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);