annotate sbr/makedir.c @ 10:a6481689f99c

*** empty log message ***
author kono
date Wed, 06 Dec 2006 03:17:53 +0900
parents bce86c4163a3
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* makedir.c - make a directory */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #if defined (BSD42) || defined (hpux)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 /* Modified to try recursive create. Really, this should be broken
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 * out into a subr so that SYS5 systems can do this too. I don't
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 * have a SYS5 machine around to test anymore, so someone else will
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 * have to send me the code.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #if defined (BSD42) || defined(SVR4) || \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 defined (hpux) || defined(sgi) || defined(__osf__) || defined(ncr) || \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 defined (_AIX) || defined(AUX) || defined(linux) || defined(__CYGWIN32__)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #include <sys/param.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #include <sys/file.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #endif /* BSD42 ... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif /* SYS5DIR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #if defined(SVR4) || defined(ncr) || defined(UNISTD)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31
10
a6481689f99c *** empty log message ***
kono
parents: 0
diff changeset
32 #include <errno.h>
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 makedir (dir)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 register char *dir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 int pid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #if defined (BSD42) || defined (hpux) || defined (SYS5DIR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 register char *c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 char path[MAXPATHLEN];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #if defined (BSD42) || defined (hpux) || defined (SYS5DIR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 if (getuid () == geteuid ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 c = strcpy(path, dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 while ((c = index((c + 1), '/')) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 *c = (char)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 if (access(path, X_OK)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 if (errno != ENOENT){
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 advise (dir, "unable to create directory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 if (mkdir(path, 0775)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 advise (dir, "unable to create directory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 *c = '/';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 if (mkdir (dir, 0755) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 advise (dir, "unable to create directory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 #endif /* BSD42 or hpux or SYS5DIR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 switch (pid = vfork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 advise ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 (void) setgid (getgid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 execl ("/bin/mkdir", "mkdir", dir, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 execl ("/usr/bin/mkdir", "mkdir", dir, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 perror ("mkdir");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 if (pidXwait (pid, "mkdir"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 if ((cp = m_find ("folder-protect")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 cp = foldprot;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 (void) chmod (dir, atooi (cp));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99