comparison src/master/login-process.c @ 6519:66e5f514355e HEAD

Login processes started by inetd aren't ours, don't treat them as such.
author Timo Sirainen <tss@iki.fi>
date Sun, 30 Sep 2007 18:03:18 +0300
parents 65c69a53a7be
children 402d14b5ef8b
comparison
equal deleted inserted replaced
6518:9b71007b70c7 6519:66e5f514355e
433 req.auth_id, authreq); 433 req.auth_id, authreq);
434 } 434 }
435 } 435 }
436 436
437 static struct login_process * 437 static struct login_process *
438 login_process_new(struct login_group *group, pid_t pid, int fd) 438 login_process_new(struct login_group *group, pid_t pid, int fd,
439 bool inetd_child)
439 { 440 {
440 struct login_process *p; 441 struct login_process *p;
441 442
442 i_assert(pid != 0); 443 i_assert(pid != 0);
443 444
445 p->process.type = PROCESS_TYPE_LOGIN; 446 p->process.type = PROCESS_TYPE_LOGIN;
446 p->group = group; 447 p->group = group;
447 p->refcount = 2; /* once for fd close, another for process exit */ 448 p->refcount = 2; /* once for fd close, another for process exit */
448 p->pid = pid; 449 p->pid = pid;
449 p->fd = fd; 450 p->fd = fd;
451 p->inetd_child = inetd_child;
450 p->io = io_add(fd, IO_READ, login_process_input, p); 452 p->io = io_add(fd, IO_READ, login_process_input, p);
451 p->output = o_stream_create_fd(fd, sizeof(struct master_login_reply)*10, 453 p->output = o_stream_create_fd(fd, sizeof(struct master_login_reply)*10,
452 FALSE); 454 FALSE);
453 child_process_add(pid, &p->process); 455 if (!inetd_child)
456 child_process_add(pid, &p->process);
454 457
455 p->state = LOGIN_STATE_LISTENING; 458 p->state = LOGIN_STATE_LISTENING;
456 459
457 if (p->group != NULL) { 460 if (p->group != NULL) {
458 p->group->refcount++; 461 p->group->refcount++;
625 process_names[group->mail_process_type]); 628 process_names[group->mail_process_type]);
626 log_set_prefix(log, prefix); 629 log_set_prefix(log, prefix);
627 630
628 net_set_nonblock(fd[0], TRUE); 631 net_set_nonblock(fd[0], TRUE);
629 fd_close_on_exec(fd[0], TRUE); 632 fd_close_on_exec(fd[0], TRUE);
630 (void)login_process_new(group, pid, fd[0]); 633 (void)login_process_new(group, pid, fd[0], FALSE);
631 (void)close(fd[1]); 634 (void)close(fd[1]);
632 (void)close(log_fd); 635 (void)close(log_fd);
633 return pid; 636 return pid;
634 } 637 }
635 638
905 i_error("accept(inetd_login_fd) failed: %m"); 908 i_error("accept(inetd_login_fd) failed: %m");
906 } else { 909 } else {
907 net_set_nonblock(fd, TRUE); 910 net_set_nonblock(fd, TRUE);
908 fd_close_on_exec(fd, TRUE); 911 fd_close_on_exec(fd, TRUE);
909 912
910 p = login_process_new(NULL, ++login_pid_counter, fd); 913 p = login_process_new(NULL, ++login_pid_counter, fd, TRUE);
911 p->initialized = TRUE; 914 p->initialized = TRUE;
912 p->inetd_child = TRUE;
913 } 915 }
914 } 916 }
915 917
916 void login_processes_init(void) 918 void login_processes_init(void)
917 { 919 {