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 || !sUsername[0]) continue;
33 sPassword = GetPassword();
38 if( (uid = ValidateUser(sUsername, sPassword)) == -1 )
40 printf("\nInvalid username or password\n");
41 _SysDebug("Auth failure: '%s':'%s'", sUsername, sPassword);
50 uinfo = GetUserInfo(uid);
51 struct s_sys_spawninfo spawninfo;
53 spawninfo.gid = uinfo->GID;
54 spawninfo.uid = uinfo->UID;
55 const char *child_argv[2] = {"-", 0};
56 const char **child_envp = NULL;
57 int fds[] = {0, 1, 2};
58 pid = _SysSpawn(uinfo->Shell, child_argv, child_envp, 3, fds, &spawninfo);
61 fprintf(stderr, "Unable to fork the login process!\n");
65 // Wait for child to terminate
66 _SysWaitTID(pid, &status);
68 // Clear graphics mode
69 struct ptymode mode = {.InputMode = PTYIMODE_ECHO|PTYIMODE_CANON,.OutputMode=0};
70 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
71 fprintf(stderr, "\x1b[R");
77 char *_GetString(int bEcho)
84 const int is_pty = (_SysIOCtl(0, DRV_IOCTL_TYPE, NULL) == DRV_TYPE_TERMINAL);
87 if( !bEcho && is_pty ) {
88 _SysIOCtl(0, PTY_IOCTL_GETMODE, &mode);
89 mode.InputMode &= ~PTYIMODE_ECHO;
90 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
94 while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
98 if( pos <= 0 ) continue;
103 else if( ch == 'c'-'a'+1)
106 else if( ch == 'u'-'a'+1)
109 else if( ch == '\r' )
114 if(pos == BUFLEN-1) break;
120 if( !bEcho && is_pty ) {
121 mode.InputMode |= PTYIMODE_ECHO;
122 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
129 * \fn char *GetUsername()
133 char ret[BUFLEN] = {0};
138 printf("Username: ");
141 return _GetString(1);
145 * \fn char *GetPassword()
150 printf("Password: ");
153 return _GetString(0);