summaryrefslogtreecommitdiff
path: root/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'node.c')
-rw-r--r--node.c114
1 files changed, 70 insertions, 44 deletions
diff --git a/node.c b/node.c
index 5dff209f1..9389103e8 100644
--- a/node.c
+++ b/node.c
@@ -27,63 +27,98 @@
#include <hurd/hurd_types.h>
#include <hurd/netfs.h>
+/* free an instance of `struct netnode' */
+void
+free_netnode (struct netnode *nn)
+{
+ free (nn->e->name);
+ free (nn->e->selector);
+ free (nn->e->server);
+ free (nn->e);
+ for (struct node *nd = nn->ents; nd; nd = nd->next)
+ free (nd);
+ free (nn);
+}
+
+/* free an instance of `struct node' */
+void
+free_node (struct node *node)
+{
+ /* XXX possibly take care of cache references */
+ free_netnode (node->nn);
+ free (node);
+}
+
+/* Normalize filename: replace '/' by '-'. */
+char *
+normalize_filename (char *name)
+{
+ char *s = strdup (name);
+
+ for (char *tmp = s; *tmp != '\0'; tmp++)
+ {
+ if (*tmp == '/')
+ *tmp = '-';
+ }
+
+ return s;
+}
+
/* make an instance of `struct netnode' with the specified parameters,
return NULL on error */
-struct netnode *
-gopherfs_make_netnode (char type, char *name, char *selector,
- char *server, unsigned short port)
+static struct netnode *
+gopherfs_make_netnode (struct gopher_entry *entry,
+ struct node *dir)
{
struct netnode *nn;
- nn = (struct netnode *) malloc (sizeof (struct netnode));
+ if (!entry)
+ return NULL;
+
+ nn = malloc (sizeof (struct netnode));
if (!nn)
return NULL;
memset (nn, 0, sizeof (struct netnode));
- nn->type = type;
- nn->name = strdup (name);
- nn->selector = strdup (selector);
- nn->server = strdup (server);
- nn->port = port;
- nn->ents = NULL;
- nn->noents = FALSE;
- /* XXX init cache references */
- if (!(nn->server && nn->selector && nn->name))
- { /* We are allowed to free NULL pointers */
- free (nn->server);
- free (nn->selector);
- free (nn->name);
+ nn->dir = dir;
+ nn->e = malloc (sizeof (struct gopher_entry));
+ if (!nn->e)
+ {
free (nn);
return NULL;
}
- return nn;
-}
+ debug ("Creating entry %s (selector %s, server %s, port %hu)",
+ entry->name,
+ entry->selector, entry->server, entry->port);
+ nn->e->name = normalize_filename (entry->name);
+ nn->e->type = entry->type;
+ nn->e->selector = strdup (entry->selector);
+ nn->e->server = strdup (entry->server);
+ nn->e->port = entry->port;
-/* free an instance of `struct netnode' */
-void
-free_netnode (struct netnode *node)
-{
- struct node *nd;
+ /* XXX init cache references */
+
+ if (!(nn->e->name && nn->e->selector && nn->e->server))
+ {
+ /* We are allowed to free NULL pointers */
+ free_netnode (nn);
+ return NULL;
+ }
+ return nn;
- free (node->server);
- free (node->selector);
- free (node->name);
- for (nd = node->ents; nd; nd = nd->next)
- free (nd);
- free (node);
}
-/* make an instance of `struct node' with the specified parameters,
+/* make an instance of `struct node' in DIR with the parameters in ENTRY.
return NULL on error */
struct node *
-gopherfs_make_node (char type, char *name, char *selector,
- char *server, unsigned short port)
+gopherfs_make_node (struct gopher_entry *entry,
+ struct node *dir)
{
struct netnode *nn;
struct node *nd;
- nn = gopherfs_make_netnode (type, name, selector, server, port);
+ nn = gopherfs_make_netnode (entry, dir);
if (!nn)
return NULL;
@@ -104,7 +139,7 @@ gopherfs_make_node (char type, char *name, char *selector,
/* fill in stat info for the node */
nd->nn_stat.st_mode = (S_IRUSR | S_IRGRP | S_IROTH) & ~gopherfs->umask;
- nd->nn_stat.st_mode |= type == GPHR_DIR ? S_IFDIR : S_IFREG;
+ nd->nn_stat.st_mode |= entry->type == GPHR_DIR ? S_IFDIR : S_IFREG;
nd->nn_stat.st_nlink = 1;
nd->nn_stat.st_uid = gopherfs->uid;
nd->nn_stat.st_gid = gopherfs->gid;
@@ -118,12 +153,3 @@ gopherfs_make_node (char type, char *name, char *selector,
return nd;
}
-
-/* free an instance of `struct node' */
-void
-free_node (struct node *node)
-{
- /* XXX possibly take care of cache references */
- free_netnode (node->nn);
- free (node);
-}