imiscd.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,123 行 · 第 1/2 页
C
1,123 行
"AIEAEEIEIOOIOOOU";static char *Ex = /* end-vowels */ "EOAY";static char *Zx = /* end-vowel pairs */ "EEOOAYEYOY";static struct web { char w_key; int w_length; int w_factor; char **w_string; char *w_special;} webs[] = { 'm', 189, 2, &Mx, NULL, 'c', 18, 1, &Cx, "HWJ", 'v', 5, 1, &Vx, NULL, 'd', 27, 2, &Dx, NULL, 'l', 35, 2, &Lx, NULL, 'p', 8, 2, &Px, NULL, 'e', 4, 1, &Ex, NULL, 'z', 5, 2, &Zx, NULL, NULL, 0, 0, NULL, NULL};/* */#define ifix(f) ((int) ((float) (f) + 0.5))#define nrand() (((float) (rand ()) / (float) 2147483647))#define rng(a,b) if (((i = ifix (a * nrand ()) * b) ? i -= b : i) < 0\ || i >= a * b + (1 - b))\ return NOTOK;static int pwdgen (pw)char *pw;{ register int i, j; register char c, *f, *s; register struct pair *pair; register struct web *web; static int latch = 0; if (!latch) { if ((Mx = malloc (((unsigned) (strlen (Dx) + strlen (Lx) + strlen (Nx))))) == NULL) return NOTOK; (void) strcpy (s = Mx, Dx); s += strlen (s); (void) strcpy (s, Lx); s += strlen (s); (void) strcpy (s, Nx); s += strlen (s); (void) srand ((int) time ((long *) 0)); latch++; } rng (TOT, 1.0); for (pair = pairs; pair -> p_form; pair++) if (pair -> p_value < i) f = pair -> p_form; else break; do { for (s = pw; c = *f++;) { for (web = webs; web -> w_key != c; web++) if (web -> w_key == c) break; if (!web -> w_key) return NOTOK; rng (web -> w_length, web -> w_factor); for (j = web -> w_factor; j > 0; j--) *s++ = (*web -> w_string)[i++]; if (web -> w_special && *f == NULL) { s--, i--; while (index (web -> w_special, *s)) *s = (*web -> w_string)[--i]; s++; } } *s = NULL; } while (object (pw)); return OK;}/* */static struct obj { char *o_string; int o_advance;} objects[] = { "TRAFLLEHPARCTIHS", 4, "SIPSSATITDOGCUFKUF", 3, NULL, 0};static int object (pw)register char *pw;{ register int n; register char *f, *s; char buffer[BUFSIZ]; register struct obj *o; for (f = buffer + strlen (s = pw), *f = NULL; *s; s++) *--f = *s; for (o = objects; s = o -> o_string; o++) for (n = o -> o_advance; *s; s += n) if (strncmp (f, s, n) == 0) return NOTOK; return OK;}/* */#ifndef FORTUNE#define FORTUNE "/usr/games/fortune"#endif#ifndef RFINGER#ifndef SYS5#define RFINGER "/usr/ucb/finger"#else#define RFINGER "/usr/bin/finger"#endif#endifstatic int op_exec (sd, ryo, rox, in, roi)int sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t in;struct RoSAPindication *roi;{ int fd, i, result, vecp, vecq, pd[2]; register char *bp, *dp; char buffer[BUFSIZ], data[BUFSIZ], *pgm, *vec[NVEC + 1]; struct type_IMISC_IA5List *ia5; register struct type_IMISC_IA5List **ia5p; vecp = vecq = 0; if (rox -> rox_nolinked == 0) { advise (NULLCP, LOG_INFO, "RO-INVOKE.INDICATION/%d: %s, unknown linkage %d", sd, ryo -> ryo_name, rox -> rox_linkid); result = ureject (sd, ROS_IP_LINKED, rox, roi); goto out; } if (debug) advise (NULLCP, LOG_DEBUG, "RO-INVOKE.INDICATION/%d: %s", sd, ryo -> ryo_name); if (ryo -> ryo_op == operation_IMISC_qotd) { vec[vecp++] = pgm = FORTUNE; vecq = vecp; } else { vec[vecp++] = pgm = RFINGER;#ifdef RFOPT1 vec[vecp++] = RFOPT1;#endif#ifdef RFOPT2 vec[vecp++] = RFOPT2;#endif vecq = vecp; for (ia5 = (struct type_IMISC_IA5List *) in; ia5; ia5 = ia5 -> next) if (vecp >= NVEC || (vec[vecp++] = qb2str (ia5 -> IA5String)) == NULLCP) { result = error (sd, error_IMISC_congested, (caddr_t) NULL, rox, roi); goto out; } } vec[vecp] = NULLCP; ia5 = NULL; ia5p = &ia5; if (access (pgm, 1) == NOTOK) { result = error_IMISC_unableToAccessFile;oops: ; free_IMISC_IA5List (ia5); ia5 = NULL; ia5p = &ia5; (void) sprintf (buffer, "%s: %s", pgm, sys_errname (errno)); if ((*ia5p = str2ia5list (buffer)) == NULL) goto congested; ia5p = &((*ia5p) -> next); result = error (sd, result, (caddr_t) ia5, rox, roi); free_IMISC_IA5List (ia5); goto out; } if (pipe (pd) == NOTOK) { result = error_IMISC_unableToPipe; goto oops; } switch (fork ()) { case NOTOK: (void) close (pd[0]); (void) close (pd[1]); result = error_IMISC_unableToFork; goto oops; case OK: closelog (); if ((fd = open ("/dev/null", 2)) != NOTOK) { if (fd != 0) (void) dup2 (fd, 0), (void) close (fd); } (void) dup2 (pd[1], 1); (void) dup2 (pd[1], 2); (void) close (pd[0]); (void) close (pd[1]); if (execuid != 0) { (void) setgid (execgid); (void) setuid (execuid); } execvp (pgm, vec); _exit (1); default: (void) close (pd[1]); for (vecp = vecq; bp = vec[vecp]; vecp++) { free (bp); vec[vecp] = NULL; } for (; vecq < vecp; vecq++) if (bp = vec[vecq]) free (bp); for (dp = data;;) switch (i = read (pd[0], buffer, sizeof buffer)) { case NOTOK: i = errno; (void) close (pd[0]); errno = i; result = error_IMISC_errorReading; goto oops; case OK: (void) close (pd[0]); if (dp != data) { *dp = NULL; if ((*ia5p = str2ia5list (data)) == NULL) goto congested; ia5p = &((*ia5p) -> next); } if (RyDsResult (sd, rox -> rox_id, (caddr_t) ia5, ROS_NOPRIO, roi) == NOTOK) ros_adios (&roi -> roi_preject, "RESULT"); free_IMISC_IA5List (ia5); result = OK; goto out; default: for (bp = buffer; i > 0; bp++, i--) switch (*bp) { case '\n': *dp = NULL; if ((*ia5p = str2ia5list (data)) == NULL) goto congested; ia5p = &((*ia5p) -> next); dp = data; break; case NULL: break; default: *dp++ = *bp; break; } continue; } }congested: ; free_IMISC_IA5List (ia5); result = error (sd, error_IMISC_congested, (caddr_t) NULL, rox, roi);out: ; for (vecp = vecq; bp = vec[vecp]; vecp++) free (bp); return result;}/* *//* ARGSUSED */static int op_tellUser (sd, ryo, rox, in, roi)int sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t in;struct RoSAPindication *roi;{#ifndef SYS5 int ud;#endif int hit, result, vecp; char *bp, *fromuser, *touser, buffer[BUFSIZ], **vec, *vecl[NVEC + 1]; struct utmp uts; register struct utmp *ut = &uts; struct type_IMISC_IA5List *ia5; vecp = 0; if (rox -> rox_nolinked == 0) { advise (NULLCP, LOG_INFO, "RO-INVOKE.INDICATION/%d: %s, unknown linkage %d", sd, ryo -> ryo_name, rox -> rox_linkid); result = ureject (sd, ROS_IP_LINKED, rox, roi); goto out; } if (debug) advise (NULLCP, LOG_DEBUG, "RO-INVOKE.INDICATION/%d: %s", sd, ryo -> ryo_name); for (ia5 = (struct type_IMISC_IA5List *) in; ia5; ia5 = ia5 -> next) if (vecp >= NVEC || (vecl[vecp++] = qb2str (ia5 -> IA5String)) == NULLCP) goto congested; vecl[vecp] = NULLCP; if (vecp < 3) { advise (NULLCP, LOG_INFO, "too few arguments (got %d, wanted at least 3)", vecp); result = ureject (sd, ROS_IP_MISTYPED, rox, roi); goto out; } fromuser = vecl[0]; touser = vecl[1]; vec = &vecl[2], vecp -= 2; hit = 0; result = error_IMISC_userNotLoggedIn;#ifndef SYS5 if ((ud = open ("/etc/utmp", 0)) == NOTOK) { (void) sprintf (buffer, "/etc/utmp: %s", sys_errname (errno)); if ((ia5 = str2ia5list (buffer)) == NULL) goto congested; result = error (sd, error_IMISC_unableToOpenFile, (caddr_t) ia5, rox, roi); free_IMISC_IA5List (ia5); goto out; } while (read (ud, (char *) ut, sizeof *ut) == sizeof *ut) { if (ut -> ut_name[0] == NULL) continue; if (strncmp (ut -> ut_name, touser, sizeof ut -> ut_name) == 0) if (do_the_tell (ut, fromuser, vec, vecp) != NOTOK) hit++; else result = error_IMISC_unableToOpenFile; } (void) close (ud);#else setutent (); while (ut = getutent ()) { if (ut -> ut_type != USER_PROCESS) continue; if (strncmp (ut -> ut_name, touser, sizeof ut -> ut_name) == 0) if (do_the_tell (ut, fromuser, vec, vecp) != NOTOK) hit++; else result = error_IMISC_unableToOpenFile; } endutent ();#endif if (hit == 0) { result = error (sd, result, (caddr_t) NULL, rox, roi); goto out; } if (RyDsResult (sd, rox -> rox_id, (caddr_t) NULL, ROS_NOPRIO, roi) == NOTOK) ros_adios (&roi -> roi_preject, "RESULT"); result = OK; goto out;congested: ; result = error (sd, error_IMISC_congested, (caddr_t) NULL, rox, roi);out: ; for (vecp = 0; bp = vecl[vecp]; vecp++) free (bp); return result;}/* */static int do_the_tell (ut, from, vec, vecp)struct utmp *ut;char *from;char *vec[];int vecp;{ int i, pid; char *bp, tty[5 + LMAX + 1]; struct stat st; FILE *fp; (void) strcpy (bp = tty, "/dev/"); bp += strlen (bp); (void) strncpy (bp, ut -> ut_line, LMAX); bp += LMAX; *bp = NULL; if (stat (tty, &st) == NOTOK || (st.st_mode & (S_IWRITE >> 3)) != (S_IWRITE >> 3)) return NOTOK; for (i = 0; i < 5; i++) { switch (pid = fork ()) { case NOTOK: continue; case 0: break; default: return OK; } break; } if (pid == NOTOK) return NOTOK; if ((fp = fopen (tty, "w")) == NULL) _exit (1); fprintf (fp, "\r\nmessage from %s:\r\n\007", from); for (i = 0, bp = NULL; i < vecp; i++, bp = " ") { if (bp) fputs (bp, fp); fputs (vec[i], fp); } fputs ("\r\n", fp); (void) fclose (fp); _exit (0); /* NOTREACHED */}/* */static int op_data (sd, ryo, rox, in, roi)int sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t in;struct RoSAPindication *roi;{ if (rox -> rox_nolinked == 0) { advise (NULLCP, LOG_INFO, "RO-INVOKE.INDICATION/%d: %s, unknown linkage %d", sd, ryo -> ryo_name, rox -> rox_linkid); return ureject (sd, ROS_IP_LINKED, rox, roi); } if (debug) advise (NULLCP, LOG_DEBUG, "RO-INVOKE.INDICATION/%d: %s", sd, ryo -> ryo_name); if (RyDsResult (sd, rox -> rox_id, ryo -> ryo_op == operation_IMISC_echo ? in : (caddr_t) NULL, ROS_NOPRIO, roi) == NOTOK) ros_adios (&roi -> roi_preject, "RESULT"); return OK;}/* ERROR */static int error (sd, err, param, rox, roi)int sd, err;caddr_t param;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{ if (RyDsError (sd, rox -> rox_id, err, param, ROS_NOPRIO, roi) == NOTOK) ros_adios (&roi -> roi_preject, "ERROR"); return OK;}/* U-REJECT */static int ureject (sd, reason, rox, roi)int sd, reason;struct RoSAPinvoke *rox;struct RoSAPindication *roi;{ if (RyDsUReject (sd, rox -> rox_id, reason, ROS_NOPRIO, roi) == NOTOK) ros_adios (&roi -> roi_preject, "U-REJECT"); return OK;}/* TYPES */struct type_IMISC_IA5List *str2ia5list (s)char *s;{ register struct type_IMISC_IA5List *ia5; if ((ia5 = (struct type_IMISC_IA5List *) calloc (1, sizeof *ia5)) == NULL) return NULL; if ((ia5 -> IA5String = str2qb (s, strlen (s), 1)) == NULL) { free ((char *) ia5); return NULL; } return ia5;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?