⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ttyw.c

📁 早期freebsd实现
💻 C
字号:
#ifndef	BSD42#undef	TTYD#endif#ifdef	TTYD/* ttyw.c - the writer */#include <errno.h>#include <stdio.h>#include <strings.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#ifndef	hpux#include <arpa/inet.h>#endif#include "ttyd.h"#include "ttym.c"/*  */ttyw (command, host, line, user)char   *command,       *host,       *line,       *user;{    int	    privd,            sd;    unsigned    times;    char        buffer[BUFSIZ];    struct	hostent *hp;    struct	servent *sp;    struct sockaddr_in  tty_socket,                       *tsock = &tty_socket;    if (command == NULL) {	errno = EINVAL;	return NOTOK;    }    if ((sp = getservbyname ("ttyserver", "tcp")) == NULL) {	errno = ENETDOWN;	return NOTOK;    }    if (host == NULL)	(void) gethostname (host = buffer, sizeof buffer);    if ((hp = gethostbyname (host))==NULL) {	errno = ENETDOWN;	return NOTOK;    }    if (line && strncmp (line, "/dev/", strlen ("/dev/")) == 0)	line += strlen ("/dev/");    privd = *command >= 'A' && *command <= 'Z';/* crude *//*  */    for (times = 1; times <= 16; times *= 2) {	if ((sd = getport (0, privd)) == NOTOK)	    return NOTOK;	bzero ((char *) tsock, sizeof *tsock);	tsock -> sin_family = hp -> h_addrtype;	tsock -> sin_port = sp -> s_port;	bcopy (hp -> h_addr, (char *) &tsock -> sin_addr, hp -> h_length);	if (connect (sd, (struct sockaddr *) tsock, sizeof *tsock) == NOTOK) {	    (void) close (sd);	    if (errno == ECONNREFUSED || errno == EINTR) {		sleep (times);		continue;	    }	    break;	}	ttym (sd, command, line, user, NULL);	if (ttyv (sd) == NOTOK || ttyv (sd) == NOTOK) {	    (void) close (sd);	    errno = EPERM;	/* what else??? */	    return NOTOK;	}	else	    return sd;    }    return NOTOK;}/*  */static int  getport (options, privd)unsigned    options;int     privd;{    int     sd,            port;    struct sockaddr_in  unx_socket,                       *usock = &unx_socket;    if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK)	return sd;    if (options & SO_DEBUG)	(void) setsockopt (sd, SOL_SOCKET, SO_DEBUG, NULL, 0);    (void) setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, NULL, 0);    if (!privd)	return sd;    usock -> sin_family = AF_INET;    usock -> sin_addr.s_addr = INADDR_ANY;    for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {	usock -> sin_port = htons (port);	switch (bind (sd, (struct sockaddr *) usock, sizeof *usock)) {	    case NOTOK: 		if (errno != EADDRINUSE && errno != EADDRNOTAVAIL)		    return NOTOK;		continue;	    default: 		return sd;	}    }    return NOTOK;}#endif	TTYD

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -