/* $Header$ * * This program will change UIDs on users who are not active so that * no UIDs are > 32000. */ #include #include #include #include #include #include #define MAX_ID_VALUE 31999 #define MIN_ID_VALUE 101 char *program; main(argc, argv) int argc; char **argv; ##{ char buf[BUFSIZ], *p; struct save_queue *sq; int found, status, wait, i; ## int id, uid; program = "uidfix"; init_krb_err_tbl(); init_sms_err_tbl(); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-w")) wait++; else if (!strcmp(argv[i], "-D")) setenv("ING_SET", "set printqry"); else fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]); } ## ingres sms ## range of u is users found = 0; sq = sq_create(); ## retrieve (id = u.users_id) ## where u.#uid >= 32000 and (u.status = 0 or u.status = 4) { sq_save_data(sq, id); found++; ## } printf("Found %d users to change.\n", found); while (sq_get_data(sq, &id)) { uid = set_next_object_id("uid", 1); ## replace u (#uid = uid) where u.users_id = id if (wait) { printf("Next"); fflush(stdout); gets(buf); } } ## exit exit(0); ##} set_next_object_id(object, limit) char *object; int limit; ##{ ## char *name; ## int rowcount, exists, value; name = object; ## begin transaction ## repeat retrieve (value = values.#value) where values.#name = @name ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) { ## abort return(0); } ## retrieve (exists = any(users.name where users.name = value)) ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) { ## abort return(0); } while (exists) { value++; if (limit && value > MAX_ID_VALUE) value = MIN_ID_VALUE; ## retrieve (exists = any(users.name where users.name = value)) } ## repeat replace values (#value = @value) where values.#name = @name ## end transaction return(value); ##}