From 56289d787a96f7d74273e0d1d1875b487f6cfe39 Mon Sep 17 00:00:00 2001 From: short <> Date: Wed, 3 Apr 2002 01:44:15 +0000 Subject: [PATCH] Implemented connection type "tcp" (GCT_TCP), use : as "port" --- common/cimd.c | 11 ++- common/device.c | 23 +++++ common/devices/Makefile | 3 +- common/devices/tcp.c | 205 +++++++++++++++++++++++++++++++++++++++++++ common/devices/unixserial.c | 9 +- gnokii/gnokii.c | 4 + gnokiid/gnokiid.c | 7 ++ include/devices/tcp.h | 39 ++++++++ include/devices/unixserial.h | 8 ++ include/gsm-common.h | 6 +- smsd/lowlevel.c | 5 ++ xgnokii/xgnokii_lowlevel.c | 6 ++ 12 files changed, 317 insertions(+), 9 deletions(-) create mode 100644 common/devices/tcp.c create mode 100644 include/devices/tcp.h diff --git a/common/cimd.c b/common/cimd.c index e213170..5784020 100644 --- a/common/cimd.c +++ b/common/cimd.c @@ -17,6 +17,9 @@ The various routines are prefixed by CIMD. $Log$ + Revision 1.1.1.2 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.1 2002/04/03 00:08:03 short Found in "gnokii-working" directory, some November-patches version @@ -757,7 +760,7 @@ static GSM_Error CIMD_PhoneSetup(void) static void CIMD_RX_Char(char rx_byte); static void CIMD_SigHandler(int status); -static bool CIMD_OpenSerial(void); +static bool CIMD_OpenSerial(GSM_ConnectionType connection); GSM_Phone phone_cimd; /* forward declaration */ @@ -780,7 +783,7 @@ int rtn; } #else SAFE_STRNCPY_SIZEOF(PortDevice,state->Link.PortDevice); - if (!CIMD_OpenSerial()) + if (!CIMD_OpenSerial(state->Link.ConnectionType)) return(GE_INTERNALERROR); #endif @@ -1203,7 +1206,7 @@ static GSM_Error CIMD_Reset(GSM_Data *data, GSM_Statemachine *state) /* Called by initialisation code to open comm port in asynchronous mode. */ -static bool CIMD_OpenSerial(void) +static bool CIMD_OpenSerial(GSM_ConnectionType connection) { int result; @@ -1221,7 +1224,7 @@ static bool CIMD_OpenSerial(void) /* Open device. */ - result = device_open(PortDevice, false/*with_odd_parity*/, true/*with_async*/, -1/*with_hw_handshake*/, GCT_Serial); + result = device_open(PortDevice, false/*with_odd_parity*/, true/*with_async*/, -1/*with_hw_handshake*/, connection); if (!result) { perror(_("Couldn't open CIMD device")); diff --git a/common/device.c b/common/device.c index dee2fe2..ad8ef2c 100644 --- a/common/device.c +++ b/common/device.c @@ -11,6 +11,9 @@ Released under the terms of the GNU GPL, see file COPYING for more details. $Log$ + Revision 1.1.1.2 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.1 2001/11/25 21:58:58 short :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001 @@ -41,6 +44,7 @@ #include "devices/unixserial.h" #include "devices/unixirda.h" #include "devices/tekram.h" +#include "devices/tcp.h" #include "device.h" /* @@ -74,6 +78,9 @@ int device_open(__const char *__file, int __with_odd_parity, int __with_async, i case GCT_Irda: device_portfd = irda_open(); break; + case GCT_TCP: + device_portfd = tcp_opendevice(__file, __with_async); + break; default: break; } @@ -93,6 +100,9 @@ void device_close(void) case GCT_Irda: irda_close(device_portfd); break; + case GCT_TCP: + tcp_close(device_portfd); + break; default: break; } @@ -113,6 +123,8 @@ void device_setdtrrts(int __dtr, int __rts) break; case GCT_Irda: break; + case GCT_TCP: + break; default: break; } @@ -130,6 +142,8 @@ void device_changespeed(int __speed) break; case GCT_Irda: break; + case GCT_TCP: + break; default: break; } @@ -148,6 +162,9 @@ size_t device_read(__ptr_t __buf, size_t __nbytes) case GCT_Irda: return irda_read(device_portfd, __buf, __nbytes); break; + case GCT_TCP: + return tcp_read(device_portfd, __buf, __nbytes); + break; default: break; } @@ -167,6 +184,9 @@ size_t device_write(__const __ptr_t __buf, size_t __n) case GCT_Irda: return irda_write(device_portfd, __buf, __n); break; + case GCT_TCP: + return tcp_write(device_portfd, __buf, __n); + break; default: break; } @@ -186,6 +206,9 @@ int device_select(struct timeval *timeout) case GCT_Irda: return irda_select(device_portfd, timeout); break; + case GCT_TCP: + return tcp_select(device_portfd, timeout); + break; default: break; } diff --git a/common/devices/Makefile b/common/devices/Makefile index aefedc8..ae54cd1 100644 --- a/common/devices/Makefile +++ b/common/devices/Makefile @@ -23,7 +23,8 @@ ifdef WIN32 OBJS += $(TOPDIR)/win32/winserial.o else OBJS += unixserial.o \ - unixirda.o + unixirda.o \ + tcp.o endif all: DEVICES.o diff --git a/common/devices/tcp.c b/common/devices/tcp.c new file mode 100644 index 0000000..ea4918e --- /dev/null +++ b/common/devices/tcp.c @@ -0,0 +1,205 @@ +/* + + $Id$ + + G N O K I I + + A Linux/Unix toolset and driver for Nokia mobile phones. + + Copyright (C) 2002 Jan Kratochvil + + Released under the terms of the GNU GPL, see file COPYING for more details. + +*/ + +#include "misc.h" +#include "cfgreader.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __unices__ +# include +#endif + +#include +#include "devices/tcp.h" +#include "devices/unixserial.h" + +#ifdef HAVE_SYS_IOCTL_COMPAT_H + #include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifndef O_NONBLOCK + #define O_NONBLOCK 0 +#endif + +/* Open the serial port and store the settings. */ + +int tcp_open(__const char *__file) { + + int __fd; + int i; + struct sockaddr_in addr; + static bool atexit_registered=false; + char *filedup,*portstr,*end; + unsigned long portul; + struct hostent *hostent; + + if (!atexit_registered) { + memset(serial_close_all_openfds,-1,sizeof(serial_close_all_openfds)); +#if 0 /* Disabled for now as atexit() functions are then called multiple times for pthreads! */ + signal(SIGINT,unixserial_interrupted); +#endif + atexit(serial_close_all); + atexit_registered=true; + } + + __fd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); + if (__fd == -1) { + perror("Gnokii tcp_open: socket()"); + return (-1); + } + if (!(filedup=strdup(__file))) { +fail_close: + close(__fd); + return (-1); + } + if (!(portstr=strchr(filedup,':'))) { + fprintf(stderr,"Gnokii tcp_open: colon (':') not found in connect strings \"%s\"!\n",filedup); +fail_free: + free(filedup); + goto fail_close; + } + *portstr++='\0'; + portul=strtoul(portstr,&end,0); + if ((end && *end) || portul>=0x10000) { + fprintf(stderr,"Gnokii tcp_open: Port string \"%s\" not valid for IPv4 connection!\n",portstr); + goto fail_free; + } + if (!(hostent=gethostbyname(filedup))) { + fprintf(stderr,"Gnokii tcp_open: Unknown host \"%s\"!\n",filedup); + goto fail_free; + } + if (hostent->h_addrtype!=AF_INET || hostent->h_length!=sizeof(addr.sin_addr) || !hostent->h_addr_list[0]) { + fprintf(stderr,"Gnokii tcp_open: Address resolve for host \"%s\" not compatible!\n",filedup); + goto fail_free; + } + free(filedup); + + addr.sin_family=AF_INET; + addr.sin_port=htons(portul); + memcpy(&addr.sin_addr,hostent->h_addr_list[0],sizeof(addr.sin_addr)); + + if (connect(__fd,(struct sockaddr *)&addr,sizeof(addr))) { + perror("Gnokii tcp_open: connect()"); + goto fail_close; + } + + for (i=0;i: as "port" + Revision 1.1.1.5 2002/04/03 00:08:07 short Found in "gnokii-working" directory, some November-patches version @@ -113,7 +116,7 @@ static void device_script_cfgfunc(const char *section,const char *key,const char setenv(key,value,1/*overwrite*/); /* errors ignored */ } -static int device_script(int fd, const char *section) +int device_script(int fd, const char *section) { pid_t pid; const char *scriptname = CFG_Get(CFG_Info, "global", section); @@ -159,7 +162,7 @@ int status; int serial_close_all_openfds[0x10]; /* -1 when entry not used, fd otherwise */ int serial_close(int __fd); -static void serial_close_all(void) +void serial_close_all(void) { int i; @@ -169,7 +172,7 @@ static void serial_close_all(void) serial_close(serial_close_all_openfds[i]); } -static void unixserial_interrupted(int signo) +void unixserial_interrupted(int signo) { exit(EXIT_FAILURE); /* NOTREACHED */ diff --git a/gnokii/gnokii.c b/gnokii/gnokii.c index 472f4e5..b7f0850 100644 --- a/gnokii/gnokii.c +++ b/gnokii/gnokii.c @@ -19,6 +19,9 @@ really powerful and useful :-) $Log$ + Revision 1.1.1.12 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.11 2002/04/03 00:08:17 short Found in "gnokii-working" directory, some November-patches version @@ -362,6 +365,7 @@ void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame)) if (!strcmp(Connection, "infrared")) connection=GCT_Infrared; if (!strcmp(Connection, "irda")) connection=GCT_Irda; + if (!strcmp(Connection, "tcp")) connection=GCT_TCP; /* Initialise the code for the GSM interface. */ diff --git a/gnokiid/gnokiid.c b/gnokiid/gnokiid.c index e0b8f16..26cb16f 100644 --- a/gnokiid/gnokiid.c +++ b/gnokiid/gnokiid.c @@ -14,6 +14,9 @@ various daemon functions. $Log$ + Revision 1.1.1.4 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.3 2002/04/03 00:08:17 short Found in "gnokii-working" directory, some November-patches version @@ -123,6 +126,10 @@ int main(int argc, char *argv[]) connection=GCT_Infrared; } + if (!strcmp(Connection, "tcp")) { + connection=GCT_TCP; + } + TerminateThread=false; if (VM_Initialise(Model, Port, Initlength, connection, BinDir, DebugMode, true) == false) { diff --git a/include/devices/tcp.h b/include/devices/tcp.h new file mode 100644 index 0000000..0786ae4 --- /dev/null +++ b/include/devices/tcp.h @@ -0,0 +1,39 @@ +/* + + $Id$ + + G N O K I I + + A Linux/Unix toolset and driver for Nokia mobile phones. + + Copyright (C) 2002 Jan Kratochvil + + Released under the terms of the GNU GPL, see file COPYING for more details. + +*/ + +#ifndef __devices_tcp_h +#define __devices_tcp_h + +#ifdef WIN32 + #include + /* FIXME: this should be solved in config.h in 0.4.0 */ + #define __const const + typedef void * __ptr_t; +#else + #include +#endif /* WIN32 */ + +#include "misc.h" + +int tcp_open(__const char *__file); +int tcp_close(int __fd); + +int tcp_opendevice(__const char *__file, int __with_async); + +size_t tcp_read(int __fd, __ptr_t __buf, size_t __nbytes); +size_t tcp_write(int __fd, __const __ptr_t __buf, size_t __n); + +int tcp_select(int fd, struct timeval *timeout); + +#endif /* __devices_tcp_h */ diff --git a/include/devices/unixserial.h b/include/devices/unixserial.h index 9dca33b..0f95914 100644 --- a/include/devices/unixserial.h +++ b/include/devices/unixserial.h @@ -11,6 +11,9 @@ Released under the terms of the GNU GPL, see file COPYING for more details. $Log$ + Revision 1.1.1.5 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.4 2002/04/03 00:08:20 short Found in "gnokii-working" directory, some November-patches version @@ -50,6 +53,11 @@ size_t serial_write(int __fd, __const __ptr_t __buf, size_t __n); int serial_select(int fd, struct timeval *timeout); +extern int serial_close_all_openfds[0x10]; +extern void serial_close_all(void); +extern int device_script(int fd, const char *section); +extern void unixserial_interrupted(int signo); + #endif /* __devices_unixserial_h */ diff --git a/include/gsm-common.h b/include/gsm-common.h index cca004b..8fbca92 100644 --- a/include/gsm-common.h +++ b/include/gsm-common.h @@ -14,6 +14,9 @@ handset. $Log$ + Revision 1.1.1.10 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.9 2002/04/03 00:08:19 short Found in "gnokii-working" directory, some November-patches version @@ -44,7 +47,8 @@ typedef enum { GCT_Serial, /* Serial connection. */ GCT_Infrared, /* Infrared connection. */ GCT_Tekram, /* Tekram Ir-Dongle */ - GCT_Irda + GCT_Irda, + GCT_TCP, /* TCP network connection */ } GSM_ConnectionType; /* Maximum length of device name for serial port */ diff --git a/smsd/lowlevel.c b/smsd/lowlevel.c index ea36182..d5191d2 100644 --- a/smsd/lowlevel.c +++ b/smsd/lowlevel.c @@ -11,6 +11,9 @@ $Id$ $Log$ + Revision 1.1.1.4 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.3 2002/04/03 00:08:22 short Found in "gnokii-working" directory, some November-patches version @@ -137,6 +140,8 @@ static GSM_Error fbusinit(bool enable_monitoring) if (!strcmp(smsdConfig.connection, "infrared")) connection = GCT_Infrared; + if (!strcmp(smsdConfig.connection, "tcp")) + connection = GCT_TCP; /* Initialise the code for the GSM interface. */ diff --git a/xgnokii/xgnokii_lowlevel.c b/xgnokii/xgnokii_lowlevel.c index 528a433..73b0b50 100644 --- a/xgnokii/xgnokii_lowlevel.c +++ b/xgnokii/xgnokii_lowlevel.c @@ -11,6 +11,9 @@ Released under the terms of the GNU GPL, see file COPYING for more details. $Log$ + Revision 1.1.1.5 2002/04/03 01:44:15 short + Implemented connection type "tcp" (GCT_TCP), use : as "port" + Revision 1.1.1.4 2002/04/03 00:08:33 short Found in "gnokii-working" directory, some November-patches version @@ -200,6 +203,9 @@ static GSM_Error fbusinit(bool enable_monitoring) if (!strcmp(xgnokiiConfig.connection, "irda")) connection = GCT_Irda; + if (!strcmp(xgnokiiConfig.connection, "tcp")) + connection = GCT_TCP; + /* Initialise the code for the GSM interface. */ if (error == GE_NOLINK) -- 1.8.3.1