/** * 获取目录总大小. * @param dir_name 目录路径 * @return 目录大小 */ int64_t AnalogFS::ftwsize(const char *dir_name) { DIR* dir = opendir(dir_name); if(dir == NULL) { pwarning(_("opendir on \"%s\" failed: %s"), dir_name, strerror(errno)); return 0; } struct dirent *dirt; int64_t sumsize = 0; while(dirt = readdir(dir)) { if(strcmp(dirt->d_name, ".") == 0) { continue; } if(strcmp(dirt->d_name, "..") == 0) { continue; } char tpath[MAX_PATHLEN]; strcpy(tpath, dir_name); mergepath(tpath, dirt->d_name); struct stat64 st; if(stat64(tpath, &st) == -1) { continue; } if(S_ISDIR(st.st_mode)) { sumsize += ftwsize(tpath); } else if(S_ISREG(st.st_mode)) { sumsize += st.st_size; } else { // ignore other files } } return sumsize; }
/** * 打开文件. * @param fn 文件路径 * @param flags as in open() * @param ... as in open() * @return 文件描述符 */ int AnalogFS::open(const char *fn, int flags, ...) { char tpath[MAX_PATHLEN]; va_list ap; char *tfn; int fd; strcpy(tpath, path); mergepath(tpath, fn); va_start(ap, flags); if ((flags & O_ACCMODE) == O_WRONLY) { tfn = assert_filename_inexist(tpath); if ((fd = ::open(tfn, flags, va_arg(ap, mode_t))) == -1) pwarning(_("Open() file \"%s\" failed, %s"), tfn, strerror(errno)); g_free(tfn); } else { if ((fd = ::open(tpath, flags, va_arg(ap, mode_t))) == -1) pwarning(_("Open() file \"%s\" failed, %s"), tpath, strerror(errno)); } va_end(ap); return fd; }
/** * 获取文件状态. * @param fn 文件路径 * @param st a stat64 struct * @return 成功与否 */ int AnalogFS::stat(const char *fn, struct stat64 *st) { char tpath[MAX_PATHLEN]; int result; strcpy(tpath, path); mergepath(tpath, fn); if ((result = ::stat64(tpath, st)) != 0) pwarning(_("Stat64() file \"%s\" failed, %s"), tpath, strerror(errno)); return result; }
/** * 打开目录. * @param dir 目录路径 * @return DIR */ DIR *AnalogFS::opendir(const char *dir) { char tpath[MAX_PATHLEN]; DIR *dirs; strcpy(tpath, path); mergepath(tpath, dir); if (!(dirs = ::opendir(tpath))) pwarning(_("Opendir() directory \"%s\" failed, %s"), tpath, strerror(errno)); return dirs; }
/** * 创建新的目录. * @param dir 目录路径 * @param mode as in mkdir() * @return 成功与否 */ int AnalogFS::mkdir(const char *dir, mode_t mode) { char tpath[MAX_PATHLEN]; int result; strcpy(tpath, path); mergepath(tpath, dir); if (::access(tpath, F_OK) == 0) return 0; if ((result = ::mkdir(tpath, mode)) != 0) pwarning(_("Mkdir() directory \"%s\" failed, %s"), tpath, strerror(errno)); return result; }
char *makepath (char fullpath [], char const *absolute, char const *relative) { char const *stack [FILE_DIR_MAX] = { (char *)(0) }; char buffer1 [FILENAME_MAX]; char buffer2 [FILENAME_MAX]; size_t limit = sizeof (stack); size_t level = 0; #ifdef CMASSOC_SAFEMODE if (fullpath == (char *) (0)) { return (fullpath); } if (absolute == (char *) (0)) { return (fullpath); } if (relative == (char *) (0)) { return (fullpath); } #endif level = splitpath (level, limit, stack, strcpy (buffer1, absolute)); level = splitpath (level, limit, stack, strcpy (buffer2, relative)); limit = mergepath (level, limit, stack); strcpy (fullpath, stack [0]); for (level = 1; level < limit; level++) { strcat (fullpath, PATH_S_EXTENDER); strcat (fullpath, stack [level]); } return (fullpath); }
void xfer_del(void) { char new_log[PATHLEN]; char linebuf[LINELEN + 1]; char bad_real[NAMELEN], bad_temp[NAMELEN]; long bad_fsize, bad_ftime; FILE *fp, *new_fp; boolean left; if (fexist(xfer_pathname)) unlink(xfer_pathname); if ((fp = sfopen(xfer_log, "rt", DENY_WRITE)) != NULL) { mergepath(new_log, download, "BAD-XFER.$$$"); if ((new_fp = sfopen(new_log, "wt", DENY_ALL)) != NULL) { left = false; while (fgets(linebuf, LINELEN, fp)) { sscanf(linebuf, "%s %s %ld %lo", bad_real, bad_temp, &bad_fsize, &bad_ftime); if (strcmp(xfer_real, bad_real) || strcmp(xfer_temp, bad_temp) || xfer_fsize != bad_fsize || xfer_ftime != bad_ftime) { fputs(linebuf, new_fp); left = true; } } fclose(fp); fclose(new_fp); unlink(xfer_log); if (left) rename(new_log, xfer_log); else unlink(new_log); } else fclose(fp); } } /*xfer_del() */
char *xfer_init(char *fname, long fsize, long ftime) { char linebuf[LINELEN + 1]; char bad_real[NAMELEN], bad_temp[NAMELEN]; long bad_fsize, bad_ftime; char skipbuf[PATHLEN]; char *p; FILE *fp; FILE *skipf; if (single_done) return (NULL); strcpy(xfer_real, fname); xfer_fsize = fsize; xfer_ftime = ftime; mergepath(xfer_pathname, download, xfer_real); if (fexist(xfer_pathname)) { struct stat f; stat(xfer_pathname, &f); if (xfer_fsize == f.st_size && xfer_ftime == f.st_mtime) return (NULL); /* already have file */ } if (skippath) { if ((skipf = fopen(skippath, "r")) != NULL) { while (fgets(skipbuf, PATHLEN, skipf)) { strcat(skipbuf, fname); if (fexist(fname)) { fclose(skipf); return 0; } } fclose(skipf); } } mergepath(xfer_log, download, "BAD-XFER.LOG"); if ((fp = sfopen(xfer_log, "rt", DENY_WRITE)) != NULL) { while (fgets(linebuf, LINELEN, fp)) { sscanf(linebuf, "%s %s %ld %lo", bad_real, bad_temp, &bad_fsize, &bad_ftime); if (!strcmp(xfer_real, bad_real) && xfer_fsize == bad_fsize && xfer_ftime == bad_ftime) { mergepath(xfer_pathname, download, bad_temp); if (fexist(xfer_pathname)) { fclose(fp); strcpy(xfer_temp, bad_temp); xfer_logged = true; return (xfer_pathname); } } } fclose(fp); } strcpy(xfer_pathname, download); p = xfer_pathname + ((int) strlen(xfer_pathname)); strcat(xfer_pathname, "BAD-XFER.000"); unique_name(xfer_pathname); strcpy(xfer_temp, p); xfer_logged = false; return (xfer_pathname); } /*xfer_init() */