+/*
+ * Helper function for CtdlRebuildDirectoryIndex()
+ */
+void CtdlRebuildDirectoryIndex_backend(char *username, void *data) {
+
+ int j = 0;
+ struct ctdluser usbuf;
+
+ if (CtdlGetUser(&usbuf, username) != 0) {
+ return;
+ }
+
+ if ( (!IsEmptyStr(usbuf.fullname)) && (!IsEmptyStr(usbuf.emailaddrs)) ) {
+ for (j=0; j<num_tokens(usbuf.emailaddrs, '|'); ++j) {
+ char one_email[512];
+ extract_token(one_email, usbuf.emailaddrs, j, '|', sizeof one_email);
+ CtdlDirectoryAddUser(one_email, usbuf.fullname);
+ }
+ }
+}
+
+
+/*
+ * Initialize the directory database (erasing anything already there)
+ */
+void CtdlRebuildDirectoryIndex(void) {
+ syslog(LOG_INFO, "internet_addressing: rebuilding email address directory index");
+ cdb_trunc(CDB_DIRECTORY);
+ ForEachUser(CtdlRebuildDirectoryIndex_backend, NULL);
+}
+
+
+/*
+ * Configure Internet email addresses for a user account, updating the Directory Index in the process
+ */
+void CtdlSetEmailAddressesForUser(char *requested_user, char *new_emailaddrs)
+{
+ struct ctdluser usbuf;
+ int i;
+ char buf[SIZ];
+
+ if (CtdlGetUserLock(&usbuf, requested_user) != 0) { // We are relying on the fact that the DirectoryIndex functions don't lock.
+ return; // Silently fail here if we can't acquire a lock on the user record.
+ }
+
+ syslog(LOG_DEBUG, "internet_addressing: setting email addresses for <%s> to <%s>", usbuf.fullname, new_emailaddrs);
+
+ /* Delete all of the existing directory index records for the user (easier this way) */
+ for (i=0; i<num_tokens(usbuf.emailaddrs, '|'); ++i) {
+ extract_token(buf, usbuf.emailaddrs, i, '|', sizeof buf);
+ CtdlDirectoryDelUser(buf, requested_user);
+ }
+
+ strcpy(usbuf.emailaddrs, new_emailaddrs); // make it official.
+
+ /* Index all of the new email addresses (they've already been sanitized) */
+ for (i=0; i<num_tokens(usbuf.emailaddrs, '|'); ++i) {
+ extract_token(buf, usbuf.emailaddrs, i, '|', sizeof buf);
+ CtdlDirectoryAddUser(buf, requested_user);
+ }
+
+ CtdlPutUserLock(&usbuf);
+}
+
+
+/*
+ * Auto-generate an Internet email address for a user account
+ */
+void AutoGenerateEmailAddressForUser(struct ctdluser *user)