]> andersk Git - moira.git/blame - afssync/sync.qc
add user sms to system:administrators before attempting to do lists
[moira.git] / afssync / sync.qc
CommitLineData
62b40972 1/* $Header$
2 *
3 * This generates the zone files necessary to load a hesiod server.
4 * The following zones are generated: passwd, uid, pobox, group,
5 * grplist, gid, filsys, cluster, pcap, sloc, service.
6 *
7 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, please see the file
9 * <mit-copyright.h>.
10 */
11
12#include <mit-copyright.h>
13#include <stdio.h>
14#include <sys/file.h>
15#include <rx/xdr.h>
16#include "print.h"
17#include "prserver.h"
18#include "prerror.h"
19#include <sms.h>
20#include <sms_app.h>
21#include <ctype.h>
22
278dd826 23#define USERSMS 14487
62b40972 24
25#define min(x,y) ((x) < (y) ? (x) : (y))
26struct hash *users = NULL;
27char *whoami = "sync";
28
29char *malloc(), *strsave();
30int dbase_fd;
31
32
33main(argc, argv)
34int argc;
35char **argv;
36{
278dd826 37 int status;
62b40972 38 int ingerr();
39
40 if (argc != 2) {
41 fprintf(stderr, "usage: %s outfile\n", argv[0]);
42 exit(SMS_ARGS);
43 }
44
45 dbase_fd = open(argv[1], O_RDWR|O_CREAT, 0660);
46 if (dbase_fd < 0) {
47 perror("opening file %s", argv[1]);
48 exit(1);
49 }
50 IIseterr(ingerr);
51 initialize_sms_error_table ();
52
53## ingres sms
54## set lockmode session where level = table
55## begin transaction
56
57 do_passwd();
278dd826 58 status = PR_AddToGroup(NULL, USERSMS, SYSADMINID);
59 if (status) {
60 prserror(status, "adding SMS to system:administrators", 0, 0);
61 }
62b40972 62 do_groups();
63
64## end transaction
65## exit
66
67 exit(SMS_SUCCESS);
68}
69
70
71/*
72 * ingerr: (supposedly) called when Ingres indicates an error.
73 * I have not yet been able to get this to work to intercept a
74 * database open error.
75 */
76#define INGRES_DEADLOCK 4700
77
78static int ingerr(num)
79 int *num;
80{
81 char buf[256];
82 int ingres_errno;
83
84 switch (*num) {
85 case INGRES_DEADLOCK:
86 ingres_errno = SMS_DEADLOCK;
87 break;
88 default:
89 ingres_errno = SMS_INGRES_ERR;
90 }
91 com_err(whoami, SMS_INGRES_ERR, " code %d\n", *num);
92 exit(ingres_errno);
93}
94
95
96prserror(status, msg, arg1, arg2)
97int status;
98char *msg;
99unsigned long arg1, arg2;
100{
101 char buf[512];
102
103 sprintf(buf, msg, arg1, arg2);
104 switch (status) {
105 case PREXIST:
106 msg = "name already exists";
107 break;
108 case PRIDEXIST:
109 msg = "ID already exists";
110 break;
111 case PRNOIDS:
112 msg = "no IDs available";
113 break;
114 case PRDBFAIL:
115 msg = "database failed";
116 break;
117 case PRNOENT:
118 msg = "no space left in database";
119 break;
120 case PRPERM:
121 msg = "permission denied";
122 break;
123 case PRNOTGROUP:
124 msg = "not a group";
125 break;
126 case PRNOTUSER:
127 msg = "not a user";
128 break;
129 case PRBADNAM:
130 msg = "bad name";
131 break;
132 case 0:
133 msg = "no error";
134 break;
135 default:
136 msg = "unknown code";
137 break;
138 }
139 fprintf(stderr, "%s (%d): %s\n", msg, status, buf);
140}
141
142
143
144do_passwd()
145##{
146## char login[9];
147## int uid, id, status;
148
149 fprintf(stderr, "Doing users\n");
150 users = create_hash(10000);
151## range of u is users
152## retrieve (login = u.#login, uid = u.#uid, id = u.users_id)
153## where u.#status = 1 {
154 strtrim(login);
155 hash_store(users, id, uid);
156 status = PR_INewEntry(NULL, login, uid, 0);
157 if (status) {
158 prserror(status, "adding user %s uid %d", login, uid);
159 }
160## }
161##}
162
163
164
165do_groups()
166##{
167 struct hash *groups;
168 long u, g, status;
169## char name[33], namebuf[128];
170## int gid, id, lid;
171
172 fprintf(stderr, "Doing groups\n");
173
174 /* make space for group list */
175 groups = create_hash(15000);
176
177 /* retrieve simple groups */
178## range of l is list
179## range of m is imembers
180 /* get lock records */
181## retrieve (name = l.modtime) where l.list_id = 0
182## retrieve (name = users.modtime) where users.users_id = 0
183
184## retrieve (name = l.#name, gid = l.#gid, lid = l.list_id)
185## where l.group != 0 and l.active != 0 {
186 strtrim(name);
187 sprintf(namebuf, "system:%s", name);
188 hash_store(groups, lid, -gid);
189 status = PR_INewEntry(NULL, namebuf, -gid, SYSADMINID);
190 if (status)
191 prserror(status, "adding list %s gid %d", namebuf, -gid);
192## }
193
194
195 fprintf(stderr, "Doing members\n");
196
197## retrieve (lid = m.list_id, id = m.member_id)
198## where m.member_type = "USER" {
199 if ((u = (long) hash_lookup(users, id)) &&
200 (g = (long) hash_lookup(groups, lid))) {
201 status = PR_AddToGroup(NULL, u, g);
202 if (status) {
203 prserror(status, "adding %d to group %d", u, -g);
204 }
205 }
206## }
207
208##}
209
This page took 0.082671 seconds and 5 git commands to generate.