annotate uip/ttyw.c @ 0:bce86c4163a3

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