server.c (3b0f8d2ed641ceeded11c0d3f253b0cacbf00880) server.c (b6217683dc0269a53b799399522dbdfb5a4919cc)
1/*-
2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $Id: server.c,v 1.16.2.9 1998/03/20 19:48:23 brian Exp $
26 * $Id: server.c,v 1.16.2.10 1998/04/03 19:21:51 brian Exp $
27 */
28
29#include <sys/param.h>
30#include <sys/socket.h>
31#include <netinet/in.h>
32#include <arpa/inet.h>
33#include <netinet/in_systm.h>
27 */
28
29#include <sys/param.h>
30#include <sys/socket.h>
31#include <netinet/in.h>
32#include <arpa/inet.h>
33#include <netinet/in_systm.h>
34#include <netinet/ip.h>
34
35#include <errno.h>
36#include <stdio.h>
37#include <string.h>
38#include <sys/stat.h>
39#include <sys/un.h>
40#include <termios.h>
41#include <unistd.h>

--- 5 unchanged lines hidden (view full) ---

47#include "defs.h"
48#include "vars.h"
49#include "descriptor.h"
50#include "server.h"
51#include "id.h"
52#include "prompt.h"
53#include "timer.h"
54#include "auth.h"
35
36#include <errno.h>
37#include <stdio.h>
38#include <string.h>
39#include <sys/stat.h>
40#include <sys/un.h>
41#include <termios.h>
42#include <unistd.h>

--- 5 unchanged lines hidden (view full) ---

48#include "defs.h"
49#include "vars.h"
50#include "descriptor.h"
51#include "server.h"
52#include "id.h"
53#include "prompt.h"
54#include "timer.h"
55#include "auth.h"
56#include "lqr.h"
57#include "hdlc.h"
58#include "fsm.h"
59#include "lcp.h"
60#include "ccp.h"
61#include "throughput.h"
62#include "link.h"
63#include "mp.h"
64#include "iplist.h"
65#include "slcompress.h"
66#include "ipcp.h"
67#include "filter.h"
68#include "bundle.h"
55
56static int
57server_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
58{
59 struct server *s = descriptor2server(d);
60
61 if (r && s->fd >= 0) {
62 if (*n < s->fd + 1)

--- 10 unchanged lines hidden (view full) ---

73 struct server *s = descriptor2server(d);
74 return s->fd >= 0 && FD_ISSET(s->fd, fdset);
75}
76
77#define IN_SIZE sizeof(struct sockaddr_in)
78#define UN_SIZE sizeof(struct sockaddr_in)
79#define ADDRSZ (IN_SIZE > UN_SIZE ? IN_SIZE : UN_SIZE)
80
69
70static int
71server_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
72{
73 struct server *s = descriptor2server(d);
74
75 if (r && s->fd >= 0) {
76 if (*n < s->fd + 1)

--- 10 unchanged lines hidden (view full) ---

87 struct server *s = descriptor2server(d);
88 return s->fd >= 0 && FD_ISSET(s->fd, fdset);
89}
90
91#define IN_SIZE sizeof(struct sockaddr_in)
92#define UN_SIZE sizeof(struct sockaddr_in)
93#define ADDRSZ (IN_SIZE > UN_SIZE ? IN_SIZE : UN_SIZE)
94
95static char *rm;
96
81static void
82server_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
83{
84 struct server *s = descriptor2server(d);
85 char hisaddr[ADDRSZ];
86 struct sockaddr *sa = (struct sockaddr *)hisaddr;
87 struct sockaddr_in *sin = (struct sockaddr_in *)hisaddr;
88 int ssize = ADDRSZ, wfd;
97static void
98server_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
99{
100 struct server *s = descriptor2server(d);
101 char hisaddr[ADDRSZ];
102 struct sockaddr *sa = (struct sockaddr *)hisaddr;
103 struct sockaddr_in *sin = (struct sockaddr_in *)hisaddr;
104 int ssize = ADDRSZ, wfd;
105 struct prompt *p;
89
90 wfd = accept(s->fd, sa, &ssize);
91 if (wfd < 0) {
92 LogPrintf(LogERROR, "server_Read: accept(): %s\n", strerror(errno));
93 return;
94 }
95
96 switch (sa->sa_family) {

--- 14 unchanged lines hidden (view full) ---

111 break;
112
113 default:
114 write(wfd, "Unrecognised access !\n", 22);
115 close(wfd);
116 return;
117 }
118
106
107 wfd = accept(s->fd, sa, &ssize);
108 if (wfd < 0) {
109 LogPrintf(LogERROR, "server_Read: accept(): %s\n", strerror(errno));
110 return;
111 }
112
113 switch (sa->sa_family) {

--- 14 unchanged lines hidden (view full) ---

128 break;
129
130 default:
131 write(wfd, "Unrecognised access !\n", 22);
132 close(wfd);
133 return;
134 }
135
119 if (!prompt_Init(&prompt, wfd)) {
120 write(wfd, "Connection already in use.\n", 27);
136 if ((p = prompt_Create(s, bundle, wfd)) == NULL) {
137 write(wfd, "Connection refused.\n", 20);
121 close(wfd);
122 } else {
138 close(wfd);
139 } else {
123 LocalAuthInit();
124 IsInteractive(1);
125 prompt_Display(&prompt, bundle);
140 switch (sa->sa_family) {
141 case AF_LOCAL:
142 snprintf(p->who, sizeof p->who, "local (%s)", rm);
143 break;
144 case AF_INET:
145 snprintf(p->who, sizeof p->who, "TCP (%s:%u)",
146 inet_ntoa(sin->sin_addr), sin->sin_port);
147 break;
148 }
149 IsInteractive(p);
150 prompt_TtyCommandMode(p);
151 prompt_Required(p);
126 }
127}
128
129static void
130server_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
131{
132 /* We never want to write here ! */
133 LogPrintf(LogERROR, "server_Write: Internal error: Bad call !\n");

--- 7 unchanged lines hidden (view full) ---

141 server_IsSet,
142 server_Read,
143 server_Write
144 },
145 -1
146};
147
148static struct sockaddr_un ifsun;
152 }
153}
154
155static void
156server_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
157{
158 /* We never want to write here ! */
159 LogPrintf(LogERROR, "server_Write: Internal error: Bad call !\n");

--- 7 unchanged lines hidden (view full) ---

167 server_IsSet,
168 server_Read,
169 server_Write
170 },
171 -1
172};
173
174static struct sockaddr_un ifsun;
149static char *rm;
150
151int
175
176int
152ServerLocalOpen(const char *name, mode_t mask)
177ServerLocalOpen(struct bundle *bundle, const char *name, mode_t mask)
153{
154 int s;
155
178{
179 int s;
180
156 if (VarLocalAuth == LOCAL_DENY) {
157 LogPrintf(LogWARN, "Local: Can't open socket %s: No password "
158 "in ppp.secret\n", name);
159 return 1;
160 }
161
162 if (mode & MODE_INTER) {
163 LogPrintf(LogWARN, "Local: Can't open socket in interactive mode\n");
164 return 1;
165 }
166
167 memset(&ifsun, '\0', sizeof ifsun);
168 ifsun.sun_len = strlen(name);
169 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) {
170 LogPrintf(LogERROR, "Local: %s: Path too long\n", name);
171 return 2;
172 }
173 ifsun.sun_family = AF_LOCAL;
174 strcpy(ifsun.sun_path, name);

--- 4 unchanged lines hidden (view full) ---

179 return 3;
180 }
181 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
182 if (mask != (mode_t)-1)
183 mask = umask(mask);
184 if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) {
185 if (mask != (mode_t)-1)
186 umask(mask);
181 memset(&ifsun, '\0', sizeof ifsun);
182 ifsun.sun_len = strlen(name);
183 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) {
184 LogPrintf(LogERROR, "Local: %s: Path too long\n", name);
185 return 2;
186 }
187 ifsun.sun_family = AF_LOCAL;
188 strcpy(ifsun.sun_path, name);

--- 4 unchanged lines hidden (view full) ---

193 return 3;
194 }
195 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
196 if (mask != (mode_t)-1)
197 mask = umask(mask);
198 if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) {
199 if (mask != (mode_t)-1)
200 umask(mask);
187 LogPrintf(LogERROR, "Local: bind: %s\n", strerror(errno));
188 if (errno == EADDRINUSE)
189 prompt_Printf(&prompt, "Wait for a while, then try again.\n");
201 LogPrintf(LogWARN, "Local: bind: %s\n", strerror(errno));
190 close(s);
191 return 4;
192 }
193 if (mask != (mode_t)-1)
194 umask(mask);
195 if (listen(s, 5) != 0) {
196 LogPrintf(LogERROR, "Local: Unable to listen to socket - BUNDLE overload?\n");
197 close(s);
198 ID0unlink(name);
199 return 5;
200 }
202 close(s);
203 return 4;
204 }
205 if (mask != (mode_t)-1)
206 umask(mask);
207 if (listen(s, 5) != 0) {
208 LogPrintf(LogERROR, "Local: Unable to listen to socket - BUNDLE overload?\n");
209 close(s);
210 ID0unlink(name);
211 return 5;
212 }
201 ServerClose();
213 ServerClose(bundle);
202 server.fd = s;
203 rm = ifsun.sun_path;
204 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name);
205 return 0;
206}
207
208int
214 server.fd = s;
215 rm = ifsun.sun_path;
216 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name);
217 return 0;
218}
219
220int
209ServerTcpOpen(int port)
221ServerTcpOpen(struct bundle *bundle, int port)
210{
211 struct sockaddr_in ifsin;
212 int s;
213
222{
223 struct sockaddr_in ifsin;
224 int s;
225
214 if (VarLocalAuth == LOCAL_DENY) {
215 LogPrintf(LogWARN, "Tcp: Can't open socket %d: No password "
216 "in ppp.secret\n", port);
217 return 6;
218 }
219
220 if (mode & MODE_INTER) {
221 LogPrintf(LogWARN, "Tcp: Can't open socket in interactive mode\n");
222 return 6;
223 }
224
225 s = ID0socket(PF_INET, SOCK_STREAM, 0);
226 if (s < 0) {
227 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno));
228 return 7;
229 }
230 memset(&ifsin, '\0', sizeof ifsin);
231 ifsin.sin_family = AF_INET;
232 ifsin.sin_addr.s_addr = INADDR_ANY;
233 ifsin.sin_port = htons(port);
234 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
235 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) {
226 s = ID0socket(PF_INET, SOCK_STREAM, 0);
227 if (s < 0) {
228 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno));
229 return 7;
230 }
231 memset(&ifsin, '\0', sizeof ifsin);
232 ifsin.sin_family = AF_INET;
233 ifsin.sin_addr.s_addr = INADDR_ANY;
234 ifsin.sin_port = htons(port);
235 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
236 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) {
236 LogPrintf(LogERROR, "Tcp: bind: %s\n", strerror(errno));
237 if (errno == EADDRINUSE)
238 prompt_Printf(&prompt, "Wait for a while, then try again.\n");
237 LogPrintf(LogWARN, "Tcp: bind: %s\n", strerror(errno));
239 close(s);
240 return 8;
241 }
242 if (listen(s, 5) != 0) {
243 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - BUNDLE overload?\n");
244 close(s);
245 return 9;
246 }
238 close(s);
239 return 8;
240 }
241 if (listen(s, 5) != 0) {
242 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - BUNDLE overload?\n");
243 close(s);
244 return 9;
245 }
247 ServerClose();
246 ServerClose(bundle);
248 server.fd = s;
249 LogPrintf(LogPHASE, "Listening at port %d.\n", port);
250 return 0;
251}
252
253int
247 server.fd = s;
248 LogPrintf(LogPHASE, "Listening at port %d.\n", port);
249 return 0;
250}
251
252int
254ServerClose()
253ServerClose(struct bundle *bundle)
255{
256 if (server.fd >= 0) {
257 close(server.fd);
258 if (rm) {
259 ID0unlink(rm);
260 rm = 0;
261 }
262 server.fd = -1;
254{
255 if (server.fd >= 0) {
256 close(server.fd);
257 if (rm) {
258 ID0unlink(rm);
259 rm = 0;
260 }
261 server.fd = -1;
262 /* Drop associated prompts */
263 bundle_DelPromptDescriptors(bundle, &server);
263 return 1;
264 }
265 return 0;
266}
264 return 1;
265 }
266 return 0;
267}