Module Name:    src
Committed By:   manu
Date:           Tue Sep  7 02:11:04 UTC 2010

Modified Files:
        src/lib/libperfuse: ops.c perfuse.c perfuse_if.h
        src/usr.sbin/perfused: msg.c perfused.c

Log Message:
- Do not checkfor peer credentials when perfused is autostarted and
therefore runs with filesystem privileges

- shut up warnings and debug messages when perfused is autostarted

- make perfused patch modifiable with CFLAGS for easier pkgsrc integration

- Fix build warnings


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/lib/libperfuse/ops.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.6 -r1.7 src/lib/libperfuse/perfuse_if.h
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/perfused/msg.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/perfused/perfused.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libperfuse/ops.c
diff -u src/lib/libperfuse/ops.c:1.11 src/lib/libperfuse/ops.c:1.12
--- src/lib/libperfuse/ops.c:1.11	Mon Sep  6 01:40:24 2010
+++ src/lib/libperfuse/ops.c	Tue Sep  7 02:11:04 2010
@@ -1,4 +1,4 @@
-/*  $NetBSD: ops.c,v 1.11 2010/09/06 01:40:24 manu Exp $ */
+/*  $NetBSD: ops.c,v 1.12 2010/09/07 02:11:04 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -41,6 +41,8 @@
 #include "perfuse_priv.h"
 #include "fuse.h"
 
+extern int perfuse_diagflags;
+
 static int node_close_common(struct puffs_usermount *, puffs_cookie_t, int);
 static int no_access(puffs_cookie_t, const struct puffs_cred *, mode_t);
 static void fuse_attr_to_vap(struct perfuse_state *,

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.4 src/lib/libperfuse/perfuse.c:1.5
--- src/lib/libperfuse/perfuse.c:1.4	Mon Sep  6 01:40:24 2010
+++ src/lib/libperfuse/perfuse.c	Tue Sep  7 02:11:04 2010
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.4 2010/09/06 01:40:24 manu Exp $ */
+/*  $NetBSD: perfuse.c,v 1.5 2010/09/07 02:11:04 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -115,8 +115,7 @@
 
 	if ((sv[0] = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1) {
 #ifdef PERFUSE_DEBUG
-		printf("%s:%d socket failed: %s\n", 
-		       __func__, __LINE__, strerror(errno));
+		DWARN("%s:%d socket failed: %s", __func__, __LINE__);
 #endif
 		return -1;
 	}
@@ -138,8 +137,7 @@
 	 */
 	if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) != 0) {
 #ifdef PERFUSE_DEBUG
-		printf("%s:%d: socketpair failed: %s\n",
-		       __func__, __LINE__, strerror(errno));
+		DWARN("%s:%d: socketpair failed", __func__, __LINE__);
 #endif
 		return -1;
 	}
@@ -149,8 +147,7 @@
 	switch(fork()) {
 	case -1:
 #ifdef PERFUSE_DEBUG
-		printf("%s:%d: fork failed: %s\n",
-		       __func__, __LINE__, strerror(errno));
+		DWARN("%s:%d: fork failed", __func__, __LINE__);
 #endif
 		return -1;
 		/* NOTREACHED */
@@ -158,8 +155,7 @@
 	case 0:
 		(void)execve(argv[0], argv, envp);
 #ifdef PERFUSE_DEBUG
-		printf("%s:%d: execve failed: %s\n",
-		       __func__, __LINE__, strerror(errno));
+		DWARN("%s:%d: execve failed", __func__, __LINE__);
 #endif
 		return -1;
 		/* NOTREACHED */
@@ -181,32 +177,19 @@
 	const void *data;
 {
 	int s;
-#if 0
-	struct sockaddr_un sun;
-#endif
 	size_t len;
 	struct perfuse_mount_out pmo;
 
 #ifdef PERFUSE_DEBUG
-	printf("%s(\"%s\", \"%s\", \"%s\", 0x%lx, \"%s\")\n", __func__,
-	       source, target, filesystemtype, mountflags, (const char *)data);
+	if (perfuse_diagflags & PDF_MISC)
+		DPRINTF("%s(\"%s\", \"%s\", \"%s\", 0x%lx, \"%s\")\n",
+			__func__, source, target, filesystemtype, 
+			mountflags, (const char *)data);
 #endif
 
-#if 0
-	if ((s = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
-		err(EX_OSERR, "socket failed");
-
-	sun.sun_len = sizeof(sun);
-	sun.sun_family = AF_LOCAL;
-	(void)strcpy(sun.sun_path, _PATH_FUSE);
-
-	if (connect(s, (struct sockaddr *)&sun, sun.sun_len) == -1)
-		err(EX_UNAVAILABLE, "cannot connect to \"%s\"", _PATH_FUSE);
-#endif
 	if ((s = get_fd(data)) == -1)
 		return -1;
 	
-
 	pmo.pmo_len = sizeof(pmo);
 	pmo.pmo_len += source ? (uint32_t)strlen(source) : 0;
 	pmo.pmo_len += target ? (uint32_t)strlen(target) : 0;
@@ -226,7 +209,8 @@
 
 	if (write(s, &pmo, sizeof(pmo)) != sizeof(pmo)) {
 #ifdef PERFUSE_DEBUG
-		printf("%s:%d short write\n", __func__, __LINE__);
+		if (perfuse_diagflags & PDF_MISC)
+			DPRINTF("%s:%d short write\n", __func__, __LINE__);
 #endif
 		return -1;
 	}
@@ -235,7 +219,7 @@
 		len = pmo.pmo_source_len;
 		if (write(s, source, len) != (ssize_t)len) {
 #ifdef PERFUSE_DEBUG
-			printf("%s:%d short write\n", __func__, __LINE__);
+			DWARNX("%s:%d short write\n", __func__, __LINE__);
 #endif
 			return -1;
 		}
@@ -245,7 +229,7 @@
 		len = pmo.pmo_target_len;
 		if (write(s, target, len) != (ssize_t)len) {
 #ifdef PERFUSE_DEBUG
-			printf("%s:%d short write\n", __func__, __LINE__);
+			DWARNX("%s:%d short write\n", __func__, __LINE__);
 #endif
 			return -1;
 		}
@@ -255,7 +239,7 @@
 		len = pmo.pmo_filesystemtype_len;
 		if (write(s, filesystemtype, len) != (ssize_t)len) {
 #ifdef PERFUSE_DEBUG
-			printf("%s:%d short write\n", __func__, __LINE__);
+			DWARNX("%s:%d short write\n", __func__, __LINE__);
 #endif
 			return -1;
 		}
@@ -265,7 +249,7 @@
 		len = pmo.pmo_data_len;
 		if (write(s, data, len) != (ssize_t)len) {
 #ifdef PERFUSE_DEBUG
-			printf("%s:%d short write\n", __func__, __LINE__);
+			DWARNX("%s:%d short write\n", __func__, __LINE__);
 #endif
 			return -1;
 		}

Index: src/lib/libperfuse/perfuse_if.h
diff -u src/lib/libperfuse/perfuse_if.h:1.6 src/lib/libperfuse/perfuse_if.h:1.7
--- src/lib/libperfuse/perfuse_if.h:1.6	Mon Sep  6 01:40:24 2010
+++ src/lib/libperfuse/perfuse_if.h	Tue Sep  7 02:11:04 2010
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse_if.h,v 1.6 2010/09/06 01:40:24 manu Exp $ */
+/*  $NetBSD: perfuse_if.h,v 1.7 2010/09/07 02:11:04 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -28,8 +28,10 @@
 #ifndef _REFUSE_PERFUSE_H
 #define _REFUSE_PERFUSE_H
 
-#define _PATH_FUSE "/dev/fuse"
+#ifndef _PATH_PERFUSED
 #define _PATH_PERFUSED "/usr/sbin/perfused"
+#endif /* _PATH_PERFUSED */
+#define _PATH_FUSE "/dev/fuse"
 #define FUSE_COMMFD_ENV "_FUSE_COMMFD" 
 #define PERFUSE_MOUNT_MAGIC "noFuseRq"
 #define PERFUSE_UNKNOWN_INO 0xffffffff

Index: src/usr.sbin/perfused/msg.c
diff -u src/usr.sbin/perfused/msg.c:1.4 src/usr.sbin/perfused/msg.c:1.5
--- src/usr.sbin/perfused/msg.c:1.4	Mon Sep  6 01:40:24 2010
+++ src/usr.sbin/perfused/msg.c	Tue Sep  7 02:11:04 2010
@@ -1,4 +1,4 @@
-/*  $NetBSD: msg.c,v 1.4 2010/09/06 01:40:24 manu Exp $ */
+/*  $NetBSD: msg.c,v 1.5 2010/09/07 02:11:04 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -87,7 +87,7 @@
 	if ((buf = malloc(len + 1)) == NULL)
 		err(EX_OSERR, "malloc(%zd) failed", len);
 
-	if (read(fd, buf, len) != len) {
+	if (read(fd, buf, len) != (ssize_t)len) {
 		DWARN("short read");
 		return NULL;
 	}

Index: src/usr.sbin/perfused/perfused.c
diff -u src/usr.sbin/perfused/perfused.c:1.6 src/usr.sbin/perfused/perfused.c:1.7
--- src/usr.sbin/perfused/perfused.c:1.6	Mon Sep  6 13:15:29 2010
+++ src/usr.sbin/perfused/perfused.c	Tue Sep  7 02:11:04 2010
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfused.c,v 1.6 2010/09/06 13:15:29 wiz Exp $ */
+/*  $NetBSD: perfused.c,v 1.7 2010/09/07 02:11:04 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -52,13 +52,19 @@
 
 static int getpeerid(int, pid_t *, uid_t *, gid_t *);
 static int access_mount(const char *, uid_t, int);
-static void new_mount(int);
+static void new_mount(int, int);
 static int parse_debug(char *);
 static void siginfo_handler(int);
 static int parse_options(int, char **);
 static void get_mount_info(int, struct perfuse_mount_info *);
 int main(int, char **);
 
+/*
+ * Flags for new_mount()
+ */
+#define  PMNT_DEVFUSE	0x0	/* We use /dev/fuse */
+#define  PMNT_SOCKPAIR	0x1	/* We use socketpair */
+
 
 static int
 getpeerid(s, pidp, uidp, gidp)
@@ -137,12 +143,12 @@
 	}
 
 #ifdef PERFUSE_DEBUG
-	DPRINTF("perfuse lengths: source = %"PRId32", target = %"PRId32", "
-	       "filesystemtype = %"PRId32", data = %"PRId32"\n", 
-		pmo->pmo_source_len, 
-		pmo->pmo_target_len,
-		pmo->pmo_filesystemtype_len,
-		pmo->pmo_data_len);
+	if (perfuse_diagflags & PDF_MISC)
+		DPRINTF("perfuse lengths: source = %"PRId32", "
+			"target = %"PRId32", filesystemtype = %"PRId32", "
+			"data = %"PRId32"\n", pmo->pmo_source_len, 
+			pmo->pmo_target_len, pmo->pmo_filesystemtype_len, 
+			pmo->pmo_data_len);
 #endif
 	len = pmo->pmo_source_len;
 	source = perfuse_recv_early(fd, len);
@@ -159,8 +165,10 @@
 	data = perfuse_recv_early(fd, len);
 
 #ifdef PERFUSE_DEBUG
-	DPRINTF("%s(\"%s\", \"%s\", \"%s\", 0x%lx, \"%s\")\n", __func__,
-	       source, target, filesystemtype, mountflags, (const char *)data);
+	if (perfuse_diagflags & PDF_MISC)
+		DPRINTF("%s(\"%s\", \"%s\", \"%s\", 0x%lx, \"%s\")\n", 
+		__func__, source, target, filesystemtype, 
+		mountflags, (const char *)data);
 #endif
 	pmi->pmi_source = source;
 	pmi->pmi_target = target;
@@ -172,8 +180,9 @@
 }
 
 static void
-new_mount(fd)
+new_mount(fd, pmnt_flags)
 	int fd;
+	int pmnt_flags;
 {
 	struct puffs_usermount *pu;
 	struct perfuse_mount_info pmi;
@@ -202,17 +211,24 @@
 	get_mount_info(fd, &pmi);
 
 	/*
-	 * Get peer identity
+	 * Get peer identity. If we use socketpair (-i option),
+	 * peer identity if the same as us.
 	 */
-	if (getpeerid(fd, NULL, &pmi.pmi_uid, NULL) != 0)
-		DWARNX("Unable to retrieve peer identity");
+	if (pmnt_flags & PMNT_SOCKPAIR) {
+		pmi.pmi_uid = getuid();
+	} else {
+		if (getpeerid(fd, NULL, &pmi.pmi_uid, NULL) != 0) {
+			DWARNX("Unable to retreive peer identity");
+			pmi.pmi_uid = (uid_t)-1;
+		}
+	}
 
 	/*
 	 * Check that peer owns mountpoint and read (and write) on it?
 	 */
 	ro_flag = pmi.pmi_mountflags & MNT_RDONLY;
 	if (access_mount(pmi.pmi_target, pmi.pmi_uid, ro_flag) != 0)
-		DERRX(EX_NOPERM, "insufficient privileges to mount %s", 
+		DERRX(EX_NOPERM, "insuficient privileges to mount on %s", 
 		      pmi.pmi_target);
 
 
@@ -337,6 +353,7 @@
 			break;
 		case 'f':
 			foreground = 1;
+			perfuse_diagflags |= PDF_MISC;
 			break;
 		case 'i':
 			retval = atoi(optarg);
@@ -371,7 +388,7 @@
 			DERR(EX_OSERR, "daemon failed");
 
 	if (s != -1) {
-		new_mount(s);
+		new_mount(s, PMNT_SOCKPAIR);
 		DERRX(EX_SOFTWARE, "new_mount exit while -i is used");
 	}
 
@@ -395,7 +412,7 @@
 		if (perfuse_diagflags & PDF_MISC)
 			DPRINTF("connexion accepted\n");
 #endif
-		new_mount(fd);
+		new_mount(fd, PMNT_DEVFUSE);
 	} while (1 /* CONSTCOND */);
 		
 	/* NOTREACHED */

Reply via email to