Mercurial > dropbear
comparison svr-main.c @ 579:8c737cd7c1af
merge of '48fdaa8706d1acda35e9d564adc9a1fbc96c18c8'
and '658fd03abd21e0da7c4c89b9fff9dc693c72daae'
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 27 Feb 2010 11:53:18 +0000 |
parents | 005530560594 |
children | a98a2138364a |
comparison
equal
deleted
inserted
replaced
577:69e98c45db7c | 579:8c737cd7c1af |
---|---|
75 } | 75 } |
76 #endif | 76 #endif |
77 | 77 |
78 #ifdef INETD_MODE | 78 #ifdef INETD_MODE |
79 static void main_inetd() { | 79 static void main_inetd() { |
80 | 80 char *host, *port = NULL; |
81 struct sockaddr_storage remoteaddr; | |
82 socklen_t remoteaddrlen; | |
83 char * addrstring = NULL; | |
84 | 81 |
85 /* Set up handlers, syslog, seed random */ | 82 /* Set up handlers, syslog, seed random */ |
86 commonsetup(); | 83 commonsetup(); |
87 | 84 |
88 remoteaddrlen = sizeof(remoteaddr); | |
89 if (getpeername(0, (struct sockaddr*)&remoteaddr, &remoteaddrlen) < 0) { | |
90 dropbear_exit("Unable to getpeername: %s", strerror(errno)); | |
91 } | |
92 | |
93 /* In case our inetd was lax in logging source addresses */ | 85 /* In case our inetd was lax in logging source addresses */ |
94 addrstring = getaddrstring(&remoteaddr, 1); | 86 get_socket_address(0, NULL, NULL, &host, &port, 0); |
95 dropbear_log(LOG_INFO, "Child connection from %s", addrstring); | 87 dropbear_log(LOG_INFO, "Child connection from %s:%s", host, port); |
88 m_free(host); | |
89 m_free(port); | |
96 | 90 |
97 /* Don't check the return value - it may just fail since inetd has | 91 /* Don't check the return value - it may just fail since inetd has |
98 * already done setsid() after forking (xinetd on Darwin appears to do | 92 * already done setsid() after forking (xinetd on Darwin appears to do |
99 * this */ | 93 * this */ |
100 setsid(); | 94 setsid(); |
101 | 95 |
102 /* Start service program | 96 /* Start service program |
103 * -1 is a dummy childpipe, just something we can close() without | 97 * -1 is a dummy childpipe, just something we can close() without |
104 * mattering. */ | 98 * mattering. */ |
105 svr_session(0, -1, getaddrhostname(&remoteaddr), addrstring); | 99 svr_session(0, -1); |
106 | 100 |
107 /* notreached */ | 101 /* notreached */ |
108 } | 102 } |
109 #endif /* INETD_MODE */ | 103 #endif /* INETD_MODE */ |
110 | 104 |
131 | 125 |
132 /* sockets to identify pre-authenticated clients */ | 126 /* sockets to identify pre-authenticated clients */ |
133 for (i = 0; i < MAX_UNAUTH_CLIENTS; i++) { | 127 for (i = 0; i < MAX_UNAUTH_CLIENTS; i++) { |
134 childpipes[i] = -1; | 128 childpipes[i] = -1; |
135 } | 129 } |
136 bzero(preauth_addrs, sizeof(preauth_addrs)); | 130 memset(preauth_addrs, 0x0, sizeof(preauth_addrs)); |
137 | 131 |
138 /* Set up the listening sockets */ | 132 /* Set up the listening sockets */ |
139 listensockcount = listensockets(listensocks, MAX_LISTEN_ADDR, &maxsock); | 133 listensockcount = listensockets(listensocks, MAX_LISTEN_ADDR, &maxsock); |
140 if (listensockcount == 0) | 134 if (listensockcount == 0) |
141 { | 135 { |
216 } | 210 } |
217 } | 211 } |
218 | 212 |
219 /* handle each socket which has something to say */ | 213 /* handle each socket which has something to say */ |
220 for (i = 0; i < listensockcount; i++) { | 214 for (i = 0; i < listensockcount; i++) { |
221 | |
222 struct sockaddr_storage remoteaddr; | |
223 socklen_t remoteaddrlen = 0; | |
224 size_t num_unauthed_for_addr = 0; | 215 size_t num_unauthed_for_addr = 0; |
225 size_t num_unauthed_total = 0; | 216 size_t num_unauthed_total = 0; |
226 char * remote_addr_str = NULL; | 217 char *remote_host = NULL, *remote_port = NULL; |
227 pid_t fork_ret = 0; | 218 pid_t fork_ret = 0; |
228 size_t conn_idx = 0; | 219 size_t conn_idx = 0; |
220 struct sockaddr_storage remoteaddr; | |
221 socklen_t remoteaddrlen; | |
229 | 222 |
230 if (!FD_ISSET(listensocks[i], &fds)) | 223 if (!FD_ISSET(listensocks[i], &fds)) |
231 continue; | 224 continue; |
232 | 225 |
233 remoteaddrlen = sizeof(remoteaddr); | 226 remoteaddrlen = sizeof(remoteaddr); |
238 /* accept failed */ | 231 /* accept failed */ |
239 continue; | 232 continue; |
240 } | 233 } |
241 | 234 |
242 /* Limit the number of unauthenticated connections per IP */ | 235 /* Limit the number of unauthenticated connections per IP */ |
243 remote_addr_str = getaddrstring(&remoteaddr, 0); | 236 getaddrstring(&remoteaddr, &remote_host, NULL, 0); |
244 | 237 |
245 num_unauthed_for_addr = 0; | 238 num_unauthed_for_addr = 0; |
246 num_unauthed_total = 0; | 239 num_unauthed_total = 0; |
247 for (j = 0; j < MAX_UNAUTH_CLIENTS; j++) { | 240 for (j = 0; j < MAX_UNAUTH_CLIENTS; j++) { |
248 if (childpipes[j] >= 0) { | 241 if (childpipes[j] >= 0) { |
249 num_unauthed_total++; | 242 num_unauthed_total++; |
250 if (strcmp(remote_addr_str, preauth_addrs[j]) == 0) { | 243 if (strcmp(remote_host, preauth_addrs[j]) == 0) { |
251 num_unauthed_for_addr++; | 244 num_unauthed_for_addr++; |
252 } | 245 } |
253 } else { | 246 } else { |
254 /* a free slot */ | 247 /* a free slot */ |
255 conn_idx = j; | 248 conn_idx = j; |
278 } else if (fork_ret > 0) { | 271 } else if (fork_ret > 0) { |
279 | 272 |
280 /* parent */ | 273 /* parent */ |
281 childpipes[conn_idx] = childpipe[0]; | 274 childpipes[conn_idx] = childpipe[0]; |
282 m_close(childpipe[1]); | 275 m_close(childpipe[1]); |
283 preauth_addrs[conn_idx] = remote_addr_str; | 276 preauth_addrs[conn_idx] = remote_host; |
284 remote_addr_str = NULL; | 277 remote_host = NULL; |
285 | 278 |
286 } else { | 279 } else { |
287 | 280 |
288 /* child */ | 281 /* child */ |
289 char * addrstring = NULL; | |
290 #ifdef DEBUG_FORKGPROF | 282 #ifdef DEBUG_FORKGPROF |
291 extern void _start(void), etext(void); | 283 extern void _start(void), etext(void); |
292 monstartup((u_long)&_start, (u_long)&etext); | 284 monstartup((u_long)&_start, (u_long)&etext); |
293 #endif /* DEBUG_FORKGPROF */ | 285 #endif /* DEBUG_FORKGPROF */ |
294 | 286 |
295 m_free(remote_addr_str); | 287 getaddrstring(&remoteaddr, NULL, &remote_port, 0); |
296 addrstring = getaddrstring(&remoteaddr, 1); | 288 dropbear_log(LOG_INFO, "Child connection from %s:%s", remote_host, remote_port); |
297 dropbear_log(LOG_INFO, "Child connection from %s", addrstring); | 289 m_free(remote_host); |
290 m_free(remote_port); | |
298 | 291 |
299 #ifndef DEBUG_NOFORK | 292 #ifndef DEBUG_NOFORK |
300 if (setsid() < 0) { | 293 if (setsid() < 0) { |
301 dropbear_exit("setsid: %s", strerror(errno)); | 294 dropbear_exit("setsid: %s", strerror(errno)); |
302 } | 295 } |
308 } | 301 } |
309 | 302 |
310 m_close(childpipe[0]); | 303 m_close(childpipe[0]); |
311 | 304 |
312 /* start the session */ | 305 /* start the session */ |
313 svr_session(childsock, childpipe[1], | 306 svr_session(childsock, childpipe[1]); |
314 getaddrhostname(&remoteaddr), | |
315 addrstring); | |
316 /* don't return */ | 307 /* don't return */ |
317 dropbear_assert(0); | 308 dropbear_assert(0); |
318 } | 309 } |
319 | 310 |
320 out: | 311 out: |
321 /* This section is important for the parent too */ | 312 /* This section is important for the parent too */ |
322 m_close(childsock); | 313 m_close(childsock); |
323 if (remote_addr_str) { | 314 if (remote_host) { |
324 m_free(remote_addr_str); | 315 m_free(remote_host); |
325 } | 316 } |
326 } | 317 } |
327 } /* for(;;) loop */ | 318 } /* for(;;) loop */ |
328 | 319 |
329 /* don't reach here */ | 320 /* don't reach here */ |