Removed the OO-style mount and credentials; conffile exposes one function to re… | |
git clone git://git.codemadness.org/susmb | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 020a5e9c64b9834132498218e64a93e91bd386d9 | |
parent 7c1c8269f8152a0b6b67183f01b24a80d3b3c37d | |
Author: geoff <devnull@localhost> | |
Date: Fri, 26 Jan 2007 22:38:09 +0000 | |
Removed the OO-style mount and credentials; conffile exposes one function to | |
retrieve all required functions from the configuration file via XPath. | |
XML functions take/output char * rather than xmlChar *, for laziness reasons. | |
Version 0x20070126. | |
Diffstat: | |
M conffile.c | 224 +++++++++--------------------… | |
M conffile.h | 30 +++++------------------------- | |
M usmb.c | 76 +++++++++++++++--------------… | |
M version.h | 2 +- | |
M xml.c | 18 +++++++++--------- | |
M xml.h | 8 ++++---- | |
6 files changed, 119 insertions(+), 239 deletions(-) | |
--- | |
diff --git a/conffile.c b/conffile.c | |
@@ -20,206 +20,108 @@ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
-#include "conffile.h" | |
#include "utils.h" | |
#include "xml.h" | |
#include "config.rng.h" | |
-struct conffile { | |
- xmlDocPtr doc; | |
- xmlXPathContextPtr ctx; | |
-}; | |
- | |
- | |
-struct credentials * credentials_new (const char *domain, | |
- const char *username, | |
- const char *password) | |
-{ | |
- struct credentials *creds = malloc (sizeof (struct credentials)); | |
- | |
- if (NULL == creds) | |
- return NULL; | |
- | |
- creds->domain = domain; | |
- creds->username = username; | |
- creds->password = password; | |
- | |
- return creds; | |
-} | |
- | |
- | |
-void credentials_destroy (struct credentials *creds) | |
-{ | |
- assert (creds != NULL); | |
- free (creds); | |
-} | |
- | |
- | |
-struct mount * mount_new (const char *server, const char *share, | |
- const char *mountpoint, | |
- const struct credentials *credentials, | |
- const char *options) | |
-{ | |
- struct mount *mount = malloc (sizeof (struct mount)); | |
- | |
- assert (NULL != credentials); | |
- | |
- if (NULL == mount) | |
- return NULL; | |
- | |
- mount->server = server; | |
- mount->share = share; | |
- mount->mountpoint = mountpoint; | |
- mount->options = options; | |
- mount->credentials = credentials; | |
- | |
- return mount; | |
-} | |
- | |
- | |
-void mount_destroy (struct mount *mount) | |
-{ | |
- assert (NULL != mount); | |
- free (mount); | |
-} | |
- | |
- | |
-struct conffile * conffile_new (const char *filename) | |
+static bool conffile_read (const char *filename, | |
+ xmlDocPtr *doc, | |
+ xmlXPathContextPtr *ctx) | |
{ | |
- xmlDocPtr doc; | |
- xmlXPathContextPtr ctx; | |
- struct conffile *cf; | |
- | |
- doc = xmlParseFile (filename); | |
- if (NULL == doc) | |
+ *doc = xmlParseFile (filename); | |
+ if (NULL == *doc) | |
{ | |
fprintf (stderr, "Cannot parse %s\n", filename); | |
- return NULL; | |
+ return false; | |
} | |
- if (!xml_validate_relaxng (doc, rng_config)) | |
+ if (!xml_validate_relaxng (*doc, rng_config)) | |
{ | |
fprintf (stderr, "%s isn't a valid USMB configuration\n", filename); | |
- xmlFreeDoc (doc); | |
- return NULL; | |
+ xmlFreeDoc (*doc); | |
+ return false; | |
} | |
- ctx = xmlXPathNewContext (doc); | |
- if (NULL == ctx) | |
+ *ctx = xmlXPathNewContext (*doc); | |
+ if (NULL == *ctx) | |
{ | |
fputs ("Cannot create XPath context\n", stderr); | |
- xmlFreeDoc (doc); | |
- return NULL; | |
+ xmlFreeDoc (*doc); | |
+ return false; | |
} | |
- cf = malloc (sizeof (struct conffile)); | |
- | |
- if (NULL == cf) | |
- { | |
- xmlXPathFreeContext (ctx); | |
- xmlFreeDoc (doc); | |
- return NULL; | |
- } | |
- | |
- cf->doc = doc; | |
- cf->ctx = ctx; | |
- | |
- return cf; | |
+ return true; | |
} | |
-void conffile_destroy (struct conffile *cf) | |
+static bool do_xpath_text (xmlXPathContextPtr ctx, | |
+ const char *parent, const char *id, | |
+ const char *child, char **out) | |
{ | |
- assert (NULL != cf); | |
- | |
- xmlXPathFreeContext (cf->ctx); | |
- xmlFreeDoc (cf->doc); | |
- free (cf); | |
+ char xpath[2048]; | |
+ snprintf (xpath, sizeof (xpath), | |
+ "/usmbconfig/%s[@id='%s']/%s/text()", parent, id, child); | |
+ return xml_xpath_text (ctx, xpath, (void *)out); | |
} | |
-struct mount * conffile_get_mount (struct conffile *cf, const char *key) | |
+bool conffile_get_mount (const char *filename, const char *key, | |
+ char **server, char **share, | |
+ char **mountpoint, char **options, | |
+ char **domain, char **username, | |
+ char **password) | |
{ | |
- char xpath[2048]; | |
+ xmlDocPtr doc; | |
+ xmlXPathContextPtr ctx; | |
+ char xp[2048]; | |
char *creds = NULL; | |
- void *server = NULL, *share = NULL, *mountpoint = NULL, *options = NULL; | |
- void *domain = NULL, *username = NULL, *password = NULL; | |
- bool ok = true; | |
- struct credentials *credentials = NULL; | |
- struct mount *ret = NULL; | |
- assert (NULL != cf); | |
- assert (NULL != key); | |
+ *server = *share = *mountpoint = *options = NULL; | |
+ *domain = *username = *password = NULL; | |
if (strchr (key, '\'')) | |
- return NULL; | |
- | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/mount[@id='%s']/server/text()", key); | |
- xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&server) || (ok = false); | |
- | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/mount[@id='%s']/share/text()", key); | |
- xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&share) || (ok = false); | |
- | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/mount[@id='%s']/mountpoint/text()", key); | |
- xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&mountpoint) || (ok = false… | |
+ { | |
+ fprintf (stderr, "Invalid share name: %s\n", key); | |
+ return false; | |
+ } | |
- snprintf (xpath, sizeof (xpath), "/usmbconfig/mount[@id='%s']", key); | |
- xml_xpath_attr_value (cf->ctx, BAD_CAST xpath, BAD_CAST "credentials", | |
- (xmlChar **)&creds) || (ok = false); | |
+ if (!conffile_read (filename, &doc, &ctx)) | |
+ return false; | |
- if (!ok) | |
- { | |
- xfree (creds); | |
- xfree (mountpoint); | |
- xfree (share); | |
- xfree (server); | |
+ do { | |
+ if (!do_xpath_text (ctx, "mount", key, "server", server)) break; | |
+ if (!do_xpath_text (ctx, "mount", key, "share", share)) break; | |
+ if (!do_xpath_text (ctx, "mount", key, "mountpoint", mountpoint)) break; | |
+ do_xpath_text (ctx, "mount", key, "options", options); | |
- return NULL; | |
- } | |
+ snprintf (xp, sizeof (xp), "/usmbconfig/mount[@id='%s']", key); | |
+ if (!xml_xpath_attr_value (ctx, xp, "credentials", &creds)) break; | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/credentials[@id='%s']/domain/text()", creds); | |
- (void)xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&domain); | |
+ do_xpath_text (ctx, "credentials", creds, "domain", domain); | |
+ if (!do_xpath_text (ctx, "credentials", creds, "username", username)) brea… | |
+ if (!do_xpath_text (ctx, "credentials", creds, "password", password)) brea… | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/credentials[@id='%s']/username/text()", creds); | |
- xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&username) || (ok = false); | |
+ xmlXPathFreeContext (ctx); | |
+ xmlFreeDoc (doc); | |
- snprintf (xpath, sizeof (xpath), | |
- "/usmbconfig/credentials[@id='%s']/password/text()", creds); | |
- xml_xpath_text (cf->ctx, BAD_CAST xpath, (void *)&password) || (ok = false); | |
+ return true; | |
+ } while (false); | |
- if (ok) | |
- { | |
- credentials = credentials_new (domain, username, password); | |
+ fputs ("Invalid configuration.\n", stderr); | |
- if (NULL != credentials) | |
- { | |
- ret = mount_new (server, share, mountpoint, credentials, options); | |
- ok = (NULL != ret); | |
- } | |
- } | |
+ xfree (*username); | |
+ xfree (*password); | |
+ xfree (*domain); | |
+ xfree (creds); | |
+ xfree (*options); | |
+ xfree (*mountpoint); | |
+ xfree (*share); | |
+ xfree (*server); | |
- if (!ok) | |
- { | |
- if (NULL != credentials) | |
- credentials_destroy (credentials); | |
- | |
- xfree (password); | |
- xfree (domain); | |
- xfree (username); | |
- xfree (creds); | |
- xfree (mountpoint); | |
- xfree (share); | |
- xfree (server); | |
- | |
- return NULL; | |
- } | |
+ xmlXPathFreeContext (ctx); | |
+ xmlFreeDoc (doc); | |
- return ret; | |
+ return false; | |
} | |
diff --git a/conffile.h b/conffile.h | |
@@ -21,29 +21,9 @@ | |
#include <stdbool.h> | |
- struct credentials { | |
- const char *domain; | |
- const char *username; | |
- const char *password; | |
- }; | |
- | |
- | |
- struct mount { | |
- const char *server; | |
- const char *share; | |
- const char *mountpoint; | |
- const struct credentials *credentials; | |
- const char *options; | |
- }; | |
- | |
- | |
- struct conffile; | |
- | |
- | |
- struct conffile * conffile_new (const char *filename); | |
- void conffile_destroy (struct conffile *cf); | |
- | |
- struct mount * conffile_get_mount (struct conffile *cf, const char *key); | |
- void mount_destroy (struct mount *mount); | |
- | |
+ bool conffile_get_mount (const char *filename, const char *key, | |
+ char **server, char **share, | |
+ char **mountpoint, char **options, | |
+ char **domain, char **username, | |
+ char **password); | |
#endif | |
diff --git a/usmb.c b/usmb.c | |
@@ -40,7 +40,8 @@ | |
SMBCCTX *ctx; | |
-static char *share = NULL; | |
+static char *server, *share, *mountpoint, *options, | |
+ *domain, *username, *password; | |
char * make_url (const char *path) | |
@@ -61,20 +62,20 @@ static inline void do_strncpy (char *to, const char *from, … | |
} | |
-static struct mount *mount; | |
- | |
static void auth_fn (const char *srv, const char *shr, char *wg, int wglen, | |
char *un, int unlen, char *pw, int pwlen) | |
{ | |
(void)srv; | |
(void)shr; | |
DEBUG (fprintf (stderr, "Authenticating for \\\\%s\\%s\n", srv, shr)); | |
+ DEBUG (fprintf (stderr, "Domain: %s; User: %s; Password:%s\n", | |
+ domain, username, password)); | |
- if (NULL != mount->credentials->domain) | |
- do_strncpy (wg, mount->credentials->domain, wglen); | |
+ if (NULL != domain) | |
+ do_strncpy (wg, domain, wglen); | |
- do_strncpy (un, mount->credentials->username, unlen); | |
- do_strncpy (pw, mount->credentials->password, pwlen); | |
+ do_strncpy (un, username, unlen); | |
+ do_strncpy (pw, password, pwlen); | |
} | |
@@ -200,13 +201,11 @@ static bool check_conf_perms (const char *conffile) | |
} | |
-static bool create_share_name (struct mount *mount) | |
+static bool create_share_name (const char *server, const char *sharename) | |
{ | |
- assert (NULL != mount->credentials); | |
- | |
size_t len = strlen ("smb:///") + | |
- strlen (mount->server) + | |
- strlen (mount->share) + 1; | |
+ strlen (server) + | |
+ strlen (sharename) + 1; | |
if (NULL == (share = malloc (len))) | |
{ | |
@@ -214,16 +213,29 @@ static bool create_share_name (struct mount *mount) | |
return false; | |
} | |
- snprintf (share, len, "smb://%s/%s", mount->server, mount->share); | |
+ snprintf (share, len, "smb://%s/%s", server, sharename); | |
DEBUG (fprintf (stderr, "Share URL: %s\n", share)); | |
return true; | |
} | |
+static void free_strings (char *sharename) | |
+{ | |
+ xfree (sharename); | |
+ xfree (password); | |
+ xfree (username); | |
+ xfree (domain); | |
+ xfree (options); | |
+ xfree (mountpoint); | |
+ xfree (share); | |
+ xfree (server); | |
+} | |
+ | |
+ | |
int main (int argc, char **argv) | |
{ | |
- const char *conffile; | |
- const char *mountid; | |
+ const char *conffile, *mountid; | |
+ char *sharename = NULL; | |
{ | |
static char conf[256]; | |
@@ -234,43 +246,29 @@ int main (int argc, char **argv) | |
if (!parse_args (&argc, &argv, &mountid, &conffile)) | |
return EXIT_FAILURE; | |
- if (!check_conf_perms (conffile)) | |
+ if (!check_conf_perms (conffile) || | |
+ !conffile_get_mount (conffile, mountid, | |
+ &server, &sharename, &mountpoint, &options, | |
+ &domain, &username, &password)) | |
return EXIT_FAILURE; | |
- struct conffile *cf = conffile_new (conffile); | |
- if (NULL == cf) | |
- return EXIT_FAILURE; | |
- | |
- mount = conffile_get_mount (cf, mountid); | |
- if (NULL == mount) | |
- { | |
- fprintf (stderr, "Mount %s not defined in configuration file %s\n", | |
- mountid, conffile); | |
- conffile_destroy (cf); | |
- return EXIT_FAILURE; | |
- } | |
- | |
- if (!create_share_name (mount) || | |
- !create_smb_context ((char *)mount->credentials->domain, | |
- (char *)mount->credentials->username, &ctx)) | |
+ if (!create_share_name (server, sharename) || | |
+ !create_smb_context (domain, username, &ctx)) | |
{ | |
- mount_destroy (mount); | |
- conffile_destroy (cf); | |
+ free_strings (sharename); | |
return EXIT_FAILURE; | |
} | |
- DEBUG (fprintf (stderr, "Username: %s\\%s\n", | |
- mount->credentials->domain, mount->credentials->username)); | |
+ DEBUG (fprintf (stderr, "Username: %s\\%s\n", domain, username)); | |
show_about (stdout); | |
int fuse_argc; | |
char **fuse_argv; | |
- build_fuse_args (mount->options, mount->mountpoint, &fuse_argc, &fuse_argv); | |
+ build_fuse_args (options, mountpoint, &fuse_argc, &fuse_argv); | |
int ret = fuse_main (fuse_argc, fuse_argv, &fuse_ops); | |
smbc_free_context (ctx, 1); | |
- mount_destroy (mount); | |
- conffile_destroy (cf); | |
+ free_strings (sharename); | |
return ret; | |
} | |
diff --git a/version.h b/version.h | |
@@ -21,7 +21,7 @@ | |
#include <stdio.h> | |
- #define USMB_VERSION 0x20070102 | |
+ #define USMB_VERSION 0x20070126 | |
// a - alpha, b - beta, p - pre-release, s - stable | |
#define USMB_VERSION_STATUS 'a' | |
diff --git a/xml.c b/xml.c | |
@@ -38,9 +38,9 @@ bool xml_validate_relaxng (xmlDocPtr doc, const char *schema) | |
bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
- xmlChar *xpath, | |
- const xmlChar *attribute, | |
- xmlChar **out) | |
+ char *xpath, | |
+ const char *attribute, | |
+ char **out) | |
{ | |
xmlXPathObjectPtr obj; | |
xmlChar *tmp; | |
@@ -51,7 +51,7 @@ bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
*out = NULL; | |
- obj = xmlXPathEval (xpath, ctx); | |
+ obj = xmlXPathEval (BAD_CAST xpath, ctx); | |
if (NULL == obj) | |
{ | |
DEBUG (fputs ("XPath evaluation error\n", stderr)); | |
@@ -78,11 +78,11 @@ bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
break; | |
} | |
- tmp = xmlGetProp (obj->nodesetval->nodeTab[0], attribute); | |
+ tmp = xmlGetProp (obj->nodesetval->nodeTab[0], BAD_CAST attribute); | |
if (NULL == tmp) | |
break; | |
- *out = (xmlChar *)xstrdup ((char *)tmp); | |
+ *out = xstrdup ((char *)tmp); | |
if (NULL == *out) | |
break; | |
@@ -97,7 +97,7 @@ bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
} | |
-bool xml_xpath_text (xmlXPathContextPtr ctx, xmlChar *xpath, xmlChar **out) | |
+bool xml_xpath_text (xmlXPathContextPtr ctx, char *xpath, char **out) | |
{ | |
xmlXPathObjectPtr obj; | |
@@ -109,7 +109,7 @@ bool xml_xpath_text (xmlXPathContextPtr ctx, xmlChar *xpath… | |
DEBUG (fprintf (stderr, "xml_xpath_text (%s)\n", xpath)); | |
- obj = xmlXPathEval (xpath, ctx); | |
+ obj = xmlXPathEval (BAD_CAST xpath, ctx); | |
if (NULL == obj) | |
{ | |
DEBUG (fputs ("XPath evaluation error\n", stderr)); | |
@@ -142,7 +142,7 @@ bool xml_xpath_text (xmlXPathContextPtr ctx, xmlChar *xpath… | |
break; | |
} | |
- *out = (xmlChar *)xstrdup ((char *)obj->nodesetval->nodeTab[0]->content); | |
+ *out = xstrdup ((char *)obj->nodesetval->nodeTab[0]->content); | |
if (NULL == *out) | |
break; | |
diff --git a/xml.h b/xml.h | |
@@ -27,9 +27,9 @@ | |
bool xml_validate_relaxng (xmlDocPtr doc, const char *schema); | |
bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
- xmlChar *xpath, | |
- const xmlChar *attribute, | |
- xmlChar **out); | |
- bool xml_xpath_text (xmlXPathContextPtr ctx, xmlChar *xpath, xmlChar **out); | |
+ char *xpath, | |
+ const char *attribute, | |
+ char **out); | |
+ bool xml_xpath_text (xmlXPathContextPtr ctx, char *xpath, char **out); | |
#endif |