home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
sredird
/
telnetcpcd-1.09.tar.gz
/
telnetcpcd-1.09.tar
/
telnetcpcd.h
< prev
next >
Wrap
C/C++ Source or Header
|
2003-08-12
|
27KB
|
827 lines
/*
telnetcpcd.h
Copyright (c) 2002,2003 Thomas J Pinkl <tom@pinkl.com>
This is the main header file for the Telnet Com Port Control daemon.
Version 1.00 11/30/2001
Version 1.01 12/04/2001 Added LOCKDIR and LOCKTEMPLATE
Version 1.02 12/13/2001 Added FLOWCONTROL
Version 1.03 12/18/2001 Added the CPC_xxx symbols.
Version 1.04 01/14/2002 Added POLLINTERVAL
Version 1.05 01/25/2002 Added "netinet/in_systm.h" and CRTSCTS,
both for SCO.
Version 1.06 01/30/2002 Added "sys/termiox.h" for AIX. Added
the "mytermios" structure.
Version 1.07 02/18/2002 Let debugging output go to syslog too.
Version 1.08 02/22/2002 Changed POLLINTERVAL to MS_POLLINTERVAL
and added LS_POLLINTERVAL.
Version 1.09 03/06/2002 Added REPLYPURGEDATA
Version 1.10 04/22/2002 Updated check_modemstate() prototype.
Version 1.11 04/24/2002 Added CONNFLUSH and DISCFLUSH. Removed
TRACKCARRIER.
Version 1.12 04/30/2002 Added conditional code around USE_DIGI_TIOCM
which includes <sys/digi.h>. This is
intended to be used on SCO OSR5. NOTE: this
doesn't work; we still cannot read the CD
signal on OSR5.
Version 1.13 10/24/2002 Added IDLETIMER.
Version 1.14 11/25/2002 Added function prototype for msleep().
Version 1.15 12/03/2002 Added SENDLOGOUT.
Version 1.16 12/12/2002 Added external globals: noquote, useconds
Version 1.17 02/05/2003 Changed the default TCP port to the one
assigned by IANA, 3696.
*/
#ifndef _TELNETCPCD_H /* prevent multiple inclusions */
#define _TELNETCPCD_H
#ifndef TELNETCPCD_SERVER_TCP_PORT
#define TELNETCPCD_SERVER_TCP_PORT 3696 /* port 3696 was assigned by IANA */
#endif
#ifndef SYSLOG_FACILITY
#define SYSLOG_FACILITY LOG_DAEMON
#endif
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <memory.h>
/*
on SCO OpenServer 5.0.[45] (and, I assume, later), the _SVID3
symbol must be defined in order for TIOCMGET to be defined
in <sys/termio.h>. TIOCMGET is an ioctl command to read modem
signals.
tjp, 04/30/2002 - SCO's TIOCMGET doesn't return Carrier Detect.
this may have been fixed in 5.0.6a.
*/
#ifdef OSR5
#ifndef _SVID3
#define _SVID3
#endif
#endif
/*
AIX uses the termiox interface for hardware flow control
*/
#ifdef AIX
#define USE_TERMIOX
#endif
#include <termios.h>
#ifdef USE_TERMIOX
#include <sys/termiox.h>
#endif
/*
USE_DIGI_TIOCM was added in an attempt to get SCO OSR5 to read
the CD modem signal. it didn't work.
*/
#ifdef USE_DIGI_TIOCM /* Digiboard specific TIOCMGET/TIOCMSET */
#undef TIOCM_LE
#undef TIOCM_SR
#undef TIOCM_ST
#undef TIOCM_DTR
#undef TIOCM_RTS
#undef TIOCM_CTS
#undef TIOCM_DSR
#undef TIOCM_CAR
#undef TIOCM_RNG
#undef TIOCM_CD
#undef TIOCM_RI
#undef TIOCMGET
#undef TIOCMSET
#undef TIOCMBIC
#undef TIOCMBIS
#undef TIOCMODG
#undef TIOCSDTR
#include <sys/digi.h>
#endif /* USE_DIGI_TIOCM */
#include <pwd.h>
#include <grp.h>
#include <sys/socket.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <arpa/inet.h>
#include <arpa/telnet.h>
#include <arpa/ftp.h>
#include <netdb.h>
#include <syslog.h>
#include <stdarg.h>
#include <signal.h>
#include <time.h>
#include <search.h> /* hash table functions */
#include <sys/time.h> /* for 'struct timeval' */
#include <sys/param.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#ifdef M_UNIX /* SCO Unix keeps 'struct winsize' here */
#include <sys/stream.h>
#include <sys/ptem.h>
#endif /* M_UNIX */
#ifdef SVR4
#include <sys/stream.h>
#endif /* SVR4 */
#if defined(M_UNIX) || defined(AIX) || defined(SVR4)
#include <sys/stropts.h>
#endif
#ifndef __linux__
#include <sys/select.h>
#endif /* ! __linux__ */
#ifdef __linux__
#include <sys/time.h>
#endif /* __linux__ */
/* for major() and minor */
#ifdef SVR4
#include <sys/mkdev.h>
#else
#include <sys/sysmacros.h>
#endif
#ifndef __linux__
extern int errno;
extern int sys_nerr;
extern char *sys_errlist[];
#endif /* ! __linux__ */
#ifdef M_UNIX
#ifndef CRTSCTS
#define CRTSCTS (RTSFLOW|CTSFLOW)
#endif
#endif
#ifndef MIN
#define MIN(x,y) (x) > (y) ? (y) : (x)
#endif
#ifndef MAX
#define MAX(x,y) (x) > (y) ? (x) : (y)
#endif
#define BLOCKING 0x01 /* second arg to create_server_socket() */
#define NONBLOCKING 0x00
#ifdef __osf__
#define ARGV_TYPE char ** const
#else
#ifdef M_UNIX
#define ARGV_TYPE char **
#else
#ifdef __linux__
#define ARGV_TYPE char * const *
#else
#ifdef AIX
#define ARGV_TYPE char * const *
#else
#define ARGV_TYPE const char **
#endif /* AIX */
#endif /* __linux__ */
#endif /* M_UNIX */
#endif /* __osf__ */
#define GETOPT_CAST ARGV_TYPE
/*
debugging levels
*/
#define DBG_ERR 0
#define DBG_INF 3
#define DBG_VINF 6
#define DBG_MEM 7
#define DBG_LV0 0
#define DBG_LV1 1
#define DBG_LV2 2
#define DBG_LV3 3
#define DBG_LV4 4
#define DBG_LV5 5
#define DBG_LV6 6
#define DBG_LV7 7
#define DBG_LV8 8
#define DBG_LV9 9
/*
defaults for uucp locking
*/
#define ASCIIPID
#ifdef AIX
#define UUCPLOCK_DIR "/etc/locks"
#define UUCPLOCK_TMPL "LCK..%s"
#endif
#ifdef __linux__
#define UUCPLOCK_DIR "/var/lock"
#define UUCPLOCK_TMPL "LCK..%s"
#endif
#ifdef SVR4
#define UUCPLOCK_DIR "/var/spool/locks"
#define UUCPLOCK_TMPL "LK.%03u.%03u.%03u"
#endif
#ifndef UUCPLOCK_DIR
#define UUCPLOCK_DIR "/usr/spool/uucp"
#define UUCPLOCK_TMPL "LCK..%s"
#endif
#ifndef PATH_MAX
#define PATH_MAX 255
#endif
/*
symbols for shutdown(2) call
*/
#ifndef SHUT_RD
#define SHUT_RD 0x00
#define SHUT_WR 0x01
#define SHUT_RDWR 0x02
#endif
/* max # modems */
#define MAX_MODEMS 256
/*
structure to keep track of info on serial devices
*/
struct serial_info_t {
char *device; /* path name of device */
char *lockfile; /* path name of lock file */
char *description; /* device description */
unsigned long speed; /* baud rate */
unsigned int databits; /* data bits */
unsigned int parity; /* parity */
unsigned int stopbits; /* stop bits (NOT USED) */
unsigned int flowcontrol; /* flow control */
int conn_flush; /* flush device on connect? */
int disc_flush; /* flush device on disconnect? */
int busy; /* modem already in use */
};
typedef struct serial_info_t SERIAL_INFO;
/*
terminal control structure
*/
struct mytermios_t {
struct termios ts;
#ifdef USE_TERMIOX
struct termiox tx;
#endif
};
typedef struct mytermios_t MYTERMIOS;
/*
configuration info
*/
#define HAVE_CONFIG_T
struct config_t {
char *directory; /* directory name */
char *tmpdir; /* tmp directory name */
char *debuglog; /* name of debug log */
int debuglevel; /* level of debugging output */
char *pidfile; /* name of pid file */
int timeout; /* connection timeout in seconds */
char *user; /* user name */
char *group; /* group name */
uid_t uid; /* user id (looked up via user name) */
gid_t gid; /* group id (looked up via group name) */
char *servertype; /* server type: concurrent or iterative */
char *lockdir; /* directory for uucp lock files */
char *locktemplate; /* filename template for uucp lock files */
int ms_pollinterval; /* polling interval in seconds for modemstate changes */
int ls_pollinterval; /* polling interval in seconds for linestate changes */
int reply_purge_data; /* reply to Purge Data commands? */
int idletimer; /* idle timer */
int send_logout; /* send Telnet LOGOUT command? */
int nmodems; /* number of modems */
SERIAL_INFO *modems[MAX_MODEMS]; /* array of ptrs to SERIAL_INFO's */
};
/*
telnet options
*/
struct telnet_options_t {
int sent_will:1;
int sent_do:1;
int sent_wont:1;
int sent_dont:1;
int server:1;
int client:1;
};
typedef struct telnet_options_t TELNET_OPTIONS;
#define MAX_TELNET_OPTIONS 256
#define MAX_TELNET_CPC_COMMAND_LEN 256
/*
telnet mode: ASCII or Binary
*/
#define ASCII 0x00
#define BINARY 0x01
/*
session state: Suspend or Resume
*/
#define SUSPEND 0x00
#define RESUME 0x01
/*
carrier detect state
*/
#define NO_CARRIER 0x00
#define GOT_CARRIER 0x01
#define LOST_CARRIER 0x02
/*
Telnet Com Port Control (CPC) option values (from rfc2217)
*/
#ifndef TELOPT_COM_PORT_OPTION
#define TELOPT_COM_PORT_OPTION 44
#endif
#ifndef TELOPT_KERMIT
#define TELOPT_KERMIT 47
#endif
#define CPC_SIGNATURE_C2S 0 /* C2S = client to server */
#define CPC_SIGNATURE_S2C 100 /* S2C = server to client */
#define CPC_SET_BAUDRATE_C2S 1
#define CPC_SET_BAUDRATE_S2C 101
#define CPC_SET_DATASIZE_C2S 2
#define CPC_SET_DATASIZE_S2C 102
#define CPC_SET_PARITY_C2S 3
#define CPC_SET_PARITY_S2C 103
#define CPC_SET_STOPSIZE_C2S 4
#define CPC_SET_STOPSIZE_S2C 104
#define CPC_SET_CONTROL_C2S 5
#define CPC_SET_CONTROL_S2C 105
#define CPC_NOTIFY_LINESTATE_C2S 6
#define CPC_NOTIFY_LINESTATE_S2C 106
#define CPC_NOTIFY_MODEMSTATE_C2S 7
#define CPC_NOTIFY_MODEMSTATE_S2C 107
#define CPC_FLOWCONTROL_SUSPEND_C2S 8
#define CPC_FLOWCONTROL_SUSPEND_S2C 108
#define CPC_FLOWCONTROL_RESUME_C2S 9
#define CPC_FLOWCONTROL_RESUME_S2C 109
#define CPC_SET_LINESTATE_MASK_C2S 10
#define CPC_SET_LINESTATE_MASK_S2C 110
#define CPC_SET_MODEMSTATE_MASK_C2S 11
#define CPC_SET_MODEMSTATE_MASK_S2C 111
#define CPC_PURGE_DATA_C2S 12
#define CPC_PURGE_DATA_S2C 112
#define CPC_DATASIZE_QUERY 0
#define CPC_DATASIZE_CS5 5
#define CPC_DATASIZE_CS6 6
#define CPC_DATASIZE_CS7 7
#define CPC_DATASIZE_CS8 8
#define CPC_PARITY_QUERY 0
#define CPC_PARITY_NONE 1
#define CPC_PARITY_ODD 2
#define CPC_PARITY_EVEN 3
#define CPC_PARITY_MARK 4
#define CPC_PARITY_SPACE 5
#define CPC_STOPSIZE_QUERY 0
#define CPC_STOPSIZE_1BIT 1
#define CPC_STOPSIZE_2BITS 2
#define CPC_STOPSIZE_15BITS 3
#define CPC_SET_CONTROL_FLOW_QUERY 0
#define CPC_SET_CONTROL_FLOW_NONE 1
#define CPC_SET_CONTROL_FLOW_XONXOFF 2
#define CPC_SET_CONTROL_FLOW_HARDWARE 3
#define CPC_SET_CONTROL_BREAK_QUERY 4
#define CPC_SET_CONTROL_BREAK_ON 5
#define CPC_SET_CONTROL_BREAK_OFF 6
#define CPC_SET_CONTROL_DTR_QUERY 7
#define CPC_SET_CONTROL_DTR_ON 8
#define CPC_SET_CONTROL_DTR_OFF 9
#define CPC_SET_CONTROL_RTS_QUERY 10
#define CPC_SET_CONTROL_RTS_ON 11
#define CPC_SET_CONTROL_RTS_OFF 12
#define CPC_SET_CONTROL_INFLOW_QUERY 13
#define CPC_SET_CONTROL_INFLOW_NONE 14
#define CPC_SET_CONTROL_INFLOW_XONXOFF 15
#define CPC_SET_CONTROL_INFLOW_HARDWARE 16
#define CPC_SET_CONTROL_FLOW_DCD 17
#define CPC_SET_CONTROL_INFLOW_DTR 18
#define CPC_SET_CONTROL_FLOW_DSR 19
#define CPC_LINESTATE_TIMEOUT_ERROR 0x80
#define CPC_LINESTATE_TSR_EMPTY 0x40
#define CPC_LINESTATE_THR_EMPTY 0x20
#define CPC_LINESTATE_BREAK_DETECT 0x10
#define CPC_LINESTATE_FRAMING_ERROR 0x08
#define CPC_LINESTATE_PARITY_ERROR 0x04
#define CPC_LINESTATE_OVERRUN_ERROR 0x02
#define CPC_LINESTATE_DATA_READY 0x01
#define CPC_MODEMSTATE_CD 0x80
#define CPC_MODEMSTATE_RI 0x40
#define CPC_MODEMSTATE_DSR 0x20
#define CPC_MODEMSTATE_CTS 0x10
#define CPC_MODEMSTATE_DELTA_CD 0x08
#define CPC_MODEMSTATE_TRLEDGE_RI 0x04
#define CPC_MODEMSTATE_DELTA_DSR 0x02
#define CPC_MODEMSTATE_DELTA_CTS 0x01
#define CPC_PURGEDATA_RECVBUFF 1
#define CPC_PURGEDATA_XMITBUFF 2
#define CPC_PURGEDATA_BOTH 3
struct buffer_t {
int size; /* buffer size */
int nbuffered; /* bytes in buffer */
int eof; /* read() eof flag */
unsigned char *label; /* name of buffer */
unsigned char *buffp; /* ptr to buffer */
unsigned char *tailp; /* ptr past end of buffer */
unsigned char *readp; /* read ptr */
unsigned char *writep; /* write ptr */
};
typedef struct buffer_t BUFFER;
/*
token types. keep these values unique!
when adding a token type, please modify the tokentype2str()
function in config.c
*/
#define LONGVALUE -5
#define BOOLEAN -4
#define PRINTFSTRING -3
#define STRING -2
#define VALUE -1
/*
token values. keep these values unique! they don't really need
to be bit masks.
these are used while parsing the config file. see also kw_table[].
*/
#define UNKNOWN 0x00000001 /* keyword is unknown */
#define INVALID 0x00000002 /* missing/invalid value for keyword */
#define COMMENT 0x00000004
#define BLANKLINE 0x00000008
#define DEBUGLOG 0x00000010
#define DEBUGLEVEL 0x00000020
#define DIRECTORY 0x00000040
#define TMPDIR 0x00000080
#define PIDFILE 0x00000100
#define TIMEOUT 0x00000200
#define SERVERTYPE 0x00000400
#define USERNAME 0x00000800
#define GROUP 0x00001000
#define LOCKDIR 0x00002000
#define LOCKTEMPLATE 0x00004000
#define DEVICE 0x00008000
#define SPEED 0x00010000
#define DATABITS 0x00020000
#define PARITY 0x00040000
#define STOPBITS 0x00080000
#define FLOWCONTROL 0x00100000
#define MS_POLLINTERVAL 0x00200000
#define LS_POLLINTERVAL 0x00400000
#define DESCRIPTION 0x00800000
#define REPLYPURGEDATA 0x01000000
#define CONNFLUSH 0x02000000
#define DISCFLUSH 0x04000000
#define IDLETIMER 0x08000000
#define SENDLOGOUT 0x10000000
/*
parity symbols
*/
#define PARITY_NONE 0x00
#define PARITY_ODD 0x01
#define PARITY_EVEN 0x02
/*
flow control symbols
*/
#define HARDWARE_FLOW 0x04
#define SOFTWARE_FLOW 0x08
#define NO_FLOWCONTROL 0x10
/*
the sizes of various things ...
*/
#define SZ_BUFFER 4096 /* buffer size */
#define SZ_KEYWORD 64 /* config file keyword */
/*
the config file keyword table
*/
struct cf_entry {
char name[SZ_KEYWORD];
unsigned long token;
int type;
char *value;
};
#ifdef INIT_KEYWORDS
struct cf_entry kw_table[] = {
{"directory", DIRECTORY, STRING, NULL},
{"tmp directory", TMPDIR, STRING, NULL},
{"lock directory", LOCKDIR, STRING, NULL},
{"lock template", LOCKTEMPLATE, STRING, NULL},
{"debug log", DEBUGLOG, STRING, NULL},
{"debug level", DEBUGLEVEL, VALUE, NULL},
{"pid file", PIDFILE, STRING, NULL},
{"timeout", TIMEOUT, VALUE, NULL},
{"user", USERNAME, STRING, NULL},
{"username", USERNAME, STRING, NULL},
{"group", GROUP, STRING, NULL},
{"server type", SERVERTYPE, STRING, NULL},
{"modem", DEVICE, STRING, NULL},
{"device", DEVICE, STRING, NULL},
{"port", DEVICE, STRING, NULL},
{"speed", SPEED, LONGVALUE, NULL},
{"baudrate", SPEED, LONGVALUE, NULL},
{"databits", DATABITS, VALUE, NULL},
{"parity", PARITY, STRING, NULL},
{"stopbits", STOPBITS, VALUE, NULL},
{"flow control", FLOWCONTROL, STRING, NULL},
{"modemstate poll interval", MS_POLLINTERVAL,VALUE, NULL},
{"linestate poll interval", LS_POLLINTERVAL,VALUE, NULL},
{"description", DESCRIPTION, STRING, NULL},
{"reply Purge Data", REPLYPURGEDATA, BOOLEAN, NULL},
{"flush on connect", CONNFLUSH, BOOLEAN, NULL},
{"flush on disconnect", DISCFLUSH, BOOLEAN, NULL},
{"idle timer", IDLETIMER, VALUE, NULL},
{"send Telnet LOGOUT", SENDLOGOUT, BOOLEAN, NULL},
{"", UNKNOWN, STRING, NULL} /* this entry must be last */
};
#else
extern struct cf_entry kw_table[];
#endif
/*
global data references
*/
extern char *progname;
extern int tcp_port;
extern int signo;
extern struct config_t conf;
extern int noquote;
extern int useconds;
/*
functions in telnetcpcd.c
*/
extern void telnetcpcd_init(void);
extern void telnetcpcd_cleanup(void);
/*
functions in config.c
*/
extern int read_config_file(char *,struct config_t *);
extern char *skip_white_space(char *);
extern int kw_init(struct cf_entry kw_table[]);
extern void kw_done(void);
extern unsigned long parse_entry(char *buffer,struct cf_entry *cf);
extern char *tokentype2str(int tokentype);
extern void lowercase(char *str);
extern int save_value(char *value,int type,void *target);
extern int booleantoi(char *value);
extern int valid_baudrate(unsigned long speed);
/*
functions in signals.c
*/
extern void install_signal_handlers(void);
extern void record_parent_signal(int sig);
extern void parent_sighandler(int sig);
extern void sigterm(int);
extern void sighup(int);
extern void sigchild(int);
extern void sigpipe(int);
extern void sigusr1(int);
extern void sigusr2(int);
extern void sigalarm(int);
extern unsigned int set_alarm(int);
extern unsigned int cancel_alarm(int);
extern int alarm_occurred(void);
/*
functions in server.c
*/
extern void server(int);
extern void child_sighandler(int);
extern void handle_pending_signal(void);
extern int get_pending_signal(void);
/*
functions in uucplocks.c
*/
extern char *uucp_lock(char *device,pid_t pid);
extern char *uucp_tmp_filename(pid_t pid);
extern char *uucp_lock_filename(char *device);
extern char *uucp_lock_template(void);
extern int uucp_unlock(char *device);
extern int uucp_verify_lock(char *path,pid_t *ret_pid);
extern int write_pidfile(char *path,int flags,mode_t mode,pid_t pid);
extern void uulog(int level,char *fmt, ...);
/*
functions in mybasename.c
*/
extern char *mybasename(char *path);
/*
functions in mystrchr.c
*/
extern unsigned char *mystrchr(unsigned char *s,int ch,int size);
/*
functions in buffer.c
*/
extern struct buffer_t *bfmalloc(char *label,int size);
extern void bffree(struct buffer_t *buff);
extern int bfread(int fd,struct buffer_t *buff);
extern int bfwrite(int fd,struct buffer_t *buff);
extern int bfeof(struct buffer_t *buff);
extern int bfamount(struct buffer_t *buff);
extern unsigned char *bfpeek(struct buffer_t *buff,int *amount);
extern int bfsize(struct buffer_t *buff);
extern unsigned char *bflabel(struct buffer_t *buff);
extern int bfflush(int fd,struct buffer_t *buff);
extern void bfclear(struct buffer_t *buff);
extern int bfstrcat(struct buffer_t *buff,unsigned char *str);
extern int bfstrncat(struct buffer_t *buff,unsigned char *str,int nbytes);
extern int bfaddch(struct buffer_t *buff,unsigned char ch);
extern unsigned char *bfstrstr(struct buffer_t *buff,unsigned char *str);
extern unsigned char *bfstrchr(struct buffer_t *buff,unsigned char ch);
extern int bfinsch(struct buffer_t *buff,unsigned char *ptr,unsigned char ch);
extern int bfrmstr(struct buffer_t *buff,unsigned char *ptr,int nbytes);
extern void bfdump(struct buffer_t *buff,int verbose);
/*
functions in debug.c
*/
extern FILE *open_debug(char *file,int level,char *program);
extern void close_debug(void);
extern int get_debug_level(void);
extern void set_debug_level(int new_level);
extern FILE *get_debugfp(void);
extern void debug(int level,char *fmt, ...);
extern void debug_perror(char *str);
/*
functions in mydaemon.c
*/
extern void mydaemon(int ignsigcld,char *directory);
extern void daemon_start(int ignsigcld);
extern void reopen_stdfds(void);
extern void reopen_fd(char *file,int mode);
extern void reopen_FILE(char *file,char *mode,FILE *stream);
extern void close_all_fds(int begin);
/*
functions in esprintf.c
*/
extern int esprintf(char *s,char *efmt, ...);
extern char *escstrcpy(char *s1,char *s2);
extern int octal_esc(char *s,int *len);
extern int hex_esc(char *s,int *len);
extern int char_esc(int c);
/*
functions in memdump.c
*/
extern void memdump(char *buf,int len,FILE *stream);
extern char *slinedump(char *str,char *buf,int len);
/*
functions in signame.c
*/
extern char *signame(int sig);
/*
functions in sockets.c
*/
extern int attach_client_socket(char *hostname,int tcp_port);
extern char *getinetaddr(char *hostname);
extern void detach_client_socket(int sockfd);
extern int create_server_socket(int tcp_port,int nonblock);
extern int nonblocking(int sockfd);
extern void concurrent_server(int sockfd,int (*funct)(int),int *signo,void (*sighandler)(int));
extern void iterative_server(int sockfd,int (*funct)(int),int *signo,void (*sighandler)(int));
extern int accept_server_connect(int sockfd);
#ifdef USE_TCP_WRAPPERS
extern int access_control(int sockfd);
#endif
/*
functions in syslog_perror.c
*/
extern void syslog_perror(char *str);
/*
functions in timestamp.c
*/
extern char *timestamp(void);
extern char *timestamp_ms(void);
/*
functions in wait_child.c
*/
extern pid_t wait_child(pid_t pid,int *statloc);
extern void log_termination_status(pid_t pid,int status);
/*
functions in trimz.c
*/
extern char *trimz(char *str);
/*
functions in rfc2217.c
*/
extern int rfc2217(int sockfd);
extern int rfc2217_proc(int sockfd,int modemfd,MYTERMIOS *newterm,SERIAL_INFO *modem);
extern void rfc2217_sigint(void);
extern int read_socket(int sockfd,int modemfd,BUFFER *skt2mdm,BUFFER *cpc2skt);
extern int write_modem(int modemfd,BUFFER *skt2mdm);
extern int read_modem(int modemfd,BUFFER *mdm2skt);
extern int write_socket(int sockfd,BUFFER *mdm2skt);
extern SERIAL_INFO *serial_init(int *fd,MYTERMIOS *oldterm,MYTERMIOS *newterm);
extern int serial_init_termios(SERIAL_INFO *v,int *fd,MYTERMIOS *oldterm,MYTERMIOS *newterm);
extern void serial_cleanup(SERIAL_INFO *v,int *fd,MYTERMIOS *oldterm,MYTERMIOS *newterm);
extern speed_t ulong2speed_t(unsigned long s);
extern unsigned long speed_t2ulong(speed_t s);
extern unsigned long uint2cs(unsigned int dbits);
extern unsigned int cs2uint(unsigned long cs);
extern char *cs2str(unsigned long cs);
extern char *telnet_cpc_datasize2str(unsigned char datasize);
extern int network_init(int sockfd,int blockopt);
extern int telnet_init(int sockfd,BUFFER *cpc2skt);
extern int send_telnet_option(int sockfd,BUFFER *cpc2skt,unsigned char optcode,unsigned char option);
extern int send_telnet_cpc_suboption(int sockfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned char *command,int cmdlen);
extern int telnet_option_was_sent(unsigned char optcode,unsigned char option);
extern void mark_telnet_option_as_sent(unsigned char optcode,unsigned char option);
extern void mark_telnet_option_as_not_sent(unsigned char optcode,unsigned char option);
extern void enable_telnet_server_option(unsigned char option);
extern void disable_telnet_server_option(unsigned char option);
extern void enable_telnet_client_option(unsigned char option);
extern void disable_telnet_client_option(unsigned char option);
extern int telnet_server_option_is_enabled(unsigned char option);
extern int telnet_client_option_is_enabled(unsigned char option);
extern int telnet_server_option_is_disabled(unsigned char option);
extern int telnet_client_option_is_disabled(unsigned char option);
extern void process_telnet_options(int sockfd,int modemfd,BUFFER *skt2mdm,BUFFER *cpc2skt);
extern int respond_telnet_option(int sockfd,BUFFER *cpc2skt,unsigned char optcode,unsigned char option);
extern int respond_known_telnet_option(int sockfd,BUFFER *cpc2skt,unsigned char optcode,unsigned char option);
extern int respond_telnet_binary_option(int sockfd,BUFFER *cpc2skt,unsigned char optcode,unsigned char option);
extern int process_telnet_cpc_suboption(int sockfd,int modemfd,BUFFER *skt2mdm,BUFFER *cpc2skt,unsigned char *optstr,int optlen);
extern int respond_telnet_cpc_signature_subopt(int sockfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned char *command,int cmdlen);
extern int respond_telnet_cpc_baudrate_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern unsigned long get_baudrate(int modemfd);
extern int set_baudrate(int modemfd,unsigned long value);
extern int respond_telnet_cpc_datasize_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern unsigned char get_datasize(int modemfd);
extern int set_datasize(int modemfd,unsigned long value);
extern int respond_telnet_cpc_parity_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern unsigned char get_parity(int modemfd);
extern int set_parity(int modemfd,unsigned long value);
extern int respond_telnet_cpc_stopsize_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern unsigned char get_stopsize(int modemfd);
extern int set_stopsize(int modemfd,unsigned long value);
extern int respond_telnet_cpc_control_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern int respond_telnet_cpc_control_break_subopt(int sockfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern int respond_telnet_cpc_control_dtr_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern int respond_telnet_cpc_control_rts_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern unsigned char get_flowcontrol(int modemfd);
extern int set_flowcontrol(int modemfd,unsigned long value);
extern unsigned int get_modem_signals(int modemfd);
extern int set_modem_signals(int modemfd,unsigned long value);
extern void advise_client_of_state_changes(int sockfd,int modemfd,BUFFER *cpc2skt);
extern unsigned char check_modemstate(int modemfd,int query);
extern int check_carrier_state(int modemfd);
extern int respond_telnet_cpc_linestate_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern int respond_telnet_cpc_modemstate_subopt(int sockfd,int modemfd,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern int respond_telnet_cpc_purge_data_subopt(int sockfd,int modemfd,BUFFER *skt2mdm,BUFFER *cpc2skt,unsigned char suboptcode,unsigned long value);
extern char *telnet_optcode2str(unsigned char optcode);
extern char *telnet_option2str(unsigned char option);
extern char *telnet_cpc_subopt2str(unsigned char suboptcode);
extern char *telnet_cpc_parity2str(unsigned char optcode);
extern char *telnet_cpc_stopsize2str(unsigned char optcode);
extern char *telnet_cpc_modemstate2str(unsigned char modemstate);
extern char *telnet_cpc_linestate2str(unsigned char linestate);
extern char *telnet_cpc_flowcontrol2str(unsigned char optcode);
extern void escape_iac_chars(BUFFER *mdm2skt);
extern void telnet_cpc_log_subopt(char *prefix,unsigned char suboptcode,unsigned long value,unsigned char *command,int cmdlen);
/*
functions in modems.c
*/
extern int add_modem(struct config_t *conf,char *device);
extern SERIAL_INFO *alloc_modem(void);
extern void free_modem(SERIAL_INFO *v);
extern void free_all_modems(SERIAL_INFO *v[]);
extern SERIAL_INFO *select_modem(struct config_t *conf);
extern int release_modem(SERIAL_INFO *v);
/*
functions in msleep.c
*/
extern int msleep(unsigned long microsec);
#endif /* _TELNETCPCD_H */