View | Details | Raw Unified | Return to bug 19537
Collapse All | Expand All

(-)bin/cat/cat.c (-2 / +26 lines)
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
}

Return to bug 19537