static int view_attrib(direntry_t *entry, MainParam_t *mp) { printf(" "); if(IS_ARCHIVE(entry)) putchar('A'); else putchar(' '); fputs(" ",stdout); if(IS_SYSTEM(entry)) putchar('S'); else putchar(' '); if(IS_HIDDEN(entry)) putchar('H'); else putchar(' '); if(IS_READONLY(entry)) putchar('R'); else putchar(' '); printf(" "); fprintPwd(stdout, entry, 0); printf("\n"); return GOT_ONE; }
static int del_entry(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; if(got_signal) return ERROR_ONE; if(entry->entry == -3) { fprintf(stderr, "Cannot remove root directory\n"); return ERROR_ONE; } if (arg->verbose) { fprintf(stderr,"Removing "); fprintPwd(stderr, entry,0); fputc('\n', stderr); } if (entry->dir.attr & (ATTR_READONLY | ATTR_SYSTEM)) { char tmp[4*MAX_VNAMELEN+1]; wchar_to_native(entry->name,tmp,MAX_VNAMELEN); if (ask_confirmation("%s: \"%s\" is read only, erase anyway (y/n) ? ", progname, tmp)) return ERROR_ONE; } if (fatFreeWithDirentry(entry)) return ERROR_ONE; wipeEntry(entry); return GOT_ONE; }
static int replay_attrib(direntry_t *entry, MainParam_t *mp) { if ( (IS_ARCHIVE(entry) && IS_DIR(entry)) || (!IS_ARCHIVE(entry) && !IS_DIR(entry)) || IS_SYSTEM(entry) || IS_HIDDEN(entry)) { printf("mattrib "); if (IS_ARCHIVE(entry) && IS_DIR(entry)) { printf("+a "); } if (!IS_ARCHIVE(entry) && !IS_DIR(entry)) { printf("-a "); } if (IS_SYSTEM(entry)) { printf("+s "); } if (IS_HIDDEN(entry)) { printf("+h "); } fprintPwd(stdout, entry, 1); printf("\n"); } return GOT_ONE; }
static int dir_mdu(direntry_t *entry, MainParam_t *mp) { Arg_t *parentArg = (Arg_t *) (mp->arg); Arg_t arg; int ret; arg = *parentArg; arg.mp.arg = (void *) &arg; arg.parent = parentArg; arg.inDir = 1; /* account for the space occupied by the directory itself */ if(!isRootDir(entry->Dir)) { arg.blocks = countBlocks(entry->Dir, getStart(entry->Dir, &entry->dir)); } else { arg.blocks = 0; } /* recursion */ ret = mp->loop(mp->File, &arg.mp, "*"); if(!arg.summary || !parentArg->inDir) { printf("%-7d ", arg.blocks); fprintPwd(stdout, entry,0); fputc('\n', stdout); } arg.parent->blocks += arg.blocks; return ret; }
void mpPrintFilename(FILE *fp, MainParam_t *mp) { if(mp->direntry) fprintPwd(fp, mp->direntry, 0); else fprintf(fp,"%s",mp->originalArg); }
static int dos_showfat(direntry_t *entry, MainParam_t *mp) { Stream_t *File=mp->File; fprintPwd(stdout, entry,0); putchar(' '); printFat(File); printf("\n"); return GOT_ONE; }
static int del_file(direntry_t *entry, MainParam_t *mp) { char shortname[13]; direntry_t subEntry; Stream_t *SubDir; Arg_t *arg = (Arg_t *) mp->arg; MainParam_t sonmp; int ret; int r; sonmp = *mp; sonmp.arg = mp->arg; r = 0; if (IS_DIR(entry)){ /* a directory */ SubDir = OpenFileByDirentry(entry); initializeDirentry(&subEntry, SubDir); ret = 0; while((r=vfat_lookup(&subEntry, "*", 1, ACCEPT_DIR | ACCEPT_PLAIN, shortname, NULL)) == 0 ){ if(shortname[0] != DELMARK && shortname[0] && shortname[0] != '.' ){ if(arg->deltype != 2){ fprintf(stderr, "Directory "); fprintPwd(stderr, entry,0); fprintf(stderr," non empty\n"); ret = ERROR_ONE; break; } if(got_signal) { ret = ERROR_ONE; break; } ret = del_file(&subEntry, &sonmp); if( ret & ERROR_ONE) break; ret = 0; } } FREE(&SubDir); if (r == -2) return ERROR_ONE; if(ret) return ret; } return del_entry(entry, mp); }
static int file_mdu(direntry_t *entry, MainParam_t *mp) { unsigned int blocks; Arg_t * arg = (Arg_t *) (mp->arg); blocks = countBlocks(entry->Dir,getStart(entry->Dir, &entry->dir)); if(arg->all || !arg->inDir) { printf("%-7d ", blocks); fprintPwd(stdout, entry,0); fputc('\n', stdout); } arg->blocks += blocks; return GOT_ONE; }
static int mcd_callback(direntry_t *entry, MainParam_t *mp) { FILE *fp; if (!(fp = open_mcwd("w"))){ fprintf(stderr,"mcd: Can't open mcwd .file for writing\n"); return ERROR_ONE; } fprintPwd(fp, entry,0); fprintf(fp, "\n"); fclose(fp); return GOT_ONE | STOP_NOW; }
/* Copy a directory to Unix */ static int unix_copydir(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; time_t mtime; Stream_t *File=mp->File; int ret; char *unixFile; if (!arg->recursive && mp->basenameHasWildcard) return 0; File->Class->get_data(File, &mtime, 0, 0, 0); if (!arg->preserveTime) mtime = 0L; if(!arg->type && arg->verbose) { fprintf(stderr,"Copying "); fprintPwd(stderr, entry,0); fprintf(stderr, "\n"); } if(got_signal) return ERROR_ONE; unixFile = mpBuildUnixFilename(mp); if(!unixFile) { printOom(); return ERROR_ONE; } if(arg->type || !*mpPickTargetName(mp) || !makeUnixDir(unixFile)) { Arg_t newArg; newArg = *arg; newArg.mp.arg = (void *) &newArg; newArg.mp.unixTarget = unixFile; newArg.mp.targetName = 0; newArg.mp.basenameHasWildcard = 1; ret = mp->loop(File, &newArg.mp, "*"); set_mtime(unixFile, mtime); free(unixFile); return ret | GOT_ONE; } else { perror("mkdir"); fprintf(stderr, "Failure to make directory %s\n", unixFile); free(unixFile); return ERROR_ONE; } }
static int concise_view_attrib(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; if(IS_ARCHIVE(entry)) putchar('A'); if(IS_DIR(entry)) putchar('D'); if(IS_SYSTEM(entry)) putchar('S'); if(IS_HIDDEN(entry)) putchar('H'); if(IS_READONLY(entry)) putchar('R'); if(arg->doPrintName) { putchar(' '); fprintPwd(stdout, entry, 0); } putchar('\n'); return GOT_ONE; }
static int dos_copydir(direntry_t *entry, MainParam_t *mp) /* copyes a directory to Dos */ { Arg_t * arg = (Arg_t *) (mp->arg); Arg_t newArg; time_t now; time_t date; int ret; const char *targetName = mpPickTargetName(mp); if (!arg->recursive && mp->basenameHasWildcard) return 0; if(entry && isSubdirOf(mp->targetDir, mp->File)) { fprintf(stderr, "Cannot recursively copy directory "); fprintPwd(stderr, entry,0); fprintf(stderr, " into one of its own subdirectories "); fprintPwd(stderr, getDirentry(mp->targetDir),0); fprintf(stderr, "\n"); return ERROR_ONE; } if (arg->mp.File->Class->get_data(arg->mp.File, & date, 0, 0, 0) < 0 ){ fprintf(stderr, "Can't stat source file\n"); return ERROR_ONE; } if(!arg->type && arg->verbose) fprintf(stderr,"Copying %s\n", mpGetBasename(mp)); if(entry && arg->preserveAttributes) arg->attr = entry->dir.attr; else arg->attr = 0; if (entry && (mp->targetDir == entry->Dir)){ arg->ch.ignore_entry = -1; arg->ch.source = entry->entry; } else { arg->ch.ignore_entry = -1; arg->ch.source = -2; } /* preserve mod time? */ if (arg->preserveTime) now = date; else getTimeNow(&now); newArg = *arg; newArg.mp.arg = &newArg; newArg.mp.targetName = 0; newArg.mp.basenameHasWildcard = 1; if(*targetName) { /* maybe the directory already exist. Use it */ newArg.mp.targetDir = subDir(mp->targetDir, targetName); if(!newArg.mp.targetDir) newArg.mp.targetDir = createDir(mp->targetDir, targetName, &arg->ch, arg->attr, now); } else newArg.mp.targetDir = mp->targetDir; if(!newArg.mp.targetDir) return ERROR_ONE; ret = mp->loop(mp->File, &newArg.mp, "*"); if(*targetName) FREE(&newArg.mp.targetDir); return ret | GOT_ONE; }