Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.