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}
|