annotate cpx.c @ 8:01687750c862 draft

Uploaded
author david-hoover
date Thu, 01 May 2014 17:11:57 -0400
parents e5a905df7e0b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
1 #include <sys/stat.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
2 #include <sys/types.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
3 #include <unistd.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
4 #include <stdio.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
5 #include <errno.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
6 #include <stdlib.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
7 #include <pwd.h>
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
8 #include <grp.h> // declares struct group
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
9 #include <libgen.h> // for dirname
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
10 #include <string.h> // for strcpy
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
11
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
12 /* cpx.c David Hoover 1/13/11
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
13 usage:
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
14 cpx from.file to.file login
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
15
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
16 cpx copies a file from one location to another, but only if the original file is owned by the given login. The
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
17 program is expected to be setuid and owned by root.
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
18
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
19 */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
20
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
21 int notReadable(char *file, char *user)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
22 /* Returns 1 if file not readable by given user */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
23 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
24 struct stat fileStat;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
25 struct passwd *own,*usr;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
26 struct group *grp;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
27 int i=0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
28
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
29 usr = getpwnam(user);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
30
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
31 /* does user exist? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
32 if (! usr)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
33 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
34 fprintf(stderr,"%s: No such user\n",user);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
35 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
36 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
37
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
38 /* must be able to stat file */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
39 if (stat(file, &fileStat) < 0)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
40 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
41 fprintf(stderr,"%s: No such file\n",file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
42 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
43 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
44
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
45 /* get the owner and group information for the file */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
46 own = getpwuid(fileStat.st_uid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
47 grp = getgrgid(fileStat.st_gid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
48
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
49 /* does the file owner match the argument? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
50 // if (!strcmp(own->pw_name,user))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
51 if (usr->pw_uid == fileStat.st_uid)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
52 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
53 // printf("owners match!\n");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
54
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
55 /* is file readable? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
56 if (fileStat.st_mode & S_IRUSR)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
57 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
58 // printf("%s is readable by %s\n",file,user);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
59 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
60 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
61 else
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
62 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
63 // printf("%s is not readable by %s\n",file,user);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
64 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
65 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
66 else {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
67 // printf("owners don't match!\n");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
68 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
69
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
70 /* is the file group readable by the given group? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
71 if (fileStat.st_mode & S_IRGRP)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
72 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
73 // printf("%s is readable by group %s\n",file,grp->gr_name);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
74
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
75
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
76 /* is the user's gid the same as the file? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
77 // printf("%d\n",usr->pw_gid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
78 // printf("%d\n",fileStat.st_gid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
79 if (usr->pw_gid == fileStat.st_gid)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
80 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
81 // printf("groups match!\n");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
82
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
83 /* if the path a directory is it executable? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
84 if (S_ISDIR(fileStat.st_mode))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
85 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
86 if (fileStat.st_mode & S_IXGRP)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
87 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
88 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
89 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
90 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
91 else {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
92 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
93 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
94 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
95 else
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
96 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
97
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
98 /* is the user a member of the group that owns the file? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
99 while(grp->gr_mem[i] != NULL)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
100 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
101 if(!strcmp(grp->gr_mem[i],user))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
102 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
103 // printf("%s is a member of the %s group\n",user,grp->gr_name);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
104 /* if the path a directory is it executable? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
105 if (S_ISDIR(fileStat.st_mode))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
106 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
107 if (fileStat.st_mode & S_IXGRP)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
108 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
109 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
110 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
111 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
112 else {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
113 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
114 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
115 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
116 i++;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
117 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
118
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
119 // printf("%s is not a member of the %s group\n",user,grp->gr_name);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
120
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
121 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
122 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
123 else
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
124 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
125 // printf("%s is not readable by group %s\n",file,grp->gr_name);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
126 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
127
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
128 /* is the e world readable? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
129 if (fileStat.st_mode & S_IROTH)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
130 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
131 // printf("%s is world readable\n",file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
132 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
133 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
134 else
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
135 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
136 // printf("%s is not world readable\n",file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
137 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
138
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
139 return 1;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
140 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
141
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
142 int copyFile(char *src, char *dst)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
143 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
144 // printf("Copying %s to %s\n",src,dst);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
145
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
146 char *c;
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
147 FILE *fs,*ft;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
148 struct stat fileStat;
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
149 size_t st=10000000;
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
150 int numr,numw;
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
151
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
152 // buffer = 10000;
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
153 /* must be able to stat file */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
154 if (stat(src, &fileStat) < 0)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
155 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
156 fprintf(stderr,"%s: No such file\n",src);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
157 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
158 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
159
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
160 /* is path a regular file? */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
161 if (S_ISDIR(fileStat.st_mode))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
162 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
163 fprintf(stderr,"%s: Is a directory\n",src);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
164 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
165 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
166
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
167 fs = fopen(src,"r");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
168 if (fs==NULL) {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
169 fprintf(stderr,"Can't read from file %s!\n",src);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
170 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
171 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
172 ft = fopen(dst,"w");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
173 if (ft==NULL) {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
174 fprintf(stderr,"Can't write to file %s!\n",dst);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
175 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
176 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
177
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
178 c=malloc(st);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
179 while(feof(fs)==0)
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
180 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
181 if((numr=fread(c,1,st,fs))!=st)
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
182 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
183 if(ferror(fs)!=0)
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
184 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
185 fprintf(stderr,"read file error.\n");
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
186 exit(1);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
187 }
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
188 else if(feof(fs)!=0);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
189 }
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
190 if((numw=fwrite(c,1,numr,ft))!=numr)
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
191 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
192 fprintf(stderr,"write file error.\n");
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
193 exit(1);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
194 }
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
195 }
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
196
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
197 fclose(fs);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
198 fclose(ft);
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
199 free(c);
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
200
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
201 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
202
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
203 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
204
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
205 int chownToUser(char *file)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
206 /* chown a file to the user running cpx */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
207 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
208 uid_t uid;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
209 gid_t gid;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
210
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
211 uid = getuid();
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
212 gid = getgid();
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
213
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
214 // printf("UID = %d\n",uid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
215 // printf("GID = %d\n",gid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
216
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
217 // printf("chown %s %d,%d\n",file,uid,gid);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
218 if (chown(file,uid,gid))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
219 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
220 fprintf(stderr,"Can't chown %s\n",file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
221 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
222 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
223 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
224 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
225
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
226 int explodePath(char *file, char *user)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
227 /* Returns 1 if file not readable by given user */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
228 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
229 char **path;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
230 char *dir;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
231 char newfile[10000];
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
232 int i;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
233
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
234 strcpy(newfile,file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
235 if (!notReadable(newfile,user))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
236 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
237 dir = dirname(newfile);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
238 if (strcmp(dir,"/"))
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
239 explodePath(dir,user);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
240 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
241 else
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
242 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
243 fprintf(stderr,"%s: Permission denied.\n",file);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
244 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
245 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
246
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
247 return 0;
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
248 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
249
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
250 main(int argc, char **argv)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
251 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
252
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
253 /* must have two arguments */
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
254 if (argc != 4)
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
255 {
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
256 fprintf(stderr,"usage: cpx source dest user\n");
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
257 exit(1);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
258 }
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
259
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
260 if (!strncmp(argv[1],"/data",5) || !strncmp(argv[1],"/home",5))
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
261 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
262
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
263 /* is file readable by given user? */
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
264 explodePath(argv[1],argv[3]);
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
265
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
266 /* copy the file and change the owner */
7
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
267 copyFile(argv[1],argv[2]);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
268 chownToUser(argv[2]);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
269 }
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
270 else
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
271 {
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
272 fprintf(stderr,"%s: Permission denied.\n",argv[1]);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
273 exit(1);
e5a905df7e0b Uploaded
david-hoover
parents: 0
diff changeset
274 }
0
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
275
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
276 exit(0);
c772c8912663 Uploaded
david-hoover
parents:
diff changeset
277 }