Esempio n. 1
0
void scan_files(file_search_data* data)
{
	size_t i;
	size_t count = data->root_files.size;
	int skip_symlink_dirs = !(data->options & FIND_FOLLOW_SYMLINKS);

	for (i = 0; i < count && !(data->options & FIND_CANCEL); i++)
	{
		file_t* file = get_root_file(data, i);
		assert(!!(file->mode & FILE_IFROOT));

		/* check if file is a directory */
		if (FILE_ISDIR(file)) {
			/* silently skip symlinks to directories if required */
			if (skip_symlink_dirs && FILE_ISLNK(file)) {
				continue;
			}

			if (data->max_depth != 0) {
				dir_scan(file, data);
			} else if ((data->options & FIND_LOG_ERRORS) != 0) {
				errno = EISDIR;
				log_file_error(file->path);
			}
		} else {
			/* process a regular file or a dash '-' path */
			data->call_back(file, data->call_back_data);
		}
	}
}
Esempio n. 2
0
static void   dir_scan(const char* path,const char* file,file_travel_cb callback,void* user_data)
{
	struct   stat   s;
	DIR           *dir;
	struct   dirent   *dt;
	char   dirname[256];
	dir_desc_t  dir_entry;
	memset(dirname,   0,   256);
	strncpy(dirname,path,256);

	if(stat(file,   &s)   <   0){
		nge_print("stat   error!\n");
		return;
	}
	if(S_ISDIR(s.st_mode)){
		strcpy(dirname+strlen(dirname),   file);
		strcpy(dirname+strlen(dirname),   "/");
		if((dir   =   opendir(file))   ==   NULL){
			nge_print("opendir   %s   error!\n",file);
			return;
		}
		if(chdir(file)   <   0)   {
			nge_print("chdir   error!\n");
			return;
		}
		while((dt   =   readdir(dir))   !=   NULL){
			if(dt->d_name[0]   ==   '.'){
				continue;
			}
			dir_scan(dirname,dt->d_name, callback,user_data);
		}
		if(chdir("..")   <   0){
			nge_print("chdir   error!\n");
			return;
		}
		closedir(dir);
		memset(&dir_entry,0,sizeof(dir_desc_t));
		sprintf(dir_entry.name,"%s",dirname);
		if(dir_entry.name[strlen(dir_entry.name)-1]=='/'){
			dir_entry.name[strlen(dir_entry.name)-1]= 0;
			if((strcmp(dir_entry.name,file)==0)&&(strlen(dir_entry.name)==strlen(file))){
				//current dir ommited
				return;
			}
			dir_entry.flag = FIO_F_DIR;
			callback(&dir_entry,user_data);

		}

	}else{
		memset(&dir_entry,0,sizeof(dir_desc_t));
		sprintf(dir_entry.name,"%s%s",dirname,file);
		dir_entry.flag = FIO_F_FILE;
		callback(&dir_entry,user_data);
	}
}
Esempio n. 3
0
// recursively delete everything in the specified directory
// (but not the directory itself).
// If an error occurs, delete as much as possible.
//
int client_clean_out_dir(
    const char* dirpath, const char* reason, const char* except
) {
    char filename[MAXPATHLEN], path[MAXPATHLEN];
    int retval, final_retval = 0;
    DIRREF dirp;

    if (reason && log_flags.slot_debug) {
        msg_printf(0, MSG_INFO, "[slot] cleaning out %s: %s", dirpath, reason);
    }
    dirp = dir_open(dirpath);
    if (!dirp) {
#ifndef _WIN32
        if (g_use_sandbox && (errno == EACCES)) {
            // dir may be owned by boinc_apps
            return remove_project_owned_file_or_dir(dirpath);
        }
#endif
        return 0;    // if dir doesn't exist, it's empty
    }

    while (1) {
        safe_strcpy(filename, "");
        retval = dir_scan(filename, dirp, sizeof(filename));
        if (retval) {
            if (retval != ERR_NOT_FOUND) {
                if (log_flags.slot_debug) {
                    msg_printf(0, MSG_INFO,
                        "[slot] dir_scan(%s) failed: %s",
                        dirpath, boincerror(retval)
                    );
                }
                final_retval = retval;
            }
            break;
        }
        if (except && !strcmp(except, filename)) {
            continue;
        }
        snprintf(path, sizeof(path), "%s/%s", dirpath,  filename);
        if (is_dir(path)) {
            retval = client_clean_out_dir(path, NULL);
            if (retval) final_retval = retval;
            retval = remove_project_owned_dir(path);
            if (retval) final_retval = retval;
        } else {
            retval = delete_project_owned_file(path, false);
            if (retval) final_retval = retval;
        }
    }
    dir_close(dirp);
    return final_retval;
}
Esempio n. 4
0
int io_dir_travel(const char* directory, file_travel_cb callback,void* user_data)
{
	char workdir[MAX_NAME]={0};
	char backdir[MAX_NAME]={0};
	getcwd(backdir,MAX_NAME);
	if(directory==NULL)
		return 0;
	strncpy(workdir,directory,MAX_NAME);
	if(workdir[strlen(workdir)-1] == '/')
		workdir[strlen(workdir)-1] = 0;
	dir_scan("",workdir,callback,user_data);
	chdir(backdir);
	return 1;
}
Esempio n. 5
0
static void add_archives(const char *path)
{
    Array archives;
    int i;

    if ((archives = dir_scan(path, is_archive, NULL, NULL)))
    {
        array_sort(archives, cmp_dir_items);

        for (i = 0; i < array_len(archives); i++)
            fs_add_path(DIR_ITEM_GET(archives, i)->path);

        dir_free(archives);
    }
}
Esempio n. 6
0
/// Recursively delete everything in the specified directory.
/// (but not the directory itself).
/// If an error occurs, delete as much as possible.
///
/// \param[in] dirpath Path to the directory that should be cleared.
/// \return Zero on success, nonzero otherwise.
int client_clean_out_dir(const char* dirpath) {
    int final_retval = 0;
    DIRREF dirp;

    dirp = dir_open(dirpath);
    if (!dirp) {
#ifndef _WIN32
        if (g_use_sandbox && (errno == EACCES)) {
            // dir may be owned by boinc_apps
            return remove_project_owned_file_or_dir(dirpath);
        }
#endif
        return 0;    // if dir doesn't exist, it's empty
    }

    while (true) {
        std::string filename;
        if (dir_scan(filename, dirp)) {
            break;
        }
        std::string path(dirpath);
        path.append("/").append(filename);

        int retval;
        if (is_dir(path.c_str())) {
            retval = client_clean_out_dir(path.c_str());
            if (retval) {
                final_retval = retval;
            }
            retval = remove_project_owned_dir(path.c_str());
            if (retval) {
                final_retval = retval;
            }
        } else {
            retval = delete_project_owned_file(path.c_str(), false);
            if (retval) {
                final_retval = retval;
            }
        }
    }
    dir_close(dirp);
    return final_retval;
}
Esempio n. 7
0
// delete unused stuff in the slots/ directory
//
void delete_old_slot_dirs() {
    char filename[1024], path[MAXPATHLEN];
    DIRREF dirp;
    int retval;

    dirp = dir_open(SLOTS_DIR);
    if (!dirp) return;
    while (1) {
        strcpy(filename, "");
        retval = dir_scan(filename, dirp, sizeof(filename));
        if (retval) break;
        snprintf(path, sizeof(path), "%s/%s", SLOTS_DIR, filename);
        if (is_dir(path)) {
#ifndef _WIN32
#if HAVE_SYS_SHM_H
            char init_data_path[MAXPATHLEN];
            SHMEM_SEG_NAME shmem_seg_name;

            // If BOINC crashes or exits suddenly (e.g., due to
            // being called with --exit_after_finish) it may leave
            // orphan shared memory segments in the system.
            // Clean these up here. (We must do this before deleting the
            // INIT_DATA_FILE, if any, from each slot directory.)
            //
            snprintf(init_data_path, sizeof(init_data_path), "%s/%s", path, INIT_DATA_FILE);
            shmem_seg_name = ftok(init_data_path, 1);
            if (shmem_seg_name != -1) {
                destroy_shmem(shmem_seg_name);
            }
#endif
#endif
            if (!gstate.active_tasks.is_slot_dir_in_use(path)) {
                client_clean_out_dir(path, "delete old slot dirs");
                remove_project_owned_dir(path);
            }
        } else {
            delete_project_owned_file(path, false);
        }
    }
    dir_close(dirp);
}
Esempio n. 8
0
char *check_validity(
    const char *certPath, const char *origFile, unsigned char *signature,
    char* caPath
) {
    MD5_CTX md5CTX;
    int rbytes;
    unsigned char md5_md[MD5_DIGEST_LENGTH],  rbuf[2048];

    SSL_load_error_strings();
    SSL_library_init();

    if (!is_file(origFile)) {
        return NULL;
    }
    FILE* of = boinc_fopen(origFile, "r");
    if (!of) return NULL;
    MD5_Init(&md5CTX);
    while (0 != (rbytes = (int)fread(rbuf, 1, sizeof(rbuf), of))) {
	    MD5_Update(&md5CTX, rbuf, rbytes);
    }
    MD5_Final(md5_md, &md5CTX);
    fclose(of);

    DIRREF dir = dir_open(certPath);

    char file[MAXPATHLEN];
    while (!dir_scan(file, dir, sizeof(file))) {
        char fpath[MAXPATHLEN];
	    snprintf(fpath, sizeof(fpath), "%s/%s", certPath, file);
        // TODO : replace '128'  
	    if (check_validity_of_cert(fpath, md5_md, signature, 128, caPath)) {
	        dir_close(dir);
	        return strdup(fpath);
	    }
    }

    dir_close(dir);
    return NULL;
}
Esempio n. 9
0
// recursively delete everything in the specified directory
// (but not the directory itself).
// If an error occurs, delete as much as possible.
//
int client_clean_out_dir(const char* dirpath, const char* reason) {
    char filename[256], path[256];
    int retval, final_retval = 0;
    DIRREF dirp;

    if (reason && log_flags.slot_debug) {
        msg_printf(0, MSG_INFO, "[slot] cleaning out %s: %s", dirpath, reason);
    }
    dirp = dir_open(dirpath);
    if (!dirp) {
#ifndef _WIN32
        if (g_use_sandbox && (errno == EACCES)) {
            // dir may be owned by boinc_apps
            return remove_project_owned_file_or_dir(dirpath);
        }
#endif
        return 0;    // if dir doesn't exist, it's empty
    }

    while (1) {
        strcpy(filename, "");
        retval = dir_scan(filename, dirp, sizeof(filename));
        if (retval) break;
        sprintf(path, "%s/%s", dirpath,  filename);
        if (is_dir(path)) {
            retval = client_clean_out_dir(path, NULL);
            if (retval) final_retval = retval;
            retval = remove_project_owned_dir(path);
            if (retval) final_retval = retval;
        } else {
            retval = delete_project_owned_file(path, false);
            if (retval) final_retval = retval;
        }
    }
    dir_close(dirp);
    return final_retval;
}
Esempio n. 10
0
Array fs_dir_scan(const char *path, int (*filter)(struct dir_item *))
{
    return dir_scan(path, filter, list_files, free_files);
}