I started to convert this to openat() when I realized it should
just use devname() instead. This should never fail since it operates
on a mounted file system (and devname() will fall back to trawling
/dev anyway if it needs to).
I also changed a QUAD_MAX to INT64_T since daddr_t is int64_t.
- todd
Index: sbin/badsect/badsect.c
===================================================================
RCS file: /cvs/src/sbin/badsect/badsect.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 badsect.c
--- sbin/badsect/badsect.c 12 Nov 2015 22:33:07 -0000 1.27
+++ sbin/badsect/badsect.c 12 Jun 2017 20:48:30 -0000
@@ -47,8 +47,10 @@
#include <ufs/ufs/dinode.h>
#include <dirent.h>
+#include <errno.h>
#include <fcntl.h>
#include <paths.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -77,10 +79,9 @@ int
main(int argc, char *argv[])
{
daddr_t number;
- struct stat stbuf, devstat;
- struct dirent *dp;
- DIR *dirp;
- char name[BUFSIZ];
+ struct stat stbuf;
+ char name[PATH_MAX];
+ char *bdev;
int len;
if (argc < 3) {
@@ -90,20 +91,10 @@ main(int argc, char *argv[])
if (chdir(argv[1]) < 0 || stat(".", &stbuf) < 0)
err(2, "%s", argv[1]);
- strlcpy(name, _PATH_DEV, sizeof name);
- len = strlen(name);
- if ((dirp = opendir(name)) == NULL)
- err(3, "%s", name);
-
- while ((dp = readdir(dirp)) != NULL) {
- strlcpy(&name[len], dp->d_name, sizeof name - len);
- if (stat(name, &devstat) < 0)
- err(4, "%s", name);
-
- if (stbuf.st_dev == devstat.st_rdev &&
- S_ISBLK(devstat.st_mode))
- break;
- }
+ bdev = devname(stbuf.st_dev, S_IFBLK);
+ if (strcmp(bdev, "??") == 0)
+ err(5, "Cannot find dev 0%o corresponding to %s",
+ stbuf.st_rdev, argv[1]);
/*
* We've found the block device, but since the filesystem
@@ -112,20 +103,16 @@ main(int argc, char *argv[])
* /dev that doesn't follow standard naming conventions, but
* it's all we've got.
*/
- name[len] = 'r';
- strlcpy(&name[len+1], dp->d_name, sizeof name - (len+1));
- closedir(dirp);
- if (dp == NULL)
- err(5, "Cannot find dev 0%o corresponding to %s",
- stbuf.st_rdev, argv[1]);
-
+ len = snprintf(name, sizeof(name), "%sr%s", _PATH_DEV, bdev);
+ if (len >= sizeof(name))
+ errc(6, ENAMETOOLONG, "%sr%s", _PATH_DEV, bdev);
if ((fsi = open(name, O_RDONLY)) < 0)
- err(6, "%s", name);
+ err(7, "%s", name);
fs = &sblock;
rdfs(SBOFF, SBSIZE, (char *)fs);
for (argc -= 2, argv += 2; argc > 0; argc--, argv++) {
- number = strtonum(*argv, 0, QUAD_MAX, NULL);
+ number = strtonum(*argv, 0, INT64_MAX, NULL);
if (chkuse(number, 1))
continue;
if (mknod(*argv, S_IFMT|S_IRUSR|S_IWUSR,