+
+/*
+ * rename_user() - this is tricky because the user's display name is the database key
+ *
+ * Returns 0 on success or nonzero if there was an error...
+ *
+ */
+int rename_user(char *oldname, char *newname) {
+ struct CitContext *cptr;
+ int retcode = RENAMEUSER_OK;
+ struct ctdluser usbuf;
+
+ char oldnamekey[USERNAME_SIZE];
+ char newnamekey[USERNAME_SIZE];
+
+ /* We cannot rename a user who is currently logged in */
+ for (cptr = ContextList; cptr != NULL; cptr = cptr->next) {
+ if (!strcasecmp(cptr->user.fullname, oldname)) {
+ return(RENAMEUSER_LOGGED_IN);
+ }
+ }
+
+ /* Create the database keys... */
+ makeuserkey(oldnamekey, oldname);
+ makeuserkey(newnamekey, newname);
+
+ /* Lock up and get going */
+ begin_critical_section(S_USERS);
+
+ if (getuser(&usbuf, newname) == 0) {
+ retcode = RENAMEUSER_ALREADY_EXISTS;
+ }
+ else {
+
+ if (getuser(&usbuf, oldname) != 0) {
+ retcode = RENAMEUSER_NOT_FOUND;
+ }
+
+ else { /* Sanity checks succeeded. Now rename the user. */
+
+ CtdlLogPrintf(CTDL_DEBUG, "Renaming <%s> to <%s>\n", oldname, newname);
+ cdb_delete(CDB_USERS, oldnamekey, strlen(oldnamekey));
+ safestrncpy(usbuf.fullname, newname, sizeof usbuf.fullname);
+ putuser(&usbuf);
+ retcode = RENAMEUSER_OK;
+ }
+
+ }
+
+ end_critical_section(S_USERS);
+ return(retcode);
+}
+
+
+