1 | #ifndef READ_SOCKET 2 | #define READ_SOCKET 3 | /*************************************** 4 | $Revision: 1.11 $ 5 | 6 | Socket module (sk) 7 | 8 | Status: NOT REVUED, NOT TESTED 9 | 10 | ******************/ /****************** 11 | Copyright (c) 1999,2000,2001,2002 RIPE NCC 12 | 13 | All Rights Reserved 14 | 15 | Permission to use, copy, modify, and distribute this software and its 16 | documentation for any purpose and without fee is hereby granted, 17 | provided that the above copyright notice appear in all copies and that 18 | both that copyright notice and this permission notice appear in 19 | supporting documentation, and that the name of the author not be 20 | used in advertising or publicity pertaining to distribution of the 21 | software without specific, written prior permission. 22 | 23 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 24 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 25 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 26 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 27 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 28 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 29 | ***************************************/ 30 | 31 | #include "stubs.h" 32 | 33 | #ifdef HAVE_SYS_TIME_H 34 | #include <sys/time.h> 35 | #endif /* HAVE_SYS_TIME_H */ 36 | 37 | #ifdef HAVE_UNISTD_H 38 | #include <unistd.h> 39 | #endif /* HAVE_UNISTD_H */ 40 | 41 | /* #include <arpa/inet.h> */ 42 | #include <sys/types.h> 43 | #include <sys/socket.h> 44 | #include <netinet/in.h> 45 | #include <netdb.h> 46 | 47 | #include <pthread.h> 48 | #include <stdlib.h> 49 | #include <errno.h> 50 | #include <fcntl.h> 51 | 52 | #include <signal.h> 53 | #include <stdio.h> 54 | 55 | #include "iproutines.h" 56 | 57 | /* maximum amount of input data to buffer */ 58 | #define INPUT_BUF_LEN 2048 59 | 60 | /* connection data -> helps keep track of all errors etc */ 61 | typedef struct { 62 | int sock; /* socket descriptor # */ 63 | struct timeval rd_timeout; /* preset timeout values */ 64 | struct timeval wr_timeout; 65 | unsigned short rtc; /* RTC flags (reason-to-close) */ 66 | 67 | pthread_t watchdog; /* thread id of the watchdog associated */ 68 | pthread_t killthis; /* thread to be killed by watchdog */ 69 | void * (*execthis)(void *); /* function to be called if watchdog triggers */ 70 | void * execargs; /* argument to be passed to that function */ 71 | pthread_mutex_t watchmutex; 72 | 73 | unsigned char lasterr; /* timeout, interrupt, etc. */ 74 | ip_addr_t rIP; /* real IP */ 75 | ip_addr_t eIP; /* effective IP */ 76 | char *ip; /* text of the eIP */ 77 | 78 | char rd_buf[INPUT_BUF_LEN]; /* buffer for input */ 79 | int rd_buf_len; /* number of characters in input buffer */ 80 | } sk_conn_st; 81 | 82 | /* reasons to close: socket-wise .... */ 83 | #define SK_DISCONNECT 0x0001 84 | #define SK_INTERRUPT 0x0002 85 | #define SK_TIMEOUT 0x0004 86 | 87 | /* ... and user-wise: */ 88 | #define SK_NOTEXT 0x0100 89 | 90 | #ifdef __cplusplus 91 | extern "C" { 92 | #endif 93 | 94 | 95 | int SK_atoport(const char *service, const char *proto); 96 | int SK_close(int socket); 97 | int SK_getsock(int socket_type, unsigned port, int backlog, uint32_t bind_address); 98 | er_ret_t SK_connect(int *sock, char *hostname, unsigned port, unsigned timeout); 99 | int SK_accept_connection(int listening_socket); 100 | /*int SK_read(int sockfd, char *buf, size_t count);*/ 101 | int SK_write(int sockfd, 102 | const char *buf, 103 | int count, 104 | const struct timeval *timeout, 105 | int *count_sent); 106 | /*int SK_gets(int sockfd, char *str, size_t count);*/ 107 | int SK_puts(int sockfd, const char *str, const struct timeval *timeout); 108 | int SK_putc(int sockfd, char ch, const struct timeval *timeout); 109 | /*int SK_getc(int sockfd);*/ 110 | char *SK_getpeername(int sockfd); 111 | int SK_getpeerip(int sockfd, ip_addr_t *ip); 112 | 113 | void SK_cd_make(sk_conn_st *condat, int sock, unsigned timeout); 114 | void SK_cd_free(sk_conn_st *condat); 115 | int SK_cd_puts(sk_conn_st *condat, const char *str); 116 | int SK_cd_gets(sk_conn_st *condat, char *str, size_t count); 117 | int SK_cd_close(sk_conn_st *condat); 118 | int SK_cd_printf(sk_conn_st *condat, char *txt, ...) 119 | #ifdef __GNUC__ /* let gcc check the format string for problems */ 120 | __attribute__ ((format (printf, 2, 3))) 121 | #endif 122 | ; 123 | void SK_init(void); 124 | 125 | er_ret_t SK_watchstart(sk_conn_st *condat); 126 | er_ret_t SK_watchstop(sk_conn_st *condat); 127 | void SK_watch_setkill(sk_conn_st *condat, pthread_t killthis); 128 | void SK_watch_setexec( sk_conn_st *condat, void *(*function)(void *), void *args); 129 | void SK_watch_setclear(sk_conn_st *condat); 130 | void SK_watchexec(sk_conn_st *condat); 131 | void SK_watchkill(sk_conn_st *condat); 132 | void SK_watchtrigger(sk_conn_st *condat); 133 | 134 | #ifdef __cplusplus 135 | } 136 | #endif 137 | 138 | #endif /* READ_SOCKET */