+int reserve_user(message,retval)
+ struct msg *message;
+ char *retval;
+{
+ int q_argc; /* Number of arguments to query */
+ char *q_argv[3]; /* Arguments to Moira query */
+ char *q_name; /* Name of Moira query */
+ int status = SUCCESS; /* General purpose error status */
+ char fstype_buf[7]; /* Buffer to hold fs_type, a 16 bit number */
+ char *login; /* The login name the user wants */
+ register int i; /* A counter */
+
+ /* Log that we are about to reserve a user. */
+ com_err(whoami, 0, "reserving user %s %s",
+ message->first, message->last);
+
+ /* Check to make sure that we can verify this user. */
+ if ((status = verify_user(message,retval)) == SUCCESS)
+ {
+ /* Get the requested login name from leftover packet information. */
+ login = message->leftover;
+
+ /* Check the login name for validity. The login name is currently
+ is allowed to contain lowercase letters in any position and
+ and numbers and underscore characters in any position but the
+ first. */
+ if ((strlen(login) < MIN_UNAME) || (strlen(login) > MAX_UNAME))
+ status = UREG_INVALID_UNAME;
+ }
+ if (status == SUCCESS)
+ if ((login[0] == '_') || isdigit(login[0]))
+ status = UREG_INVALID_UNAME;
+
+ if (status == SUCCESS)
+ {
+ for (i = 0; i < strlen(login); i++)
+ if (!islower(login[i]) && !isdigit(login[i]) &&
+ (login[i] != '_'))
+ {
+ status = UREG_INVALID_UNAME;
+ break;
+ }
+ }
+ if (status == SUCCESS)
+ {
+ /* Now that we have a valid user with a valid login... */
+
+ /* First, try to reserve the user in Moira. */
+ (void) sprintf(fstype_buf,"%d",MR_FS_STUDENT);
+ q_name = "register_user";
+ q_argv[0] = message->db.uid;
+ q_argv[1] = login;
+ q_argv[2] = fstype_buf;
+ q_argc = 3;
+ status = mr_query(q_name,q_argc,q_argv,null_callproc,(char *)0);
+ switch (status)
+ {
+ case MR_SUCCESS:
+ status = SUCCESS;
+ break;
+ case MR_IN_USE:
+ status = UREG_LOGIN_USED;
+ break;
+ case MR_DEADLOCK:
+ status = UREG_MISC_ERROR;
+ break;
+ default:
+ critical_alert(FAIL_INST,"%s returned from register_user.",
+ error_message(status));
+ status = UREG_MISC_ERROR;
+ break;
+ }
+ }