Added password prompting. Added - susmb - mounting of SMB/CIFS shares via FUSE | |
git clone git://git.codemadness.org/susmb | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 75faa5048782f604cec733a804c331b36859f1f6 | |
parent 74f8aa75a21a15d0a9bd036ce850b65c210fa7ee | |
Author: Geoff Johnstone <[email protected]> | |
Date: Fri, 30 May 2008 18:33:29 +0100 | |
Added password prompting. | |
Added | |
Diffstat: | |
M Makefile | 14 ++++++++------ | |
M conffile.c | 8 ++++++-- | |
M conffile.h | 2 +- | |
M config.rng | 4 +++- | |
M options.h | 2 +- | |
A password.c | 79 +++++++++++++++++++++++++++++… | |
A password.h | 24 ++++++++++++++++++++++++ | |
M usmb.c | 11 +++++++++-- | |
M usmb.h | 11 ++++++----- | |
M utils.c | 12 ++++++++++++ | |
M utils.h | 5 +++-- | |
M version.h | 2 +- | |
M xml.h | 7 ++++--- | |
13 files changed, 157 insertions(+), 24 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -23,7 +23,7 @@ BINDIR = $(PREFIX)/bin | |
CFLAGS += -Wall -Wextra -Werror -std=c99 -pedantic -O \ | |
-I$(SAMBA)/include -D_BSD_SOURCE -DFUSE_USE_VERSION=26 \ | |
- -DHAVE_UTIME_H | |
+ -DHAVE_UTIME_H -DMUSTCHECK='__attribute__ ((warn_unused_result))' | |
LDLIBS = -lsmbclient | |
LDFLAGS = -L$(SAMBA)/lib | |
@@ -34,8 +34,8 @@ CFLAGS += $(shell pkg-config --cflags $(PACKAGES)) | |
LDLIBS += $(shell pkg-config --libs-only-l $(PACKAGES)) | |
LDFLAGS += $(shell pkg-config --libs-only-L $(PACKAGES)) | |
-SOURCES = conffile.c options.c usmb.c usmb_dir.c usmb_file.c utils.c \ | |
- version.c xml.c | |
+SOURCES = conffile.c options.c password.c usmb.c usmb_dir.c usmb_file.c \ | |
+ utils.c version.c xml.c | |
OBJECTS = $(SOURCES:.c=.o) | |
PROGRAM = usmb | |
@@ -95,12 +95,14 @@ tar: | |
.PHONY: all debug dist install install-strip uninstall clean distclean tar | |
-conffile.o: conffile.c utils.h xml.h config.rng.h | |
+conffile.o: conffile.c password.h utils.h xml.h config.rng.h | |
options.o: options.c options.h utils.h version.h | |
-usmb.o: usmb.c conffile.h options.h usmb.h usmb_dir.h usmb_file.h \ | |
- utils.h version.h | |
+password.o: password.c password.h utils.h | |
+usmb.o: usmb.c conffile.h options.h usmb.h usmb_dir.h usmb_file.h utils.h \ | |
+ version.h | |
usmb_dir.o: usmb_dir.c usmb_dir.h usmb.h utils.h | |
usmb_file.o: usmb_file.c usmb_file.h usmb.h utils.h | |
utils.o: utils.c utils.h | |
version.o: version.c version.h | |
xml.o: xml.c xml.h utils.h | |
+ | |
diff --git a/conffile.c b/conffile.c | |
@@ -18,6 +18,7 @@ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
+#include "password.h" | |
#include "utils.h" | |
#include "xml.h" | |
#include "config.rng.h" | |
@@ -98,7 +99,10 @@ bool conffile_get_mount (const char *filename, const char *k… | |
(void)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… | |
+ | |
+ if (!do_xpath_text (ctx, "credentials", creds, "password", password) && | |
+ !password_read (password)) | |
+ break; | |
xmlXPathFreeContext (ctx); | |
xmlFreeDoc (doc); | |
@@ -110,7 +114,7 @@ bool conffile_get_mount (const char *filename, const char *… | |
fputs ("Invalid configuration.\n", stderr); | |
xfree (*username); | |
- xfree (*password); | |
+ clear_and_free (*password); | |
xfree (*domain); | |
xfree (creds); | |
xfree (*options); | |
diff --git a/conffile.h b/conffile.h | |
@@ -23,5 +23,5 @@ | |
char **server, char **share, | |
char **mountpoint, char **options, | |
char **domain, char **username, | |
- char **password); | |
+ char **password) MUSTCHECK; | |
#endif | |
diff --git a/config.rng b/config.rng | |
@@ -24,7 +24,9 @@ | |
<element name="domain"> <text /> </element> | |
</optional> | |
<element name="username"> <text /> </element> | |
- <element name="password"> <text /> </element> | |
+ <optional> | |
+ <element name="password"> <text /> </element> | |
+ </optional> | |
</element> | |
</define> | |
diff --git a/options.h b/options.h | |
@@ -18,7 +18,7 @@ | |
#define OPTIONS_H | |
bool parse_args (int *argc, char ***argv, | |
- const char **mountid, const char **out_conffile); | |
+ const char **mountid, const char **out_conffile) MUSTCHECK; | |
void build_fuse_args (const char *options, const char *mountpoint, | |
int *out_argc, char ***out_argv); | |
diff --git a/password.c b/password.c | |
@@ -0,0 +1,79 @@ | |
+/* usmb - mount SMB shares via FUSE and Samba | |
+ * Copyright (C) 2006-2008 Geoff Johnstone | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License version 3 as | |
+ * published by the Free Software Foundation. | |
+ * | |
+ * This program 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/>. | |
+ */ | |
+ | |
+#include <assert.h> | |
+#include <stdbool.h> | |
+#include <stdio.h> | |
+#include <stdlib.h> | |
+#include <string.h> | |
+#include <termios.h> | |
+#include <unistd.h> | |
+#include "password.h" | |
+#include "utils.h" | |
+ | |
+ | |
+bool password_read (char **out) | |
+{ | |
+ struct termios attr, new; | |
+ | |
+ assert (NULL != out); | |
+ *out = NULL; | |
+ | |
+ if (0 != tcgetattr (STDIN_FILENO, &attr)) | |
+ { | |
+ perror ("tcgetattr"); | |
+ fputs ("Cannot configure terminal to read password securely.\n", stderr); | |
+ return false; | |
+ } | |
+ | |
+ new = attr; | |
+ new.c_lflag &= ~ECHO; | |
+ | |
+ if (0 != tcsetattr (STDIN_FILENO, TCSAFLUSH, &new)) | |
+ { | |
+ perror ("tcsetattr"); | |
+ fputs ("Cannot configure terminal to read password securely.\n", stderr); | |
+ return false; | |
+ } | |
+ | |
+ bool ok = false; | |
+ char buff[1024]; | |
+ | |
+ fputs ("\nPassword: ", stdout); | |
+ fflush (stdout); | |
+ ok = (buff == fgets (buff, sizeof (buff), stdin)); | |
+ fputc ('\n', stdout); | |
+ | |
+ if (0 != tcsetattr (STDIN_FILENO, TCSAFLUSH, &attr)) | |
+ { | |
+ perror ("tcsetattr"); | |
+ fputs ("Failed to reset terminal.\n", stderr); | |
+ } | |
+ | |
+ // strip a trailing '\n'. | |
+ { | |
+ size_t len = strlen (buff); | |
+ | |
+ if ((0 < len) && ('\n' == buff[len - 1])) | |
+ buff[len - 1] = '\0'; | |
+ } | |
+ | |
+ *out = xstrdup (buff); | |
+ DEBUG (fprintf (stderr, "Password: %s\n", *out)); | |
+ | |
+ return (NULL != *out); | |
+} | |
+ | |
diff --git a/password.h b/password.h | |
@@ -0,0 +1,24 @@ | |
+/* usmb - mount SMB shares via FUSE and Samba | |
+ * Copyright (C) 2006-2008 Geoff Johnstone | |
+ * | |
+ * This program is free software; you can redistribute it and/or modify | |
+ * it under the terms of the GNU General Public License version 3 as | |
+ * published by the Free Software Foundation. | |
+ * | |
+ * This program 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/>. | |
+ */ | |
+ | |
+#ifndef PASSWORD_H | |
+ #define PASSWORD_H | |
+ | |
+ #include <stdbool.h> | |
+ | |
+ bool password_read (char **out) MUSTCHECK; | |
+ | |
+#endif | |
diff --git a/usmb.c b/usmb.c | |
@@ -245,7 +245,7 @@ static bool create_share_name (const char *server, const ch… | |
static void free_strings (char *sharename) | |
{ | |
xfree (sharename); | |
- xfree (password); | |
+ clear_and_free (password); | |
xfree (username); | |
xfree (domain); | |
xfree (options); | |
@@ -260,6 +260,12 @@ int main (int argc, char **argv) | |
const char *conffile, *mountid; | |
char *sharename = NULL; | |
+ if (sizeof (uint64_t) < sizeof (uintptr_t)) | |
+ { | |
+ fputs ("usmb is not supported on this platform.\n", stderr); | |
+ return EXIT_FAILURE; | |
+ } | |
+ | |
{ | |
static char conf[256]; | |
snprintf (conf, sizeof (conf), "%s/.usmb.conf", getenv ("HOME")); | |
@@ -269,6 +275,8 @@ int main (int argc, char **argv) | |
if (!parse_args (&argc, &argv, &mountid, &conffile)) | |
return EXIT_FAILURE; | |
+ show_about (stdout); | |
+ | |
if (!check_conf_perms (conffile) || | |
!conffile_get_mount (conffile, mountid, | |
&server, &sharename, &mountpoint, &options, | |
@@ -283,7 +291,6 @@ int main (int argc, char **argv) | |
} | |
DEBUG (fprintf (stderr, "Username: %s\\%s\n", domain, username)); | |
- show_about (stdout); | |
int fuse_argc; | |
char **fuse_argv; | |
diff --git a/usmb.h b/usmb.h | |
@@ -21,18 +21,19 @@ | |
extern SMBCCTX *ctx; | |
- char * make_url (const char *path); | |
+ char * make_url (const char *path) MUSTCHECK; | |
- static inline int smbcfile_to_fd (SMBCFILE *file) | |
+ /* fuse_file_info uses a uint64_t for a "File handle" */ | |
+ static inline uint64_t smbcfile_to_fd (SMBCFILE *file) | |
{ | |
- return (NULL == file) ? -1 : (int)file; | |
+ return (uint64_t)(uintptr_t)file; | |
} | |
- static inline SMBCFILE * fd_to_smbcfile (int fd) | |
+ static inline SMBCFILE * fd_to_smbcfile (uint64_t fd) | |
{ | |
- return (SMBCFILE *)fd; | |
+ return (SMBCFILE *)(uintptr_t)fd; | |
} | |
#endif | |
diff --git a/utils.c b/utils.c | |
@@ -108,3 +108,15 @@ void xfree (const void *ptr) | |
free ((void *)ptr); | |
} | |
+ | |
+void clear_and_free (char *ptr) | |
+{ | |
+ if (NULL != ptr) | |
+ { | |
+ for (char *pch = ptr; '\0' != *pch; ++pch) | |
+ *pch = '\0'; | |
+ | |
+ free (ptr); | |
+ } | |
+} | |
+ | |
diff --git a/utils.h b/utils.h | |
@@ -25,8 +25,9 @@ | |
#define DEBUG(x) ((void)0) | |
#endif | |
- char * concat_strings (int num, ...); | |
- char * xstrdup (const char *in); | |
+ char * concat_strings (int num, ...) MUSTCHECK; | |
+ char * xstrdup (const char *in) MUSTCHECK; | |
void xfree (const void *ptr); | |
+ void clear_and_free (char *ptr); | |
#endif | |
diff --git a/version.h b/version.h | |
@@ -19,7 +19,7 @@ | |
#include <stdio.h> | |
- #define USMB_VERSION 0x20080421 | |
+ #define USMB_VERSION 0x20080530 | |
// a - alpha, b - beta, p - pre-release, s - stable | |
#define USMB_VERSION_STATUS 's' | |
diff --git a/xml.h b/xml.h | |
@@ -23,11 +23,12 @@ | |
#include <stdbool.h> | |
- bool xml_validate_relaxng (xmlDocPtr doc, const char *schema); | |
+ bool xml_validate_relaxng (xmlDocPtr doc, const char *schema) MUSTCHECK; | |
bool xml_xpath_attr_value (xmlXPathContextPtr ctx, | |
char *xpath, | |
const char *attribute, | |
- char **out); | |
- bool xml_xpath_text (xmlXPathContextPtr ctx, char *xpath, char **out); | |
+ char **out) MUSTCHECK; | |
+ bool xml_xpath_text (xmlXPathContextPtr ctx, | |
+ char *xpath, char **out) MUSTCHECK; | |
#endif |