00001
00002
00003
00004
00005
00006
00007 #include "sysincludes.h"
00008 #include "msdos.h"
00009 #include "mtools.h"
00010 #include "stream.h"
00011 #include "mainloop.h"
00012 #include "fs.h"
00013 #include "file.h"
00014
00015 typedef struct Arg_t {
00016 int deltype;
00017 int verbose;
00018 } Arg_t;
00019
00020 static int del_entry(direntry_t *entry, MainParam_t *mp)
00021 {
00022 Arg_t *arg=(Arg_t *) mp->arg;
00023 direntry_t longNameEntry;
00024 int i;
00025
00026 if(got_signal)
00027 return ERROR_ONE;
00028
00029 if(entry->entry == -3) {
00030 fprintf(stderr, "Cannot remove root directory\n");
00031 return ERROR_ONE;
00032 }
00033
00034 if (arg->verbose) {
00035 fprintf(stderr,"Removing ");
00036 fprintPwd(stdout, entry,0);
00037 putchar('\n');
00038 }
00039
00040 if ((entry->dir.attr & (ATTR_READONLY | ATTR_SYSTEM)) &&
00041 (ask_confirmation("%s: \"%s\" is read only, erase anyway (y/n) ? ",
00042 progname, entry->name)))
00043 return ERROR_ONE;
00044 if (fatFreeWithDirentry(entry))
00045 return ERROR_ONE;
00046
00047 initializeDirentry(&longNameEntry, entry->Dir);
00048 for(i=entry->beginSlot; i< entry->endSlot; i++) {
00049 int error;
00050 longNameEntry.entry=i;
00051 dir_read(&longNameEntry, &error);
00052 if(error)
00053 break;
00054 longNameEntry.dir.name[0] = (char) DELMARK;
00055 dir_write(&longNameEntry);
00056 }
00057
00058 entry->dir.name[0] = (char) DELMARK;
00059 dir_write(entry);
00060 return GOT_ONE;
00061 }
00062
00063 static int del_file(direntry_t *entry, MainParam_t *mp)
00064 {
00065 char shortname[13];
00066 direntry_t subEntry;
00067 Stream_t *SubDir;
00068 Arg_t *arg = (Arg_t *) mp->arg;
00069 MainParam_t sonmp;
00070 int ret;
00071 int r;
00072
00073 sonmp = *mp;
00074 sonmp.arg = mp->arg;
00075
00076 r = 0;
00077 if (IS_DIR(entry)){
00078
00079 SubDir = OpenFileByDirentry(entry);
00080 initializeDirentry(&subEntry, SubDir);
00081 ret = 0;
00082 while((r=vfat_lookup(&subEntry, "*", 1,
00083 ACCEPT_DIR | ACCEPT_PLAIN,
00084 shortname, NULL)) == 0 ){
00085 if(shortname[0] != DELMARK &&
00086 shortname[0] &&
00087 shortname[0] != '.' ){
00088 if(arg->deltype != 2){
00089 fprintf(stderr,
00090 "Directory ");
00091 fprintPwd(stderr, entry,0);
00092 fprintf(stderr," non empty\n");
00093 ret = ERROR_ONE;
00094 break;
00095 }
00096 if(got_signal) {
00097 ret = ERROR_ONE;
00098 break;
00099 }
00100 ret = del_file(&subEntry, &sonmp);
00101 if( ret & ERROR_ONE)
00102 break;
00103 ret = 0;
00104 }
00105 }
00106 FREE(&SubDir);
00107 if (r == -2)
00108 return ERROR_ONE;
00109 if(ret)
00110 return ret;
00111 }
00112 return del_entry(entry, mp);
00113 }
00114
00115
00116 static void usage(void)
00117 {
00118 fprintf(stderr,
00119 "Mtools version %s, dated %s\n", mversion, mdate);
00120 fprintf(stderr,
00121 "Usage: %s [-v] msdosfile [msdosfiles...]\n"
00122 "\t-v Verbose\n",
00123 progname);
00124 exit(1);
00125 }
00126
00127 void mdel(int argc, char **argv, int deltype)
00128 {
00129 Arg_t arg;
00130 MainParam_t mp;
00131 int c,i;
00132
00133 arg.verbose = 0;
00134 while ((c = getopt(argc, argv, "v")) != EOF) {
00135 switch (c) {
00136 case 'v':
00137 arg.verbose = 1;
00138 break;
00139 default:
00140 usage();
00141 }
00142 }
00143
00144 if(argc == optind)
00145 usage();
00146
00147 init_mp(&mp);
00148 mp.callback = del_file;
00149 mp.arg = (void *) &arg;
00150 mp.openflags = O_RDWR;
00151 arg.deltype = deltype;
00152 switch(deltype){
00153 case 0:
00154 mp.lookupflags = ACCEPT_PLAIN;
00155 break;
00156 case 1:
00157 mp.lookupflags = ACCEPT_DIR;
00158 break;
00159 case 2:
00160 mp.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN;
00161 break;
00162 }
00163 mp.lookupflags |= NO_DOTS;
00164 for(i=optind;i<argc;i++) {
00165 int b,l;
00166 b = skip_drive(argv[i]) - argv[i];
00167 l = strlen(argv[i]+b);
00168 if(l > 1 && argv[i][b+l-1] == '/')
00169 argv[i][b+l-1] = '\0';
00170 }
00171
00172 exit(main_loop(&mp, argv + optind, argc - optind));
00173 }