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

📄 rdfile.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
	    file_info[I_LOCKOFF] &= ~1;	}	if(data_size != 0) {	    if(data_size > max_data_size) {		if(data_fork == NULL) {		    data_fork = malloc((unsigned)data_size);		} else {		    data_fork = realloc(data_fork, (unsigned)data_size);		}		max_data_size = data_size;	    }	    if(fread(data_fork, 1, data_size, fd) != data_size) {		(void)fprintf(stderr, "Short file %s\n", filename);		exit(1);	    }	    skip = (((data_size + 127) >> 7) << 7) - data_size;	    for(j = 0; j < skip; j++) {		(void)fgetc(fd);	    }	}	if(rsrc_size != 0) {	    if(rsrc_size > max_rsrc_size) {		if(rsrc_fork == NULL) {		    rsrc_fork = malloc((unsigned)rsrc_size);		} else {		    rsrc_fork = realloc(rsrc_fork, (unsigned)rsrc_size);		}		max_rsrc_size = rsrc_size;	    }	    if(fread(rsrc_fork, 1, rsrc_size, fd) != rsrc_size) {		(void)fprintf(stderr, "Short file %s\n", filename);		exit(1);	    }	}	break;#ifdef APPLESHARE    case SHAREFILE:#ifdef AUFS	(void)strcpy(filename1, infodir);	(void)strcat(filename1, "/");	(void)strcat(filename1, filename);	if((fd = fopen(filename1, "r")) == NULL) {	    (void)fprintf(stderr, "Cannot open file %s\n", filename1);	}	read_aufs_info(fd);	(void)fclose(fd);	(void)strcpy(filename1, rsrcdir);	(void)strcat(filename1, "/");	(void)strcat(filename1, filename);	if(stat(filename1, &stbuf) >= 0) {	    rsrc_size = stbuf.st_size;	    put4(file_info + I_RLENOFF, (unsigned long)rsrc_size);	    if(rsrc_size > 0) {		if(rsrc_size > max_rsrc_size) {		    if(rsrc_fork == NULL) {			rsrc_fork = malloc((unsigned)rsrc_size);		    } else {			rsrc_fork = realloc(rsrc_fork, (unsigned)rsrc_size);		    }		    max_rsrc_size = rsrc_size;		}		if((fd = fopen(filename1, "r")) == NULL) {		    (void)fprintf(stderr, "Cannot open file %s\n", filename1);		    exit(1);		}		if(fread(rsrc_fork, 1, rsrc_size, fd) != rsrc_size) {		    (void)fprintf(stderr, "Short file %s\n", filename1);		    exit(1);		}		(void)fclose(fd);	    }	}	if(stat(filename, &stbuf) >= 0) {	    data_size = stbuf.st_size;	    put4(file_info + I_DLENOFF, (unsigned long)data_size);	    if(data_size > 0) {		if(data_size > max_data_size) {		    if(data_fork == NULL) {			data_fork = malloc((unsigned)data_size);		    } else {			data_fork = realloc(data_fork, (unsigned)data_size);		    }		    max_data_size = data_size;		}		if((fd = fopen(filename, "r")) == NULL) {		    (void)fprintf(stderr, "Cannot open file %s\n", filename);		    exit(1);		}		if(fread(data_fork, 1, data_size, fd) != data_size) {		    (void)fprintf(stderr, "Short file %s\n", filename1);		    exit(1);		}		(void)fclose(fd);	    }	}#endif /* AUFS */#ifdef APPLEDOUBLE	(void)strcpy(filename1, infodir);	(void)strcat(filename1, "/");	(void)strcat(filename1, filename);	if((fd = fopen(filename1, "r")) == NULL) {	    (void)fprintf(stderr, "Cannot open file %s\n", filename1);	}	read_appledouble_info(fd);	rsrc_size = get4(file_info + I_RLENOFF);	if(rsrc_size > 0) {	    if(rsrc_size > max_rsrc_size) {		if(rsrc_fork == NULL) {		    rsrc_fork = malloc((unsigned)rsrc_size);		} else {		    rsrc_fork = realloc(rsrc_fork, (unsigned)rsrc_size);		}		max_rsrc_size = rsrc_size;	    }	    if(fread(rsrc_fork, 1, rsrc_size, fd) != rsrc_size) {		(void)fprintf(stderr, "Short file %s\n", filename1);		exit(1);	    }	}	(void)fclose(fd);	if(stat(filename, &stbuf) >= 0) {	    data_size = stbuf.st_size;	    put4(file_info + I_DLENOFF, (unsigned long)data_size);	    if(data_size > 0) {		if(data_size > max_data_size) {		    if(data_fork == NULL) {			data_fork = malloc((unsigned)data_size);		    } else {			data_fork = realloc(data_fork, (unsigned)data_size);		    }		    max_data_size = data_size;		}		if((fd = fopen(filename, "r")) == NULL) {		    (void)fprintf(stderr, "Cannot open file %s\n", filename);		    exit(1);		}		if(fread(data_fork, 1, data_size, fd) != data_size) {		    (void)fprintf(stderr, "Short file %s\n", filename1);		    exit(1);		}		(void)fclose(fd);	    }	}#endif /* APPLEDOUBLE */	break;#endif /* APPLESHARE */    }}static void enter_dir(){    DIR *directory;    struct dirstruct *curentry;    FILE *fd;    int n, j, namlen;    int listsize, cursize;    char *filetable;    filelist *new_files;#ifdef APPLESHARE    char filename1[255];#endif /* APPLESHARE */    for(j = 0; j < INFOBYTES; j++) {	file_info[j] = 0;    }    (void)strcpy(file_info + I_NAMEOFF + 1, filename);    file_info[I_NAMEOFF] = strlen(filename);    directory = opendir(filename);    if(directory == NULL) {	(void)fprintf(stderr, "Cannot read directory %s\n", filename);	exit(1);    }    listsize = 1024;    filetable = malloc((unsigned)listsize);    cursize = 0;    n = 0;    while((curentry = readdir(directory)) != NULL) {	namlen = strlen(curentry->d_name);	if(namlen + 1 > listsize - cursize) {	    listsize += 1024;	    filetable = realloc(filetable, (unsigned)listsize);	}	(void)strcpy(filetable + cursize, curentry->d_name);	cursize += (namlen + 1);	n++;    }    filetable = realloc(filetable, (unsigned)cursize);    (void)closedir(directory);    new_files = (filelist *)malloc(sizeof(filelist));    new_files->nfiles = n;    new_files->files = (char **)malloc((unsigned)n * sizeof(char **));    new_files->kind = (int *)malloc((unsigned)n * sizeof(int));    new_files->previous = current_files;    new_files->current = 0;    cursize = 0;    for(j = 0; j < n; j++) {	new_files->files[j] = filetable + cursize;	cursize += (strlen(filetable + cursize) + 1);    }    (void)chdir(filename);#ifdef APPLESHARE    if((fd = fopen(f_name, "r")) != NULL) {	if(fread(file_info, 1, INFOBYTES, fd) != INFOBYTES) {	    (void)fprintf(stderr, "File error on %s\n", f_name);	    exit(1);	}	file_info[I_NAMEOFF] |= 0x80;	(void)fclose(fd);    } else {#ifdef AUFS	(void)strcpy(filename1, "../");	(void)strcat(filename1, infodir);	(void)strcat(filename1, "/");	(void)strcat(filename1, filename);	if((fd = fopen(filename1, "r")) != NULL) {	    read_aufs_info(fd);	    (void)fclose(fd);	}#endif /* AUFS */#ifdef APPLEDOUBLE	(void)strcpy(filename1, infodir);	(void)strcat(filename1, "/.Parent");	if((fd = fopen(filename1, "r")) != NULL) {	    read_appledouble_info(fd);	    (void)fclose(fd);	}#endif /* APPLEDOUBLE */	file_info[I_NAMEOFF] |= 0x80;    }#else /* APPLESHARE */    if((fd = fopen(f_name, "r")) != NULL) {	if(fread(file_info, 1, INFOBYTES, fd) != INFOBYTES) {	    (void)fprintf(stderr, "File error on %s\n", f_name);	    exit(1);	}	file_info[I_NAMEOFF] |= 0x80;	(void)fclose(fd);    }#endif /* APPLESHARE */    current_files = new_files;    check_files(0);}static void exit_dir(){    filelist *old_files;    int i;    for(i = 0; i < INFOBYTES; i++) {	file_info[i] = 0;    }    file_info[I_NAMEOFF] = 0x80;    old_files = current_files;    /* Do some garbage collection here! */    current_files = current_files->previous;    (void)free(old_files->files[0]);    (void)free((char *)old_files->files);    (void)free((char *)old_files->kind);    (void)free((char *)old_files);    (void)chdir("..");}#ifdef APPLESHARE#ifdef AUFSstatic void read_aufs_info(fd)FILE *fd;{    FileInfo theinfo;    int i, n;    struct stat stbuf;    for(i = 0; i < INFOBYTES; i++) {	file_info[i] = 0;    }    bzero((char *) &theinfo, sizeof(theinfo));    if(fread((char *)&theinfo, 1, sizeof(theinfo), fd) != sizeof(theinfo)) {	(void)fprintf(stderr, "Short AUFS info header for %s\n", filename);	exit(1);    }    if(theinfo.fi_magic1 & BYTEMASK != FI_MAGIC1 ||       theinfo.fi_version & BYTEMASK != FI_VERSION ||       theinfo.fi_magic & BYTEMASK != FI_MAGIC) {	(void)fprintf(stderr, "Magic number mismatch on %s\n", filename);	exit(1);    }    bcopy(theinfo.fi_fndr, file_info + I_TYPEOFF, 4);    bcopy(theinfo.fi_fndr + 4, file_info + I_AUTHOFF, 4);    bcopy(theinfo.fi_fndr + 8, file_info + I_FLAGOFF, 2);    if(theinfo.fi_bitmap & FI_BM_MACINTOSHFILENAME) {	n = strlen(theinfo.fi_macfilename);	(void)strncpy(file_info + I_NAMEOFF + 1, (char *)theinfo.fi_macfilename,		n);    } else if(theinfo.fi_bitmap & FI_BM_SHORTFILENAME) {	n = strlen(theinfo.fi_shortfilename);	(void)strncpy(file_info + I_NAMEOFF + 1,		(char *)theinfo.fi_shortfilename, n);    } else {	n = strlen(filename);	(void)strncpy(file_info + I_NAMEOFF + 1, filename, n);    }    file_info[I_NAMEOFF] = n;#ifdef AUFSPLUS    if(theinfo.fi_datemagic == FI_MAGIC &&       (theinfo.fi_datevalid & (FI_CDATE | FI_MDATE)) ==		(FI_CDATE | FI_MDATE)) {	put4(file_info + I_CTIMOFF, get4(theinfo.fi_ctime) + TIMEDIFF);	put4(file_info + I_MTIMOFF, get4(theinfo.fi_mtime) + TIMEDIFF);    } else {	if(fstat(fileno(fd), &stbuf) >= 0) {	    put4(file_info + I_CTIMOFF,		(unsigned long)stbuf.st_ctime + TIMEDIFF);	    put4(file_info + I_MTIMOFF,		(unsigned long)stbuf.st_mtime + TIMEDIFF);	}    }#else /* AUFSPLUS */    if(fstat(fileno(fd), &stbuf) >= 0) {	put4(file_info + I_CTIMOFF, (unsigned long)stbuf.st_ctime + TIMEDIFF);	put4(file_info + I_MTIMOFF, (unsigned long)stbuf.st_mtime + TIMEDIFF);    }#endif /* AUFSPLUS */}#endif /* AUFS */#ifdef APPLEDOUBLE/* This version assumes that the AppleDouble info header is always the same   size and format.  I have not yet seen something that will lead me to   believe different.*/static void read_appledouble_info(fd)FILE *fd;{    FileInfo theinfo;    int i, n;    for(i = 0; i < INFOBYTES; i++) {	file_info[i] = 0;    }    bzero((char *) &theinfo, sizeof(theinfo));    if(fread((char *)&theinfo, 1, sizeof(theinfo), fd) != sizeof(theinfo)) {	(void)fprintf(stderr, "Short AppleDouble info header for %s\n",		filename);	exit(1);    }    if(get4(theinfo.fi_magic) != FI_MAGIC ||       get2(theinfo.fi_version) != FI_VERSION) {	(void)fprintf(stderr, "Magic number mismatch on %s\n", filename);	exit(1);    }    bcopy(theinfo.fi_type, file_info + I_TYPEOFF, 4);    bcopy(theinfo.fi_auth, file_info + I_AUTHOFF, 4);    bcopy(theinfo.fi_finfo, file_info + I_FLAGOFF, 2);    n = get4(theinfo.fi_namlen);    (void)strncpy(file_info + I_NAMEOFF + 1, theinfo.fi_name, n);    file_info[I_NAMEOFF] = n;    put4(file_info + I_CTIMOFF, get4(theinfo.fi_ctime) + TIMEDIFF);    put4(file_info + I_MTIMOFF, get4(theinfo.fi_mtime) + TIMEDIFF);    rsrc_size = get4(theinfo.fi_rsrc);    put4(file_info + I_RLENOFF, (unsigned long)rsrc_size);}#endif /* APPLEDOUBLE */#endif /* APPLESHARE */static int get_stdin_file(){    int i, skip;    i = fgetc(stdin);    if(i == EOF) {	return ISATEND;    }    (void)ungetc(i, stdin);    if(fread(file_info, 1, INFOBYTES, stdin) != INFOBYTES) {	(void)fprintf(stderr, "Short input\n");	exit(1);    }    if(file_info[0] != 0) {	(void)fprintf(stderr, "File is not MacBinary: %s\n", filename);	exit(1);    }    data_size = get4(file_info + I_DLENOFF);    rsrc_size = get4(file_info + I_RLENOFF);    if(file_info[I_LOCKOFF] & 1) {	file_info[I_FLAGOFF + 1] = PROTCT_MASK;	file_info[I_LOCKOFF] &= ~1;    }    if(data_size != 0) {	if(data_size > max_data_size) {	    if(data_fork == NULL) {		data_fork = malloc((unsigned)data_size);	    } else {		data_fork = realloc(data_fork, (unsigned)data_size);	    }	    max_data_size = data_size;	}	if(fread(data_fork, 1, data_size, stdin) != data_size) {	    (void)fprintf(stderr, "Short input\n");	    exit(1);	}	skip = (((data_size + 127) >> 7) << 7) - data_size;	for(i = 0; i < skip; i++) {	    (void)fgetc(stdin);	}    }    if(rsrc_size != 0) {	if(rsrc_size > max_rsrc_size) {	    if(rsrc_fork == NULL) {		rsrc_fork = malloc((unsigned)rsrc_size);	    } else {		rsrc_fork = realloc(rsrc_fork, (unsigned)rsrc_size);	    }	    max_rsrc_size = rsrc_size;	}	if(fread(rsrc_fork, 1, rsrc_size, stdin) != rsrc_size) {	    (void)fprintf(stderr, "Short input\n");	    exit(1);	}	skip = (((rsrc_size + 127) >> 7) << 7) - rsrc_size;	for(i = 0; i < skip; i++) {	    (void)fgetc(stdin);	}    }    if(file_info[I_NAMEOFF] & 0x80) {	if((file_info[I_NAMEOFF] & 0xff) == 0x80) {	    return ENDDIR;	}	return ISDIR;    }    return ISFILE;}int rdfileopt(c)char c;{extern char *optarg;char name[32];    switch(c) {    case 'd':	data_only = DATA_FORMAT;	break;    case 'u':    case 'U':	data_only = UNIX_FORMAT;	break;    case 'r':	data_only = RSRC_FORMAT;	break;    case 'c':	backtrans(name, optarg);	(void)strncpy(f_auth, name, 4);	break;    case 't':	backtrans(name, optarg);	(void)strncpy(f_type, name, 4);	break;    default:	return 0;    }    return 1;}void give_rdfileopt(){    (void)fprintf(stderr, "File input options:\n");    (void)fprintf(stderr, "-r:\tread as resource files\n");    (void)fprintf(stderr, "-d:\tread as data files\n");    (void)fprintf(stderr,	"-u:\tread as data files with Unix -> Mac text file translation\n");    (void)fprintf(stderr, "-U:\ta synonym for -u\n");    (void)fprintf(stderr,	"-c cr:\tcreator if one of the above options is used\n");    (void)fprintf(stderr,	"-t ty:\tfiletype if one of the above options is used\n");}void set_norecurse(){    no_recurse = 1;}char *get_rdfileopt(){    static char options[] = "rduUc:t:";    return options;}char *get_minb(){#ifdef APPLESHARE#ifdef AUFS    return ", AUFS supported";#endif /* AUFS */#ifdef APPLEDOUBLE    return ", AppleDouble supported";#endif /* APPLEDOUBLE */#else /* APPLESHARE */    return ", no Apple-Unix sharing supported";#endif /* APPLESHARE */}

⌨️ 快捷键说明

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