3 * - By John Hodge (thePowersGang)
6 #include <acess/devices/pty.h> // Enable/disable echo
16 int main(int argc, char *argv[])
18 char *sUsername, *sPassword;
23 printf("\x1B[?25h"); // Re-enable the cursor
24 // printf("\x1B[2J"); // Clear Screen
31 sUsername = GetUsername();
32 if(!sUsername) continue;
33 sPassword = GetPassword();
34 if(!sPassword) continue;
35 if( (uid = ValidateUser(sUsername, sPassword)) == -1 )
37 printf("\nInvalid username or password\n");
38 _SysDebug("Auth failure: '%s':'%s'", sUsername, sPassword);
47 uinfo = GetUserInfo(uid);
48 struct s_sys_spawninfo spawninfo;
50 spawninfo.gid = uinfo->GID;
51 spawninfo.uid = uinfo->UID;
52 const char *child_argv[2] = {"-", 0};
53 const char **child_envp = NULL;
54 int fds[] = {0, 1, 2};
55 pid = _SysSpawn(uinfo->Shell, child_argv, child_envp, 3, fds, &spawninfo);
58 fprintf(stderr, "Unable to fork the login process!\n");
62 // Wait for child to terminate
63 _SysWaitTID(pid, &status);
65 // Clear graphics mode
66 struct ptymode mode = {.InputMode = PTYIMODE_ECHO|PTYIMODE_CANON,.OutputMode=0};
67 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
73 char *_GetString(int bEcho)
80 const int is_pty = (_SysIOCtl(0, DRV_IOCTL_TYPE, NULL) == DRV_TYPE_TERMINAL);
83 if( !bEcho && is_pty ) {
84 _SysIOCtl(0, PTY_IOCTL_GETMODE, &mode);
85 mode.InputMode &= ~PTYIMODE_ECHO;
86 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
90 while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
94 if( pos <= 0 ) continue;
99 else if( ch == 'c'-'a'+1)
102 else if( ch == 'u'-'a'+1)
105 else if( ch == '\r' )
110 if(pos == BUFLEN-1) break;
116 if( !bEcho && is_pty ) {
117 mode.InputMode |= PTYIMODE_ECHO;
118 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
125 * \fn char *GetUsername()
129 char ret[BUFLEN] = {0};
134 printf("Username: ");
137 return _GetString(1);
141 * \fn char *GetPassword()
146 printf("Password: ");
149 return _GetString(0);