123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #ifndef RSPAMD_UTIL_H
- #define RSPAMD_UTIL_H
-
- #include "config.h"
- #include "mem_pool.h"
- #include "radix.h"
- #include "statfile.h"
- #include "printf.h"
- #include "fstring.h"
-
- struct config_file;
- struct rspamd_main;
- struct workq;
- struct statfile;
- struct classifier_config;
-
- /*
- * Create socket and bind or connect it to specified address and port
- */
- gint make_tcp_socket (struct in_addr *, u_short, gboolean is_server, gboolean async);
- /*
- * Create socket and bind or connect it to specified address and port
- */
- gint make_udp_socket (struct in_addr *, u_short, gboolean is_server, gboolean async);
- /*
- * Accept from socket
- */
- gint accept_from_socket (gint listen_sock, struct sockaddr *addr, socklen_t *len);
- /*
- * Create and bind or connect unix socket
- */
- gint make_unix_socket (const gchar *, struct sockaddr_un *, gboolean is_server, gboolean async);
-
- /**
- * Make universal stream socket
- * @param credits host, ip or path to unix socket
- * @param port port (used for network sockets)
- * @param async make this socket asynced
- * @param is_server make this socket as server socket
- * @param try_resolve try name resolution for a socket (BLOCKING)
- */
- gint make_universal_stream_socket (const gchar *credits, guint16 port,
- gboolean async, gboolean is_server, gboolean try_resolve);
-
- /*
- * Create socketpair
- */
- gint make_socketpair (gint pair[2]);
-
- /*
- * Write pid to file
- */
- gint write_pid (struct rspamd_main *);
-
- /*
- * Make specified socket non-blocking
- */
- gint make_socket_nonblocking (gint);
- /*
- * Make specified socket blocking
- */
- gint make_socket_blocking (gint);
-
- /*
- * Poll a sync socket for specified events
- */
- gint poll_sync_socket (gint fd, gint timeout, short events);
-
- /*
- * Init signals
- */
- #ifdef HAVE_SA_SIGINFO
- void init_signals (struct sigaction *sa, void (*sig_handler)(gint, siginfo_t *, void *));
- #else
- void init_signals (struct sigaction *sa, void (*sig_handler)(gint));
- #endif
-
- /*
- * Send specified signal to each worker
- */
- void pass_signal_worker (GHashTable *, gint );
- /*
- * Convert string to lowercase
- */
- void convert_to_lowercase (gchar *str, guint size);
-
- #ifndef HAVE_SETPROCTITLE
- /*
- * Process title utility functions
- */
- gint init_title(gint argc, gchar *argv[], gchar *envp[]);
- gint setproctitle(const gchar *fmt, ...);
- #endif
-
- #ifndef HAVE_PIDFILE
- /*
- * Pidfile functions from FreeBSD libutil code
- */
- typedef struct rspamd_pidfh_s {
- gint pf_fd;
- #ifdef HAVE_PATH_MAX
- gchar pf_path[PATH_MAX + 1];
- #elif defined(HAVE_MAXPATHLEN)
- gchar pf_path[MAXPATHLEN + 1];
- #else
- gchar pf_path[1024 + 1];
- #endif
- dev_t pf_dev;
- ino_t pf_ino;
- } rspamd_pidfh_t;
- rspamd_pidfh_t *rspamd_pidfile_open(const gchar *path, mode_t mode, pid_t *pidptr);
- gint rspamd_pidfile_write(rspamd_pidfh_t *pfh);
- gint rspamd_pidfile_close(rspamd_pidfh_t *pfh);
- gint rspamd_pidfile_remove(rspamd_pidfh_t *pfh);
- #else
- typedef struct pidfh rspamd_pidfh_t;
- #define rspamd_pidfile_open pidfile_open
- #define rspamd_pidfile_write pidfile_write
- #define rspamd_pidfile_close pidfile_close
- #define rspamd_pidfile_remove pidfile_remove
- #endif
-
- /*
- * Replace %r with rcpt value and %f with from value, new string is allocated in pool
- */
- gchar* resolve_stat_filename (memory_pool_t *pool, gchar *pattern, gchar *rcpt, gchar *from);
- #ifdef HAVE_CLOCK_GETTIME
- /*
- * Calculate check time with specified resolution of timer
- */
- const gchar* calculate_check_time (struct timeval *tv, struct timespec *begin, gint resolution);
- #else
- const gchar* calculate_check_time (struct timeval *begin, gint resolution);
- #endif
-
- /*
- * File locking functions
- */
- gboolean lock_file (gint fd, gboolean async);
- gboolean unlock_file (gint fd, gboolean async);
-
- /*
- * Hash table utility functions for case insensitive hashing
- */
- guint rspamd_strcase_hash (gconstpointer key);
- gboolean rspamd_strcase_equal (gconstpointer v, gconstpointer v2);
-
- /*
- * Hash table utility functions for hashing fixed strings
- */
- guint fstr_strcase_hash (gconstpointer key);
- gboolean fstr_strcase_equal (gconstpointer v, gconstpointer v2);
-
- /*
- * Google perf-tools initialization function
- */
- void gperf_profiler_init (struct config_file *cfg, const gchar *descr);
-
- /*
- * Workarounds for older versions of glib
- */
- #if ((GLIB_MAJOR_VERSION == 2) && (GLIB_MINOR_VERSION < 22))
- void g_ptr_array_unref (GPtrArray *array);
- #endif
- #if ((GLIB_MAJOR_VERSION == 2) && (GLIB_MINOR_VERSION < 14))
- void g_queue_clear (GQueue *queue);
- #endif
-
-
- /*
- * Copy src to dest limited to len, in compare with standart strlcpy(3) rspamd strlcpy does not
- * traverse the whole string and it is possible to use it for non NULL terminated strings. This is
- * more like memccpy(dst, src, size, '\0')
- *
- * @param dst destination string
- * @param src source string
- * @param siz length of destination buffer
- * @return bytes copied
- */
- gsize rspamd_strlcpy (gchar *dst, const gchar *src, gsize siz);
-
- /*
- * Strip <> from email address
- */
- gchar * escape_braces_addr_fstr (memory_pool_t *pool, f_str_t *in);
-
- /*
- * Convert milliseconds to timeval fields
- */
- #define msec_to_tv(msec, tv) do { (tv)->tv_sec = (msec) / 1000; (tv)->tv_usec = ((msec) - (tv)->tv_sec * 1000) * 1000; } while(0)
- #define tv_to_msec(tv) (tv)->tv_sec * 1000 + (tv)->tv_usec / 1000
-
- /* Compare two emails for building emails tree */
- gint compare_email_func (gconstpointer a, gconstpointer b);
-
- /* Compare two urls for building emails tree */
- gint compare_url_func (gconstpointer a, gconstpointer b);
-
- /*
- * Find string find in string s ignoring case
- */
- gchar* rspamd_strncasestr (const gchar *s, const gchar *find, gint len);
-
- /*
- * Try to convert string of length to long
- */
- gboolean rspamd_strtol (const gchar *s, gsize len, glong *value);
-
- /*
- * Try to convert string of length to unsigned long
- */
- gboolean rspamd_strtoul (const gchar *s, gsize len, gulong *value);
-
- /**
- * Try to allocate a file on filesystem (using fallocate or posix_fallocate)
- * @param fd descriptor
- * @param offset offset of file
- * @param len length to allocate
- * @return -1 in case of failure
- */
- gint rspamd_fallocate (gint fd, off_t offset, off_t len);
-
- /**
- * Return worker's control structure by its type
- * @param type
- * @return worker's control structure or NULL
- */
- worker_t* get_worker_by_type (GQuark type);
-
- #endif
|