|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 1204 (0x4b4) Types: TextFile Notes: UNIX file Names: »getpass.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »libc/gen/getpass.c«
/* * Coherent I/O Library. * getpass -- get a password from the controlling * terminal with echo suppressed. */ #include <stdio.h> #include <sgtty.h> #include <signal.h> #define NPASS 50 /* Characters in a password */ static char tty[] = "/dev/tty"; static struct sgttyb sg; static int omode; static FILE *ifp; static FILE *ofp; static int (*ofunc)(); char * getpass(pp) char *pp; { static char passwd[NPASS+1]; char *p; int c; int reset(); if ((ofp = fopen(tty, "r+w")) != NULL) ifp = ofp; else { ifp = stdin; ofp = stderr; } if ((ofunc = signal(SIGINT, reset)) != SIG_IGN) signal(SIGINT, reset); ioctl(fileno(ofp), TIOCGETP, &sg); omode = sg.sg_flags; sg.sg_flags &= ~ECHO; ioctl(fileno(ofp), TIOCSETP, &sg); while (*pp) putc(*pp++, ofp); p = passwd; while ((c=getc(ifp))!=EOF && c!='\n') { if (p < &passwd[NPASS]) *p++ = c; } while (p < &passwd[NPASS]) *p++ = '\0'; reset(); if (ifp != stdin) fclose(ifp); signal(SIGINT, ofunc); return (c==EOF ? NULL : passwd); } /* * Reset echo on and signal catching. */ static reset() { signal(SIGINT, ofunc); sg.sg_flags = omode; ioctl(fileno(ofp), TIOCSETP, &sg); if (omode & ECHO) putc('\n', ofp); }