1*433d6423SLionel Sambuc /* test22: umask() (p) Jan-Mark Wams. email: jms@cs.vu.nl */
2*433d6423SLionel Sambuc
3*433d6423SLionel Sambuc #include <sys/types.h>
4*433d6423SLionel Sambuc #include <sys/stat.h>
5*433d6423SLionel Sambuc #include <errno.h>
6*433d6423SLionel Sambuc #include <fcntl.h>
7*433d6423SLionel Sambuc #include <unistd.h>
8*433d6423SLionel Sambuc #include <stdlib.h>
9*433d6423SLionel Sambuc #include <sys/wait.h>
10*433d6423SLionel Sambuc #include <stdio.h>
11*433d6423SLionel Sambuc
12*433d6423SLionel Sambuc #include "common.h"
13*433d6423SLionel Sambuc
14*433d6423SLionel Sambuc #define ITERATIONS 2
15*433d6423SLionel Sambuc
16*433d6423SLionel Sambuc #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd)
17*433d6423SLionel Sambuc #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir)
18*433d6423SLionel Sambuc #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a)
19*433d6423SLionel Sambuc
20*433d6423SLionel Sambuc
21*433d6423SLionel Sambuc void test22a(void);
22*433d6423SLionel Sambuc int mode(char *filename);
23*433d6423SLionel Sambuc int umode(char *filename);
24*433d6423SLionel Sambuc void quit(void);
25*433d6423SLionel Sambuc
main(int argc,char * argv[])26*433d6423SLionel Sambuc int main(int argc, char *argv[])
27*433d6423SLionel Sambuc {
28*433d6423SLionel Sambuc int i, m = 0xFFFF;
29*433d6423SLionel Sambuc
30*433d6423SLionel Sambuc sync();
31*433d6423SLionel Sambuc if (argc == 2) m = atoi(argv[1]);
32*433d6423SLionel Sambuc start(22);
33*433d6423SLionel Sambuc
34*433d6423SLionel Sambuc for (i = 0; i < ITERATIONS; i++) {
35*433d6423SLionel Sambuc if (m & 0001) test22a();
36*433d6423SLionel Sambuc }
37*433d6423SLionel Sambuc
38*433d6423SLionel Sambuc quit();
39*433d6423SLionel Sambuc
40*433d6423SLionel Sambuc return (-1); /* Unreachable */
41*433d6423SLionel Sambuc }
42*433d6423SLionel Sambuc
test22a()43*433d6423SLionel Sambuc void test22a()
44*433d6423SLionel Sambuc {
45*433d6423SLionel Sambuc int fd1, fd2;
46*433d6423SLionel Sambuc int i, oldmask;
47*433d6423SLionel Sambuc int stat_loc; /* For the wait sys call. */
48*433d6423SLionel Sambuc
49*433d6423SLionel Sambuc subtest = 1;
50*433d6423SLionel Sambuc
51*433d6423SLionel Sambuc system("chmod 777 ../DIR_22/* ../DIR_22/*/* > /dev/null 2>&1");
52*433d6423SLionel Sambuc System("rm -rf ../DIR_22/*");
53*433d6423SLionel Sambuc
54*433d6423SLionel Sambuc oldmask = 0123; /* Set oldmask and umask. */
55*433d6423SLionel Sambuc umask(oldmask); /* Set oldmask and umask. */
56*433d6423SLionel Sambuc
57*433d6423SLionel Sambuc /* Check all the possible values of umask. */
58*433d6423SLionel Sambuc for (i = 0000; i <= 0777; i++) {
59*433d6423SLionel Sambuc if (oldmask != umask(i)) e(1); /* set umask() */
60*433d6423SLionel Sambuc fd1 = open("open", O_CREAT, 0777);
61*433d6423SLionel Sambuc if (fd1 != 3) e(2); /* test open(), */
62*433d6423SLionel Sambuc fd2 = creat("creat", 0777);
63*433d6423SLionel Sambuc if (fd2 != 4) e(3); /* creat(), */
64*433d6423SLionel Sambuc if (mkdir("dir", 0777) != 0) e(4); /* mkdir(), */
65*433d6423SLionel Sambuc if (mkfifo("fifo", 0777) != 0) e(5); /* and mkfifo(). */
66*433d6423SLionel Sambuc
67*433d6423SLionel Sambuc if (umode("open") != i) e(6); /* see if they have */
68*433d6423SLionel Sambuc if (umode("creat") != i) e(7); /* the proper mode */
69*433d6423SLionel Sambuc if (umode("dir") != i) e(8);
70*433d6423SLionel Sambuc if (umode("fifo") != i) e(9);
71*433d6423SLionel Sambuc
72*433d6423SLionel Sambuc /* Clean up */
73*433d6423SLionel Sambuc if (close(fd1) != 0) e(10);
74*433d6423SLionel Sambuc if (close(fd2) != 0) e(11); /* close fd's and */
75*433d6423SLionel Sambuc unlink("open"); /* clean the dir */
76*433d6423SLionel Sambuc unlink("creat");
77*433d6423SLionel Sambuc rmdir("dir");
78*433d6423SLionel Sambuc unlink("fifo");
79*433d6423SLionel Sambuc oldmask = i; /* save current mask */
80*433d6423SLionel Sambuc }
81*433d6423SLionel Sambuc
82*433d6423SLionel Sambuc /* Check-reset mask */
83*433d6423SLionel Sambuc if (umask(0124) != 0777) e(12);
84*433d6423SLionel Sambuc
85*433d6423SLionel Sambuc /* Check if a umask of 0000 leaves the modes alone. */
86*433d6423SLionel Sambuc if (umask(0000) != 0124) e(13);
87*433d6423SLionel Sambuc for (i = 0000; i <= 0777; i++) {
88*433d6423SLionel Sambuc fd1 = open("open", O_CREAT, i);
89*433d6423SLionel Sambuc if (fd1 != 3) e(14); /* test open(), */
90*433d6423SLionel Sambuc fd2 = creat("creat", i);
91*433d6423SLionel Sambuc if (fd2 != 4) e(15); /* creat(), */
92*433d6423SLionel Sambuc if (mkdir("dir", i) != 0) e(16); /* mkdir(), */
93*433d6423SLionel Sambuc if (mkfifo("fifo", i) != 0) e(17); /* and mkfifo(). */
94*433d6423SLionel Sambuc
95*433d6423SLionel Sambuc if (mode("open") != i) e(18); /* see if they have */
96*433d6423SLionel Sambuc if (mode("creat") != i) e(19); /* the proper mode */
97*433d6423SLionel Sambuc if (mode("dir") != i) e(20);
98*433d6423SLionel Sambuc if (mode("fifo") != i) e(21);
99*433d6423SLionel Sambuc
100*433d6423SLionel Sambuc /* Clean up */
101*433d6423SLionel Sambuc if (close(fd1) != 0) e(22);
102*433d6423SLionel Sambuc if (close(fd2) != 0) e(23);
103*433d6423SLionel Sambuc if (unlink("open") != 0) e(24);
104*433d6423SLionel Sambuc unlink("creat");
105*433d6423SLionel Sambuc rmdir("dir");
106*433d6423SLionel Sambuc unlink("fifo");
107*433d6423SLionel Sambuc }
108*433d6423SLionel Sambuc
109*433d6423SLionel Sambuc /* Check if umask survives a fork() */
110*433d6423SLionel Sambuc if (umask(0124) != 0000) e(25);
111*433d6423SLionel Sambuc switch (fork()) {
112*433d6423SLionel Sambuc case -1: fprintf(stderr, "Can't fork\n"); break;
113*433d6423SLionel Sambuc case 0:
114*433d6423SLionel Sambuc mkdir("bar", 0777); /* child makes a dir */
115*433d6423SLionel Sambuc exit(0);
116*433d6423SLionel Sambuc default:
117*433d6423SLionel Sambuc if (wait(&stat_loc) == -1) e(26);
118*433d6423SLionel Sambuc }
119*433d6423SLionel Sambuc if (umode("bar") != 0124) e(27);
120*433d6423SLionel Sambuc rmdir("bar");
121*433d6423SLionel Sambuc
122*433d6423SLionel Sambuc /* Check if umask in child changes umask in parent. */
123*433d6423SLionel Sambuc switch (fork()) {
124*433d6423SLionel Sambuc case -1: fprintf(stderr, "Can't fork\n"); break;
125*433d6423SLionel Sambuc case 0:
126*433d6423SLionel Sambuc switch (fork()) {
127*433d6423SLionel Sambuc case -1:
128*433d6423SLionel Sambuc fprintf(stderr, "Can't fork\n");
129*433d6423SLionel Sambuc break;
130*433d6423SLionel Sambuc case 0:
131*433d6423SLionel Sambuc if (umask(0432) != 0124) e(28);
132*433d6423SLionel Sambuc exit(0);
133*433d6423SLionel Sambuc default:
134*433d6423SLionel Sambuc if (wait(&stat_loc) == -1) e(29);
135*433d6423SLionel Sambuc }
136*433d6423SLionel Sambuc if (umask(0423) != 0124) e(30);
137*433d6423SLionel Sambuc exit(0);
138*433d6423SLionel Sambuc default:
139*433d6423SLionel Sambuc if (wait(&stat_loc) == -1) e(31);
140*433d6423SLionel Sambuc }
141*433d6423SLionel Sambuc if (umask(0342) != 0124) e(32);
142*433d6423SLionel Sambuc
143*433d6423SLionel Sambuc /* See if extra bits are ignored */
144*433d6423SLionel Sambuc if (umask(0xFFFF) != 0342) e(33);
145*433d6423SLionel Sambuc if (umask(0xFE00) != 0777) e(34);
146*433d6423SLionel Sambuc if (umask(01777) != 0000) e(35);
147*433d6423SLionel Sambuc if (umask(0022) != 0777) e(36);
148*433d6423SLionel Sambuc }
149*433d6423SLionel Sambuc
mode(arg)150*433d6423SLionel Sambuc int mode(arg)
151*433d6423SLionel Sambuc char *arg;
152*433d6423SLionel Sambuc { /* return the file mode. */
153*433d6423SLionel Sambuc struct stat st;
154*433d6423SLionel Sambuc Stat(arg, &st);
155*433d6423SLionel Sambuc return st.st_mode & 0777;
156*433d6423SLionel Sambuc }
157*433d6423SLionel Sambuc
umode(arg)158*433d6423SLionel Sambuc int umode(arg)
159*433d6423SLionel Sambuc char *arg;
160*433d6423SLionel Sambuc { /* return the umask used for this file */
161*433d6423SLionel Sambuc return 0777 ^ mode(arg);
162*433d6423SLionel Sambuc }
163*433d6423SLionel Sambuc
164