Bump version
[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     int ret = 0;
44
45     if (snprintf(cpath, sizeof(cpath), "%s/ceoc", lib_dir) >= sizeof(cpath))
46         fatal("path too long");
47
48     Ceo__AddUser req;
49     ceo__add_user__init(&req);
50
51     req.username = userid;
52     req.realname = name;
53     req.type = CEO__ADD_USER__TYPE__CLUB;
54
55     strbuf_grow(&preq, ceo__add_user__get_packed_size(&req));
56     strbuf_setlen(&preq, ceo__add_user__pack(&req, (uint8_t *)preq.buf));
57
58     if (spawnvem(cpath, cargv, environ, &preq, &pret, 0))
59         return 1;
60
61     Ceo__AddUserResponse *resp = ceo__add_user_response__unpack(&protobuf_c_default_allocator,
62                                                                pret.len, (uint8_t *)pret.buf);
63     if (!resp)
64         fatal("failed to unpack response");
65
66     for (int i = 0; i < resp->n_messages; i++) {
67         if (resp->messages[i]->status) {
68             ret = -1;
69             error("%s", resp->messages[i]->message);
70         } else {
71             notice("%s", resp->messages[i]->message);
72         }
73     }
74
75     ceo__add_user_response__free_unpacked(resp, &protobuf_c_default_allocator);
76     strbuf_release(&preq);
77     strbuf_release(&pret);
78
79     return ret;
80 }
81
82 int main(int argc, char *argv[]) {
83     int opt;
84     int ret;
85
86     prog = xstrdup(basename(argv[0]));
87     init_log(prog, LOG_PID, LOG_AUTHPRIV, 1);
88
89     configure();
90
91     while ((opt = getopt_long(argc, argv, "", opts, NULL)) != -1) {
92         switch (opt) {
93             case '?':
94                 usage();
95                 break;
96             default:
97                 fatal("error parsing arguments");
98         }
99     }
100
101     if (argc - optind != 2 && argc - optind != 3)
102         usage();
103
104     userid = argv[optind++];
105     name = argv[optind++];
106
107     lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir;
108
109     ret = addclub();
110
111     free_config();
112     free(prog);
113
114     return ret;
115 }