Make more noise in config parser
[mspang/pyceo.git] / src / zfsaddhomedir.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <unistd.h>
4 #include <assert.h>
5 #include "util.h"
6
7 int main(int argc, char *argv[]) {
8     if(argc < 7) {
9         fprintf(stderr, "Usage: zfsaddhomedir homedir refquota skeldir uid gid mode acl\n");
10         return 1;
11     }
12
13     {
14         char *homedir = argv[1];
15         char *skeldir = argv[3];
16         char refquota[32];
17         char *mode = argv[6];
18         char *acl = (argc >= 8) ? argv[7] : NULL;
19         uid_t uid, gid;
20         char *zfs_bin = "/usr/sbin/zfs";
21         char *chmod_bin = "/usr/bin/chmod";
22         char *rsync_bin = "/usr/bin/rsync";
23         char *dataset = homedir + 1;
24         char *create_argv[] = { "zfs", "create", dataset, NULL };
25         char *quota_argv[] = { "zfs", "set", refquota, dataset, NULL };
26         char *mode_argv[] = { "chmod", mode, homedir, NULL };
27         char *acl_argv[] = { "chmod", acl, homedir, NULL };
28         char *rsync_argv[] = { "rsync", "-avH", skeldir, homedir, NULL };
29
30         assert(homedir[0]);
31         uid = atol(argv[4]);
32         gid = atol(argv[5]);
33         snprintf(refquota, sizeof(refquota), "refquota=%s", argv[2]);
34
35         if(spawnv(zfs_bin, create_argv))
36             return 1;
37         if(spawnv(zfs_bin, quota_argv))
38             return 1;
39         if(spawnv(chmod_bin, mode_argv))
40             return 1;
41         if(acl && spawnv(chmod_bin, acl_argv))
42             return 1;
43
44         if (chown(homedir, uid, gid)) {
45             errorpe("failed to chown %s", homedir);
46             return -1;
47         }
48
49         if(seteuid(uid) != 0 || setegid(gid) != 0)
50             return 1;
51         if(spawnv(rsync_bin, rsync_argv))
52             return 1;
53     }
54
55     return 0;
56 }