summaryrefslogtreecommitdiffstats
path: root/debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c')
-rw-r--r--debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c372
1 files changed, 372 insertions, 0 deletions
diff --git a/debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c b/debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c
new file mode 100644
index 00000000..8555cdd7
--- /dev/null
+++ b/debian/pilot-link/pilot-link-0.12.5-dfsg/libpisock/sys.c
@@ -0,0 +1,372 @@
+/*
+ * $Id: sys.c,v 1.17 2006/10/12 14:21:22 desrod Exp $
+ *
+ * sys.c: Pilot System Protocol
+ *
+ * (c) 1996, Kenneth Albanowski.
+ * Derived from padp.c.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "pi-debug.h"
+#include "pi-source.h"
+#include "pi-slp.h"
+#include "pi-sys.h"
+#include "pi-error.h"
+
+/* Declare function prototypes */
+static int sys_flush(pi_socket_t *ps, int flags);
+static int sys_getsockopt(pi_socket_t *ps, int level, int option_name,
+ void *option_value, size_t *option_len);
+static int sys_setsockopt(pi_socket_t *ps, int level, int option_name,
+ const void *option_value, size_t *option_len);
+
+
+/***********************************************************************
+ *
+ * Function: sys_protocol_dup
+ *
+ * Summary: clones an existing pi_protocol struct
+ *
+ * Parameters: pi_protocol*
+ *
+ * Returns: pi_protocol_t* or NULL if operation failed
+ *
+ ***********************************************************************/
+static pi_protocol_t *
+sys_protocol_dup (pi_protocol_t *prot)
+{
+ pi_protocol_t *new_prot = NULL;
+ pi_sys_data_t *data = NULL,
+ *new_data = NULL;
+
+ new_prot = (pi_protocol_t *)malloc (sizeof (pi_protocol_t));
+ if (new_prot != NULL) {
+ new_data = (pi_sys_data_t *)malloc (sizeof (pi_sys_data_t));
+ if (new_data == NULL) {
+ free(new_prot);
+ new_prot = NULL;
+ }
+ }
+
+ if (new_prot != NULL && new_data != NULL) {
+ new_prot->level = prot->level;
+ new_prot->dup = prot->dup;
+ new_prot->free = prot->free;
+ new_prot->read = prot->read;
+ new_prot->write = prot->write;
+ new_prot->flush = prot->flush;
+ new_prot->getsockopt = prot->getsockopt;
+ new_prot->setsockopt = prot->setsockopt;
+
+ data = (pi_sys_data_t *)prot->data;
+ new_data->txid = data->txid;
+ new_prot->data = new_data;
+ }
+
+ return new_prot;
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_protocol_free
+ *
+ * Summary: frees an existing pi_protocol struct
+ *
+ * Parameters: pi_protocol*
+ *
+ * Returns: void
+ *
+ ***********************************************************************/
+static void
+sys_protocol_free (pi_protocol_t *prot)
+{
+
+ ASSERT (prot != NULL);
+ if (prot != NULL) {
+ if (prot->data != NULL)
+ free(prot->data);
+ free(prot);
+ }
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_protocol
+ *
+ * Summary: creates and inits pi_protocol struct instance
+ *
+ * Parameters: void
+ *
+ * Returns: pi_protocol_t* or NULL if operation failed
+ *
+ ***********************************************************************/
+pi_protocol_t *
+sys_protocol (void)
+{
+ pi_protocol_t *prot = NULL;
+ pi_sys_data_t *data = NULL;
+
+ prot = (pi_protocol_t *)malloc (sizeof (pi_protocol_t));
+ if (prot != NULL) {
+ data = (pi_sys_data_t *)malloc (sizeof (pi_sys_data_t));
+ if (data == NULL) {
+ free(prot);
+ prot = NULL;
+ }
+ }
+
+ if (prot != NULL && data != NULL) {
+ prot->level = PI_LEVEL_SYS;
+ prot->dup = sys_protocol_dup;
+ prot->free = sys_protocol_free;
+ prot->read = sys_rx;
+ prot->write = sys_tx;
+ prot->flush = sys_flush;
+ prot->getsockopt = sys_getsockopt;
+ prot->setsockopt = sys_setsockopt;
+
+ data->txid = 0x00;
+ prot->data = data;
+ }
+
+ return prot;
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_tx
+ *
+ * Summary: Send a system message
+ *
+ * Parameters: pi_socket_t*, char* to buffer, buffer length, flags
+ *
+ * Returns: 0 if success, nonzero otherwise
+ *
+ ***********************************************************************/
+ssize_t
+sys_tx(pi_socket_t *ps, const unsigned char *buf, size_t len, int flags)
+{
+ pi_protocol_t *prot,
+ *next;
+
+ pi_sys_data_t *data;
+
+ int type,
+ socket;
+
+ size_t size;
+
+ prot = pi_protocol(ps->sd, PI_LEVEL_SYS);
+ if (prot == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ data = (pi_sys_data_t *)prot->data;
+
+ next = pi_protocol_next(ps->sd, PI_LEVEL_SYS);
+ if (next == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ if (!data->txid || data->txid == 0xff)
+ data->txid = 0x11; /* some random # */
+ data->txid++;
+ if (!data->txid || data->txid == 0xff)
+ data->txid = 0x11; /* some random # */
+
+ type = PI_SLP_TYPE_RDCP;
+
+ /* Fix me, allow socket type */
+ socket = PI_SLP_SOCK_CON;
+ size = sizeof(type);
+ pi_setsockopt(ps->sd, PI_LEVEL_SLP, PI_SLP_TYPE,
+ &type, &size);
+ pi_setsockopt(ps->sd, PI_LEVEL_SLP, PI_SLP_DEST,
+ &socket, &size);
+ pi_setsockopt(ps->sd, PI_LEVEL_SLP, PI_SLP_SRC,
+ &socket, &size);
+ size = sizeof(data->txid);
+ pi_setsockopt(ps->sd, PI_LEVEL_SLP, PI_SLP_TXID,
+ &data->txid, &size);
+
+ len = next->write(ps, buf, len, flags);
+ if (len >= 0) {
+ CHECK(PI_DBG_SYS, PI_DBG_LVL_INFO, sys_dump_header(buf, 1));
+ CHECK(PI_DBG_SYS, PI_DBG_LVL_DEBUG, sys_dump(buf, len));
+ }
+
+ return len;
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_rx
+ *
+ * Summary: Receive system message
+ *
+ * Parameters: pi_socket_t*, char* to buffer, buffer length, flags
+ *
+ * Returns: Length of read or negative on error
+ *
+ ***********************************************************************/
+ssize_t
+sys_rx(pi_socket_t *ps, pi_buffer_t *buf, size_t len, int flags)
+{
+ pi_protocol_t *next,
+ *prot;
+
+ pi_sys_data_t *data;
+ size_t data_len;
+
+ prot = pi_protocol(ps->sd, PI_LEVEL_SYS);
+ if (prot == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ data = (pi_sys_data_t *)prot->data;
+ next = pi_protocol_next(ps->sd, PI_LEVEL_SYS);
+ if (next == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ data_len = next->read(ps, buf, len, flags);
+
+ CHECK(PI_DBG_SYS, PI_DBG_LVL_INFO, sys_dump_header(buf->data, 0));
+ CHECK(PI_DBG_SYS, PI_DBG_LVL_DEBUG, sys_dump(buf->data, data_len));
+
+ return data_len;
+}
+
+/***********************************************************************
+ *
+ * Function: sys_flush
+ *
+ * Summary: Flush input and output buffers
+ *
+ * Parameters: pi_socket_t*, flags
+ *
+ * Returns: A negative number on error, 0 otherwise
+ *
+ ***********************************************************************/
+static int
+sys_flush(pi_socket_t *ps, int flags)
+{
+ pi_protocol_t *prot,
+ *next;
+
+ prot = pi_protocol(ps->sd, PI_LEVEL_SYS);
+ if (prot == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ next = pi_protocol_next(ps->sd, PI_LEVEL_SYS);
+ if (next == NULL)
+ return pi_set_error(ps->sd, PI_ERR_SOCK_INVALID);
+
+ return next->flush(ps, flags);
+}
+
+/***********************************************************************
+ *
+ * Function: sys_getsockopt
+ *
+ * Summary: get options on socket
+ *
+ * Parameters: pi_socket*, level, option name, option value, option length
+ *
+ * Returns: 0 for success
+ *
+ ***********************************************************************/
+static int
+sys_getsockopt(pi_socket_t *ps, int level, int option_name,
+ void *option_value, size_t *option_len)
+{
+ return 0;
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_setsockopt
+ *
+ * Summary: get options on socket
+ *
+ * Parameters: pi_socket*, level, option name, option value, option length
+ *
+ * Returns: 0 for success
+ *
+ ***********************************************************************/
+static int
+sys_setsockopt(pi_socket_t *ps, int level, int option_name,
+ const void *option_value, size_t *option_len)
+{
+ return 0;
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_dump_header
+ *
+ * Summary: Dump SYS packet header
+ *
+ * Parameters: char* to data, RXTX boolean
+ *
+ * Returns: void
+ *
+ ***********************************************************************/
+void
+sys_dump_header(const unsigned char *data, int rxtx)
+{
+ LOG((PI_DBG_SYS, PI_DBG_LVL_NONE,
+ "SYS %s\n", rxtx ? "TX" : "RX"));
+}
+
+
+/***********************************************************************
+ *
+ * Function: sys_dump
+ *
+ * Summary: Dump SYS packet
+ *
+ * Parameters: char* to data, length
+ *
+ * Returns: void
+ *
+ ***********************************************************************/
+void
+sys_dump(const unsigned char *data, size_t len)
+{
+ pi_dumpdata((char *)&data[PI_SYS_HEADER_LEN], len);
+}
+
+/* vi: set ts=8 sw=4 sts=4 noexpandtab: cin */
+/* ex: set tabstop=4 expandtab: */
+/* Local Variables: */
+/* indent-tabs-mode: t */
+/* c-basic-offset: 8 */
+/* End: */
+