move to debhelper compat 13, hopefully fixes cross-building
[debian/cpmtools] / cpmchmod.c
1 /* #includes */ /*{{{C}}}*//*{{{*/
2 #include "config.h"
3
4 #include <ctype.h>
5 #include <errno.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <stdlib.h>
9
10 #include "getopt_.h"
11 #include "cpmfs.h"
12 /*}}}*/
13
14 const char cmd[]="cpmchmod";
15
16 int main(int argc, char *argv[]) /*{{{*/
17 {
18   /* variables */ /*{{{*/
19   const char *err;
20   const char *image;
21   const char *format;
22   const char *devopts=NULL;
23   int uppercase=0;
24   int c,i,usage=0,exitcode=0;
25   struct cpmSuperBlock drive;
26   struct cpmInode root;
27   int gargc;
28   char **gargv;
29   unsigned int mode; 
30   /*}}}*/
31
32   /* parse options */ /*{{{*/
33   if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT;
34   while ((c=getopt(argc,argv,"T:f:uh?"))!=EOF) switch(c)
35   {
36     case 'T': devopts=optarg; break;
37     case 'f': format=optarg; break;
38     case 'u': uppercase=1; break;
39     case 'h':
40     case '?': usage=1; break;
41   }
42
43   if (optind>=(argc-2)) usage=1;
44   else 
45   {
46     image=argv[optind++];
47     if (!sscanf(argv[optind++], "%o", &mode)) usage=1;
48   }    
49
50   if (usage)
51   {
52     fprintf(stderr,"Usage: %s [-f format] [-u] image mode pattern ...\n",cmd);
53     exit(1);
54   }
55   /*}}}*/
56   /* open image */ /*{{{*/
57   if ((err=Device_open(&drive.dev, image, O_RDWR, devopts)))
58   {
59     fprintf(stderr,"%s: cannot open %s (%s)\n",cmd,image,err);
60     exit(1);
61   }
62   if (cpmReadSuper(&drive,&root,format,uppercase)==-1)
63   {
64     fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo);
65     exit(1);
66   }
67   /*}}}*/
68   cpmglob(optind,argc,argv,&root,&gargc,&gargv);
69   for (i=0; i<gargc; ++i)
70   {
71     struct cpmInode ino;
72
73     if (cpmNamei(&root,gargv[i], &ino)==-1)
74     {
75       fprintf(stderr,"%s: can not find %s: %s\n",cmd,gargv[i],boo);
76       exitcode=1;
77     }
78     else if (cpmChmod(&ino, mode) == -1)
79     {
80       fprintf(stderr,"%s: Failed to set attributes for %s: %s\n",cmd,gargv[i],boo);
81       exitcode=1;
82     }
83   }
84   cpmUmount(&drive);
85   exit(exitcode);
86 }
87 /*}}}*/