mdel.c

Go to the documentation of this file.
00001 /*
00002  * mdel.c
00003  * Delete an MSDOS file
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                 /* a directory */
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; /* mdel */
00155                 break;
00156         case 1:
00157                 mp.lookupflags = ACCEPT_DIR; /* mrd */
00158                 break;
00159         case 2:
00160                 mp.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN; /* mdeltree */
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 }

Generated on Fri Apr 14 22:56:55 2006 for minix by  doxygen 1.4.6