[PATCH] RFC cifs-utils: Use autoconf to get kernel headers

scott.lovenberg at gmail.com scott.lovenberg at gmail.com
Mon Jul 22 11:47:23 MDT 2013


From: Scott Lovenberg <scott.lovenberg at gmail.com>

This is an RFC for how we'd use autoconf to get the Linux kernel headers
in include/uapi/linux/cifs.h.  If this is the correct approach, I'll
formalize this patch.  I've never played with autoconf before so this is
completely untested but should (read: might) probably work.

Signed-off-by: Scott Lovenberg <scott.lovenberg at gmail.com>
---
 configure.ac |  3 +++
 mount.cifs.c | 27 +++++++++++++++++++--------
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/configure.ac b/configure.ac
index b5f7c49..708fdeb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -111,6 +111,9 @@ AC_SUBST(RT_LDADD)
 # Checks for header files.
 AC_CHECK_HEADERS([arpa/inet.h ctype.h fcntl.h inttypes.h limits.h mntent.h netdb.h stddef.h stdint.h stdbool.h stdlib.h stdio.h errno.h string.h strings.h sys/mount.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h], , [AC_MSG_ERROR([necessary header(s) not found])])
 
+# Check for linux's cifs.h header that defines string lengths.
+AC_CHECK_HEADER([linux/cifs.h], ,[AC_MSG_WARN([cifs kernel header not found. Using internal values.])])
+
 # do we have sys/fsuid.h and setfsuid()?
 AC_CHECK_HEADERS([sys/fsuid.h])
 AC_CHECK_FUNC(setfsuid, , [AC_MSG_ERROR([System does not support setfsuid()])])
diff --git a/mount.cifs.c b/mount.cifs.c
index 77ea0f8..0fca0a9 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -62,6 +62,9 @@
 #include "mount.h"
 #include "util.h"
 #include "resolve_host.h"
+#ifdef HAVE_LINUX_CIFS_H
+#include <linux/cifs.h>
+#endif /* HAVE_LINUX_CIFS_h */
 
 #ifndef MS_MOVE 
 #define MS_MOVE 8192 
@@ -91,16 +94,24 @@
 
 /* Max length of the share name portion of a UNC. Share names over 80
  * characters cannot be accessed via commandline in Windows 2000/XP. */
-#define MAX_SHARE_LEN 256
+#ifndef MAX_SHARE_SIZE
+#define MAX_SHARE_SIZE 256
+#endif
 
 /* Max user name length. */
+#ifndef MAX_USERNAME_SIZE
 #define MAX_USERNAME_SIZE 256
+#endif
 
 /* Max domain size. */
-#define MAX_DOMAIN_SIZE 256
+#ifndef MAX_DOMAINNAME_SIZE
+#define MAX_DOMAINNAME_SIZE 256
+#endif
 
 /* Max password size. */
-#define MOUNT_PASSWD_SIZE 512
+#ifndef MAX_PASSWORD_SIZE
+#define MAX_PASSWORD_SIZE 512
+#endif
 
 
 
@@ -176,12 +187,12 @@
 struct parsed_mount_info {
 	unsigned long flags;
 	char host[NI_MAXHOST + 1];
-	char share[MAX_SHARE_LEN + 1];
+	char share[MAX_SHARE_SIZE + 1];
 	char prefix[PATH_MAX + 1];
 	char options[MAX_OPTIONS_LEN];
-	char domain[MAX_DOMAIN_SIZE + 1];
+	char domain[MAX_DOMAINNAME_SIZE + 1];
 	char username[MAX_USERNAME_SIZE + 1];
-	char password[MOUNT_PASSWD_SIZE + 1];
+	char password[MAX_PASSWORD_SIZE + 1];
 	char addrlist[MAX_ADDR_LIST_LEN];
 	unsigned int got_user:1;
 	unsigned int got_password:1;
@@ -1766,13 +1777,13 @@ assemble_mountinfo(struct parsed_mount_info *parsed_info,
 	}
 
 	if (!parsed_info->got_password) {
-		char tmp_pass[MOUNT_PASSWD_SIZE + 1];
+		char tmp_pass[MAX_PASSWORD_SIZE + 1];
 		char *prompt = NULL;
 
 		if(asprintf(&prompt, "Password for %s@%s: ", parsed_info->username, orig_dev) < 0)
 			prompt = NULL;
 
-		if (get_password(prompt ? prompt : "Password: ", tmp_pass, MOUNT_PASSWD_SIZE + 1)) {
+		if (get_password(prompt ? prompt : "Password: ", tmp_pass, MAX_PASSWORD_SIZE + 1)) {
 			rc = set_password(parsed_info, tmp_pass);
 		} else {
 			fprintf(stderr, "Error reading password, exiting\n");
-- 
1.8.1.4



More information about the samba-technical mailing list