4 * (c) Copyright 1989 by the Massachusetts Institute of Technology.
5 * For copying and distribution information, please see the file
9 #include <mit-copyright.h>
19 #include <moira_site.h>
22 #define min(x,y) ((x) < (y) ? (x) : (y))
23 struct hash *users = NULL;
24 char *whoami = "sync";
26 char *malloc(), *strsave();
38 fprintf(stderr, "usage: %s outfile\n", argv[0]);
42 dbase_fd = open(argv[1], O_RDWR|O_CREAT, 0660);
44 perror("opening file %s", argv[1]);
48 initialize_sms_error_table ();
51 ## set lockmode session where level = table
57 status = PR_AddToGroup(NULL, USERSMS, SYSADMINID);
59 prserror(status, "adding MR to system:administrators", 0, 0);
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.
76 #define INGRES_DEADLOCK 4700
78 static int ingerr(num)
86 ingres_errno = MR_DEADLOCK;
89 ingres_errno = MR_INGRES_ERR;
91 com_err(whoami, MR_INGRES_ERR, " code %d\n", *num);
96 prserror(status, msg, arg1, arg2)
99 unsigned long arg1, arg2;
103 sprintf(buf, msg, arg1, arg2);
106 msg = "name already exists";
109 msg = "ID already exists";
112 msg = "no IDs available";
115 msg = "database failed";
118 msg = "no space left in database";
121 msg = "permission denied";
136 msg = "unknown code";
139 fprintf(stderr, "%s (%d): %s\n", msg, status, buf);
147 ## int uid, id, status;
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 {
155 hash_store(users, id, uid);
156 status = PR_INewEntry(NULL, login, uid, 0);
158 prserror(status, "adding user %s uid %d", login, uid);
169 ## char name[33], namebuf[128];
170 ## int gid, id, lid, hide;
172 fprintf(stderr, "Doing groups\n");
174 /* make space for group list */
175 groups = create_hash(15000);
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
184 ## retrieve (name = l.#name, gid = l.#gid, lid = l.list_id, hide = l.hidden)
185 ## where l.group != 0 and l.active != 0 {
187 sprintf(namebuf, "system:%s", name);
188 hash_store(groups, lid, -gid);
189 status = PR_INewEntry(NULL, namebuf, -gid, SYSADMINID);
191 prserror(status, "adding list %s gid %d", namebuf, -gid);
194 status = PR_SetFieldsEntry
196 PR_SF_ALLBITS/*mask*/,
197 PRP_STATUS_MEM >> PRIVATE_SHIFT /*flags*/,
198 0/*ngroups*/, 0/*nusers*/, 0/*spare1*/, 0/*spare2*/);
201 prserror(status, "setting flags on list %s", namebuf);
206 fprintf(stderr, "Doing members\n");
208 ## retrieve (lid = m.list_id, id = m.member_id)
209 ## where m.member_type = "USER" {
210 if ((u = (long) hash_lookup(users, id)) &&
211 (g = (long) hash_lookup(groups, lid))) {
212 status = PR_AddToGroup(NULL, u, g);
214 prserror(status, "adding %d to group %d", u, -g);