home *** CD-ROM | disk | FTP | other *** search
- /* getty.c
- * RISC OS getty clone
- * (c) Chris Rutter 1997
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "user.h"
-
- #ifdef __riscos
- #include "kernel.h"
- #endif /* __riscos */
-
- #define f_setDir 1u
- #define f_openDir 2u
-
- #define ourLog(x) if(logFile[0])user_log(logFile,x)
- char *hostname (void);
- void getty (unsigned int);
- void restart (void);
-
- unsigned int gettyFlags=0;
- int exitFlag=1;
- int numLogins=0;
- char gHostname[256];
- char logFile[256];
-
- int main (int argc, char *argv[])
- {
- int n;
- for (n=1; n<argc; n++)
- {
- if (!strcmp (argv[n], "-setDir")) gettyFlags |= f_setDir;
- else if (!strcmp (argv[n], "-openDir")) gettyFlags |= f_openDir;
- else if (!strcmp (argv[n], "-log")) strcpy (logFile, argv[++n]);
- else if (!strcmp (argv[n], "-host"))
- {
- strcpy (gHostname, argv[++n]);
- strcat (gHostname, " ");
- }
- else if (!strcmp (argv[n], "-help"))
- {
- #ifdef __riscos
- printf ("Syntax: *getty [-setDir] [-openDir] [-log <file>] [-host <hostname>]\n");
- #else
- printf ("Usage: getty [-log <file>] [-host <hostname>]\n");
- #endif /* __riscos */
- exit (0);
- }
- else if (argv[n][0]=='-' && argv[n][1]=='v')
- {
- printf ("getty 0.01 (c) Chris Rutter 1997\n");
- exit(0);
- }
- else printf ("Option `%s' not recognised.\n", argv[n]);
-
- }
- if (gHostname[0]==0) strcpy (gHostname, hostname());
- getty (gettyFlags);
- }
-
- void restart ()
- {
- if (exitFlag) getty (gettyFlags);
- }
-
- void getty (unsigned int f)
- {
- char nm[32], pw[32];
- user *u;
-
- atexit (restart);
-
- do
- {
- if (numLogins++) putc ('\n', stdout);
- printf ("%slogin: ",gHostname);
- scanf ("%31s", nm);
-
- printf ("Password: ");
- user_scanf (pw, 32, 0);
-
- u=user_verify (nm, pw);
-
- if (!u)
- {
- char b[256];
- sprintf (b,"User `%s' failed to login with password `%s'", nm, pw);
- ourLog(b);
- }
- else
- {
- char b[256];
- sprintf (b,"User `%s' successfully logged in",nm);
- ourLog(b);
- }
- }
- while (!u);
-
- #ifdef __riscos
- if (!u->homeDir[0]) goto skipDirs;
-
- if (f&f_setDir)
- {
- char c[256];
- sprintf (c, "dir %s", u->homeDir);
- system (c);
- }
-
- if (f&f_openDir)
- {
- char c[256];
- sprintf (c, "filer_opendir %s", u->homeDir);
- system (c);
- }
- skipDirs:
- #endif /* __riscos */
-
- #ifdef __riscos
- {
- char c[256];
- sprintf (c, "set User$Username \x22%s\x22", u->username);
- system (c);
- sprintf (c, "set User$HomeDir \x22%s\x22", u->homeDir);
- system (c);
- sprintf (c, "set User$RealName \x22%s\x22", u->realName);
- system (c);
- sprintf (c, "set User$UID %d", u->uid);
- system (c);
- sprintf (c, "set User$GID %d", u->gid);
- system (c);
- }
- #endif /* __riscos */
-
- exitFlag=0;
- }
-
- char *hostname (void)
- {
- #ifdef __riscos
- _kernel_swi_regs r;
- static char buf[256];
- r.r[0]=(int)"Inet$Hostname";
- r.r[1]=(int)buf;
- r.r[2]=256;
- r.r[3]=0;
- r.r[4]=0; /* string */
- _kernel_swi(0x23, &r, &r); /* 0x23==OS_ReadVarVal */
- if (buf[0])
- {
- buf[strlen(buf)+1]=0;
- buf[strlen(buf)]=' ';
- }
- return buf;
- #else
- return "";
- #endif /* __riscos */
- }
-