--- /dev/null
+/*
+ * Copyright (C) 2008 Nokia Corporation
+ * All rights reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/* Wrapper functions for basic NoTA I/O
+ * (sending, receiving, connecting, disconnecting).
+ *
+ * TODO: Update error handling to use perror throughout,
+ * once it is thoroughly implemented in h_in3.
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include "notaio.h"
+
+#ifdef USE_H_IN3
+
+// Activates a service. This version returns the listener socket,
+// if successful.
+int n_activate(int sid, void* key, void* callback)
+{
+ errno = 0;
+ // Create an initial socket for monitoring incoming connections
+ int socket = Hsocket(Hgetinstance(), AF_NOTA, SOCK_STREAM, 0);
+ if (socket < 0)
+ {
+ perror("Error creating socket");
+ return socket;
+ }
+ nota_addr_t addr = { sid, 0 }; // { Service, Port }
+ errno = 0;
+ sleep(2); //FIXME: this is so that l_in has time to update cmap
+ // Register service:
+ int error = Hbind(Hgetinstance(), socket, (struct sockaddr*)&addr, sizeof(addr));
+ if (error < 0) {
+ perror("Error registering service");
+ return error;
+ }
+
+ errno = 0;
+ // Set the socket to listen:
+ error = Hlisten(Hgetinstance(), socket, 1);
+ if (error < 0) {
+ perror("Error listening to socket");
+ return error;
+ }
+ return socket;
+}
+
+// In this version, 'sid' means the listener socket. In h_in3,
+// deactivating a service means closing the socket bound to its
+// address.
+int n_deactivate(int sid, void* key)
+{
+ return n_disconnect(sid);
+}
+
+int n_accept(int to, void* param1, void* param2)
+{
+ errno = 0;
+ int error = Haccept(Hgetinstance(), to, (struct sockaddr*)param1, (socklen_t*)param2);
+ if (errno != 0)
+ {
+ perror("Error accepting incoming connection");
+ return -errno;
+ }
+ return error;
+}
+
+// Creates a socket and connects it to the service
+int n_connect(int sid, void* key, void* callback)
+{
+ int socket;
+ printf("Connecting to service %d...\n", sid);
+ socket = Hsocket(Hgetinstance(), AF_NOTA, SOCK_STREAM, 0);
+ if (socket < 0)
+ {
+ printf("Error connecting to SID %d: %d\n", sid, socket);
+ return socket;
+ }
+ nota_addr_t addr = { sid, 0 }; // Service, port
+ errno = 0;
+ sleep(2); //FIXME: this is so that l_in has time to update cmap
+ int error = Hconnect(Hgetinstance(), socket, (struct sockaddr*)&addr, sizeof(addr));
+ if (error < 0)
+ {
+ printf("Error connecting to SID %d: %d\n", sid, error);
+ Hclose(Hgetinstance(), socket);
+ return error;
+ }
+ else printf("\tdone - socket %d connected to service %d.\n", socket, sid);
+ return socket;
+}
+
+// Send data
+int n_send(int socket, void* buffer, int buffer_len, int mode)
+{
+ int error = 0;
+ errno = 0;
+ error = Hsend(Hgetinstance(), socket, buffer, buffer_len, mode);
+ if (error < 0)
+ {
+ printf("Write error to socket %d: %d\n", socket, error);
+ return error;
+ }
+ return error;
+}
+
+
+// Receive data
+int n_read(int socket, void *buffer, int buffer_len, int mode)
+{
+ int error = 0;
+ errno = 0;
+ error = Hrecv(Hgetinstance(), socket, buffer, buffer_len, mode);
+ if (error < 0)
+ {
+ printf("Read error from socket %d: %d\n", socket, error);
+ }
+ return error;
+}
+
+
+
+// Close a connection
+int n_disconnect(int socket)
+{
+ printf("Closing socket %d\n", socket);
+ errno = 0;
+ int error = Hclose(Hgetinstance(), socket);
+ if (error < 0)
+ printf("Error closing socket %d: %d\n", socket, error);
+ else
+ printf("\tdone.\n");
+ return error;
+}
+
+#endif //USE_H_IN3
+