[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
PATCH 1/2 - fix all compiler warnings. (was XMLFS for GSoC)
From: |
Michael Walker |
Subject: |
PATCH 1/2 - fix all compiler warnings. (was XMLFS for GSoC) |
Date: |
Mon, 4 Apr 2011 13:35:21 +0100 |
The below patch fixes all compiler warnings. It's quite long as I use
a lot of warning flags (habit from when I was working on my own kernel
project):
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e20fc66
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.o
+xmlfs
diff --git a/Makefile b/Makefile
index 3c66000..d646475 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
CC = gcc
-CFLAGS = `pkg-config libxml-2.0 --cflags` -Wall -ggdb3 -O0 -std=c99
-D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-COMPILE=$(CC) $(CFLAGS)
+CFLAGS = `pkg-config libxml-2.0 --cflags` -ggdb3 -O0 -std=c99
-D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
+WARN = -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align
-Wwrite-strings -Wmissing-declarations -Wredundant-decls
-Wnested-externs -Winline -Wno-long-long -Winit-self
-Wmissing-prototypes -Wstrict-prototypes -Wconversion -pedantic
+COMPILE=$(CC) $(CFLAGS) $(WARN)
LDFLAGS = `pkg-config libxml-2.0 --libs` -lnetfs -liohelp -lfshelp -lports
OBJS = fs.o xmlfs.o xml.o netfs.o fsutils.o
BINARY = xmlfs
diff --git a/fs.c b/fs.c
index 01cceca..d59385b 100644
--- a/fs.c
+++ b/fs.c
@@ -25,7 +25,7 @@
FILE *debug;
error_t
-xmlfs_create (file_t fd, struct xmlfs *xmlfs)
+xmlfs_create (file_t fd, struct xmlfs *thexmlfs)
{
error_t err;
@@ -44,28 +44,28 @@ xmlfs_create (file_t fd, struct xmlfs *xmlfs)
netfs_root_node->nn_stat.st_nlink = 2;
- xmlfs->root = netfs_root_node;
+ thexmlfs->root = netfs_root_node;
DEBUG ("INFO: building XML tree...\n");
/* Build an XML tree from the file */
- xmlfs->doc = xmlReadFd (fd, NULL, NULL, XML_PARSE_NOCDATA);
+ thexmlfs->doc = xmlReadFd ((int) fd, NULL, NULL, XML_PARSE_NOCDATA);
- if (xmlfs->doc == NULL)
+ if (thexmlfs->doc == NULL)
error (-1, 0, "E: (%s, %d): couldn't parse",
__FILE__, __LINE__);
- xmlfs->root_node = xmlDocGetRootElement (xmlfs->doc);
+ thexmlfs->root_node = xmlDocGetRootElement (thexmlfs->doc);
- if (xmlfs->root_node == NULL)
+ if (thexmlfs->root_node == NULL)
{
- xmlFreeDoc (xmlfs->doc);
+ xmlFreeDoc (thexmlfs->doc);
error (-1, 0, "E: (%s, %d): couldn't get root element",
__FILE__, __LINE__);
}
/* Make our pathname XPath compliant. */
- asprintf(&netfs_root_node->nn->pathname, "/%s", xmlfs->root_node->name);
+ asprintf(&netfs_root_node->nn->pathname, "/%s", thexmlfs->root_node->name);
DEBUG ("NOTICE: %s returns with 0.\n", __PRETTY_FUNCTION__);
diff --git a/fsutils.c b/fsutils.c
index 7a90900..2f1e549 100644
--- a/fsutils.c
+++ b/fsutils.c
@@ -115,8 +115,8 @@ _make_node (struct node **n, struct node *dir,
char* name, mode_t m)
/* General stat */
st.st_fstype = FSTYPE_MISC;
- st.st_fsid = pid;
- st.st_dev = st.st_rdev = pid; /* unique device id */
+ st.st_fsid = (__fsid_t) pid;
+ st.st_dev = st.st_rdev = (__dev_t) pid; /* unique device id */
st.st_uid = st.st_author = uid;
st.st_gid = gid;
st.st_mode = m;
@@ -270,7 +270,7 @@ char*
get_path_from_root (struct node *root, struct node *node)
{
#define REVERSE_COPY(dst, src) \
- { int i; \
+ { unsigned int i; \
for (i=0; i < strlen ((src)); i++) \
(dst)[i] = src[strlen ((src)) - 1 - i]; \
(dst)[strlen ((src))] = '\0'; \
diff --git a/fsutils.h b/fsutils.h
index 3573e36..a823dc8 100644
--- a/fsutils.h
+++ b/fsutils.h
@@ -33,7 +33,7 @@
/* Initialization.
*/
-extern int fs_init ();
+extern int fs_init (void);
/* Creates a new node in directory DIR, with name NAME and mode M. If not NULL,
* N points to the newly created node.
diff --git a/netfs.c b/netfs.c
index e23fe08..b95c908 100644
--- a/netfs.c
+++ b/netfs.c
@@ -21,6 +21,7 @@
#include "xmlfs.h"
#include "xml.h"
+#include "netfs.h"
#include <mach.h>
#include <libxml/xpath.h>
@@ -42,6 +43,9 @@ FILE *debug;
error_t
netfs_validate_stat (struct node *np, struct iouser *cred)
{
+ (void) np;
+ (void) cred;
+
return 0; /* everything is good for us ;P */
}
@@ -51,6 +55,11 @@ error_t
netfs_attempt_chown (struct iouser *cred, struct node *np,
uid_t uid, uid_t gid)
{
+ (void) cred;
+ (void) np;
+ (void) uid;
+ (void) gid;
+
return EROFS;
}
@@ -60,6 +69,10 @@ error_t
netfs_attempt_chauthor (struct iouser *cred, struct node *np,
uid_t author)
{
+ (void) cred;
+ (void) np;
+ (void) author;
+
return EROFS;
}
@@ -72,6 +85,10 @@ error_t
netfs_attempt_chmod (struct iouser *cred, struct node *node,
mode_t mode)
{
+ (void) cred;
+ (void) node;
+ (void) mode;
+
return EROFS;
}
/* The user must define this function. Attempt to turn locked node NP
@@ -80,6 +97,10 @@ error_t
netfs_attempt_mksymlink (struct iouser *cred, struct node *np,
char *name)
{
+ (void) cred;
+ (void) np;
+ (void) name;
+
return EROFS;
}
/* The user must define this function. Attempt to turn NODE (user
@@ -88,6 +109,11 @@ netfs_attempt_mksymlink (struct iouser *cred,
struct node *np,
error_t netfs_attempt_mkdev (struct iouser *cred, struct node *np,
mode_t type, dev_t indexes)
{
+ (void) cred;
+ (void) np;
+ (void) type;
+ (void) indexes;
+
return EROFS;
}
/* The user must define this function. This should attempt a chflags
@@ -96,6 +122,10 @@ error_t netfs_attempt_mkdev (struct iouser *cred,
struct node *np,
error_t netfs_attempt_chflags (struct iouser *cred, struct node *np,
int flags)
{
+ (void) cred;
+ (void) np;
+ (void) flags;
+
return EROFS;
}
/* This should attempt a utimes call for the user specified by CRED on
@@ -104,6 +134,11 @@ error_t netfs_attempt_chflags (struct iouser
*cred, struct node *np,
error_t netfs_attempt_utimes (struct iouser *cred, struct node *np,
struct timespec *atime, struct timespec *mtime)
{
+ (void) cred;
+ (void) np;
+ (void) atime;
+ (void) mtime;
+
return EROFS;
}
@@ -112,6 +147,10 @@ error_t netfs_attempt_utimes (struct iouser
*cred, struct node *np,
error_t netfs_attempt_set_size (struct iouser *cred, struct node *np,
loff_t size)
{
+ (void) cred;
+ (void) np;
+ (void) size;
+
return EROFS;
}
@@ -121,6 +160,10 @@ error_t netfs_attempt_set_size (struct iouser
*cred, struct node *np,
error_t netfs_attempt_statfs (struct iouser *cred, struct node *np,
fsys_statfsbuf_t *st)
{
+ (void) cred;
+ (void) np;
+ (void) st;
+
return EOPNOTSUPP;
}
/* This should sync the locked file NP completely to disk, for the user CRED.
@@ -129,6 +172,10 @@ error_t
netfs_attempt_sync (struct iouser *cred, struct node *np,
int wait)
{
+ (void) cred;
+ (void) np;
+ (void) wait;
+
return 0;
}
/* The user must define this function. This should sync the entire
@@ -137,6 +184,9 @@ netfs_attempt_sync (struct iouser *cred, struct node *np,
error_t
netfs_attempt_syncfs (struct iouser *cred, int wait)
{
+ (void) cred;
+ (void) wait;
+
return 0;
}
@@ -151,9 +201,11 @@ netfs_attempt_lookup (struct iouser *user, struct
node *dir,
{
struct node *nd;
error_t err;
-
+
+ (void) user;
+
DEBUG ("NOTICE: netfs_attempt_lookup (name: %s, dir: %p)\n",
- name, dir);
+ name, (void*) dir);
if (!dir || dir->nn->type == CONTENT)
{
@@ -218,6 +270,10 @@ error_t
netfs_attempt_unlink (struct iouser *user, struct node *dir,
char *name)
{
+ (void) user;
+ (void) dir;
+ (void) name;
+
return EROFS;
}
@@ -228,6 +284,13 @@ netfs_attempt_rename (struct iouser *user, struct
node *fromdir,
char *fromname, struct node *todir,
char *toname, int excl)
{
+ (void) user;
+ (void) fromdir;
+ (void) fromname;
+ (void) todir;
+ (void) toname;
+ (void) excl;
+
return EROFS;
}
/* Attempt to create a new directory named NAME in DIR (which is locked)
@@ -235,6 +298,11 @@ netfs_attempt_rename (struct iouser *user, struct
node *fromdir,
error_t netfs_attempt_mkdir (struct iouser *user, struct node *dir,
char *name, mode_t mode)
{
+ (void) user;
+ (void) dir;
+ (void) name;
+ (void) mode;
+
return EROFS;
}
/* Attempt to remove directory named NAME in DIR (which is locked) for
@@ -242,6 +310,10 @@ error_t netfs_attempt_mkdir (struct iouser *user,
struct node *dir,
error_t netfs_attempt_rmdir (struct iouser *user,
struct node *dir, char *name)
{
+ (void) user;
+ (void) dir;
+ (void) name;
+
return EROFS;
}
@@ -251,6 +323,12 @@ error_t netfs_attempt_rmdir (struct iouser *user,
error_t netfs_attempt_link (struct iouser *user, struct node *dir,
struct node *file, char *name, int excl)
{
+ (void) user;
+ (void) dir;
+ (void) file;
+ (void) name;
+ (void) excl;
+
return EROFS;
}
@@ -261,6 +339,11 @@ error_t netfs_attempt_mkfile (struct iouser
*user, struct node *dir,
mode_t mode, struct node **np)
{
+ (void) user;
+ (void) dir;
+ (void) mode;
+ (void) np;
+
return EROFS;
}
@@ -273,6 +356,12 @@ error_t
netfs_attempt_create_file (struct iouser *user, struct node *dir,
char *name, mode_t mode, struct node **np)
{
+ (void) user;
+ (void) dir;
+ (void) name;
+ (void) mode;
+ (void) np;
+
return EROFS;
}
@@ -281,6 +370,10 @@ netfs_attempt_create_file (struct iouser *user,
struct node *dir,
error_t netfs_attempt_readlink (struct iouser *user, struct node *np,
char *buf)
{
+ (void) user;
+ (void) np;
+ (void) buf;
+
return EOPNOTSUPP;
}
@@ -292,6 +385,8 @@ netfs_check_open_permissions (struct iouser *user,
struct node *node,
int flags, int newnode)
{
error_t err = 0;
+
+ (void) newnode;
if (!err && (flags & O_READ))
err = fshelp_access (&node->nn_stat, S_IREAD, user);
@@ -311,9 +406,11 @@ error_t netfs_attempt_read (struct iouser *cred,
struct node *node,
{
xmlNodePtr cur = NULL;
char *content = NULL;
- size_t size = -1;
+ size_t size = (size_t) -1;
error_t err;
+ (void) cred;
+
DEBUG ("NOTICE: %s (node: %s, offset: %lld, len: %d)\n",
__PRETTY_FUNCTION__, node->nn->name, offset, *len);
@@ -336,7 +433,7 @@ error_t netfs_attempt_read (struct iouser *cred,
struct node *node,
if (offset < size)
{
DEBUG ("INFO: copying the node\n");
- int gsize = size;
+ int gsize = (int) size;
/* We got more than requested. Copy only the first *len bytes. */
if (size > *len)
@@ -346,7 +443,7 @@ error_t netfs_attempt_read (struct iouser *cred,
struct node *node,
/* Adding newline for user's convenience. */
if (offset + size == gsize)
- memcpy (data + size++, "\n", 1);
+ memcpy ((void*) ((size_t) data + size++), "\n", 1);
*len = size;
}
@@ -372,6 +469,12 @@ error_t netfs_attempt_read (struct iouser *cred,
struct node *node,
error_t netfs_attempt_write (struct iouser *cred, struct node *np,
loff_t offset, size_t *len, void *data)
{
+ (void) cred;
+ (void) np;
+ (void) offset;
+ (void) len;
+ (void) data;
+
return EROFS;
}
@@ -380,6 +483,10 @@ error_t netfs_attempt_write (struct iouser *cred,
struct node *np,
error_t netfs_report_access (struct iouser *cred, struct node *np,
int *types)
{
+ (void) cred;
+ (void) np;
+ (void) types;
+
return EROFS;
}
@@ -387,12 +494,19 @@ error_t netfs_report_access (struct iouser
*cred, struct node *np,
struct iouser *netfs_make_user (uid_t *uids, int nuids,
uid_t *gids, int ngids)
{
+ (void) uids;
+ (void) nuids;
+ (void) gids;
+ (void) ngids;
+
return NULL;
}
/* Node NP has no more references; free all its associated storage. */
void netfs_node_norefs (struct node *np)
{
+ (void) np;
+
return;
}
@@ -405,7 +519,62 @@ void netfs_node_norefs (struct node *np)
padded to a four-byte alignment. */
#define DIRENT_LEN(name_len) \
((DIRENT_NAME_OFFS + (name_len) + 1 + (DIRENT_ALIGN - 1)) \
- & ~(DIRENT_ALIGN - 1))
+ & (unsigned int) ~(DIRENT_ALIGN - 1))
+
+/* Add the length of a directory entry for NAME to SIZE and return true,
+ unless it would overflow MAX_DATA_LEN or NUM_ENTRIES, in which case
+ return false. */
+int
+bump_size (const char *name, int num_entries, int *count,
+ size_t *size, vm_size_t max_data_len)
+{
+ if (num_entries == -1 || *count < num_entries)
+ {
+ size_t new_size = *size + DIRENT_LEN (strlen (name));
+ if (max_data_len > 0 && new_size > max_data_len)
+ return 0;
+
+ *size = new_size;
+ *count = *count + 1;
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+add_dir_entry (const char *name, ino_t thefileno, int type, struct node *dir,
+ int num_entries, int *count, size_t size, char **p)
+{
+ if (num_entries == -1 || *count < num_entries)
+ {
+ struct dirent hdr;
+ size_t name_len = strlen (name);
+ size_t sz = DIRENT_LEN (name_len);
+
+ DEBUG ("NOTICE: %s contains %s (fileno: %llu)\n",
dir->nn->name, name, thefileno);
+
+ if (sz > size)
+ return 0;
+ else
+ size -= sz;
+
+ hdr.d_fileno = thefileno;
+ hdr.d_reclen = (short unsigned int) sz;
+ hdr.d_type = (unsigned char) type;
+ hdr.d_namlen = (unsigned char) name_len;
+
+ memcpy (*p, &hdr, DIRENT_NAME_OFFS);
+ strcpy (*p + DIRENT_NAME_OFFS, name);
+
+ *p += sz;
+
+ *count += 1;
+
+ return 1;
+ }
+ return 0;
+}
/* Fill the array *DATA of size MAX_DATA_LEN with up to NUM_ENTRIES
dirents from DIR (which is locked) starting with entry ENTRY for
@@ -425,26 +594,10 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
size_t size = 0;
error_t err;
- /* Add the length of a directory entry for NAME to SIZE and return true,
- unless it would overflow MAX_DATA_LEN or NUM_ENTRIES, in which case
- return false. */
- int bump_size (const char *name)
- {
- if (num_entries == -1 || count < num_entries)
- {
- size_t new_size = size + DIRENT_LEN (strlen (name));
- if (max_data_len > 0 && new_size > max_data_len)
- return 0;
- size = new_size;
- count++;
- return 1;
- }
- else
- return 0;
- }
+ (void) cred;
DEBUG ("NOTICE: %s (dir: [addr: %p, name: %s, path: %s], offset:
%d, count: %d)\n",
- __PRETTY_FUNCTION__, dir, dir->nn->name, dir->nn->pathname,
+ __PRETTY_FUNCTION__, (void*) dir, dir->nn->name, dir->nn->pathname,
first_entry, num_entries);
if (!dir)
@@ -473,9 +626,9 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
count = 0;
if (first_entry == 0)
- bump_size (".");
+ bump_size (".", num_entries, &count, &size, max_data_len);
if (first_entry <= 1)
- bump_size ("..");
+ bump_size ("..", num_entries, &count, &size, max_data_len);
if (!nd || num_entries == 0)
{
@@ -486,8 +639,7 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
}
for (struct node *n = nd; n; n = n->next)
- if (!bump_size (n->nn->name))
- ;
+ if (!bump_size (n->nn->name, num_entries, &count, &size, max_data_len)) {;}
*data = mmap (0, size, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
@@ -496,39 +648,6 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
{
char *p = *data;
- int add_dir_entry (const char *name, ino_t fileno, int type)
- {
- if (num_entries == -1 || count < num_entries)
- {
- struct dirent hdr;
- size_t name_len = strlen (name);
- size_t sz = DIRENT_LEN (name_len);
-
- DEBUG ("NOTICE: %s contains %s (fileno: %llu)\n",
dir->nn->name, name, fileno);
-
- if (sz > size)
- return 0;
- else
- size -= sz;
-
- hdr.d_fileno = fileno;
- hdr.d_reclen = sz;
- hdr.d_type = type;
- hdr.d_namlen = name_len;
-
- memcpy (p, &hdr, DIRENT_NAME_OFFS);
- strcpy (p + DIRENT_NAME_OFFS, name);
-
- p += sz;
-
- count++;
-
- return 1;
- }
- else
- return 0;
- }
-
*data_len = size;
*data_entries = count;
@@ -536,14 +655,15 @@ netfs_get_dirents (struct iouser *cred, struct node *dir,
/* Add `.' and `..' entries. */
if (first_entry == 0)
- add_dir_entry (".", dir->nn_stat.st_ino, DT_DIR);
+ add_dir_entry (".", dir->nn_stat.st_ino, DT_DIR, dir, num_entries,
&count, size, &p);
if (first_entry <= 1)
- add_dir_entry ("..", 2, DT_DIR);
+ add_dir_entry ("..", 2, DT_DIR, dir, num_entries, &count, size, &p);
/* Fill in the real directory entries. */
for (struct node *n = nd; n; n = n->next)
if (!add_dir_entry (n->nn->name, n->nn_stat.st_ino,
- n->nn->type == CONTENT ? DT_REG : DT_DIR))
+ n->nn->type == CONTENT ? DT_REG : DT_DIR,
+ dir, num_entries, &count, size, &p))
break;
}
diff --git a/netfs.h b/netfs.h
new file mode 100644
index 0000000..bca16c5
--- /dev/null
+++ b/netfs.h
@@ -0,0 +1,38 @@
+/* xmlfs -- a translator for accessing XML documents
+
+ Copyright (C) 2002, 2005 HurdFR.
+ Written by Marc de Saint Sauveur <marc@hurdfr.org>
+ and Manuel Menal <mmenal@hurdfr.org>
+
+ xmlfs is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ xmlfs 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+*/
+
+#ifndef __NETFS_H__
+#define __NETFS_H__
+
+#define _GNU_SOURCE 1
+
+/* Add the length of a directory entry for NAME to SIZE and return true,
+ unless it would overflow MAX_DATA_LEN or NUM_ENTRIES, in which case
+ return false. */
+int bump_size (const char *name, int num_entries,
+ int *count, size_t *size, vm_size_t max_data_len);
+
+/* Add a directory named NAME to DIR */
+int add_dir_entry (const char *name, ino_t thefileno, int type,
+ struct node *dir, int num_entries, int *count,
+ size_t size, char **p);
+
+#endif
diff --git a/xml.c b/xml.c
index 8ba9a3f..6d6dbc2 100644
--- a/xml.c
+++ b/xml.c
@@ -20,6 +20,7 @@
*/
#include "xmlfs.h"
+#include "xml.h"
#include "fsutils.h"
#include <string.h>
@@ -146,14 +147,15 @@ xml_find_children_sorted (const char *xpath)
xmlNodeSetPtr set = xml_find_children (xpath);
/* Sort the nodes so we can make their names unique easily. */
- qsort (set->nodeTab, xmlXPathNodeSetGetLength (set),
+ qsort (set->nodeTab, (size_t) xmlXPathNodeSetGetLength (set),
sizeof (xmlNodePtr), xml_node_compare);
return set;
}
static void
-make_unique_name (xmlNodePtr node, struct node *dir, int count, int
index, char **name, char **pathname)
+make_unique_name (xmlNodePtr node, struct node *dir, int count,
+ int theindex, char **name, char **pathname)
{
/* Create a unique name AND pathname. */
char *prefixed_name = NULL, *node_name = NULL;
@@ -172,10 +174,10 @@ make_unique_name (xmlNodePtr node, struct node
*dir, int count, int index, char
break;
}
- if (index == -1)
+ if (theindex == -1)
*name = strdup (prefixed_name);
else
- asprintf (name, "%s%d", prefixed_name, index);
+ asprintf (name, "%s%d", prefixed_name, theindex);
if (count == -1)
sindex = strdup ("");
@@ -204,7 +206,7 @@ fill_dir_with_nodes (struct node *dir)
int count = -1;
/* Keep track of the index to add to the node name. Differs from count
because it does not consider blank nodes and such. */
- int index = -1;
+ int theindex = -1;
for (int i = 0; i < xmlXPathNodeSetGetLength (set); i++)
{
@@ -220,10 +222,10 @@ fill_dir_with_nodes (struct node *dir)
if (count != -1)
count++;
- if (index != -1)
- index++;
+ if (theindex != -1)
+ theindex++;
- cur_index = index;
+ cur_index = theindex;
cur_count = count;
/* Compute index so that name is unique in DIR. */
@@ -233,12 +235,12 @@ fill_dir_with_nodes (struct node *dir)
if (!diff && count == -1)
{
DEBUG ("INFO: setting count = 0 (starting a serie)\n");
- index = count = cur_index = cur_count = 0;
+ theindex = count = cur_index = cur_count = 0;
}
else if (diff && count != -1)
{
DEBUG ("INFO: setting count = -1 (stopping a serie)\n");
- count = index = -1;
+ count = theindex = -1;
}
}
@@ -246,7 +248,7 @@ fill_dir_with_nodes (struct node *dir)
if (xmlIsBlankNode (cur))
{
/* Finally we're not going to add it... */
- if (index != 0) index--;
+ if (theindex != 0) theindex--;
DEBUG ("INFO: entry is blank\n");
continue;
}
@@ -330,7 +332,7 @@ fill_dirnode (struct node *dir)
assert (dir);
DEBUG ("NOTICE: %s (DIR (%p, name: %s, pathname: %s)\n",
__PRETTY_FUNCTION__,
- dir, dir->nn->name, dir->nn->pathname);
+ (void*)dir, dir->nn->name, dir->nn->pathname);
err = fill_dir_with_nodes (dir);
if (err)
diff --git a/xml.h b/xml.h
index b87e203..8d51c80 100644
--- a/xml.h
+++ b/xml.h
@@ -25,13 +25,34 @@
#define _GNU_SOURCE 1
#include <hurd/netfs.h>
+#include <libxml/xpath.h>
/* Find the node with pathname PATH. */
xmlNodePtr xml_find_node (const char *path);
+
/* Dump NODE to BUF and write the content size to SIZE. */
error_t xml_dump_node (xmlNodePtr node, char **buf, size_t *size);
/* Create all the children node in DIR. */
error_t fill_dirnode (struct node *dir);
+/* Compare two nodes returning 0 if equal, < 0 if a < b, > 0 if a > b */
+int xml_node_compare (const void *a, const void *b);
+
+/* Return all nodes under PATH in the original document */
+xmlNodeSetPtr xml_find_nodeset (const char *path);
+
+/* Return all nodes which are children of PATH */
+xmlNodeSetPtr xml_find_children (const char *cpath);
+
+/* Return all nodes which are children of PATH, sorted (stable) to give
+ unique named. */
+xmlNodeSetPtr xml_find_children_sorted (const char *cpath);
+
+/* Find children nodes adn populate DIR with them */
+error_t fill_dir_with_nodes (struct node *dir);
+
+/* Find attributes and populate DIR with them */
+error_t fill_dir_with_attrs (struct node *dir);
+
#endif
diff --git a/xmlfs.c b/xmlfs.c
index ced136d..bd39dec 100644
--- a/xmlfs.c
+++ b/xmlfs.c
@@ -30,10 +30,13 @@
FILE *debug;
-char *netfs_server_name = "xmlfs";
-char *netfs_server_version = XMLFS_VERSION; /* defined in version.h */
+char *netfs_server_name = (char*) "xmlfs";
+char *netfs_server_version = (char*) XMLFS_VERSION; /* defined in version.h */
const char *argp_program_version;
+/* The filename of the XML */
+char *xmlfilename = NULL;
+
/* our filesystem */
struct xmlfs *xmlfs;
@@ -41,9 +44,8 @@ int netfs_maxsymlinks = 0; /* not much sense ... */
static const struct argp_option options[] =
{
- { "debug-filen", 'd', "FILE", 0,
- "Enable debug and write debug statements to FILE." },
- { 0 }
+ { "debug-filen", 'd', "FILE", 0, "Enable debug and write debug
statements to FILE.", 0},
+ { 0, 0, 0, 0, 0, 0 }
};
static const char args_doc[] = "XML-DOC";
@@ -52,37 +54,39 @@ static const char doc[] =
"\vThis translator appears like a directory which tries to match the XML"
" tree in XML-DOC as closely as possible.";
+error_t parse_opt (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case 'd':
+ debug = fopen (arg, "w");
+ setbuf (debug, NULL);
+ break;
+ case ARGP_KEY_ARG:
+ if (state->arg_num == 0)
+ xmlfilename = arg;
+ else
+ return ARGP_ERR_UNKNOWN;
+ break;
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+
+ return 0;
+}
+
int
main (int argc, char **argv)
{
mach_port_t bootstrap, underlying_node;
io_statbuf_t underlying_stat;
file_t xmlfile;
- char *xmlfilename = NULL;
error_t err;
+ xmlfilename = NULL;
debug = NULL;
- error_t parse_opt (int key, char *arg, struct argp_state *state)
- {
- switch (key)
- {
- case 'd':
- debug = fopen (arg, "w");
- setbuf (debug, NULL);
- break;
- case ARGP_KEY_ARG:
- if (state->arg_num == 0)
- xmlfilename = arg;
- else
- return ARGP_ERR_UNKNOWN;
- break;
- default:
- return ARGP_ERR_UNKNOWN;
- }
- return 0;
- }
- struct argp argp = { options, parse_opt, args_doc, doc };
+ struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0 };
asprintf ((char **) &argp_program_version, "%s %s",
netfs_server_name, netfs_server_version);
@@ -104,9 +108,9 @@ main (int argc, char **argv)
if (!xmlfilename)
/* Try to open the underlying node, which is incidently
our default XML file. */
- xmlfile = openport (underlying_node, O_READ);
+ xmlfile = (file_t) openport (underlying_node, O_READ);
else
- xmlfile = open (xmlfilename, O_READ);
+ xmlfile = (file_t) open (xmlfilename, O_READ);
xmlfs = malloc (sizeof (struct xmlfs));
@@ -114,7 +118,7 @@ main (int argc, char **argv)
netfs_root_node->nn_stat = underlying_stat;
netfs_root_node->nn_stat.st_mode =
- S_IFDIR | (underlying_stat.st_mode & ~S_IFMT & ~S_ITRANS);
+ S_IFDIR | (underlying_stat.st_mode & (unsigned int) ~S_IFMT &
(unsigned int) ~S_ITRANS);
if (err)
error (1, err, "Cannot create filesystem");
diff --git a/xmlfs.h b/xmlfs.h
index e3c0af6..d47613e 100644
--- a/xmlfs.h
+++ b/xmlfs.h
@@ -26,6 +26,7 @@
#include <stdlib.h>
#include <errno.h>
#include <error.h>
+#include <argp.h>
#include <hurd/netfs.h>
@@ -61,7 +62,12 @@ extern struct xmlfs *xmlfs;
error_t xmlfs_create (file_t, struct xmlfs *);
+/* Parse an option from the argv array */
+error_t parse_opt (int key, char *arg, struct argp_state *state);
+
+extern char *xmlfilename;
+
extern FILE *debug;
-#define DEBUG(format, ...) if (debug) fprintf (debug, format, ## __VA_ARGS__)
+#define DEBUG(...) if (debug) fprintf (debug, __VA_ARGS__)
#endif /* __XMLFS_H__ */
--
Michael Walker (http://www.barrucadu.co.uk)
Arch Hurd Developer; GNU Webmaster; FSF member #8385
http://www.archhurd.org http://www.gnu.org http://www.fsf.org
- PATCH 1/2 - fix all compiler warnings. (was XMLFS for GSoC),
Michael Walker <=