Changeset 1593
- Timestamp:
- 03/06/08 19:57:26 (6 months ago)
- Files:
-
- nebula/trunk/ChangeLog (modified) (1 diff)
- nebula/trunk/src/hash.c (modified) (1 diff)
- nebula/trunk/src/nebula.c (modified) (9 diffs)
- nebula/trunk/src/nebula.h (modified) (1 diff)
- nebula/trunk/src/session.c (modified) (2 diffs)
- nebula/trunk/src/session.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
nebula/trunk/ChangeLog
r1588 r1593 1 1 0.2.1 2 - polling corrected 2 3 - port and protocol added to signatures 3 4 - signature hash fixed nebula/trunk/src/hash.c
r1558 r1593 51 51 ((hash *)h)->sha512sum = NULL; 52 52 53 session_reset(((hash *)h)->submission, NULL);53 session_reset(((hash *)h)->submission, -1); 54 54 free(((hash *)h)->submission); 55 55 ((hash *)h)->submission = NULL; nebula/trunk/src/nebula.c
r1585 r1593 28 28 #include <stdio.h> 29 29 #include <sys/mman.h> 30 #include <sys/resource.h> 30 31 #include <sys/stat.h> 31 32 #include <sys/types.h> … … 80 81 submission s[POLLFD_SET_SIZE], *tmp_submission; 81 82 pthread_attr_t ptattr; 82 83 84 memset(pfdset, -1, sizeof(struct pollfd) * (POLLFD_SET_SIZE+1)); 83 struct rlimit rlim; 84 85 86 memset(pfdset, 0, sizeof(struct pollfd) * (POLLFD_SET_SIZE+1)); 87 memset(pfdflag, 0, sizeof(u_char) * (POLLFD_SET_SIZE)); 85 88 memset(s, 0, sizeof(submission) * POLLFD_SET_SIZE); 86 89 … … 210 213 set_signal_handlers(); 211 214 215 216 // increase maximum number of open files if necessary 217 memset(&rlim, 0, sizeof(struct rlimit)); 218 if (getrlimit(RLIMIT_NOFILE, &rlim) == -1) { 219 fprintf(stderr, "Error - Unable to get maximum number of open files: %s.\n", strerror(errno)); 220 exit(EXIT_FAILURE); 221 } 222 if (rlim.rlim_max < POLLFD_SET_SIZE+1) { 223 rlim.rlim_max = rlim.rlim_cur = POLLFD_SET_SIZE+1; 224 if (setrlimit(RLIMIT_NOFILE, &rlim) == -1) { 225 fprintf(stderr, "Error - Unable to increase maximum number of open files: %s.\n", strerror(errno)); 226 exit(EXIT_FAILURE); 227 } 228 if (verbose) printf(" Maximum number of open files increased to %u.\n", (unsigned int) rlim.rlim_cur); 229 } 230 231 212 232 // initialize HMAC pads 213 233 memset(k_ipad, IPAD_VAL, HMAC_BLOCK_SIZE); … … 250 270 LISTEN_SOCK.fd = listen_fd; 251 271 LISTEN_SOCK.events = POLLIN; 272 252 273 for(;;) { 253 274 switch (rv = poll(pfdset, POLLFD_SET_SIZE+1, -1)) { … … 282 303 pfdset[i].fd = net_accept(LISTEN_SOCK.fd); 283 304 pfdset[i].events = POLLOUT; 305 pfdflag[i] = 1; 284 306 285 307 memset(&s[i], 0, sizeof(submission)); … … 294 316 } 295 317 for (i=0; i<POLLFD_SET_SIZE; i++) { 296 if (pfd set[i].revents & POLLOUT) {318 if (pfdflag[i] && pfdset[i].revents & POLLOUT) { 297 319 switch (session_handle_data(&pfdset[i], &s[i])) { 298 320 case -1: 299 321 fprintf(stderr, "Error - Invalid submission state. Terminating session.\n"); 300 session_reset(&s[i], &pfdset[i]);322 session_reset(&s[i], i); 301 323 break; 302 324 case 0: 303 session_reset(&s[i], &pfdset[i]);325 session_reset(&s[i], i); 304 326 break; 305 327 default: … … 308 330 } 309 331 } 310 if (pfd set[i].revents) {332 if (pfdflag[i] && pfdset[i].revents) { 311 333 if (pfdset[i].revents & POLLIN) { 312 334 switch (session_handle_data(&pfdset[i], &s[i])) { … … 335 357 pthread_attr_destroy(&ptattr); 336 358 337 session_reset(&s[i], &pfdset[i]);359 session_reset(&s[i], i); 338 360 break; 339 361 case 0: 340 362 // connection closed 341 session_reset(&s[i], &pfdset[i]);363 session_reset(&s[i], i); 342 364 break; 343 365 case -1: 344 366 // program error 345 367 fprintf(stderr, "Error - Terminating session.\n"); 346 session_reset(&s[i], &pfdset[i]);368 session_reset(&s[i], i); 347 369 break; 348 370 case -2: 349 371 // connection state error 350 372 fprintf(stderr, "Error - Invalid connection state.\n"); 351 session_reset(&s[i], &pfdset[i]);373 session_reset(&s[i], i); 352 374 break; 353 375 default: … … 356 378 } else if (pfdset[i].revents & POLLERR && errno != EINTR) { 357 379 fprintf(stderr, "Error - Unable to poll socket: %s.\n", strerror(errno)); 358 session_reset(&s[i], &pfdset[i]);380 session_reset(&s[i], i); 359 381 } else if (pfdset[i].revents & POLLHUP) { 360 382 fprintf(stderr, "Error - Socket hangup.\n"); 361 session_reset(&s[i], &pfdset[i]);383 session_reset(&s[i], i); 362 384 } else if (pfdset[i].revents & POLLNVAL) { 363 385 fprintf(stderr, "Error - Socket descriptor is invalid.\n"); 364 session_reset(&s[i], &pfdset[i]);386 session_reset(&s[i], i); 365 387 } 366 388 } nebula/trunk/src/nebula.h
r1566 r1593 36 36 37 37 38 #define POLLFD_SET_SIZE 102338 #define POLLFD_SET_SIZE 255 39 39 #define LISTEN_SOCK pfdset[POLLFD_SET_SIZE] 40 40 41 41 struct pollfd pfdset[POLLFD_SET_SIZE+1]; 42 u_char pfdflag[POLLFD_SET_SIZE]; 42 43 43 44 int lock_mutex; nebula/trunk/src/session.c
r1588 r1593 35 35 36 36 37 void session_reset(submission *s, struct pollfd *pfd) {37 void session_reset(submission *s, int session_number) { 38 38 if (!s) return; 39 39 … … 46 46 memset(s, 0, sizeof(submission)); 47 47 48 if ( pfd) {49 if (pfd ->fd >= 0) close(pfd->fd);48 if (session_number >= 0 && pfdflag[session_number]) { 49 if (pfdset[session_number].fd >= 0) close(pfdset[session_number].fd); 50 50 if (verbose > 1) printf("[<] Connection terminated.\n"); 51 51 52 memset( pfd, 0, sizeof(struct pollfd));53 pfd ->events = 0;54 pfd ->fd = -1;52 memset(&pfdset[session_number], 0, sizeof(struct pollfd)); 53 pfdset[session_number].events = 0; 54 pfdflag[session_number] = 0; // mark fd as unused 55 55 } 56 56 nebula/trunk/src/session.h
r1568 r1593 58 58 59 59 typedef struct submission { 60 u_int32_t session_number; // session number in array 60 61 sstate state; // session state 61 62 u_int32_t bytes_read; // number of bytes read so far … … 78 79 79 80 80 void session_reset(submission *s, struct pollfd *pfd);81 void session_reset(submission *s, int session_number); 81 82 char *session_hmac(u_char **msg, ssize_t len); 82 83 int session_handle_data(struct pollfd *pfd, submission *s);
