Kill zfsaddhomedir
authorMichael Spang <mspang@uwaterloo.ca>
Wed, 29 Jul 2009 12:30:08 +0000 (08:30 -0400)
committerMichael Spang <mspang@uwaterloo.ca>
Wed, 29 Jul 2009 12:30:08 +0000 (08:30 -0400)
src/Makefile
src/zfsaddhomedir.c [deleted file]

index c086fb7..e9ac610 100644 (file)
@@ -6,7 +6,7 @@ override CFLAGS  += -std=gnu99 $(INCLUDES)
 DESTDIR :=
 PREFIX  := /usr/local
 
-BIN_PROGS := addmember addclub zfsaddhomedir ceod
+BIN_PROGS := addmember addclub ceod
 LIB_PROGS := ceoc op-adduser
 EXT_PROGS := config-test
 
@@ -26,7 +26,7 @@ CONFIG_OBJECTS := config.o parser.o
 CONFIG_LDFLAGS :=
 CONFIG_PROGS   := $(LDAP_PROGS) $(KRB5_PROGS) $(NET_PROGS)
 UTIL_OBJECTS   := util.o strbuf.o
-UTIL_PROGS     := config-test zfsaddhomedir $(CONFIG_PROGS)
+UTIL_PROGS     := config-test $(CONFIG_PROGS)
 
 all: $(BIN_PROGS) $(LIB_PROGS) $(EXT_PROGS)
 
@@ -65,4 +65,4 @@ $(UTIL_PROGS):   LDFLAGS += $(UTIL_LDFLAGS)
 $(UTIL_PROGS):   $(UTIL_OBJECTS)
 
 .PHONY: clean all
-.SECONDARY: ceoc.o zfsaddhomedir.o addmember.o addclub.o
+.SECONDARY: ceoc.o addmember.o addclub.o
diff --git a/src/zfsaddhomedir.c b/src/zfsaddhomedir.c
deleted file mode 100644 (file)
index ae556f6..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <assert.h>
-#include "util.h"
-
-int main(int argc, char *argv[]) {
-    if(argc < 7) {
-        fprintf(stderr, "Usage: zfsaddhomedir homedir refquota skeldir uid gid mode acl\n");
-        return 1;
-    }
-
-    char *homedir = argv[1];
-    char *skeldir = argv[3];
-    char refquota[32];
-    char *mode = argv[6];
-    char *acl = (argc >= 8) ? argv[7] : NULL;
-    uid_t uid, gid;
-    char *zfs_bin = "/usr/sbin/zfs";
-    char *chmod_bin = "/usr/bin/chmod";
-    char *dataset = homedir + 1;
-    char *create_argv[] = { "zfs", "create", dataset, NULL };
-    char *quota_argv[] = { "zfs", "set", refquota, dataset, NULL };
-    char *mode_argv[] = { "chmod", mode, homedir, NULL };
-    char *acl_argv[] = { "chmod", acl, homedir, NULL };
-    DIR *skel;
-    struct dirent *skelent;
-
-    assert(homedir[0]);
-    uid = atol(argv[4]);
-    gid = atol(argv[5]);
-    snprintf(refquota, sizeof(refquota), "refquota=%s", argv[2]);
-
-    if(spawnv(zfs_bin, create_argv))
-        return 1;
-    if(spawnv(zfs_bin, quota_argv))
-        return 1;
-    if(spawnv(chmod_bin, mode_argv))
-        return 1;
-    if(acl && spawnv(chmod_bin, acl_argv))
-        return 1;
-
-    skel = opendir(skeldir);
-    if (!skel) {
-        errorpe("failed to open %s", skeldir);
-        return -1;
-    }
-
-    while ((skelent = readdir(skel))) {
-        struct stat sb;
-        char src[PATH_MAX], dest[PATH_MAX];
-
-        if (!strcmp(skelent->d_name, ".") || !strcmp(skelent->d_name, ".."))
-            continue;
-
-        snprintf(src, sizeof(src), "%s/%s", skeldir, skelent->d_name);
-        snprintf(dest, sizeof(dest), "/%s/%s", homedir, skelent->d_name);
-        lstat(src, &sb);
-
-        if (sb.st_uid || sb.st_gid) {
-            warn("not creating %s due to ownership", dest);
-            continue;
-        }
-
-        if (S_ISREG(sb.st_mode)) {
-            int bytes;
-            char buf[4096];
-
-            int srcfd = open(src, O_RDONLY);
-            if (srcfd == -1) {
-                warnpe("open: %s", src);
-                continue;
-            }
-
-            int destfd = open(dest, O_WRONLY|O_CREAT|O_EXCL, sb.st_mode & 0777);
-            if (destfd == -1) {
-                warnpe("open: %s", dest);
-                close(srcfd);
-                continue;
-            }
-
-            for (;;) {
-                bytes = read(srcfd, buf, sizeof(buf));
-                if (!bytes)
-                    break;
-                if (bytes < 0) {
-                    warnpe("read");
-                    break;
-                }
-                if (write(destfd, buf, bytes) < 0) {
-                    warnpe("write");
-                    break;
-                }
-            }
-            if (fchown(destfd, uid, gid))
-                errorpe("chown: %s", dest);
-
-            close(srcfd);
-            close(destfd);
-        } else if (S_ISDIR(sb.st_mode)) {
-            if (mkdir(dest, sb.st_mode & 0777)) {
-                warnpe("mkdir: %s", dest);
-                continue;
-            }
-            if (chown(dest, uid, gid))
-                errorpe("chown: %s", dest);
-        } else if (S_ISLNK(sb.st_mode)) {
-            char lnkdest[PATH_MAX];
-            int bytes;
-            bytes = readlink(src, lnkdest, sizeof(lnkdest));
-            lnkdest[bytes] = '\0';
-            if (bytes == -1) {
-                warnpe("readlink: %s", src);
-                continue;
-            }
-            if (symlink(lnkdest, dest)) {
-                warnpe("symlink: %s", dest);
-                continue;
-            }
-            if (lchown(dest, uid, gid))
-                errorpe("lchown: %s", dest);
-        } else {
-            warn("not creating %s", dest);
-        }
-    }
-
-    closedir(skel);
-
-    if (chown(homedir, uid, gid)) {
-        errorpe("failed to chown %s", homedir);
-        return -1;
-    }
-
-    return 0;
-}