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