Deleted Added
full compact
server.c (31061) server.c (31070)
1/*
1/*
2 * $Id: server.c,v 1.6 1997/10/26 01:03:39 brian Exp $
2 * $Id: server.c,v 1.7 1997/11/09 06:22:47 brian Exp $
3 */
4
5#include <sys/param.h>
6#include <sys/socket.h>
7#include <netinet/in.h>
8#include <arpa/inet.h>
9#include <netinet/in_systm.h>
10#include <netinet/ip.h>
11
12#include <errno.h>
13#include <stdio.h>
14#include <string.h>
15#include <sys/stat.h>
16#include <sys/un.h>
17#include <unistd.h>
18
19#include "mbuf.h"
20#include "log.h"
21#include "loadalias.h"
22#include "command.h"
3 */
4
5#include <sys/param.h>
6#include <sys/socket.h>
7#include <netinet/in.h>
8#include <arpa/inet.h>
9#include <netinet/in_systm.h>
10#include <netinet/ip.h>
11
12#include <errno.h>
13#include <stdio.h>
14#include <string.h>
15#include <sys/stat.h>
16#include <sys/un.h>
17#include <unistd.h>
18
19#include "mbuf.h"
20#include "log.h"
21#include "loadalias.h"
22#include "command.h"
23#include "defs.h"
23#include "vars.h"
24#include "server.h"
25#include "log.h"
26#include "id.h"
24#include "vars.h"
25#include "server.h"
26#include "log.h"
27#include "id.h"
27#include "defs.h"
28
29int server = -2;
30
31static struct sockaddr_un ifsun;
32static char *rm;
33
34int
35ServerLocalOpen(const char *name, mode_t mask)
36{
37 int s;
38
39 if (VarLocalAuth == LOCAL_DENY) {
40 LogPrintf(LogERROR, "Local: Can't open socket %s: No password "
41 "in ppp.secret\n", name);
42 return 1;
43 }
44
45 if (!(mode&(MODE_AUTO|MODE_DEDICATED|MODE_DIRECT))) {
46 LogPrintf(LogERROR, "Local: Can't open socket in interactive mode\n");
47 return 1;
48 }
49
50 ifsun.sun_len = strlen(name);
51 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) {
52 LogPrintf(LogERROR, "Local: %s: Path too long\n", name);
53 return 2;
54 }
55 ifsun.sun_family = AF_LOCAL;
56 strcpy(ifsun.sun_path, name);
57
58 s = ID0socket(PF_LOCAL, SOCK_STREAM, 0);
59 if (s < 0) {
60 LogPrintf(LogERROR, "Local: socket: %s\n", strerror(errno));
61 return 3;
62 }
63 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
64 mask = umask(mask);
65 if (bind(s, (struct sockaddr *) & ifsun, sizeof(ifsun)) < 0) {
66 umask(mask);
67 LogPrintf(LogERROR, "Local: bind: %s\n", strerror(errno));
68 if (errno == EADDRINUSE && VarTerm)
69 fprintf(VarTerm, "Wait for a while, then try again.\n");
70 close(s);
71 ID0unlink(name);
72 return 4;
73 }
74 umask(mask);
75 if (listen(s, 5) != 0) {
76 LogPrintf(LogERROR, "Local: Unable to listen to socket - OS overload?\n");
77 close(s);
78 ID0unlink(name);
79 return 5;
80 }
81 ServerClose();
82 server = s;
83 rm = ifsun.sun_path;
84 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name);
85 return 0;
86}
87
88int
89ServerTcpOpen(int port)
90{
91 struct sockaddr_in ifsin;
92 int s;
93
94 if (VarLocalAuth == LOCAL_DENY) {
95 LogPrintf(LogERROR, "Tcp: Can't open socket %d: No password "
96 "in ppp.secret\n", port);
97 return 6;
98 }
99
100 if (!(mode&(MODE_AUTO|MODE_DEDICATED|MODE_DIRECT))) {
101 LogPrintf(LogERROR, "Tcp: Can't open socket in interactive mode\n");
102 return 6;
103 }
104
105 s = ID0socket(PF_INET, SOCK_STREAM, 0);
106 if (s < 0) {
107 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno));
108 return 7;
109 }
110 ifsin.sin_family = AF_INET;
111 ifsin.sin_addr.s_addr = INADDR_ANY;
112 ifsin.sin_port = htons(port);
113 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
114 if (bind(s, (struct sockaddr *) & ifsin, sizeof(ifsin)) < 0) {
115 LogPrintf(LogERROR, "Tcp: bind: %s\n", strerror(errno));
116 if (errno == EADDRINUSE && VarTerm)
117 fprintf(VarTerm, "Wait for a while, then try again.\n");
118 close(s);
119 return 8;
120 }
121 if (listen(s, 5) != 0) {
122 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - OS overload?\n");
123 close(s);
124 return 9;
125 }
126 ServerClose();
127 server = s;
128 LogPrintf(LogPHASE, "Listening at port %d.\n", port);
129 return 0;
130}
131
132void
133ServerClose()
134{
135 if (server >= 0) {
136 close(server);
137 if (rm) {
138 ID0unlink(rm);
139 rm = 0;
140 }
141 }
142 server = -1;
143}
28
29int server = -2;
30
31static struct sockaddr_un ifsun;
32static char *rm;
33
34int
35ServerLocalOpen(const char *name, mode_t mask)
36{
37 int s;
38
39 if (VarLocalAuth == LOCAL_DENY) {
40 LogPrintf(LogERROR, "Local: Can't open socket %s: No password "
41 "in ppp.secret\n", name);
42 return 1;
43 }
44
45 if (!(mode&(MODE_AUTO|MODE_DEDICATED|MODE_DIRECT))) {
46 LogPrintf(LogERROR, "Local: Can't open socket in interactive mode\n");
47 return 1;
48 }
49
50 ifsun.sun_len = strlen(name);
51 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) {
52 LogPrintf(LogERROR, "Local: %s: Path too long\n", name);
53 return 2;
54 }
55 ifsun.sun_family = AF_LOCAL;
56 strcpy(ifsun.sun_path, name);
57
58 s = ID0socket(PF_LOCAL, SOCK_STREAM, 0);
59 if (s < 0) {
60 LogPrintf(LogERROR, "Local: socket: %s\n", strerror(errno));
61 return 3;
62 }
63 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
64 mask = umask(mask);
65 if (bind(s, (struct sockaddr *) & ifsun, sizeof(ifsun)) < 0) {
66 umask(mask);
67 LogPrintf(LogERROR, "Local: bind: %s\n", strerror(errno));
68 if (errno == EADDRINUSE && VarTerm)
69 fprintf(VarTerm, "Wait for a while, then try again.\n");
70 close(s);
71 ID0unlink(name);
72 return 4;
73 }
74 umask(mask);
75 if (listen(s, 5) != 0) {
76 LogPrintf(LogERROR, "Local: Unable to listen to socket - OS overload?\n");
77 close(s);
78 ID0unlink(name);
79 return 5;
80 }
81 ServerClose();
82 server = s;
83 rm = ifsun.sun_path;
84 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name);
85 return 0;
86}
87
88int
89ServerTcpOpen(int port)
90{
91 struct sockaddr_in ifsin;
92 int s;
93
94 if (VarLocalAuth == LOCAL_DENY) {
95 LogPrintf(LogERROR, "Tcp: Can't open socket %d: No password "
96 "in ppp.secret\n", port);
97 return 6;
98 }
99
100 if (!(mode&(MODE_AUTO|MODE_DEDICATED|MODE_DIRECT))) {
101 LogPrintf(LogERROR, "Tcp: Can't open socket in interactive mode\n");
102 return 6;
103 }
104
105 s = ID0socket(PF_INET, SOCK_STREAM, 0);
106 if (s < 0) {
107 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno));
108 return 7;
109 }
110 ifsin.sin_family = AF_INET;
111 ifsin.sin_addr.s_addr = INADDR_ANY;
112 ifsin.sin_port = htons(port);
113 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s);
114 if (bind(s, (struct sockaddr *) & ifsin, sizeof(ifsin)) < 0) {
115 LogPrintf(LogERROR, "Tcp: bind: %s\n", strerror(errno));
116 if (errno == EADDRINUSE && VarTerm)
117 fprintf(VarTerm, "Wait for a while, then try again.\n");
118 close(s);
119 return 8;
120 }
121 if (listen(s, 5) != 0) {
122 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - OS overload?\n");
123 close(s);
124 return 9;
125 }
126 ServerClose();
127 server = s;
128 LogPrintf(LogPHASE, "Listening at port %d.\n", port);
129 return 0;
130}
131
132void
133ServerClose()
134{
135 if (server >= 0) {
136 close(server);
137 if (rm) {
138 ID0unlink(rm);
139 rm = 0;
140 }
141 }
142 server = -1;
143}