summaryrefslogtreecommitdiff
path: root/protocol.c
diff options
context:
space:
mode:
authorMoritz Schulte <moritz@duesseldorf.ccc.de>2002-10-23 01:06:23 +0000
committerMoritz Schulte <moritz@duesseldorf.ccc.de>2002-10-23 01:06:23 +0000
commit9c9949846e9958520994009b7ed2a98367bc6994 (patch)
tree169ae34d854c57036755700e8c643628fbd438ce /protocol.c
parent86257c4e9551141cab13bc26521f99231f47f8fa (diff)
2002-10-23 Moritz Schulte <moritz@duesseldorf.ccc.de>
* netfs.c (netfs_attempt_lookup): Return ENOTDIR instead of EOPNOTSUPP in case the user tries to look something up beneath a port node. (netfs_S_io_read): Correct the netio specific hack, make it apply only for PORT_NODEs. (netfs_attempt_create_file): Clear *np and unlocked &dir->lock. (netfs_attempt_write): Set err to EISDIR if trying to write to a node, which is not a PORT_NODE. (netfs_attempt_read): Set *len to 0, if trying to read from a node, which is not a PORT_NODE, otherwise try to read from socket via socket_recv; update *len to nread after successfull reading. * main.c: Declare ul_node static. * lib.h: Include comments from lib.c. * version.h: Updated. * protocol.c (PROTOCOL_INIT): New macro, used in initializing protocols array. (protocol_socket_open_tcp): Renamed to protocol_socket_open_TCP. (protocol_socket_open_udp): Renamed to protocol_socket_open_UDP. (protocol_find_node): Cleanup. * main.c: Assigned Copyright to FSF. * Makefile: Likewise. * lib.c: Likewise. * lib.h: Likewise. * netfs.c: Likewise. * netio.h: Likewise. (PROTOCOL_NAME_TCP): Defined to "tcp". (PROTOCOL_NAME_UDP): Defined to "udp". Typedef for socket_open_func_t. (OPENONLY_STATE_MODES): Remove definition. Added some comments. * node.c: Likewise. * node.h: Likewise. * protocol.c: Likewise. (protocol_socket_open_std): Added static keyword. (protocol_socket_open_tcp): Likewise. (protocol_socket_open_udp): Likewise. Declared protocol_socket_open_tcp and protocol_socket_open_udp. * protocol.h: Likewise. * protocol.c (protocol_register_protocols): Renamed to protocol_register_default ... * protocol.h: Likewise. * main.c (main): ... and used. * netfs.c (netfs_attempt_mkdir): Call protocol_register to create protocol directories beneath the root directory. (netfs_attempt_rmdir): Cleanup. 2002-10-22 Moritz Schulte <moritz@duesseldorf.ccc.de> * protocol.c (protocol_register): Don't take "id" and "socket_open_func" arguments. (protocol_register): Don't allocate new protocol structure for the node, instead use a pointer to the static protocols structure. (protocol_find_by_name): New function. (protocol_register_protocols): Rewritten to iterate over protocols list. * protocol.h (protocol_register): Likewise. * node.c (node_destroy): Don't free np->nn->protocol. * netio.h (struct protocol): Typedef to protocol_t. * protocol.c (protocols): New array, initialized with protocol information. * netfs.c (netfs_attempt_lookup): Use strcmp instead of STRING_EQUAL. * lib.h: Remove STRING_EQUAL definition.
Diffstat (limited to 'protocol.c')
-rw-r--r--protocol.c98
1 files changed, 64 insertions, 34 deletions
diff --git a/protocol.c b/protocol.c
index 88dcb5901..adbe06a6f 100644
--- a/protocol.c
+++ b/protocol.c
@@ -1,5 +1,6 @@
/* netio - creates socket ports via the filesystem
- Copyright (C) 2002 Moritz Schulte <moritz@duesseldorf.ccc.de>
+ Copyright (C) 2001, 02 Free Software Foundation, Inc.
+ Written by Moritz Schulte.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -25,10 +26,22 @@
#include "lib.h"
#include "node.h"
+static error_t protocol_socket_open_TCP (struct node *node);
+static error_t protocol_socket_open_UDP (struct node *node);
+
+#define PROTOCOL_INIT(p) { PROTOCOL_ID_##p, PROTOCOL_NAME_##p, \
+ protocol_socket_open_##p }
+
+static protocol_t protocols[] = { PROTOCOL_INIT (TCP),
+ PROTOCOL_INIT (UDP),
+ { 0, NULL, NULL } };
+
+static error_t protocol_find_by_name (char *name, protocol_t **protocol);
+
/* Connect the node *NODE with style STYLE (SOCK_STREAM or
SOCK_DGRAM). Used by protocol_socket_open_{tcp,udp}. Return 0 on
success or an error code. */
-error_t
+static error_t
protocol_socket_open_std (struct node *node, int style)
{
extern pf_t socket_server;
@@ -66,15 +79,15 @@ protocol_socket_open_std (struct node *node, int style)
}
/* Open a TCP socket for *NODE. Return 0 on success or an error code. */
-error_t
-protocol_socket_open_tcp (struct node *node)
+static error_t
+protocol_socket_open_TCP (struct node *node)
{
return protocol_socket_open_std (node, SOCK_STREAM);
}
/* Open a UDP socket for *NODE. Return 0 on success or an error code. */
-error_t
-protocol_socket_open_udp (struct node *node)
+static error_t
+protocol_socket_open_UDP (struct node *node)
{
return protocol_socket_open_std (node, SOCK_DGRAM);
}
@@ -86,43 +99,37 @@ error_t
protocol_find_node (char *name, struct node **node)
{
struct node *np;
+ error_t err = ENOENT;
+
for (np = netfs_root_node->nn->entries;
np && strcmp (np->nn->protocol->name, name);
np = np->next);
- if (! np)
- return ENOENT;
- *node = np;
- return 0;
+ if (np)
+ {
+ *node = np;
+ err = 0;
+ }
+ return err;
}
/* Register a protocol specified by ID and NAME, creating an according
node. Sockets for that protocol get opened by SOCKET_OPEN_FUNC.
Return 0 on success or an error code. */
error_t
-protocol_register (int id, char *name,
- error_t (*socket_open_func) (struct node *node))
+protocol_register (char *name)
{
error_t err;
- struct protocol *protocol;
- err = my_malloc (sizeof (struct protocol), (void **) &protocol);
+ protocol_t *protocol;
+
+ err = protocol_find_by_name (name, &protocol);
if (err)
- return err;
- protocol->name = strdup (name);
- if (! protocol->name)
- {
- free (protocol);
- return ENOMEM;
- }
+ return EOPNOTSUPP; /* No protocol definition by that name
+ found. */
err = node_make_protocol_node (netfs_root_node, protocol);
if (err)
- {
- free (protocol->name);
- free (protocol);
- return err;
- }
- protocol->id = id;
- protocol->socket_open = socket_open_func;
- return 0;
+ return err;
+
+ return err;
}
/* Unregister the protocol specified by NAME, drop the reference to
@@ -133,6 +140,7 @@ protocol_unregister (char *name)
{
struct node *np;
error_t err;
+
err = protocol_find_node (name, &np);
if (err)
return err;
@@ -143,10 +151,32 @@ protocol_unregister (char *name)
/* Register the protocols - create according nodes. Return 0 on
success or an error code. */
error_t
-protocol_register_protocols (void)
+protocol_register_default (void)
+{
+ protocol_t *p;
+ error_t err = 0;
+
+ for (p = protocols; ! err && p->name; p++)
+ err = protocol_register (p->name);
+
+ return err;
+}
+
+/* Lookup the protocol information for NAME and store them in
+ *PROTOCOL. Return zero on success or ENOENT if the protocol for
+ NAME could not be found. */
+static error_t
+protocol_find_by_name (char *name, protocol_t **protocol)
{
- return (protocol_register (PROTOCOL_ID_TCP, "tcp",
- protocol_socket_open_tcp)
- || protocol_register (PROTOCOL_ID_UDP, "udp",
- protocol_socket_open_udp));
+ protocol_t *p;
+ error_t err = 0;
+
+ for (p = protocols; p->name && strcmp (p->name, name); p++);
+
+ if (p->name)
+ *protocol = p;
+ else
+ err = ENOENT;
+
+ return err;
}