Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libcmd / mkdir.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: mkdir.c /main/3 1995/11/01 19:06:47 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 static const char id[] = "\n@(#)mkdir (AT&T Bell Laboratories) 02/14/95\0\n";
94
95 #include <cmdlib.h>
96 #include <ls.h>
97
98 #define DIRMODE (S_IRWXU|S_IRWXG|S_IRWXO)
99
100 int
101 b_mkdir __PARAM__((int argc, char *argv[]), (argc, argv)) __OTORP__(int argc; char *argv[];){
102         register char *arg;
103         register mode_t mode=DIRMODE, mask;
104         register int n, mflag=0, pflag=0;
105         mode_t dmode;
106
107         NoP(argc);
108         NoP(id[0]);
109         cmdinit(argv);
110         while (n = optget(argv, "pm:[mode] directory ...")) switch (n)
111         {
112         case 'p':
113                 pflag=1;
114                 break;
115         case 'm':
116                 mflag=1;
117                 mode = strperm(arg=opt_info.arg,&opt_info.arg,mode);
118                 if(*opt_info.arg)
119                         error(ERROR_exit(0),"%s: invalid mode",arg);
120                 break;
121         case ':':
122                 error(2, opt_info.arg);
123                 break;
124         case '?':
125                 error(ERROR_usage(2), opt_info.arg);
126                 break;
127         }
128         argv += opt_info.index;
129         if(error_info.errors || !*argv)
130                 error(ERROR_usage(2),optusage(NiL));
131         if(mflag || pflag)
132         {
133                 umask(mask = umask(0));
134                 dmode = (DIRMODE&~mask)|S_IWUSR|S_IXUSR;
135         }
136         while(arg = *argv++)
137         {
138                 if(mkdir(arg,mode) < 0)
139                 {
140                         char *name;
141                         if(!pflag || !(errno==ENOENT || errno==EEXIST))
142                         {
143                                 error(ERROR_system(0),"%s:",arg);
144                                 continue;
145                         }
146                         if(errno==EEXIST)
147                                 continue;
148                         /* -p option, preserve intermediates */
149                         /* first eliminate trailing /'s */
150                         n = strlen(arg);
151                         while(n>0 && arg[--n]=='/');
152                         arg[n+1]=0;
153                         for(name=arg,n= *arg;n;)
154                         {
155                                 /* skip over slashes */
156                                 while(*arg=='/')
157                                         arg++;
158                                 /* skip to next component */
159                                 while((n= *arg) && n!='/')
160                                         arg++;
161                                 *arg = 0;
162                                 if(access(name, X_OK) && mkdir(name,n?dmode:mode))
163                                 {
164                                         *arg = n;
165                                         error(ERROR_system(0),"%s:",name);
166                                         break;
167                                 }
168                                 *arg = n;
169                         }
170                 }
171         }
172         return(error_info.errors!=0);
173 }