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