1 /* GNU Mailutils -- a suite of utilities for electronic mail 2 Copyright (C) 2007-2021 Free Software Foundation, Inc. 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 3 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General 15 Public License along with this library; If not, see 16 <http://www.gnu.org/licenses/>. */ 17 18 #ifndef _MAILUTILS_SERVER_H 19 #define _MAILUTILS_SERVER_H 20 21 #include <mailutils/types.h> 22 #include <signal.h> 23 24 typedef int (*mu_conn_loop_fp) (int fd, void *conn_data, void *server_data); 25 typedef void (*mu_conn_free_fp) (void *conn_data, void *server_data); 26 typedef int (*mu_server_idle_fp) (void *server_data); 27 typedef void (*mu_server_free_fp) (void *server_data); 28 29 #define MU_SERVER_SUCCESS 0 30 #define MU_SERVER_CLOSE_CONN 1 31 #define MU_SERVER_SHUTDOWN 2 32 33 int mu_server_run (mu_server_t srv); 34 int mu_server_create (mu_server_t *psrv); 35 int mu_server_destroy (mu_server_t *psrv); 36 int mu_server_set_idle (mu_server_t srv, mu_server_idle_fp fp); 37 int mu_server_set_data (mu_server_t srv, void *data, mu_server_free_fp fp); 38 int mu_server_add_connection (mu_server_t srv, 39 int fd, void *data, 40 mu_conn_loop_fp loop, 41 mu_conn_free_fp free); 42 struct timeval; 43 int mu_server_set_timeout (mu_server_t srv, struct timeval *to); 44 int mu_server_count (mu_server_t srv, size_t *pcount); 45 46 47 /* IP (TCP and UDP) server */ 48 struct sockaddr; 49 typedef int (*mu_ip_server_conn_fp) (int fd, struct sockaddr *s, int len, 50 void *server_data, void *call_data, 51 mu_ip_server_t srv); 52 typedef int (*mu_ip_server_intr_fp) (void *data, void *call_data); 53 typedef void (*mu_ip_server_free_fp) (void *data); 54 55 #define MU_IP_TCP 0 56 #define MU_IP_UDP 1 57 58 int mu_ip_server_create (mu_ip_server_t *psrv, struct mu_sockaddr *addr, 59 int type); 60 int mu_ip_server_destroy (mu_ip_server_t *psrv); 61 int mu_ip_server_get_type (mu_ip_server_t srv, int *ptype); 62 int mu_ip_server_set_ident (mu_ip_server_t srv, const char *ident); 63 int mu_ip_server_set_acl (mu_ip_server_t srv, mu_acl_t acl); 64 int mu_ip_server_set_conn (mu_ip_server_t srv, mu_ip_server_conn_fp conn); 65 int mu_ip_server_set_intr (mu_ip_server_t srv, mu_ip_server_intr_fp intr); 66 int mu_ip_server_set_data (mu_ip_server_t srv, 67 void *data, mu_ip_server_free_fp free); 68 int mu_ip_server_open (mu_ip_server_t srv); 69 int mu_ip_server_shutdown (mu_ip_server_t srv); 70 int mu_ip_server_accept (mu_ip_server_t srv, void *call_data); 71 int mu_ip_server_get_fd (mu_ip_server_t srv); 72 int mu_ip_server_get_sockaddr (mu_ip_server_t srv, struct mu_sockaddr **psa); 73 const char *mu_ip_server_addrstr (mu_ip_server_t srv); 74 75 int mu_tcp_server_set_backlog (mu_ip_server_t srv, int backlog); 76 int mu_udp_server_set_bufsize (mu_ip_server_t srv, size_t size); 77 int mu_udp_server_get_bufsize (mu_ip_server_t srv, size_t *psize); 78 int mu_udp_server_get_rdata (mu_ip_server_t srv, char **pbuf, 79 size_t *pbufsize); 80 81 82 /* m-server */ 83 84 struct mu_srv_config /* Configuration data for a single TCP server. */ 85 { 86 mu_m_server_t msrv; /* Parent m-server. */ 87 mu_ip_server_t tcpsrv; /* TCP server these data are for. */ 88 mu_acl_t acl; /* Access control list for this server. */ 89 int single_process; /* Should it run as a single process? */ 90 int transcript; /* Enable session transcript. */ 91 time_t timeout; /* Idle timeout for this server. */ 92 /* Application-dependent data may follow */ 93 }; 94 95 typedef struct mu_m_server_connect_data mu_m_server_connect_data_t; 96 typedef int (*mu_m_server_handler_fp) (int fd, struct sockaddr *sa, int salen, 97 struct mu_srv_config *pconf, 98 void *data); 99 typedef int (*mu_m_server_preflight_fp) (mu_m_server_t); 100 101 void mu_m_server_create (mu_m_server_t *psrv, const char *ident); 102 void mu_m_server_destroy (mu_m_server_t *pmsrv); 103 void mu_m_server_set_mode (mu_m_server_t srv, int mode); 104 void mu_m_server_set_type (mu_m_server_t srv, int type); 105 void mu_m_server_get_type (mu_m_server_t srv, int *ptype); 106 void mu_m_server_set_conn (mu_m_server_t srv, mu_m_server_handler_fp f); 107 void mu_m_server_set_prefork (mu_m_server_t srv, mu_m_server_handler_fp fun); 108 void mu_m_server_set_data (mu_m_server_t srv, void *data); 109 void *mu_ip_server_get_data (mu_ip_server_t tcpsrv); 110 void mu_m_server_set_max_children (mu_m_server_t srv, size_t num); 111 int mu_m_server_set_pidfile (mu_m_server_t srv, const char *pidfile); 112 int mu_m_server_set_foreground (mu_m_server_t srv, int enable); 113 void mu_m_server_set_default_port (mu_m_server_t srv, int port); 114 void mu_m_server_set_timeout (mu_m_server_t srv, time_t t); 115 void mu_m_server_set_mode (mu_m_server_t srv, int mode); 116 void mu_m_server_set_sigset (mu_m_server_t srv, sigset_t *sigset); 117 void mu_m_server_set_strexit (mu_m_server_t srv, const char *(*fun) (int)); 118 void mu_m_server_set_app_data_size (mu_m_server_t srv, size_t size); 119 int mu_m_server_set_config_size (mu_m_server_t srv, size_t size); 120 void mu_m_server_set_preflight (mu_m_server_t srv, 121 mu_m_server_preflight_fp fun); 122 123 struct mu_srv_config *mu_m_server_listen (mu_m_server_t msrv, 124 struct mu_sockaddr *s, int type); 125 int mu_m_server_parse_url (mu_m_server_t msrv, const char *arg, 126 struct mu_sockaddr **psa); 127 128 int mu_m_server_mode (mu_m_server_t srv); 129 int mu_m_server_foreground (mu_m_server_t srv); 130 time_t mu_m_server_timeout (mu_m_server_t srv); 131 const char * mu_m_server_pidfile (mu_m_server_t srv); 132 void mu_m_server_get_sigset (mu_m_server_t srv, sigset_t *sigset); 133 int mu_m_server_get_srvlist (mu_m_server_t srv, mu_list_t *plist); 134 135 void mu_m_server_configured_count (mu_m_server_t msrv, size_t *count); 136 137 void mu_m_server_begin (mu_m_server_t msrv); 138 int mu_m_server_run (mu_m_server_t msrv); 139 void mu_m_server_end (mu_m_server_t msrv); 140 141 void mu_m_server_stop (int code); 142 int mu_m_server_check_acl (mu_m_server_t msrv, struct sockaddr *s, int salen); 143 144 struct mu_cfg_param; 145 void mu_m_server_cfg_init (mu_m_server_t msrv, struct mu_cfg_param *app_param); 146 147 int mu_sid (char **); 148 149 #endif 150