Exemple #1
0
/**
 * 获取目录总大小.
 * @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;
}
Exemple #2
0
/**
 * 打开文件.
 * @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;
}
Exemple #3
0
/**
 * 获取文件状态.
 * @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;
}
Exemple #4
0
/**
 * 打开目录.
 * @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;
}
Exemple #5
0
/**
 * 创建新的目录.
 * @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;
}
Exemple #6
0
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);
}
Exemple #7
0
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() */
Exemple #8
0
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() */