/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1982-2007 AT&T Knowledge Ventures * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Knowledge Ventures * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * David Korn * * * ***********************************************************************/ #pragma prototyped /* * umask [-S] [mask] * * David Korn * AT&T Labs * research!dgk * */ #include #include #include #include #include #include #include "builtins.h" #ifndef SH_DICT # define SH_DICT "libshell" #endif int b_umask(int argc,char *argv[],void *extra) { register char *mask; register int flag = 0, sflag = 0; NOT_USED(extra); while((argc = optget(argv,sh_optumask))) switch(argc) { case 'S': sflag++; break; case ':': errormsg(SH_DICT,2, "%s", opt_info.arg); break; case '?': errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg); break; } if(error_info.errors) errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); argv += opt_info.index; if(mask = *argv) { register int c; if(isdigit(*mask)) { while(c = *mask++) { if (c>='0' && c<='7') flag = (flag<<3) + (c-'0'); else errormsg(SH_DICT,ERROR_exit(1),e_number,*argv); } } else { char *cp = mask; flag = umask(0); c = strperm(cp,&cp,~flag); if(*cp) { umask(flag); errormsg(SH_DICT,ERROR_exit(1),e_format,mask); } flag = (~c&0777); } umask(flag); } else { umask(flag=umask(0)); if(sflag) sfprintf(sfstdout,"%s\n",fmtperm(~flag&0777)); else sfprintf(sfstdout,"%0#4o\n",flag); } return(0); }