⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 libbt-1.04
💻 C
字号:
#include "config.h"#ifdef WITH_DMALLOC#include <dmalloc.h>#endif /* WITH_DMALLOC */#include <stdio.h>#include <stdlib.h>#include <string.h>#if !WIN32#   if HAVE_UNISTD_H#      include <unistd.h>#   endif#   if HAVE_FCNTL_H#      include <fcntl.h>#   endif#   include <sys/param.h>#endif#include <sys/stat.h>#include <sys/types.h>#if WIN32#   include <io.h>#   include <direct.h>#   define MAXPATHLEN 255#   define MKDIR(p,f) mkdir(p)#else#   define MKDIR(p,f) mkdir(p,f)#endif#include "bterror.h"#include "util.h"#undef malloc#undef calloc#undef realloc#undef free/* Globals */#define FILESETSIZE 50static struct {    int fd;    int options;    char *path;} c_fileset[ FILESETSIZE ];static int c_index = 0;void *btcalloc( size_t nmemb, size_t size) {    void *region = calloc( nmemb, size);    if (!region) SYSDIE("calloc");    return region;}void *btmalloc( size_t size) {    void *region = malloc( size);    if (!region) SYSDIE("malloc");    return region;}void *btrealloc( void *ptr, size_t size) {    void *region = realloc( ptr, size);    if (!region) SYSDIE("realloc");    return region;}void btfree( void *ptr) {    free( ptr);}char *bts_strerror( int err) {    if (err) {	if (err >= BTERR_BASE && err < BTERR_LAST) {	    return bterror_string[err - BTERR_BASE];	} else {	    return strerror(err);	}    }     return "Not an error";}void bts_perror( int err, char *msg) {    fprintf( stderr, "%s: [%d] %s\n", msg, err, bts_strerror(err));}int die( char *file, int line, char *msg, int err) {    if (err) {	fprintf( stderr, "%s+%d: (FATAL ERROR) %s ([%d] %s)\n", 	    file, line, msg, err, bts_strerror( err));    } else {	fprintf( stderr, "%s+%d: (FATAL ERROR) %s\n", 	    file, line, msg);    }    abort();}intcacheopen( char *path, int options, int mode) {    int i;    int fd;    int err;    static int last_i = 0;    if (c_fileset[last_i].path == path && c_fileset[last_i].options == options)     {	return c_fileset[last_i].fd;    }    for (i=0; i<FILESETSIZE; i++) {        if (path == c_fileset[i].path && options == c_fileset[i].options) {	    last_i = i;	    return c_fileset[i].fd;	}    }    printf("cacheopen(%s)\n", path);    fd = open( path, options, mode);    if (fd < 0) return fd;    if (c_fileset[c_index].fd > 0) {        err = close(c_fileset[c_index].fd);	if (err) {	    bts_perror( errno, "Error closing file");	    fprintf( stderr, "File '%s' may be corrupt\n", c_fileset[c_index].path);	}    }    c_fileset[c_index].fd = fd;    c_fileset[c_index].path = path;    c_fileset[c_index].options = options;    c_index = (c_index + 1) % FILESETSIZE;     return fd;}void cacheclose( void) {    int err;    int i;    for (i=0; i<FILESETSIZE; i++) {        if (c_fileset[c_index].fd) {	    err = close(c_fileset[c_index].fd);	    c_fileset[c_index].path = NULL;	    c_fileset[c_index].options = 0;	    c_fileset[c_index].fd = 0;	    if (err) {		bts_perror( errno, "Error closing file");		fprintf( stderr, "File '%s' may be corrupt\n", c_fileset[c_index].path);	    }	}    }}int openPath( char *path, int options) {    char subdir[MAXPATHLEN];    char *sep;    int fd;    int len;    int err;#if 0    printf("open( %s,...)\n", path);#endif    fd = cacheopen( path, options, 0666);    if (fd < 0) {#if 0	perror("open failed");#endif	sep = path;	sep = strchr(sep+1, '/');	while( sep) {	    len = sep - path;	    memcpy( subdir, path, len);	    subdir[len] = 0;#if 0	    printf("mkdir( %s,...)\n", subdir);#endif	    err = MKDIR(subdir, 0777);	    if (err) {	        if (errno == EEXIST) {		    /* check for existing directory */		    int mderr = errno;		    int serr;		    struct stat sbuf;		    serr = stat(subdir, &sbuf);		    if (!serr && S_ISDIR(sbuf.st_mode)) err = 0;		    errno=mderr;		}		if (err) {		    bts_perror( errno, "Error creating directory");		    fprintf( stderr, "Directory '%s' will be missing\n", path);		}	    }	    sep = strchr(sep+1, '/');	}#if 0	printf("open( %s,...)\n", path);#endif	fd = cacheopen( path, options, 0666);    }    if (fd < 0) {	bts_perror( errno, "Error creating file");	fprintf( stderr, "File '%s' will be missing\n", path);    }    return fd;}voidhexencode (const unsigned char *digest, int len, char *buf, int buflen) {    int i;    for (i=0; i<len; i++) {	snprintf(buf+3*i, buflen - 3*i, "%%%02x", digest[i]);    }}inthexdecode (unsigned char *digest, int len, const char *buf, int buflen) {    int i;    const char *cpos = buf;    for (i=0; i<len; i++) {        unsigned int hexval;	int nextchar;	if (sscanf( cpos, "%%%02x%n", &hexval, &nextchar) < 1) {	    return -1;	}	digest[i] = (unsigned char)hexval;        cpos += nextchar;    }    if (*cpos != 0 && *cpos != '\n' && *cpos != '\r') return -2;    return 0;}#if WIN32 || !HAVE_ON_EXIT#define EXITMAX 20static struct {    exitfn_ptr exitfn;    void *data;} __exitlist[EXITMAX];static int __exitindex = 0;void on_exit_exit( void) {    int i;    for (i=0; i<__exitindex; i++) {	__exitlist[i].exitfn( 0, __exitlist[i].data);    }}int on_exit( exitfn_ptr exitfn, void* data) {    if (__exitindex >= EXITMAX) return 1;    if (__exitindex == 0) {	atexit( on_exit_exit);    }    __exitlist[ __exitindex].exitfn = exitfn;    __exitlist[ __exitindex].data = data;    __exitindex++;    return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -