hello, the following is my attempt to add duid support to dump.
thanks!
Index: Makefile
===================================================================
RCS file: /cvs/src/sbin/dump/Makefile,v
retrieving revision 1.11
diff -p -u -r1.11 Makefile
--- Makefile 6 Jan 2013 21:59:28 -0000 1.11
+++ Makefile 26 Nov 2013 17:59:50 -0000
@@ -12,6 +12,8 @@
# TDEBUG trace out the process forking
PROG= dump
+LDADD= -lutil
+DPADD= ${LIBUTIL}
LINKS= ${BINDIR}/dump ${BINDIR}/rdump
CFLAGS+=-DRDUMP
SRCS= itime.c main.c optr.c dumprmt.c tape.c traverse.c
Index: dump.h
===================================================================
RCS file: /cvs/src/sbin/dump/dump.h,v
retrieving revision 1.17
diff -p -u -r1.17 dump.h
--- dump.h 11 Jun 2013 16:42:04 -0000 1.17
+++ dump.h 26 Nov 2013 17:59:50 -0000
@@ -86,6 +86,7 @@ int tp_bshift; /* log2(TP_BSIZE) */
/* operator interface functions */
void broadcast(char *message);
time_t do_stats(void);
+int duidtorawname(char *duid, char *buf, size_t s);
void lastdump(int arg); /* int should be char */
void msg(const char *fmt, ...)
__attribute__((__format__ (printf, 1, 2)));
Index: main.c
===================================================================
RCS file: /cvs/src/sbin/dump/main.c,v
retrieving revision 1.46
diff -p -u -r1.46 main.c
--- main.c 16 Apr 2013 18:17:39 -0000 1.46
+++ main.c 26 Nov 2013 17:59:50 -0000
@@ -31,6 +31,7 @@
*/
#include <sys/param.h>
+#include <sys/dkio.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/time.h>
@@ -51,6 +52,7 @@
#include <string.h>
#include <time.h>
#include <unistd.h>
+#include <util.h>
#include "dump.h"
#include "pathnames.h"
@@ -78,6 +80,7 @@ static void usage(void);
int
main(int argc, char *argv[])
{
+ char dbuf[MAXPATHLEN];
ino_t ino;
int dirty;
union dinode *dp;
@@ -204,7 +207,9 @@ main(int argc, char *argv[])
for (i = 0; i < argc; i++) {
struct stat sb;
- if (lstat(argv[i], &sb) == -1) {
+ if (isduid(argv[i], 0))
+ break;
+ else if (lstat(argv[i], &sb) == -1) {
msg("Cannot lstat %s: %s\n", argv[i], strerror(errno));
exit(X_STARTUP);
}
@@ -321,6 +326,10 @@ main(int argc, char *argv[])
* the special name missing the leading '/',
* the file system name with or without the leading '/'.
*/
+ if (isduid(disk, 0)) {
+ duidtorawname(disk, dbuf, sizeof(dbuf));
+ disk = dbuf;
+ }
if (!statfs(disk, &fsbuf) && !strcmp(fsbuf.f_mntonname, disk)) {
/* mounted disk? */
disk = rawname(fsbuf.f_mntfromname);
@@ -604,17 +613,42 @@ sig(int signo)
}
}
+int
+duidtorawname(char *duid, char *buf, size_t s)
+{
+ struct dk_diskmap dk;
+ int fd, ret;
+
+ if ((fd = open("/dev/diskmap", O_RDONLY)) < 0)
+ return 0;
+
+ strlcpy(buf, duid, s);
+ dk.fd = fd;
+ dk.device = buf;
+ dk.flags = 0;
+ // buf is filled with raw dev
+ ret = ioctl(fd, DIOCMAP, &dk);
+ close(fd);
+
+ return (ret < 0) ? 0 : 1;
+}
+
char *
rawname(char *cp)
{
static char rawbuf[MAXPATHLEN];
- char *dp = strrchr(cp, '/');
-
- if (dp == NULL)
- return (NULL);
- *dp = '\0';
- (void)snprintf(rawbuf, sizeof(rawbuf), "%s/r%s", cp, dp + 1);
- *dp = '/';
+ char *dp;
+
+ if (isduid(cp, 0)) {
+ duidtorawname(cp, rawbuf, sizeof(rawbuf));
+ } else {
+ dp = strrchr(cp, '/');
+ if (dp == NULL)
+ return (NULL);
+ *dp = '\0';
+ (void)snprintf(rawbuf, sizeof(rawbuf), "%s/r%s", cp, dp + 1);
+ *dp = '/';
+ }
return (rawbuf);
}