int main(int argc,char **argv) { apr_initialize(); apr_pool_t *pool; apr_pool_create(&pool,NULL); apr_status_t st; apr_signal_init(pool); apr_signal(SIGINT,signal_func); apr_signal_block(SIGINT); printf("signal SIGINT blocked\n"); apr_sleep(5000000); apr_signal_unblock(SIGINT); printf("signal SIGINT unblocked\n"); apr_sleep(50000000); apr_pool_destroy(pool); apr_terminate(); return 0; }
void ibp_configure_signals() { #ifdef SIGPIPE apr_signal_block(SIGPIPE); #endif }
int main(int argc, char *argv[]) { char errbuf[ERRBUFLEN + 1]; apr_pool_t *pool; apr_proc_t proc; dynalogin_session_t *h; apr_status_t res; apr_sockaddr_t *sa; apr_socket_t *socket, *socket_new; char *cfg_filename; char *bind_address; int bind_port; int qlen = 32; int cfg_detach = 1; int ret; int done = 0; apr_hash_t *config; if(apr_initialize() != APR_SUCCESS) { fprintf(stderr, "apr_initialize failed\n"); return 1; } /* Just return an error if a client closes a socket */ apr_signal_block(SIGPIPE); openlog(argv[0], LOG_PID, LOG_AUTHPRIV); if((res = apr_pool_create(&pool, NULL)) != APR_SUCCESS) { syslog(LOG_ERR, "failed to create root pool: %s", apr_strerror(res, errbuf, ERRBUFLEN)); return 1; } if(argc == 2) cfg_filename = argv[1]; else cfg_filename = apr_psprintf(pool, "%s%c%s", SYSCONFDIR, DIR_SEP, DEFAULT_CONFIG_FILENAME); if(cfg_filename == NULL) { syslog(LOG_ERR, "apr_psprintf failed to create filename: %s", apr_strerror(res, errbuf, ERRBUFLEN)); return 1; } /* Read config */ if(dynalogin_read_config_from_file(&config, cfg_filename, pool) != DYNALOGIN_SUCCESS) { syslog(LOG_ERR, "failed to read config file %s", cfg_filename); return 1; } /* Set up DYNALOGIN session (threadsafe?) */ if(dynalogin_init(&h, pool, config) != DYNALOGIN_SUCCESS) { syslog(LOG_ERR, "failed to init dynalogin stack"); return 1; } /* Daemonize? */ GET_INT_PARAM(cfg_detach, config, DYNALOGIND_PARAM_DETACH) if((res=apr_proc_detach(cfg_detach)) != APR_SUCCESS) { syslog(LOG_ERR, "failed to detach: %s", apr_strerror(res, errbuf, ERRBUFLEN)); return 1; } /* Create socket for clients */ if((res=apr_socket_create(&socket, APR_INET, SOCK_STREAM, APR_PROTO_TCP, pool))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to create listening socket: %s", apr_strerror(res, errbuf, ERRBUFLEN)); return 1; } GET_STRING_PARAM_DEF(bind_address, config, DYNALOGIND_PARAM_BIND_ADDR, DEFAULT_BIND_ADDR) GET_INT_PARAM_DEF(bind_port, config, DYNALOGIND_PARAM_BIND_PORT, DEFAULT_BIND_PORT) if((res=apr_sockaddr_info_get(&sa, bind_address, APR_UNSPEC, bind_port, APR_IPV4_ADDR_OK || APR_IPV6_ADDR_OK, pool))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to resolve bind address: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } if((res=apr_socket_opt_set(socket, APR_SO_REUSEADDR, 1))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to set APR_SO_REUSEADDR: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } if((res=apr_socket_bind(socket, sa))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to bind: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } GET_STRING_PARAM_DEF(tls_cert, config, DYNALOGIND_PARAM_TLS_CERT, NULL) GET_STRING_PARAM_DEF(tls_key, config, DYNALOGIND_PARAM_TLS_KEY, NULL) if(tls_cert != NULL) { if(tls_key == NULL) { syslog(LOG_ERR, "%s specified, but %s not specified", DYNALOGIND_PARAM_TLS_CERT, DYNALOGIND_PARAM_TLS_KEY); return 1; } gnutls_global_init (); gnutls_certificate_allocate_credentials (&x509_cred); ret = gnutls_certificate_set_x509_key_file (x509_cred, tls_cert, tls_key, GNUTLS_X509_FMT_PEM); if (ret < 0) { syslog(LOG_ERR, "No certificate or key were found"); return 1; } generate_dh_params (); gnutls_priority_init (&priority_cache, "PERFORMANCE:%SERVER_PRECEDENCE", NULL); gnutls_certificate_set_dh_params (x509_cred, dh_params); } else if(tls_key == NULL) { syslog(LOG_ERR, "%s specified, but %s not specified", DYNALOGIND_PARAM_TLS_KEY, DYNALOGIND_PARAM_TLS_CERT); return 1; } /* Main loop */ while(done != 1) { if((res=apr_socket_listen(socket, qlen))!=APR_SUCCESS) { syslog(LOG_ERR, "failed apr_socket_listen: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } if((res=apr_socket_accept(&socket_new, socket, pool))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to accept incoming connection: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } syslog(LOG_INFO, "new incoming connection"); if((res=handle_new_client(socket_new, pool, h))!=APR_SUCCESS) { syslog(LOG_ERR, "failed to handle incoming connection: %s", apr_strerror(res, errbuf, ERRBUFLEN)); apr_socket_close(socket); return 1; } } apr_socket_close(socket); return 0; }