|
Lines 68-73
Link Here
|
| 68 |
int main __P((int argc, char *argv[])); |
68 |
int main __P((int argc, char *argv[])); |
| 69 |
void raw_args __P((char *argv[])); |
69 |
void raw_args __P((char *argv[])); |
| 70 |
void raw_cat __P((int)); |
70 |
void raw_cat __P((int)); |
|
|
71 |
void checkmode __P((struct stat *, char *)); |
| 71 |
|
72 |
|
| 72 |
int |
73 |
int |
| 73 |
main(argc, argv) |
74 |
main(argc, argv) |
|
Lines 121-126
Link Here
|
| 121 |
cook_args(argv) |
122 |
cook_args(argv) |
| 122 |
char **argv; |
123 |
char **argv; |
| 123 |
{ |
124 |
{ |
|
|
125 |
struct stat sb; |
| 124 |
register FILE *fp; |
126 |
register FILE *fp; |
| 125 |
|
127 |
|
| 126 |
fp = stdin; |
128 |
fp = stdin; |
|
Lines 129-140
Link Here
|
| 129 |
if (*argv) { |
131 |
if (*argv) { |
| 130 |
if (!strcmp(*argv, "-")) |
132 |
if (!strcmp(*argv, "-")) |
| 131 |
fp = stdin; |
133 |
fp = stdin; |
| 132 |
else if ((fp = fopen(*argv, "r")) == NULL) { |
134 |
else if ((fp = fopen(*argv, "r")) == NULL || |
|
|
135 |
fstat(fileno(fp), &sb)) { |
| 133 |
warn("%s", *argv); |
136 |
warn("%s", *argv); |
| 134 |
rval = 1; |
137 |
rval = 1; |
| 135 |
++argv; |
138 |
++argv; |
| 136 |
continue; |
139 |
continue; |
| 137 |
} |
140 |
} |
|
|
141 |
checkmode(&sb, *argv); |
| 138 |
filename = *argv++; |
142 |
filename = *argv++; |
| 139 |
} |
143 |
} |
| 140 |
cook_buf(fp); |
144 |
cook_buf(fp); |
|
Lines 211-216
Link Here
|
| 211 |
raw_args(argv) |
215 |
raw_args(argv) |
| 212 |
char **argv; |
216 |
char **argv; |
| 213 |
{ |
217 |
{ |
|
|
218 |
struct stat sb; |
| 214 |
register int fd; |
219 |
register int fd; |
| 215 |
|
220 |
|
| 216 |
fd = fileno(stdin); |
221 |
fd = fileno(stdin); |
|
Lines 219-230
Link Here
|
| 219 |
if (*argv) { |
224 |
if (*argv) { |
| 220 |
if (!strcmp(*argv, "-")) |
225 |
if (!strcmp(*argv, "-")) |
| 221 |
fd = fileno(stdin); |
226 |
fd = fileno(stdin); |
| 222 |
else if ((fd = open(*argv, O_RDONLY, 0)) < 0) { |
227 |
else if ((fd = open(*argv, O_RDONLY, 0)) < 0 || |
|
|
228 |
fstat(fd, &sb)) { |
| 223 |
warn("%s", *argv); |
229 |
warn("%s", *argv); |
| 224 |
rval = 1; |
230 |
rval = 1; |
| 225 |
++argv; |
231 |
++argv; |
| 226 |
continue; |
232 |
continue; |
| 227 |
} |
233 |
} |
|
|
234 |
checkmode(&sb, *argv); |
| 228 |
filename = *argv++; |
235 |
filename = *argv++; |
| 229 |
} |
236 |
} |
| 230 |
raw_cat(fd); |
237 |
raw_cat(fd); |
|
Lines 259-262
Link Here
|
| 259 |
warn("%s", filename); |
266 |
warn("%s", filename); |
| 260 |
rval = 1; |
267 |
rval = 1; |
| 261 |
} |
268 |
} |
|
|
269 |
} |
| 270 |
|
| 271 |
void |
| 272 |
checkmode(sb, fname) |
| 273 |
struct stat *sb; |
| 274 |
char *fname; |
| 275 |
{ |
| 276 |
if (sb->st_mode & S_IFDIR) |
| 277 |
errx(1, "%s is a directory", fname); |
| 278 |
if (sb->st_mode & S_IFLNK) |
| 279 |
/* This should transparently be resolved and |
| 280 |
* thus never happen. |
| 281 |
*/ |
| 282 |
errx(1, "%s is a symlink", fname); |
| 283 |
if (sb->st_mode & S_IFWHT) |
| 284 |
/* This should never happen. */ |
| 285 |
errx(1, "%s is a whiteout entry", fname); |
| 262 |
} |
286 |
} |