summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-05-07 16:14:18 +0100
committerVincent Sanders <vince@kyllikki.org>2014-05-07 16:24:51 +0100
commitc56642819eed87431dff3446fe111f7f3eefaa7d (patch)
tree397126ca4baac425f9c1c44f3d5c56c681e2c4fe /utils
parentc1e2da80dfa62793ea107cf12408c814e268a54b (diff)
downloadnetsurf-c56642819eed87431dff3446fe111f7f3eefaa7d.tar.gz
netsurf-c56642819eed87431dff3446fe111f7f3eefaa7d.tar.bz2
add file operations table and make all frontends use it.
This rationalises the path construction and basename file operations. The default implementation is POSIX which works for all frontends except windows, riscos and amiga which have differeing path separators and rules. These implementations are significantly more robust than the previous nine implementations and also do not use unsafe strncpy or buffers with arbitrary length limits. These implementations also carry full documentation comments.
Diffstat (limited to 'utils')
-rw-r--r--utils/Makefile2
-rw-r--r--utils/file.c117
-rw-r--r--utils/file.h95
-rw-r--r--utils/filepath.c19
-rw-r--r--utils/filepath.h11
5 files changed, 213 insertions, 31 deletions
diff --git a/utils/Makefile b/utils/Makefile
index aef579948..c808b91ba 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -2,6 +2,6 @@
S_UTILS := base64.c corestrings.c filename.c filepath.c hashtable.c \
libdom.c locale.c log.c messages.c nsurl.c talloc.c url.c \
- utf8.c utils.c useragent.c bloom.c nsoption.c
+ utf8.c utils.c useragent.c bloom.c nsoption.c file.c
S_UTILS := $(addprefix utils/,$(S_UTILS))
diff --git a/utils/file.c b/utils/file.c
new file mode 100644
index 000000000..7b0a4677a
--- /dev/null
+++ b/utils/file.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf 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; version 2 of the License.
+ *
+ * NetSurf 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Table operations for files with posix compliant path separator.
+ */
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "desktop/gui_factory.h"
+#include "utils/utils.h"
+
+#include "utils/file.h"
+
+/**
+ * Generate a posix path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_mkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ return vsnstrjoin(str, size, '/', nelm, ap);
+}
+
+/**
+ * Get the basename of a file using posix path handling.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_basename(const char *path, char **str, size_t *size)
+{
+ const char *leafname;
+ char *fname;
+
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ leafname = strrchr(path, '/');
+ if (!leafname) {
+ leafname = path;
+ } else {
+ leafname += 1;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
+}
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...)
+{
+ va_list ap;
+ nserror ret;
+
+ va_start(ap, nelm);
+ if (guit != NULL) {
+ ret = guit->file->mkpath(str, size, nelm, ap);
+ } else {
+ /* default to posix */
+ ret = vsnstrjoin(str, size, '/', nelm, ap);
+ }
+ va_end(ap);
+
+ return ret;
+}
+
+/* default to using the posix file handling */
+static struct gui_file_table file_table = {
+ .mkpath = posix_mkpath,
+ .basename = posix_basename,
+};
+
+struct gui_file_table *default_file_table = &file_table;
diff --git a/utils/file.h b/utils/file.h
new file mode 100644
index 000000000..f183337c5
--- /dev/null
+++ b/utils/file.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf 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; version 2 of the License.
+ *
+ * NetSurf 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Default operations table for files.
+ */
+
+#ifndef NETSURF_UTILS_FILE_H
+#define NETSURF_UTILS_FILE_H
+
+#include <stdarg.h>
+
+/**
+ * function table for file and filename operations.
+ *
+ * function table implementing GUI interface to file and filename
+ * functionality appropriate for the OS.
+ */
+struct gui_file_table {
+ /* Mandantory entries */
+
+ /**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+ nserror (*mkpath)(char **str, size_t *size, size_t nemb, va_list ap);
+
+ /**
+ * Get the basename of a file.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+ nserror (*basename)(const char *path, char **str, size_t *size);
+};
+
+/** Default (posix) file operation table. */
+struct gui_file_table *default_file_table;
+
+/**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @warning If this is called before the gui operation tables are
+ * initialised the behaviour defaults to posix paths. Ensure this is
+ * the required behaviour.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...);
+
+#endif
diff --git a/utils/filepath.c b/utils/filepath.c
index 68e8d7e79..c28a821d7 100644
--- a/utils/filepath.c
+++ b/utils/filepath.c
@@ -326,25 +326,6 @@ void filepath_free_strvec(char **pathv)
}
/* exported interface documented in filepath.h */
-char *filepath_append(const char *path, const char *leaf)
-{
- int dirname_len;
- char *dirname;
-
- if ((path == NULL) || (leaf == NULL)) {
- return NULL;
- }
-
- dirname_len = strlen(path) + strlen(leaf) + 2;
- dirname = malloc(dirname_len);
- if (dirname != NULL) {
- snprintf(dirname, dirname_len, "%s/%s", path, leaf);
- }
-
- return dirname;
-}
-
-/* exported interface documented in filepath.h */
nserror filepath_mkdir_all(const char *fname)
{
char *dname;
diff --git a/utils/filepath.h b/utils/filepath.h
index 56e9eff74..61b7209cc 100644
--- a/utils/filepath.h
+++ b/utils/filepath.h
@@ -128,17 +128,6 @@ void filepath_free_strvec(char **pathv);
/**
- * generate a new filename from a path and leaf.
- *
- * @param path The base path.
- * @param leaf The leaf to add.
- * @return The combined path in a new string must be freed by caller
- * or NULL on failiure to allocte memory.
- */
-char *filepath_append(const char *path, const char *leaf);
-
-
-/**
* Ensure that all directory elements needed to store a filename exist.
*
* @param fname The filename to ensure the path to exists.