386 lines
13 KiB
C
386 lines
13 KiB
C
/* include unph */
|
|
/* Our own header. Tabs are set for 4 spaces, not 8 */
|
|
|
|
#ifndef __unp_h
|
|
#define __unp_h
|
|
|
|
#include <sys/types.h> /* basic system data types */
|
|
#include <sys/socket.h> /* basic socket definitions */
|
|
#include <sys/time.h> /* timeval{} for select() */
|
|
#include <time.h> /* timespec{} for pselect() */
|
|
|
|
#include <sys/time.h> /* includes <time.h> unsafely */
|
|
|
|
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
|
|
#include <arpa/inet.h> /* inet(3) functions */
|
|
#include <errno.h>
|
|
#include <fcntl.h> /* for nonblocking */
|
|
#include <netdb.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h> /* for S_xxx file mode constants */
|
|
#include <sys/uio.h> /* for iovec{} and readv/writev */
|
|
#include <unistd.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/un.h> /* for Unix domain sockets */
|
|
#include <sys/sem.h>
|
|
#include <sys/ipc.h>
|
|
|
|
#include <semaphore.h>
|
|
|
|
# include <sys/select.h> /* for convenience */
|
|
|
|
# include <sys/param.h> /* OpenBSD prereq for sysctl.h */
|
|
# include <sys/sysctl.h>
|
|
|
|
# include <poll.h> /* for convenience */
|
|
|
|
//# include <sys/event.h> /* for kqueue */
|
|
|
|
# include <strings.h> /* for convenience */
|
|
|
|
/* Three headers are normally needed for socket/file ioctl's:
|
|
* <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
|
|
*/
|
|
# include <sys/ioctl.h>
|
|
//# include <sys/filio.h>
|
|
//# include <sys/sockio.h>
|
|
|
|
# include <pthread.h>
|
|
|
|
//# include <net/if_dl.h>
|
|
|
|
#ifndef __PROTOCOL_H__
|
|
#include "protocol.h"
|
|
#endif
|
|
|
|
#ifndef __GLOBAL_H__
|
|
#include "global.h"
|
|
#endif
|
|
|
|
#ifndef __PRE_THREAD_MODEL_H__
|
|
#include "pre_thread_model.h"
|
|
#endif
|
|
|
|
#include <mysql.h>
|
|
#include <libpq-fe.h>
|
|
/* OSF/1 actually disables recv() and send() in <sys/socket.h> */
|
|
#ifdef __osf__
|
|
#undef recv
|
|
#undef send
|
|
#define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
|
|
#define send(a,b,c,d) sendto(a,b,c,d,0,0)
|
|
#endif
|
|
|
|
#ifndef INADDR_NONE
|
|
/* $$.Ic INADDR_NONE$$ */
|
|
#define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */
|
|
#endif
|
|
|
|
#ifndef SHUT_RD /* these three POSIX names are new */
|
|
#define SHUT_RD 0 /* shutdown for reading */
|
|
#define SHUT_WR 1 /* shutdown for writing */
|
|
#define SHUT_RDWR 2 /* shutdown for reading and writing */
|
|
/* $$.Ic SHUT_RD$$ */
|
|
/* $$.Ic SHUT_WR$$ */
|
|
/* $$.Ic SHUT_RDWR$$ */
|
|
#endif
|
|
|
|
/* *INDENT-OFF* */
|
|
#ifndef INET_ADDRSTRLEN
|
|
/* $$.Ic INET_ADDRSTRLEN$$ */
|
|
#define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0"
|
|
1234567890123456 */
|
|
#endif
|
|
|
|
/* Define following even if IPv6 not supported, so we can always allocate
|
|
an adequately sized buffer without #ifdefs in the code. */
|
|
#ifndef INET6_ADDRSTRLEN
|
|
/* $$.Ic INET6_ADDRSTRLEN$$ */
|
|
#define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string:
|
|
"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or
|
|
"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"
|
|
1234567890123456789012345678901234567890123456 */
|
|
#endif
|
|
/* *INDENT-ON* */
|
|
|
|
/* Define bzero() as a macro if it's not in standard C library. */
|
|
#define bzero(ptr,n) memset(ptr, 0, n)
|
|
/* $$.If bzero$$ */
|
|
/* $$.If memset$$ */
|
|
|
|
/* Older resolvers do not have gethostbyname2() */
|
|
#define gethostbyname2(host,family) gethostbyname((host))
|
|
|
|
/* The structure returned by recvfrom_flags() */
|
|
struct unp_in_pktinfo {
|
|
struct in_addr ipi_addr; /* dst IPv4 address */
|
|
int ipi_ifindex;/* received interface index */
|
|
};
|
|
/* $$.It unp_in_pktinfo$$ */
|
|
/* $$.Ib ipi_addr$$ */
|
|
/* $$.Ib ipi_ifindex$$ */
|
|
|
|
/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few
|
|
implementations support them today. These two macros really need
|
|
an ALIGN() macro, but each implementation does this differently. */
|
|
#ifndef CMSG_LEN
|
|
/* $$.Im CMSG_LEN$$ */
|
|
#define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size))
|
|
#endif
|
|
#ifndef CMSG_SPACE
|
|
/* $$.Im CMSG_SPACE$$ */
|
|
#define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size))
|
|
#endif
|
|
|
|
/* POSIX requires the SUN_LEN() macro, but not all implementations DefinE
|
|
it (yet). Note that this 4.4BSD macro works regardless whether there is
|
|
a length field or not. */
|
|
#ifndef SUN_LEN
|
|
/* $$.Im SUN_LEN$$ */
|
|
# define SUN_LEN(su) \
|
|
(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
|
|
#endif
|
|
|
|
/* POSIX renames "Unix domain" as "local IPC."
|
|
Not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */
|
|
#ifndef AF_LOCAL
|
|
#define AF_LOCAL AF_UNIX
|
|
#endif
|
|
#ifndef PF_LOCAL
|
|
#define PF_LOCAL PF_UNIX
|
|
#endif
|
|
|
|
/* POSIX requires that an #include of <poll.h> DefinE INFTIM, but many
|
|
systems still DefinE it in <sys/stropts.h>. We don't want to include
|
|
all the STREAMS stuff if it's not needed, so we just DefinE INFTIM here.
|
|
This is the standard value, but there's no guarantee it is -1. */
|
|
#ifndef INFTIM
|
|
#define INFTIM (-1) /* infinite poll timeout */
|
|
/* $$.Ic INFTIM$$ */
|
|
#define INFTIM_UNPH /* tell unpxti.h we defined it */
|
|
#endif
|
|
|
|
/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many
|
|
kernels still #define it as 5, while actually supporting many more */
|
|
#define LISTENQ 1024 /* 2nd argument to listen() */
|
|
|
|
/* Miscellaneous constants */
|
|
#define MAXLINE 4096 /* max text line length */
|
|
#define BUFFSIZE 8192 /* buffer size for reads and writes */
|
|
|
|
/* Define some port number that can be used for our examples */
|
|
#define SERV_PORT 9877 /* TCP and UDP */
|
|
#define SERV_PORT_STR "9877" /* TCP and UDP */
|
|
#define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */
|
|
#define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */
|
|
/* $$.ix [LISTENQ]~constant,~definition~of$$ */
|
|
/* $$.ix [MAXLINE]~constant,~definition~of$$ */
|
|
/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */
|
|
/* $$.ix [SERV_PORT]~constant,~definition~of$$ */
|
|
/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */
|
|
/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */
|
|
|
|
/* Following shortens all the typecasts of pointer arguments: */
|
|
#define SA struct sockaddr
|
|
|
|
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
|
|
/* default file access permissions for new files */
|
|
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
|
|
/* default permissions for new directories */
|
|
|
|
typedef void Sigfunc(int); /* for signal handlers */
|
|
#define min(a,b) ((a) < (b) ? (a) : (b))
|
|
#define max(a,b) ((a) > (b) ? (a) : (b))
|
|
|
|
/* end unph */
|
|
|
|
/* prototypes for our own library functions */
|
|
int connect_nonb(int, const SA *, socklen_t, int);
|
|
int connect_timeo(int, const SA *, socklen_t, int);
|
|
int daemon_init(const char *, int);
|
|
void daemon_inetd(const char *, int);
|
|
void dg_cli(FILE *, int, const SA *, socklen_t);
|
|
void dg_echo(int, SA *, socklen_t);
|
|
int family_to_level(int);
|
|
char *gf_time(void);
|
|
void heartbeat_cli(int, int, int);
|
|
void heartbeat_serv(int, int, int);
|
|
struct addrinfo *host_serv(const char *, const char *, int, int);
|
|
int inet_srcrt_add(char *);
|
|
u_char *inet_srcrt_init(int);
|
|
void inet_srcrt_print(u_char *, int);
|
|
void inet6_srcrt_print(void *);
|
|
char **my_addrs(int *);
|
|
int readable_timeo(int, int);
|
|
ssize_t readline(int, void *, size_t);
|
|
ssize_t readn(int, void *, size_t);
|
|
ssize_t read_fd(int, void *, size_t, int *);
|
|
ssize_t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
|
|
struct unp_in_pktinfo *);
|
|
Sigfunc *signal_intr(int, Sigfunc *);
|
|
int sock_bind_wild(int, int);
|
|
int sock_cmp_addr(const SA *, const SA *, socklen_t);
|
|
int sock_cmp_port(const SA *, const SA *, socklen_t);
|
|
int sock_get_port(const SA *, socklen_t);
|
|
void sock_set_addr(SA *, socklen_t, const void *);
|
|
void sock_set_port(SA *, socklen_t, int);
|
|
void sock_set_wild(SA *, socklen_t);
|
|
char *sock_ntop(const SA *, socklen_t);
|
|
char *sock_ntop_host(const SA *, socklen_t);
|
|
int sockfd_to_family(int);
|
|
void str_echo(int);
|
|
void str_cli(FILE *, int);
|
|
int tcp_connect(const char *, const char *);
|
|
int tcp_listen(const char *, const char *, socklen_t *);
|
|
void tv_sub(struct timeval *, struct timeval *);
|
|
int udp_client(const char *, const char *, SA **, socklen_t *);
|
|
int udp_connect(const char *, const char *);
|
|
int udp_server(const char *, const char *, socklen_t *);
|
|
int writable_timeo(int, int);
|
|
ssize_t writen(int, const void *, size_t);
|
|
ssize_t write_fd(int, void *, size_t, int);
|
|
uint16_t in_cksum(uint16_t *, int);
|
|
|
|
/* prototypes for our own library wrapper functions */
|
|
void Connect_timeo(int, const SA *, socklen_t, int);
|
|
int Family_to_level(int);
|
|
struct addrinfo *Host_serv(const char *, const char *, int, int);
|
|
const char *Inet_ntop(int, const void *, char *, size_t);
|
|
void Inet_pton(int, const char *, void *);
|
|
char *If_indextoname(unsigned int, char *);
|
|
unsigned int If_nametoindex(const char *);
|
|
struct if_nameindex *If_nameindex(void);
|
|
char **My_addrs(int *);
|
|
ssize_t Read_fd(int, void *, size_t, int *);
|
|
int Readable_timeo(int, int);
|
|
ssize_t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
|
|
struct unp_in_pktinfo *);
|
|
Sigfunc *Signal(int, Sigfunc *);
|
|
Sigfunc *Signal_intr(int, Sigfunc *);
|
|
int Sock_bind_wild(int, int);
|
|
char *Sock_ntop(const SA *, socklen_t);
|
|
char *Sock_ntop_host(const SA *, socklen_t);
|
|
int Sockfd_to_family(int);
|
|
int Tcp_connect(const char *, const char *);
|
|
int Tcp_listen(const char *, const char *, socklen_t *);
|
|
int Udp_client(const char *, const char *, SA **, socklen_t *);
|
|
int Udp_connect(const char *, const char *);
|
|
int Udp_server(const char *, const char *, socklen_t *);
|
|
ssize_t Write_fd(int, void *, size_t, int);
|
|
int Writable_timeo(int, int);
|
|
|
|
/* prototypes for our Unix wrapper functions: see {Sec errors} */
|
|
void *Calloc(size_t, size_t);
|
|
void Close(int);
|
|
void Dup2(int, int);
|
|
int Fcntl(int, int, int);
|
|
void Gettimeofday(struct timeval *, void *);
|
|
int Ioctl(int, int, void *);
|
|
pid_t Fork(void);
|
|
void *Malloc(size_t);
|
|
int Mkstemp(char *);
|
|
void *Mmap(void *, size_t, int, int, int, off_t);
|
|
int Open(const char *, int, mode_t);
|
|
void Pipe(int *fds);
|
|
ssize_t Read(int, void *, size_t);
|
|
void Sigaddset(sigset_t *, int);
|
|
void Sigdelset(sigset_t *, int);
|
|
void Sigemptyset(sigset_t *);
|
|
void Sigfillset(sigset_t *);
|
|
int Sigismember(const sigset_t *, int);
|
|
void Sigpending(sigset_t *);
|
|
void Sigprocmask(int, const sigset_t *, sigset_t *);
|
|
char *Strdup(const char *);
|
|
long Sysconf(int);
|
|
void Sysctl(int *, u_int, void *, size_t *, void *, size_t);
|
|
void Unlink(const char *);
|
|
pid_t Wait(int *);
|
|
pid_t Waitpid(pid_t, int *, int);
|
|
void Write(int, void *, size_t);
|
|
|
|
/* prototypes for our stdio wrapper functions: see {Sec errors} */
|
|
void Fclose(FILE *);
|
|
FILE *Fdopen(int, const char *);
|
|
char *Fgets(char *, int, FILE *);
|
|
FILE *Fopen(const char *, const char *);
|
|
void Fputs(const char *, FILE *);
|
|
|
|
/* prototypes for our socket wrapper functions: see {Sec errors} */
|
|
int Accept(int, SA *, socklen_t *);
|
|
void Bind(int, const SA *, socklen_t);
|
|
void Connect(int, const SA *, socklen_t);
|
|
void Getpeername(int, SA *, socklen_t *);
|
|
void Getsockname(int, SA *, socklen_t *);
|
|
void Getsockopt(int, int, int, void *, socklen_t *);
|
|
|
|
void Listen(int, int);
|
|
ssize_t Readline(int, void *, size_t);
|
|
ssize_t Readn(int, void *, size_t);
|
|
ssize_t Recv(int, void *, size_t, int);
|
|
ssize_t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);
|
|
ssize_t Recvmsg(int, struct msghdr *, int);
|
|
int Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
|
void Send(int, const void *, size_t, int);
|
|
void Sendto(int, const void *, size_t, int, const SA *, socklen_t);
|
|
void Sendmsg(int, const struct msghdr *, int);
|
|
void Setsockopt(int, int, int, const void *, socklen_t);
|
|
void Shutdown(int, int);
|
|
int Sockatmark(int);
|
|
int Socket(int, int, int);
|
|
void Socketpair(int, int, int, int *);
|
|
void Writen(int, void *, size_t);
|
|
int ConnectWait(int, struct sockaddr *, int, int);
|
|
|
|
void err_dump(const char *, ...);
|
|
void err_msg(const char *, ...);
|
|
void err_quit(const char *, ...);
|
|
void err_ret(const char *, ...);
|
|
void err_sys(const char *, ...);
|
|
|
|
/* Read configuration func */
|
|
extern int GetProfileInt(char *part, char *spart, int dval);
|
|
extern char *GetProfile(char *part, char *spart, char *rval, char *dval );
|
|
extern int SetIniName(char * buf);
|
|
|
|
/* roolu util func */
|
|
int devide(char **val, char *str, char delim);
|
|
char * timeToString(struct tm *);
|
|
char *makeLogString();
|
|
void WriteSHLog(char *, ...);
|
|
void WriteSHLog_safe(char *, ...);
|
|
|
|
/* new status inner func */
|
|
void addServerToList(servinfo_t *, MYSQL_ROW);
|
|
void vrcd_thread_make(int);
|
|
void report_thread_make(int);
|
|
void chk_rtime_update_serv_status();
|
|
int rcacctFind(char **, char *);
|
|
void processing_server_status(int, int, servinfo_t *);
|
|
void UpdateStatus(unsigned int, unsigned int, char *);
|
|
int timedCheck(char *, int, int);
|
|
int socket_open_with_timeout(int, servinfo_t *);
|
|
void HandleTimeOut(int);
|
|
int increaseDeadCount(unsigned int, char *);
|
|
void * report_thread_update_main(void *);
|
|
int update_report_func();
|
|
void update_server_list(servinfo_t *, servinfo_t *);
|
|
void * report_thread_send_main(void *);
|
|
void * vrcd_thread_main(void *);
|
|
void updateShm(struct svr_status *, int, int);
|
|
char *make_status_string(int *);
|
|
int get_sizeof_shm();
|
|
void SendToWebServ(const char *, char *);
|
|
void view_header_packet(struct common_message_header *);
|
|
void view_serv_status_packet(struct svr_status *);
|
|
void view_rcmng_header_packet(rcmng_cheader_t *);
|
|
void view_servinfo_t_packet(servinfo_t *);
|
|
servinfo_t *get_shm_start_pointer();
|
|
servinfo_t *get_shm_start_pointer_readonly();
|
|
void makedaemon(int);
|
|
void SafeProcessRunSpinWait(void);
|
|
|
|
#endif /* __unp_h */
|