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 + -
显示快捷键?