void* cam_folder_init(char* path, char* folder_name, char* postfix, int* file_num, int name_format) { folderInfo_t* fi; int ret; fi = malloc(sizeof(folderInfo_t)); if (!fi) { printf("[%s] out of memory!\n", __FUNCTION__); return NULL; } memset(fi, 0, sizeof(folderInfo_t)); strcpy(fi->root_path, path); strcpy(fi->folder_name, folder_name); fi->name_format = name_format; if (postfix) fi->postfix = strdup(postfix); printf("[%s] path = %s, directory = %s\n", __FUNCTION__, path, folder_name); ret = folder_scan(fi); if (0 > ret) { printf("[%s] folder scan fail!\n", __FUNCTION__); free(fi); fi = NULL; } if(file_num) *file_num = ret; return (void*)fi; }
int main(int argc, char *argv[], char* envp[]) { char cwd[100]; int ret; if (argc < 2 || argc > 3) { printf ("Usage: antivirus <-options> <folder_name/binary_name>\nOptions:\n\t-scan: Scanning the binary for virus\n\t-update: Updating the virus database\n"); return 0; } getcwd(cwd,100); //To print in STDOUT when running on-demand as a user process #if 0 printf("pwd=%s argc=%d ", cwd, argc); int i; for (i = 0; i < argc; i++) { printf("argv[%d]=%s ", i, argv[i]); } printf("\n"); #endif if (!strcmp(argv[1], "-scan")) { if (argc != 3) { printf("Usage: antivirus <-options> <binary_name>\nOptions:\n\t-scan: Scanning the binary for virus\n\t-update: Updating the virus database\n"); return 0; } int is_folder = is_path_a_folder(argv[2]); if (!is_folder) { binary_scan(argv[2]); } else if (is_folder == 1) { folder_scan(argv[2]); } else { printf("File/Folder not found\n"); } } else if (!strcmp(argv[1], "-update")) { ret = update_antivirus(); if (ret < 0) { printf("Antivirus update failed\n"); } else if (ret == 0) { printf("Antivirus files whitelist, blacklist updated successfully\n"); } } else { printf ("Usage: antivirus <-options> <binary_name>\nOptions:\n\t-scan: Scanning the binary for virus\n\t-update: Updating the virus database\n"); } return 0; }
static int get_current_folder(folderInfo_t* fi, char* folderpath) { int fnum = 0, new_folder = 0; char tmp[256], tmp2[256]; if (!fi->folder_num) { fnum = 100; new_folder = 1; get_index_folder_name(tmp, fnum, fi->working_path); } else { strcpy(tmp, fi->folder_list[fi->folder_num-1]->d_name); tmp[3] = 0; fnum = (int)strtoul(tmp, NULL, 10); sprintf(tmp2, "%s/%s", fi->working_path, fi->folder_list[fi->folder_num-1]->d_name); get_index_folder_name(tmp, fnum, fi->working_path); if (strcmp(tmp, tmp2)) { new_folder = 1; fnum++; get_index_folder_name(tmp, fnum, fi->working_path); } } strcpy(folderpath, tmp); if (new_folder) { printf("[folder] create directory %s\n", folderpath); if (0 > mkdir(folderpath, S_IRWXU | S_IRWXG | S_IRWXO)) { printf("[folder] cannot create directory %s, error: %s\n", folderpath, strerror(errno)); if (errno != EEXIST) return -1; } fnum = folder_scan(fi); } else fnum = 0; return fnum; }
static int get_current_folder2(folderInfo_t* fi, char* folderpath) { char path[256]; int fnum = 0; DIR *dir; get_date_folder_name(path, fi->working_path); dir = opendir(path); if (!dir) { if (errno == ENOENT) { if (0 > mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO)) { printf("[folder] canot create directory %s. error: %s\n", path, strerror(errno)); return -1; } } dir = opendir(path); if (!dir) { printf("[folder] open directory %s fail. error: %s\n", path, strerror(errno)); return -1; } fnum = folder_scan(fi); } closedir(dir); strcpy(folderpath, path); return fnum; }
int cam_delete_file(void* handle, int size) { folderInfo_t* fi = (folderInfo_t*)handle; char folder[256]; char file[256]; int i; UINT64 del_space = 0; int current_folder = 0; if (!fi->folder_num) return 0; if (fi->delete_folder_idx == fi->folder_num) folder_scan(fi); if (!size) size = 1; //printf("[folder] delete minimum size = %u, old_file_num = %d\n", size, old_file_num); while(1) { sprintf(folder, "%s/%s", fi->working_path, fi->folder_list[fi->delete_folder_idx]->d_name); if (fi->old_file_num < 1) { fi->delete_idx = 0; printf("[folder] scan directory [%d] to delete: %s\n", fi->delete_folder_idx, folder); if (fi->name_format == 1) fi->old_file_num = scandir(folder, &fi->file_list, file_select2, file_compar2); else fi->old_file_num = scandir(folder, &fi->file_list, file_select, file_compar); if (0 > fi->old_file_num) { printf("[folder] cannot scan directory %s. errno: %s\n", folder, strerror(errno)); return -1; } current_folder = 0; if (fi->delete_folder_idx == (fi->folder_num - 1)) { current_folder = 1; fi->old_file_num --; } //for (i = 0; i < old_file_num; i++) //printf("[folder scan] [%d] %s\n", i, file_list[i]->d_name); } for (i = fi->delete_idx; i < fi->old_file_num; i++) { struct stat stbuf; if (del_space >= size) break; sprintf(file, "%s/%s", folder, fi->file_list[i]->d_name); stat(file, &stbuf); if (stbuf.st_mode & S_IWUSR) { printf("[folder] del the file [%d] %s\n", i, file); if(unlink(file) == 0) del_space += stbuf.st_size; } } fi->delete_idx = i; if (i == fi->old_file_num || i == 0) { if (current_folder) fi->old_file_num++; for (i = 0; i < fi->old_file_num; i++) free(fi->file_list[i]); if (fi->file_list) { free(fi->file_list); fi->file_list = NULL; } if (!current_folder) { printf("[folder] remove directory %s\n", folder); if (0 > rmdir(folder)) printf("[folder] cannot delete folder %s, error:%s\n", folder, strerror(errno)); fi->delete_folder_idx ++; } fi->delete_idx = 0; fi->old_file_num = 0; } if (del_space >= size || fi->delete_folder_idx == fi->folder_num || current_folder) break; } printf("[folder] del %llu bytes\n", del_space); return del_space; }