void auido_del(char *dest, byte * tool_state) { ag_setbusy(); if (auic_s > 0) { int valid_files = 0; int number_files = auic_s; byte *copy_status = malloc(number_files * sizeof(byte)); char **source_path = malloc(number_files * sizeof(char *)); memset(copy_status, 0, number_files * sizeof(byte)); memset(source_path, 0, number_files * sizeof(char *)); int i = 0; for (i = 0; i < number_files; i++) { source_path[i] = auic_getpath(i); if (source_path[i] != NULL) { //-- Check paste validity copy_status[i] = 0; char *real_source = realpath(source_path[i], NULL); if (isnodelete(real_source)) { copy_status[i] = 1; } if (copy_status[i] != 1) valid_files++; free(real_source); } else { copy_status[i] = 3; } } if (valid_files > 0) { auido_show_del(copy_status, source_path, number_files); } //-- Releases for (i = 0; i < number_files; i++) { if (source_path[i] != NULL) free(source_path[i]); } free(source_path); free(copy_status); } auic_release(); *tool_state = 0; return; }
void afs_filedelete_do(AFSDTP dt, const char * path, byte ischild) { //-- Define struct stat fstat; struct stat lfstat; byte islnk = 0; int sz = 0; //-- Forbidden File if (isnodelete(path)) { return; } //-- Get Stat if (stat(path, &fstat)) { return; } //-- Set Current Info if (ischild) { //-- Get Link Stat if ((lstat(path, &lfstat) == 0) && S_ISLNK(lfstat.st_mode)) { sz = lfstat.st_size; islnk = 1; } else { sz = fstat.st_size; } //-- Set Current Filename char * bsn = basename(path); if (bsn != NULL) { snprintf(dt->curr, 255, "%s", bsn); free(bsn); } //-- Set Current Status dt->n += 1; dt->cr = 0; dt->cs = sz; //-- Set Total Size int kbsz = sz / AFS_KILOBYTE; dt->b += sz % AFS_KILOBYTE; if (dt->b >= AFS_KILOBYTE) { dt->b -= AFS_KILOBYTE; dt->k += 1; } dt->k += kbsz; //-- Tick afs_tick(dt); } if (!islnk && S_ISDIR(fstat.st_mode)) { DIR * d = opendir(path); size_t path_len = strlen(path); if (d) { struct dirent * p; while ((dt->status == 1) && (p = readdir(d))) { //-- No "." & ".." if ((p->d_name[0] == '.') && ((p->d_name[1] == 0) || ((p->d_name[1] == '.') && (p->d_name[2] == 0)))) { continue; } //-- Filename Buffer size_t len = path_len + strlen(p->d_name) + 2; char * buf = malloc(len); if (buf) { snprintf(buf, len, "%s/%s", path, p->d_name); afs_filedelete_do(dt, buf, 1); free(buf); } } } closedir(d); rmdir(path); } else { unlink(path); } }