| 715 | } |
| 716 | |
| 717 | static int cgid_server(void *data) |
| 718 | { |
| 719 | int sd, sd2, rc; |
| 720 | mode_t omask; |
| 721 | apr_pool_t *ptrans; |
| 722 | server_rec *main_server = data; |
| 723 | apr_hash_t *script_hash = apr_hash_make(pcgi); |
| 724 | apr_status_t rv; |
| 725 | |
| 726 | apr_pool_create(&ptrans, pcgi); |
| 727 | apr_pool_tag(ptrans, "cgid_ptrans"); |
| 728 | |
| 729 | apr_signal(SIGCHLD, SIG_IGN); |
| 730 | apr_signal(SIGHUP, daemon_signal_handler); |
| 731 | |
| 732 | /* Close our copy of the listening sockets */ |
| 733 | ap_close_listeners(); |
| 734 | |
| 735 | /* cgid should use its own suexec doer */ |
| 736 | ap_hook_get_suexec_identity(cgid_suexec_id_doer, NULL, NULL, |
| 737 | APR_HOOK_REALLY_FIRST); |
| 738 | apr_hook_sort_all(); |
| 739 | |
| 740 | if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { |
| 741 | ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, APLOGNO(01242) |
| 742 | "Couldn't create unix domain socket"); |
| 743 | return errno; |
| 744 | } |
| 745 | |
| 746 | apr_pool_cleanup_register(pcgi, (void *)((long)sd), |
| 747 | close_unix_socket, close_unix_socket); |
| 748 | |
| 749 | omask = umask(0077); /* so that only Apache can use socket */ |
| 750 | rc = bind(sd, (struct sockaddr *)server_addr, server_addr_len); |
| 751 | umask(omask); /* can't fail, so can't clobber errno */ |
| 752 | if (rc < 0) { |
| 753 | ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, APLOGNO(01243) |
| 754 | "Couldn't bind unix domain socket %s", |
| 755 | sockname); |
| 756 | return errno; |
| 757 | } |
| 758 | |
| 759 | /* Not all flavors of unix use the current umask for AF_UNIX perms */ |
| 760 | rv = apr_file_perms_set(sockname, APR_FPROT_UREAD|APR_FPROT_UWRITE|APR_FPROT_UEXECUTE); |
| 761 | if (rv != APR_SUCCESS) { |
| 762 | ap_log_error(APLOG_MARK, APLOG_CRIT, rv, main_server, APLOGNO(01244) |
| 763 | "Couldn't set permissions on unix domain socket %s", |
| 764 | sockname); |
| 765 | return rv; |
| 766 | } |
| 767 | |
| 768 | if (listen(sd, DEFAULT_CGID_LISTENBACKLOG) < 0) { |
| 769 | ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, APLOGNO(01245) |
| 770 | "Couldn't listen on unix domain socket"); |
| 771 | return errno; |
| 772 | } |
| 773 | |
| 774 | if (!geteuid()) { |
no test coverage detected