Module Name:    src
Committed By:   sborrill
Date:           Fri Oct 16 12:10:54 UTC 2009

Modified Files:
        src/lib/libpuffs [netbsd-5]: puffs.c puffs.h

Log Message:
Pull up the following revisions(s) (requested by pooka in ticket #1095):
        lib/libpuffs/puffs.c:   revision 1.94
        lib/libpuffs/puffs.h:   revision 1.110

Add puffs_cancel(), which allows to back down after puffs_init()
and before puffs_mount().


To generate a diff of this commit:
cvs rdiff -u -r1.92.4.1 -r1.92.4.2 src/lib/libpuffs/puffs.c
cvs rdiff -u -r1.108.4.1 -r1.108.4.2 src/lib/libpuffs/puffs.h

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

Modified files:

Index: src/lib/libpuffs/puffs.c
diff -u src/lib/libpuffs/puffs.c:1.92.4.1 src/lib/libpuffs/puffs.c:1.92.4.2
--- src/lib/libpuffs/puffs.c:1.92.4.1	Fri Oct 16 12:07:23 2009
+++ src/lib/libpuffs/puffs.c	Fri Oct 16 12:10:54 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.c,v 1.92.4.1 2009/10/16 12:07:23 sborrill Exp $	*/
+/*	$NetBSD: puffs.c,v 1.92.4.2 2009/10/16 12:10:54 sborrill Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: puffs.c,v 1.92.4.1 2009/10/16 12:07:23 sborrill Exp $");
+__RCSID("$NetBSD: puffs.c,v 1.92.4.2 2009/10/16 12:10:54 sborrill Exp $");
 #endif /* !lint */
 
 #include <sys/param.h>
@@ -463,12 +463,23 @@
 	return -1;
 }
 
+static void
+shutdaemon(struct puffs_usermount *pu, int error)
+{
+	ssize_t n;
+
+	n = write(pu->pu_dpipe[1], &error, sizeof(int));
+	assert(n == 4);
+	close(pu->pu_dpipe[0]);
+	close(pu->pu_dpipe[1]);
+	pu->pu_state &= ~PU_PUFFSDAEMON;
+}
+
 int
 puffs_mount(struct puffs_usermount *pu, const char *dir, int mntflags,
 	puffs_cookie_t cookie)
 {
 	char rp[MAXPATHLEN];
-	ssize_t n;
 	int rv, fd, sverrno;
 	char *comfd;
 
@@ -566,12 +577,8 @@
 	free(pu->pu_kargp);
 	pu->pu_kargp = NULL;
 
-	if (pu->pu_state & PU_PUFFSDAEMON) {
-		n = write(pu->pu_dpipe[1], &sverrno, sizeof(int));
-		assert(n == 4);
-		close(pu->pu_dpipe[0]);
-		close(pu->pu_dpipe[1]);
-	}
+	if (pu->pu_state & PU_PUFFSDAEMON)
+		shutdaemon(pu, sverrno);
 
 	errno = sverrno;
 	return rv;
@@ -658,6 +665,15 @@
 	return NULL;
 }
 
+void
+puffs_cancel(struct puffs_usermount *pu, int error)
+{
+
+	assert(puffs_getstate(pu) < PUFFS_STATE_RUNNING);
+	shutdaemon(pu, error);
+	free(pu);
+}
+
 /*
  * XXX: there's currently no clean way to request unmount from
  * within the user server, so be very brutal about it.
@@ -669,6 +685,7 @@
 	struct puffs_node *pn;
 
 	force = 1; /* currently */
+	assert((pu->pu_state & PU_PUFFSDAEMON) == 0);
 
 	if (pu->pu_fd)
 		close(pu->pu_fd);

Index: src/lib/libpuffs/puffs.h
diff -u src/lib/libpuffs/puffs.h:1.108.4.1 src/lib/libpuffs/puffs.h:1.108.4.2
--- src/lib/libpuffs/puffs.h:1.108.4.1	Fri Oct 16 12:07:23 2009
+++ src/lib/libpuffs/puffs.h	Fri Oct 16 12:10:54 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.h,v 1.108.4.1 2009/10/16 12:07:23 sborrill Exp $	*/
+/*	$NetBSD: puffs.h,v 1.108.4.2 2009/10/16 12:10:54 sborrill Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -419,6 +419,7 @@
 				    const char *, void *, uint32_t);
 int		puffs_mount(struct puffs_usermount *, const char *, int, void*);
 int		puffs_exit(struct puffs_usermount *, int);
+void		puffs_cancel(struct puffs_usermount *, int);
 int		puffs_mainloop(struct puffs_usermount *);
 int		puffs_daemon(struct puffs_usermount *, int, int);
 

Reply via email to