move to debhelper compat 13, hopefully fixes cross-building
[debian/cpmtools] / cpmchattr.c
1 /* #includes */ /*{{{C}}}*//*{{{*/
2 #include "config.h"
3
4 #include <ctype.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdlib.h>
8
9 #include "getopt_.h"
10 #include "cpmfs.h"
11 /*}}}*/
12
13 const char cmd[]="cpmchattr";
14
15 int main(int argc, char *argv[]) /*{{{*/
16 {
17   /* variables */ /*{{{*/
18   const char *err;
19   const char *image;
20   const char *format;
21   const char *devopts=NULL;
22   int uppercase=0;
23   int c,i,usage=0,exitcode=0;
24   struct cpmSuperBlock drive;
25   struct cpmInode root;
26   int gargc;
27   char **gargv;
28   const char *attrs; 
29   /*}}}*/
30
31   /* parse options */ /*{{{*/
32   if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT;
33   while ((c=getopt(argc,argv,"T:f:uh?"))!=EOF) switch(c)
34   {
35     case 'T': devopts=optarg; break;
36     case 'f': format=optarg; break;
37     case 'u': uppercase=1; break;
38     case 'h':
39     case '?': usage=1; break;
40   }
41
42   if (optind>=(argc-2)) usage=1;
43   else 
44   {
45     image=argv[optind++];
46     attrs = argv[optind++];
47   }    
48
49   if (usage)
50   {
51     fprintf(stderr,"Usage: %s [-f format] [-T dsktype] [-u] image [NMrsa1234] pattern ...\n",cmd);
52     exit(1);
53   }
54   /*}}}*/
55   /* open image */ /*{{{*/
56   if ((err=Device_open(&drive.dev, image, O_RDWR, devopts)))
57   {
58     fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err);
59     exit(1);
60   }
61   if (cpmReadSuper(&drive,&root,format,uppercase)==-1)
62   {
63     fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo);
64     exit(1);
65   }
66   /*}}}*/
67   cpmglob(optind,argc,argv,&root,&gargc,&gargv);
68   for (i=0; i<gargc; ++i)
69   {
70     struct cpmInode ino;
71     int rc;
72     cpm_attr_t attrib;
73
74     rc = cpmNamei(&root,gargv[i], &ino)==-1;
75     if (!rc) rc = cpmAttrGet(&ino, &attrib);
76     if (!rc)
77     {
78         unsigned int n;
79         int m;
80
81         m = 0;
82         for (n = 0; n < strlen(attrs); n++)
83         {
84           int mask = 0;
85           switch (attrs[n])
86           {
87             case 'n':
88             case 'N': mask = 0; attrib = 0; break;
89             case 'm':
90             case 'M': mask = 0; m = !m;   break;
91             case '1': mask = CPM_ATTR_F1; break;
92             case '2': mask = CPM_ATTR_F2; break;
93             case '3': mask = CPM_ATTR_F3; break;
94             case '4': mask = CPM_ATTR_F4; break;
95             case 'r': 
96             case 'R': mask = CPM_ATTR_RO; break;
97             case 's':
98             case 'S': mask = CPM_ATTR_SYS; break;
99             case 'a':
100             case 'A': mask = CPM_ATTR_ARCV; break;
101             default: fprintf(stderr, "%s: Unknown attribute %c\n", cmd, attrs[n]);
102                      exit(1);
103           } 
104           if (m) attrib &= ~mask; else attrib |= mask;
105         }
106         rc = cpmAttrSet(&ino, attrib);
107     }
108     if (rc)
109     {
110       fprintf(stderr,"%s: can not set attributes for %s: %s\n",cmd,gargv[i],boo);
111       exitcode=1;
112     }
113   }
114   cpmUmount(&drive);
115   exit(exitcode);
116 }
117 /*}}}*/