Free everything before exiting
[public/pyceo-broken.git] / src / addclub.c
1 #include <unistd.h>
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <getopt.h>
7 #include <ctype.h>
8 #include <pwd.h>
9 #include <grp.h>
10 #include <errno.h>
11 #include <libgen.h>
12 #include <syslog.h>
13
14 #include "util.h"
15 #include "config.h"
16 #include "ldap.h"
17 #include "krb5.h"
18 #include "kadm.h"
19 #include "ceo.pb-c.h"
20
21 char *prog = NULL;
22
23 static char *name = NULL;
24 static char *userid = NULL;
25
26 static struct option opts[] = {
27     { NULL, 0, NULL, '\0' },
28 };
29
30 const char *default_lib_dir = "/usr/lib/ceod";
31 const char *lib_dir;
32
33 static void usage() {
34     fprintf(stderr, "Usage: %s userid clubname\n", prog);
35     exit(2);
36 }
37
38 int addclub(void) {
39     struct strbuf preq = STRBUF_INIT;
40     struct strbuf pret = STRBUF_INIT;
41     char cpath[1024];
42     char *cargv[] = { "ceoc", "adduser", NULL };
43
44     if (snprintf(cpath, sizeof(cpath), "%s/ceoc", lib_dir) >= sizeof(cpath))
45         fatal("path too long");
46
47     Ceo__AddUser req;
48     ceo__add_user__init(&req);
49
50     req.username = userid;
51     req.realname = name;
52     req.type = CEO__ADD_USER__TYPE__CLUB;
53
54     strbuf_grow(&preq, ceo__add_user__get_packed_size(&req));
55     strbuf_setlen(&preq, ceo__add_user__pack(&req, (uint8_t *)preq.buf));
56
57     if (spawnvem(cpath, cargv, environ, &preq, &pret, 0))
58         return 1;
59
60     Ceo__AddUserResponse *ret = ceo__add_user_response__unpack(&protobuf_c_default_allocator,
61                                                                pret.len, (uint8_t *)pret.buf);
62     if (!ret)
63         fatal("failed to unpack response");
64
65     for (int i = 0; i < ret->n_messages; i++) {
66         if (ret->messages[i]->status)
67             error("%s", ret->messages[i]->message);
68         else
69             notice("%s", ret->messages[i]->message);
70     }
71
72     ceo__add_user_response__free_unpacked(ret, &protobuf_c_default_allocator);
73     strbuf_release(&preq);
74     strbuf_release(&pret);
75
76     return 0;
77 }
78
79 int main(int argc, char *argv[]) {
80     int opt;
81     int ret;
82
83     prog = xstrdup(basename(argv[0]));
84     init_log(prog, 0, LOG_AUTHPRIV);
85
86     configure();
87
88     while ((opt = getopt_long(argc, argv, "", opts, NULL)) != -1) {
89         switch (opt) {
90             case '?':
91                 usage();
92                 break;
93             default:
94                 fatal("error parsing arguments");
95         }
96     }
97
98     if (argc - optind != 2 && argc - optind != 3)
99         usage();
100
101     userid = argv[optind++];
102     name = argv[optind++];
103
104     lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir;
105
106     ret = addclub();
107
108     free_config();
109     free(prog);
110
111     return ret;
112 }