1: #ifdef TTYD
2: /* ttyw.c - the writer */
3:
4: #include <errno.h>
5: #include <stdio.h>
6: #include <strings.h>
7: #include <sys/types.h>
8: #include <sys/socket.h>
9: #include <netinet/in.h>
10: #include <netdb.h>
11: #include <arpa/inet.h>
12: #include "ttyd.h"
13: #include "ttym.c"
14:
15: /* */
16:
17: ttyw (command, host, line, user)
18: char *command,
19: *host,
20: *line,
21: *user;
22: {
23: int privd,
24: sd;
25: unsigned times;
26: char buffer[BUFSIZ];
27: struct hostent *hp;
28: struct servent *sp;
29: struct sockaddr_in tty_socket,
30: *tsock = &tty_socket;
31:
32: if (command == NULL) {
33: errno = EINVAL;
34: return NOTOK;
35: }
36:
37: if ((sp = getservbyname ("ttyserver", "tcp")) == NULL) {
38: errno = ENETDOWN;
39: return NOTOK;
40: }
41: if (host == NULL)
42: (void) gethostname (host = buffer, sizeof buffer);
43: if ((hp = gethostbyname (host))==NULL) {
44: errno = ENETDOWN;
45: return NOTOK;
46: }
47:
48: if (line && strncmp (line, "/dev/", strlen ("/dev/")) == 0)
49: line += strlen ("/dev/");
50:
51: privd = *command >= 'A' && *command <= 'Z';/* crude */
52:
53: /* */
54:
55: for (times = 1; times <= 16; times *= 2) {
56: if ((sd = getport (0, privd)) == NOTOK)
57: return NOTOK;
58:
59: bzero ((char *) tsock, sizeof *tsock);
60: tsock -> sin_family = hp -> h_addrtype;
61: tsock -> sin_port = sp -> s_port;
62: bcopy (hp -> h_addr, (char *) &tsock -> sin_addr, hp -> h_length);
63:
64: if (connect (sd, (struct sockaddr *) tsock, sizeof *tsock) == NOTOK) {
65: (void) close (sd);
66: if (errno == ECONNREFUSED || errno == EINTR) {
67: sleep (times);
68: continue;
69: }
70: break;
71: }
72:
73: ttym (sd, command, line, user, NULL);
74: if (ttyv (sd) == NOTOK || ttyv (sd) == NOTOK) {
75: (void) close (sd);
76: errno = EPERM; /* what else??? */
77: return NOTOK;
78: }
79: else
80: return sd;
81: }
82:
83: return NOTOK;
84: }
85:
86: /* */
87:
88: static int getport (options, privd)
89: unsigned options;
90: int privd;
91: {
92: int sd,
93: port;
94: struct sockaddr_in unx_socket,
95: *usock = &unx_socket;
96:
97: if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK)
98: return sd;
99:
100: if (options & SO_DEBUG)
101: (void) setsockopt (sd, SOL_SOCKET, SO_DEBUG, NULL, 0);
102: (void) setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, NULL, 0);
103:
104: if (!privd)
105: return sd;
106:
107: usock -> sin_family = AF_INET;
108: usock -> sin_addr.s_addr = INADDR_ANY;
109:
110: for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {
111: usock -> sin_port = htons (port);
112:
113: switch (bind (sd, (struct sockaddr *) usock, sizeof *usock)) {
114: case NOTOK:
115: if (errno != EADDRINUSE && errno != EADDRNOTAVAIL)
116: return NOTOK;
117: continue;
118:
119: default:
120: return sd;
121: }
122: }
123:
124: return NOTOK;
125: }
126: #endif TTYD
Defined functions
ttyw
defined in line
17; used 1 times