--- /dev/null
+/*
+ MYGNOKII net_api
+ Version 0.03 07.02.2002
+ <ralf@mythelen.de>
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/errno.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <netdb.h>
+#include <unistd.h>
+#include "mg_net_api.h"
+
+
+/* globals */
+static int mg_s; /* socket descriptor */
+static struct sockaddr_in mg_myaddr_in; /* for local socket address */
+static struct sockaddr_in mg_servaddr_in; /* for server socket address */
+static char mg_password[8]; /* passwd for udp-requsts */
+
+/*
+ * H A N D L E R
+ *
+ * This routine is the signal handler for the alarm signal.
+ * It simply re-installs itself as the handler and returns.
+ */
+void handler()
+{
+ signal(SIGALRM, handler);
+}
+
+/* Send the request to the server. */
+/* and wait for response */
+static int send_rq(MG_api_request *rq)
+{
+int ret;
+
+strncpy(rq->passwd,mg_password,8);
+
+if (sendto (mg_s, rq, sizeof(*rq), 0, (struct sockaddr *) &mg_servaddr_in,
+ sizeof(struct sockaddr_in)) == -1) {
+ return(-1);
+ }
+
+
+ /* Set up alarm signal handler. */
+signal(SIGALRM, handler);
+
+ /* Set up a timeout so I don't hang in case the packet
+ * gets lost. After all, UDP does not guarantee
+ * delivery.
+ */
+alarm(5);
+
+ /* Wait for the reply to come in. We assume that
+ * no messages will come from any other source,
+ * so that we do not need to do a recvfrom nor
+ * check the responder's address.
+ */
+
+/* RTH FIXME: TIMEOUT DONT WORK !! */
+ret = recv (mg_s, rq, sizeof(*rq), 0);
+switch (ret) {
+ case EINTR:
+ /* Alarm went off and aborted the receive. */
+ alarm(0);
+ return(MG_ERROR_TIMEOUT);
+ break;
+
+ default:
+ alarm(0);
+ return(ret);
+ break;
+ }
+}
+
+int mg_exit(void)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_EXIT;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else return(rq.cmd);
+
+}
+
+int mg_version(MG_rq_version *version)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_VERSION;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(version, rq.buffer, sizeof(*version));
+ return(rq.cmd);
+ }
+}
+
+int mg_identify(MG_rq_identify *ident)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_IDENTIFY;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(ident, rq.buffer, sizeof(*ident));
+ return(rq.cmd);
+ }
+}
+
+int mg_memorystatus(MG_rq_memorystatus *stats)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_MEMORYSTATUS;
+memcpy(rq.buffer, stats, sizeof(*stats));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(stats, rq.buffer, sizeof(*stats));
+ return(rq.cmd);
+ }
+}
+
+int mg_get_memory_location(MG_rq_phonebook_location *rph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_GET_MEMORY_LOCATION;
+memcpy(rq.buffer, rph, sizeof(*rph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(rph, rq.buffer, sizeof(*rph));
+ return(rq.cmd);
+ }
+}
+
+int mg_write_phonebook_location(MG_rq_phonebook_location *wph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_WRITE_PHONEBOOK_LOCATION;
+memcpy(rq.buffer, wph, sizeof(*wph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(wph, rq.buffer, sizeof(*wph));
+ return(rq.cmd);
+ }
+}
+
+int mg_delete_phonebook_location(MG_rq_phonebook_location *dph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_DELETE_PHONEBOOK_LOCATION;
+memcpy(rq.buffer, dph, sizeof(*dph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(dph, rq.buffer, sizeof(*dph));
+ return(rq.cmd);
+ }
+}
+
+int mg_send_sms(MG_rq_send_sms *sms)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_SEND_SMS;
+memcpy(rq.buffer, sms, sizeof(*sms));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(sms, rq.buffer, sizeof(*sms));
+ return(rq.cmd);
+ }
+}
+
+
+/*
+ mg_init
+ Input: Hostname of mygnokii-server
+ Output: connected udp-port on success, else -1
+*/
+int mg_init(char *hostname, char *passwd)
+{
+
+struct hostent *hp; /* pointer to host info for nameserver host */
+struct servent *sp; /* pointer to service information */
+
+/* set password */
+strncpy(mg_password,passwd,8);
+
+/* clear out address structures */
+memset ((char *)&mg_myaddr_in, 0, sizeof(struct sockaddr_in));
+memset ((char *)&mg_servaddr_in, 0, sizeof(struct sockaddr_in));
+
+/* Set up the server address. */
+mg_servaddr_in.sin_family = AF_INET;
+
+/* Get the host information for the server's hostname that the
+ * user passed in.
+ */
+hp = gethostbyname (hostname);
+if (hp == NULL) {
+ return(1);
+ }
+
+mg_servaddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
+/* Find the information for the "example" server
+ * in order to get the needed port number.
+ */
+sp = getservbyname ("mygnokii", "udp");
+if (sp == NULL) {
+ /* not found -> use default port 50963 */
+ mg_servaddr_in.sin_port = htons(50963);
+ }
+else mg_servaddr_in.sin_port = sp->s_port;
+
+/* Create the socket. */
+mg_s = socket (AF_INET, SOCK_DGRAM, 0);
+if (mg_s == -1) {
+ return(-1);
+ }
+
+ /* Bind socket to some local address so that the
+ * server can send the reply back. A port number
+ * of zero will be used so that the system will
+ * assign any available port number. An address
+ * of INADDR_ANY will be used so we do not have to
+ * look up the internet address of the local host.
+ */
+mg_myaddr_in.sin_family = AF_INET;
+mg_myaddr_in.sin_port = 0;
+mg_myaddr_in.sin_addr.s_addr = INADDR_ANY;
+if (bind(mg_s, (struct sockaddr *) &mg_myaddr_in, sizeof(struct sockaddr_in)) == -1) {
+ return(-1);
+ }
+
+/* return portnumber */
+return(mg_servaddr_in.sin_port);
+
+}
+