home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / disk-man / mtools-3.000 / mtools-3 / mtools-3.0 / mattrib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-08  |  2.5 KB  |  140 lines

  1. /*
  2.  * mattrib.c
  3.  * Change MSDOS file attribute flags
  4.  */
  5.  
  6. #include "sysincludes.h"
  7. #include "msdos.h"
  8. #include "mtools.h"
  9. #include "streamcache.h"
  10.  
  11. typedef struct Arg_t {
  12.     char add;
  13.     unsigned char remove;
  14.     struct StreamCache_t sc;
  15. } Arg_t;
  16.  
  17. static int attrib_file(Stream_t *Dir, StreamCache_t *sc, int entry)
  18. {
  19.     Arg_t *arg=(Arg_t *) sc->arg;
  20.  
  21.     sc->dir.attr = (sc->dir.attr & arg->remove) | arg->add;
  22.     dir_write(Dir,entry,& sc->dir);
  23.     return GOT_ONE;
  24. }
  25.  
  26.  
  27. static int view_attrib(Stream_t *Dir, StreamCache_t *sc, int entry)
  28. {
  29.     printf("  ");
  30.     if(sc->dir.attr & 0x20)
  31.         putchar('A');
  32.     else
  33.         putchar(' ');
  34.     fputs("  ",stdout);
  35.     if(sc->dir.attr & 0x4)
  36.         putchar('S');
  37.     else
  38.         putchar(' ');
  39.     if(sc->dir.attr & 0x2)
  40.         putchar('H');
  41.     else
  42.         putchar(' ');
  43.     if(sc->dir.attr & 0x1)
  44.         putchar('R');
  45.     else
  46.         putchar(' ');
  47.     printf("     %c:%s", sc->drivename, sc->pathname);
  48.     if(strlen(sc->pathname) != 1 )
  49.         putchar('/');    
  50.     puts(sc->outname);
  51.     return 3;
  52. }
  53.  
  54. void mattrib(int argc, char **argv, int type)
  55. {
  56.     Arg_t arg;
  57.     enum action_type { LEAVE, ADD, REMOVE} action;
  58.     int oops, fargn, view;
  59.     char code = 0;
  60.     int i,ret;
  61.     char filename[VBUFSIZE];
  62.     char pathname[MAX_PATH];
  63.  
  64.     oops = 0;
  65.     fargn = 1;
  66.     arg.add = 0;
  67.     arg.remove = 0xff;
  68.     view = 1;
  69.  
  70.     /* can't use getopt(3)... */
  71.     for (i = 1; i < argc; i++) {
  72.         action = LEAVE;  /* avoid compiler warnings */
  73.         switch (argv[i][0]) {
  74.             case '-':
  75.                 action = REMOVE;
  76.                 break;
  77.             case '+':
  78.                 action = ADD;
  79.                 break;
  80.             default:
  81.                 fargn = i;
  82.                 goto break2;
  83.         }
  84.         switch (toupper(argv[i][1])) {
  85.         case 'A':
  86.             code = 0x20;
  87.             break;
  88.         case 'H':
  89.             code = 0x2;
  90.             break;
  91.         case 'R':
  92.             code = 0x1;
  93.             break;
  94.         case 'S':
  95.             code = 0x4;
  96.             break;
  97.         case'?':
  98.             oops++;
  99.             break;
  100.         }
  101.         if (oops)
  102.             break;
  103.         view = 0;
  104.         switch(action){
  105.         case ADD:
  106.             arg.add |= code;
  107.             break;
  108.         case REMOVE:
  109.             arg.remove &= ~code;
  110.             break;
  111.         case LEAVE:
  112.             break;
  113.         }            
  114.     }
  115.  
  116.  break2:
  117.     if (argc <= fargn || argv[fargn][0] == '\0' || oops) {
  118.         fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  119.         fprintf(stderr, "Usage: %s [-V] [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...]\n", argv[0]);
  120.         cleanup_and_exit(1);
  121.     }
  122.  
  123.     init_sc(&arg.sc);
  124.     if(view){
  125.         arg.sc.callback = view_attrib;
  126.         arg.sc.openflags = O_RDONLY;
  127.     } else {
  128.         arg.sc.callback = attrib_file;
  129.         arg.sc.openflags = O_RDWR;
  130.     }
  131.  
  132.     arg.sc.outname = filename;
  133.     arg.sc.arg = (void *) &arg;
  134.     arg.sc.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR;
  135.     arg.sc.pathname = pathname;
  136.     ret=main_loop(&arg.sc, argv[0], argv + fargn, argc - fargn);
  137.     finish_sc(&arg.sc);
  138.     cleanup_and_exit(ret);
  139. }
  140.