/* * Fetch the next item in a sequential search. Returns a pointer to a * cdbdata structure, or NULL if we've hit the end. */ struct cdbdata *cdb_next_item(int cdb) { DBT key, data; struct cdbdata *cdbret; int ret = 0; /* Initialize the key/data pair so the flags aren't set. */ memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); data.flags = DB_DBT_MALLOC; ret = TSD->cursors[cdb]->c_get(TSD->cursors[cdb], &key, &data, DB_NEXT); if (ret) { if (ret != DB_NOTFOUND) { syslog(LOG_EMERG, "cdb_next_item(%d): %s\n", cdb, db_strerror(ret)); cdb_abort(); } cdb_close_cursor(cdb); return NULL; /* presumably, end of file */ } cdbret = (struct cdbdata *) malloc(sizeof(struct cdbdata)); cdbret->len = data.size; cdbret->ptr = data.data; cdb_decompress_if_necessary(cdbret); return (cdbret); }
/* * Get Next Unregistered User */ void cmd_gnur(char *argbuf) { struct cdbdata *cdbus; struct ctdluser usbuf; if (CtdlAccessCheck(ac_aide)) { return; } if ((CtdlGetConfigInt("MMflags") & MM_VALID) == 0) { cprintf("%d There are no unvalidated users.\n", CIT_OK); return; } /* There are unvalidated users. Traverse the user database, * and return the first user we find that needs validation. */ cdb_rewind(CDB_USERS); while (cdbus = cdb_next_item(CDB_USERS), cdbus != NULL) { memset(&usbuf, 0, sizeof(struct ctdluser)); memcpy(&usbuf, cdbus->ptr, ((cdbus->len > sizeof(struct ctdluser)) ? sizeof(struct ctdluser) : cdbus->len)); cdb_free(cdbus); if ((usbuf.flags & US_NEEDVALID) && (usbuf.axlevel > AxDeleted)) { cprintf("%d %s\n", MORE_DATA, usbuf.fullname); cdb_close_cursor(CDB_USERS); return; } } /* If we get to this point, there are no more unvalidated users. * Therefore we clear the "users need validation" flag. */ begin_critical_section(S_CONTROL); int flags; flags = CtdlGetConfigInt("MMflags"); flags = flags & (~MM_VALID); CtdlSetConfigInt("MMflags", flags); end_critical_section(S_CONTROL); cprintf("%d *** End of registration.\n", CIT_OK); }