From e08d7384ee3f79e9419d75ac63bf9c6e3d094be3 Mon Sep 17 00:00:00 2001 From: Brian Feldman Date: Fri, 27 Aug 1999 16:36:46 +0000 Subject: [PATCH] Use FIODTYPE to unbogosify much of the file type checking in dd. --- bin/dd/dd.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/bin/dd/dd.c b/bin/dd/dd.c index b6e0ebbc1261..ece32c4b762b 100644 --- a/bin/dd/dd.c +++ b/bin/dd/dd.c @@ -46,12 +46,14 @@ static char const copyright[] = static char sccsid[] = "@(#)dd.c 8.5 (Berkeley) 4/2/94"; #endif static const char rcsid[] = - "$Id: dd.c,v 1.18 1999/06/20 14:58:51 green Exp $"; + "$Id: dd.c,v 1.19 1999/07/13 18:44:56 green Exp $"; #endif /* not lint */ #include #include +#include #include +#include #include #include @@ -224,19 +226,22 @@ static void getfdtype(io) IO *io; { - struct mtget mt; - struct diskslices ds; struct stat sb; + int type; if (fstat(io->fd, &sb)) err(1, "%s", io->name); - if ((S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) && - ioctl(io->fd, DIOCGSLICEINFO, &ds) != -1) - io->flags |= ISDISK; - if (S_ISCHR(sb.st_mode)) - io->flags |= ioctl(io->fd, MTIOCGET, &mt) ? ISCHR : ISTAPE; - else if (lseek(io->fd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) - io->flags |= ISPIPE; /* XXX fixed in 4.4BSD */ + if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) { + if (ioctl(io->fd, FIODTYPE, &type) == -1) + err(1, "%s", io->name); + if (type & D_TAPE) + io->flags |= ISTAPE; + else if (type & D_DISK) + io->flags |= ISDISK; + if (S_ISCHR(sb.st_mode) && (type & D_TAPE) == 0) + io->flags |= ISCHR; + } else if (!S_ISREG(sb.st_mode)) + io->flags |= ISPIPE; } static void