diff options
author | Moritz Schulte <moritz@duesseldorf.ccc.de> | 2002-10-23 01:06:23 +0000 |
---|---|---|
committer | Moritz Schulte <moritz@duesseldorf.ccc.de> | 2002-10-23 01:06:23 +0000 |
commit | 9c9949846e9958520994009b7ed2a98367bc6994 (patch) | |
tree | 169ae34d854c57036755700e8c643628fbd438ce /protocol.c | |
parent | 86257c4e9551141cab13bc26521f99231f47f8fa (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.c | 98 |
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; } |