annotate cpy.c @ 2:0b424b791e12

Uploaded
author david-hoover
date Tue, 28 Feb 2012 12:32:29 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
1 #include <sys/stat.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
2 #include <sys/types.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
3 #include <unistd.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
4 #include <stdio.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
5 #include <errno.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
6 #include <stdlib.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
7 #include <pwd.h>
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
8 #include <grp.h> // declares struct group
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
9 #include <libgen.h> // for dirname
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
10 #include <string.h> // for strcpy
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
11
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
12 /* cpy.c David Hoover 1/20/12
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
13 usage:
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
14 cpy from.file to.file login
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
15
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
16 cpy copies a file from one location to another, and then sets the ownership to a given user. The
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
17 program is expected to be setuid and owned by root.
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
18
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
19 */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
20
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
21 int notWriteable(char *file, char *user)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
22 /* Returns 1 if file not writeable by given user */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
23 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
24 struct stat fileStat;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
25 struct passwd *own,*usr;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
26 struct group *grp;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
27 int i=0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
28
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
29 usr = getpwnam(user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
30
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
31 /* does user exist? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
32 if (! usr)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
33 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
34 fprintf(stderr,"%s: No such user\n",user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
35 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
36 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
37
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
38 /* must be able to stat file */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
39 if (stat(file, &fileStat) < 0)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
40 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
41 fprintf(stderr,"%s: No such directory\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
42 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
43 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
44
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
45 /* get the owner and group information for the file */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
46 own = getpwuid(fileStat.st_uid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
47 grp = getgrgid(fileStat.st_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
48
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
49 /* does the file owner match the argument? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
50 // if (!strcmp(own->pw_name,user))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
51 if (usr->pw_uid == fileStat.st_uid)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
52 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
53 // printf("owners match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
54
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
55 /* is file writeable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
56 if (fileStat.st_mode & S_IWUSR)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
57 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
58 // printf("%s is writeable by %s\n",file,user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
59 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
60 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
61 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
62 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
63 // printf("%s is not writeable by %s\n",file,user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
64 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
65 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
66 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
67 // printf("owners don't match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
68 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
69
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
70 /* is the file group readable by the given group? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
71 if (fileStat.st_mode & S_IWGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
72 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
73 // printf("%s is writeable by group %s\n",file,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
74
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
75
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
76 /* is the user's gid the same as the file? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
77 // printf("%d\n",usr->pw_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
78 // printf("%d\n",fileStat.st_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
79 if (usr->pw_gid == fileStat.st_gid)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
80 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
81 // printf("groups match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
82
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
83 /* if the path a directory is it executable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
84 if (S_ISDIR(fileStat.st_mode))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
85 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
86 if (fileStat.st_mode & S_IXGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
87 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
88 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
89 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
90 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
91 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
92 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
93 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
94 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
95 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
96 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
97
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
98 /* is the user a member of the group that owns the file? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
99 while(grp->gr_mem[i] != NULL)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
100 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
101 if(!strcmp(grp->gr_mem[i],user))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
102 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
103 // printf("%s is a member of the %s group\n",user,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
104 /* if the path a directory is it executable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
105 if (S_ISDIR(fileStat.st_mode))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
106 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
107 if (fileStat.st_mode & S_IXGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
108 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
109 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
110 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
111 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
112 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
113 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
114 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
115 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
116 i++;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
117 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
118
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
119 // printf("%s is not a member of the %s group\n",user,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
120
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
121 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
122 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
123 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
124 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
125 // printf("%s is not writeable by group %s\n",file,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
126 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
127
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
128 /* is the e world writeable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
129 if (fileStat.st_mode & S_IWOTH)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
130 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
131 // printf("%s is world writeable\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
132 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
133 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
134 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
135 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
136 // printf("%s is not world writeable\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
137 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
138
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
139 return 1;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
140 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
141
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
142 int notReadable(char *file, char *user)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
143 /* Returns 1 if file not readable by given user */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
144 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
145 struct stat fileStat;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
146 struct passwd *own,*usr;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
147 struct group *grp;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
148 int i=0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
149
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
150 usr = getpwnam(user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
151
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
152 /* does user exist? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
153 if (! usr)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
154 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
155 fprintf(stderr,"%s: No such user\n",user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
156 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
157 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
158
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
159 /* must be able to stat file */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
160 if (stat(file, &fileStat) < 0)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
161 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
162 fprintf(stderr,"%s: No such directory\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
163 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
164 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
165
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
166 /* get the owner and group information for the file */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
167 own = getpwuid(fileStat.st_uid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
168 grp = getgrgid(fileStat.st_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
169
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
170 /* does the file owner match the argument? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
171 // if (!strcmp(own->pw_name,user))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
172 if (usr->pw_uid == fileStat.st_uid)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
173 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
174 // printf("owners match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
175
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
176 /* is file readable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
177 if (fileStat.st_mode & S_IRUSR)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
178 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
179 // printf("%s is readable by %s\n",file,user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
180 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
181 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
182 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
183 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
184 // printf("%s is not readable by %s\n",file,user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
185 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
186 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
187 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
188 // printf("owners don't match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
189 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
190
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
191 /* is the file group readable by the given group? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
192 if (fileStat.st_mode & S_IRGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
193 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
194 // printf("%s is readable by group %s\n",file,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
195
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
196
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
197 /* is the user's gid the same as the file? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
198 // printf("%d\n",usr->pw_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
199 // printf("%d\n",fileStat.st_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
200 if (usr->pw_gid == fileStat.st_gid)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
201 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
202 // printf("groups match!\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
203
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
204 /* if the path a directory is it executable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
205 if (S_ISDIR(fileStat.st_mode))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
206 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
207 if (fileStat.st_mode & S_IXGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
208 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
209 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
210 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
211 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
212 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
213 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
214 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
215 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
216 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
217 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
218
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
219 /* is the user a member of the group that owns the file? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
220 while(grp->gr_mem[i] != NULL)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
221 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
222 if(!strcmp(grp->gr_mem[i],user))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
223 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
224 // printf("%s is a member of the %s group\n",user,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
225 /* if the path a directory is it executable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
226 if (S_ISDIR(fileStat.st_mode))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
227 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
228 if (fileStat.st_mode & S_IXGRP)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
229 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
230 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
231 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
232 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
233 else {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
234 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
235 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
236 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
237 i++;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
238 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
239
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
240 // printf("%s is not a member of the %s group\n",user,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
241
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
242 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
243 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
244 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
245 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
246 // printf("%s is not readable by group %s\n",file,grp->gr_name);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
247 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
248
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
249 /* is the e world readable? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
250 if (fileStat.st_mode & S_IROTH)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
251 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
252 // printf("%s is world readable\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
253 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
254 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
255 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
256 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
257 // printf("%s is not world readable\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
258 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
259
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
260 return 1;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
261 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
262
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
263 int copyFile(char *src, char *dst)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
264 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
265 // printf("Copying %s to %s\n",src,dst);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
266
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
267 int c;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
268 FILE *fs,*ft;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
269 struct stat fileStat;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
270
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
271 /* must be able to stat file */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
272 if (stat(src, &fileStat) < 0)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
273 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
274 fprintf(stderr,"%s: No such file\n",src);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
275 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
276 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
277
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
278 /* is path a regular file? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
279 if (S_ISDIR(fileStat.st_mode))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
280 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
281 fprintf(stderr,"%s: Is a directory\n",src);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
282 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
283 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
284
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
285 fs = fopen(src,"r");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
286 if (fs==NULL) {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
287 fprintf(stderr,"Can't read from file %s!\n",src);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
288 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
289 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
290 ft = fopen(dst,"w");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
291 if (ft==NULL) {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
292 fprintf(stderr,"Can't write to file %s!\n",dst);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
293 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
294 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
295
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
296 c = getc(fs);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
297 while (c != EOF) {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
298 putc(c,ft);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
299 c = getc(fs);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
300 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
301
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
302 fclose(fs);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
303 fclose(ft);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
304
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
305 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
306
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
307 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
308
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
309 int chownToGivenUser(char *file, char *user)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
310 /* chown a file to the given user */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
311 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
312 struct passwd *usr;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
313
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
314 usr = getpwnam(user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
315
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
316 // printf("UID = %d\n",usr->pw_uid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
317 // printf("GID = %d\n",usr->pw_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
318
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
319 // printf("chown %s %d,%d\n",file,usr->pw_uid,usr->pw_gid);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
320 if (chown(file,usr->pw_uid,usr->pw_gid))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
321 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
322 fprintf(stderr,"Can't chown %s\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
323 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
324 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
325 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
326 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
327
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
328 int explodePath(char *file, char *user)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
329 /* Returns 1 if file not readable by given user */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
330 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
331 char **path;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
332 char *dir;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
333 char newfile[10000];
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
334 int i;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
335
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
336 strcpy(newfile,file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
337 if (!notReadable(newfile,user))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
338 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
339 dir = dirname(newfile);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
340 if (strcmp(dir,"/"))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
341 explodePath(dir,user);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
342 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
343 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
344 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
345 fprintf(stderr,"%s: Permission denied.\n",file);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
346 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
347 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
348
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
349 return 0;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
350 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
351
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
352 main(int argc, char **argv)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
353 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
354 char *dir;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
355 char newfile[10000];
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
356 struct stat fileStat;
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
357
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
358 /* must have two arguments */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
359 if (argc != 4)
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
360 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
361 fprintf(stderr,"usage: cpy source dest user\n");
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
362 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
363 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
364
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
365 /* is filepath writeable by given user? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
366 strcpy(newfile,argv[2]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
367 dir = dirname(newfile);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
368 if (!notWriteable(dir,argv[3]))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
369 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
370
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
371 /* is filepath readable by given user? */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
372 explodePath(dir,argv[3]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
373
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
374 /* dest file must not exist yet */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
375 if (!(stat(argv[2], &fileStat) < 0))
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
376 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
377 fprintf(stderr,"%s: File already exists.\n",argv[2]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
378 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
379 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
380
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
381 /* copy the file and change the owner */
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
382 copyFile(argv[1],argv[2]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
383 chownToGivenUser(argv[2],argv[3]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
384 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
385 else
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
386 {
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
387 fprintf(stderr,"%s: Permission denied.\n",argv[2]);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
388 exit(1);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
389 }
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
390
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
391 exit(0);
0b424b791e12 Uploaded
david-hoover
parents:
diff changeset
392 }