/* * Change MSDOS file attribute flags * * Emmet P. Gray US Army, HQ III Corps & Fort Hood * ...!uunet!uiucuxc!fthood!egray Attn: AFZF-DE-ENV * fthood!egray@uxc.cso.uiuc.edu Directorate of Engineering & Housing * Environmental Management Office * Fort Hood, TX 76544-5057 */ #include #include "msdos.h" #include "patchlevel.h" int fd = -1; /* the file descriptor for the device */ int dir_start; /* starting sector for directory */ int dir_len; /* length of directory (in sectors) */ int dir_entries; /* number of directory entries */ int clus_size; /* cluster size (in sectors) */ char *mcwd; /* the Current Working Directory */ int fat_error; /* FAT error detected? */ #define ADD 1 #define REMOVE (-1) #define LEAVE 0 main(argc, argv) int argc; char *argv[]; { int entry, ismatch, oops, fargn, read_only, hidden, sys, archive; int i, action; char *filename, *newfile, *unix_name(), drive, get_drive(); char *get_path(), *pathname, *get_name(), *fix_mcwd(), last_drive; void exit(), dir_write(), dir_flush(), disk_flush(); struct directory *dir, *dir_read(); oops = 0; fargn = -1; archive = LEAVE; hidden = LEAVE; read_only = LEAVE; sys = LEAVE; /* can't use getopt(3)... */ for (i = 1; i < argc; i++) { switch (argv[i][0]) { case '-': action = REMOVE; break; case '+': action = ADD; break; default: fargn = i; break; } if (fargn != -1) break; switch (argv[i][1]) { case 'a': case 'A': archive = action; break; case 'h': case 'H': hidden = action; break; case 'r': case 'R': read_only = action; break; case 's': case 'S': sys = action; break; default: oops++; break; } if (oops) break; } if (argc < 3 || argv[fargn][0] == '\0' || oops) { fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE); fprintf(stderr, "Usage: %s [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...]\n", argv[0]); exit(1); } last_drive = 'x'; mcwd = fix_mcwd(); for (i = fargn; i < argc; i++) { drive = get_drive(argv[i]); if (last_drive != drive) { if (init(drive, 2)) { fprintf(stderr, "%s: Cannot initialize '%c:'\n", argv[0], drive); continue; } last_drive = drive; } filename = get_name(argv[i]); pathname = get_path(argv[i]); if (subdir(drive, pathname)) continue; /* see if exists and do it */ ismatch = 0; for (entry = 0; entry < dir_entries; entry++) { dir = dir_read(entry); /* if empty */ if (dir->name[0] == 0x0) break; /* if erased */ if (dir->name[0] == 0xe5) continue; /* if dir or volume label */ if ((dir->attr & 0x10) || (dir->attr & 0x08)) continue; newfile = unix_name(dir->name, dir->ext); /* do it... */ if (match(newfile, filename)) { if (archive == ADD) dir->attr |= 0x20; if (archive == REMOVE) dir->attr &= ~0x20; if (hidden == ADD) dir->attr |= 0x02; if (hidden == REMOVE) dir->attr &= ~0x02; if (read_only == ADD) dir->attr |= 0x01; if (read_only == REMOVE) dir->attr &= ~0x01; if (sys == ADD) dir->attr |= 0x04; if (sys == REMOVE) dir->attr &= ~0x04; dir_write(entry, dir); ismatch++; } } if (!ismatch) fprintf(stderr, "%s: File \"%s\" not found\n", argv[0], filename); } dir_flush(); disk_flush(); close(fd); exit(0); }