1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1982-2014 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * David Korn <dgkorn@gmail.com> *
18 * *
19 ***********************************************************************/
20 #pragma prototyped
21 /*
22 * umask [-pS] [mask]
23 *
24 * David Korn
25 * dgkorn@gmail.com
26 *
27 */
28
29 #include <ast.h>
30 #include <sfio.h>
31 #include <error.h>
32 #include <ctype.h>
33 #include <ls.h>
34 #include <shell.h>
35 #include "builtins.h"
36 #ifndef SH_DICT
37 # define SH_DICT "libshell"
38 #endif
39
b_umask(int argc,char * argv[],Shbltin_t * context)40 int b_umask(int argc,char *argv[],Shbltin_t *context)
41 {
42 register char *mask;
43 register int flag = 0;
44 register bool sflag=false, pflag=false;
45 NOT_USED(context);
46 while((argc = optget(argv,sh_optumask))) switch(argc)
47 {
48 case 'p':
49 pflag = true;
50 break;
51 case 'S':
52 sflag = true;
53 break;
54 case ':':
55 errormsg(SH_DICT,2, "%s", opt_info.arg);
56 break;
57 case '?':
58 errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
59 break;
60 }
61 if(error_info.errors)
62 errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
63 argv += opt_info.index;
64 if(mask = *argv)
65 {
66 register int c;
67 if(isdigit(*mask))
68 {
69 while(c = *mask++)
70 {
71 if (c>='0' && c<='7')
72 flag = (flag<<3) + (c-'0');
73 else
74 errormsg(SH_DICT,ERROR_exit(1),e_number,*argv);
75 }
76 }
77 else
78 {
79 char *cp = mask;
80 flag = umask(0);
81 c = strperm(cp,&cp,~flag&0777);
82 if(*cp)
83 {
84 umask(flag);
85 errormsg(SH_DICT,ERROR_exit(1),e_format,mask);
86 }
87 flag = (~c&0777);
88 }
89 umask(flag);
90 }
91 else
92 {
93 char *prefix = pflag?"umask ":"";
94 umask(flag=umask(0));
95 if(sflag)
96 sfprintf(sfstdout,"%s%s\n",prefix,fmtperm(~flag&0777));
97 else
98 sfprintf(sfstdout,"%s%0#4o\n",prefix,flag);
99 }
100 return(0);
101 }
102
103