Module Name:    src
Committed By:   pooka
Date:           Fri May 21 10:50:52 UTC 2010

Modified Files:
        src/lib/libpuffs: dispatcher.c puffs.c puffs.h shlib_version

Log Message:
* support extended attributes
* bump major due to structure growth
* add some spare space
* remove ABI sillyness


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/lib/libpuffs/dispatcher.c
cvs rdiff -u -r1.106 -r1.107 src/lib/libpuffs/puffs.c
cvs rdiff -u -r1.114 -r1.115 src/lib/libpuffs/puffs.h
cvs rdiff -u -r1.4 -r1.5 src/lib/libpuffs/shlib_version

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/dispatcher.c
diff -u src/lib/libpuffs/dispatcher.c:1.33 src/lib/libpuffs/dispatcher.c:1.34
--- src/lib/libpuffs/dispatcher.c:1.33	Sat Oct 17 23:19:52 2009
+++ src/lib/libpuffs/dispatcher.c	Fri May 21 10:50:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: dispatcher.c,v 1.33 2009/10/17 23:19:52 pooka Exp $	*/
+/*	$NetBSD: dispatcher.c,v 1.34 2010/05/21 10:50:52 pooka Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007, 2008 Antti Kantee.  All Rights Reserved.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: dispatcher.c,v 1.33 2009/10/17 23:19:52 pooka Exp $");
+__RCSID("$NetBSD: dispatcher.c,v 1.34 2010/05/21 10:50:52 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -230,15 +230,26 @@
 			break;
 		}
 
-		case PUFFS_VFS_SUSPEND:
+		case PUFFS_VFS_EXTATTRCTL:
 		{
-			struct puffs_vfsmsg_suspend *auxt = auxbuf;
+			struct puffs_vfsmsg_extattrctl *auxt = auxbuf;
+			const char *attrname;
+			int flags;
 
-			error = 0;
-			if (pops->puffs_fs_suspend == NULL)
+			if (pops->puffs_fs_extattrctl == NULL) {
+				error = EOPNOTSUPP;
 				break;
+			}
+
+			if (auxt->pvfsr_flags & PUFFS_EXTATTRCTL_HASATTRNAME)
+				attrname = auxt->pvfsr_attrname;
+			else
+				attrname = NULL;
 
-			pops->puffs_fs_suspend(pu, auxt->pvfsr_status);
+			flags = auxt->pvfsr_flags & PUFFS_EXTATTRCTL_HASNODE;
+			error = pops->puffs_fs_extattrctl(pu, auxt->pvfsr_cmd,
+			    opcookie, flags,
+			    auxt->pvfsr_attrnamespace, attrname);
 			break;
 		}
 
@@ -908,6 +919,123 @@
 			break;
 		}
 
+		case PUFFS_VN_GETEXTATTR:
+		{
+			struct puffs_vnmsg_getextattr *auxt = auxbuf;
+			PUFFS_MAKECRED(pcr, &auxt->pvnr_cred);
+			size_t res, *resp, *sizep;
+			uint8_t *data;
+
+			if (pops->puffs_node_getextattr == NULL) {
+				error = EOPNOTSUPP;
+				break;
+			}
+
+			if (auxt->pvnr_datasize)
+				sizep = &auxt->pvnr_datasize;
+			else
+				sizep = NULL;
+
+			res = auxt->pvnr_resid;
+			if (res > 0) {
+				data = auxt->pvnr_data;
+				resp = &auxt->pvnr_resid;
+			} else {
+				data = NULL;
+				resp = NULL;
+			}
+
+			error = pops->puffs_node_getextattr(pu,
+			    opcookie, auxt->pvnr_attrnamespace,
+			    auxt->pvnr_attrname, sizep, data, resp, pcr);
+
+			/* need to move a bit more? */
+			preq->preq_buflen =
+			    sizeof(struct puffs_vnmsg_getextattr)
+			    + (res - auxt->pvnr_resid);
+			break;
+		}
+
+		case PUFFS_VN_SETEXTATTR:
+		{
+			struct puffs_vnmsg_setextattr *auxt = auxbuf;
+			PUFFS_MAKECRED(pcr, &auxt->pvnr_cred);
+			size_t *resp;
+			uint8_t *data;
+
+			if (pops->puffs_node_setextattr == NULL) {
+				error = EOPNOTSUPP;
+				break;
+			}
+
+			if (auxt->pvnr_resid > 0) {
+				data = auxt->pvnr_data;
+				resp = &auxt->pvnr_resid;
+			} else {
+				data = NULL;
+				resp = NULL;
+			}
+
+			error = pops->puffs_node_setextattr(pu,
+			    opcookie, auxt->pvnr_attrnamespace,
+			    auxt->pvnr_attrname, data, resp, pcr);
+			break;
+		}
+
+		case PUFFS_VN_LISTEXTATTR:
+		{
+			struct puffs_vnmsg_listextattr *auxt = auxbuf;
+			PUFFS_MAKECRED(pcr, &auxt->pvnr_cred);
+			size_t res, *resp, *sizep;
+			uint8_t *data;
+
+			if (pops->puffs_node_listextattr == NULL) {
+				error = EOPNOTSUPP;
+				break;
+			}
+
+			if (auxt->pvnr_datasize)
+				sizep = &auxt->pvnr_datasize;
+			else
+				sizep = NULL;
+
+			res = auxt->pvnr_resid;
+			if (res > 0) {
+				data = auxt->pvnr_data;
+				resp = &auxt->pvnr_resid;
+			} else {
+				data = NULL;
+				resp = NULL;
+			}
+
+			res = auxt->pvnr_resid;
+			error = pops->puffs_node_listextattr(pu,
+			    opcookie, auxt->pvnr_attrnamespace,
+			    sizep, data, resp, pcr);
+
+			/* need to move a bit more? */
+			preq->preq_buflen =
+			    sizeof(struct puffs_vnmsg_listextattr)
+			    + (res - auxt->pvnr_resid);
+			break;
+		}
+
+		case PUFFS_VN_DELETEEXTATTR:
+		{
+			struct puffs_vnmsg_deleteextattr *auxt = auxbuf;
+			PUFFS_MAKECRED(pcr, &auxt->pvnr_cred);
+
+			if (pops->puffs_node_deleteextattr == NULL) {
+				error = EOPNOTSUPP;
+				break;
+			}
+
+			error = pops->puffs_node_deleteextattr(pu,
+			    opcookie, auxt->pvnr_attrnamespace,
+			    auxt->pvnr_attrname, pcr);
+			break;
+		}
+
 		default:
 			printf("inval op %d\n", preq->preq_optype);
 			error = EINVAL;

Index: src/lib/libpuffs/puffs.c
diff -u src/lib/libpuffs/puffs.c:1.106 src/lib/libpuffs/puffs.c:1.107
--- src/lib/libpuffs/puffs.c:1.106	Wed May 19 12:16:45 2010
+++ src/lib/libpuffs/puffs.c	Fri May 21 10:50:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.c,v 1.106 2010/05/19 12:16:45 pooka Exp $	*/
+/*	$NetBSD: puffs.c,v 1.107 2010/05/21 10:50:52 pooka 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.106 2010/05/19 12:16:45 pooka Exp $");
+__RCSID("$NetBSD: puffs.c,v 1.107 2010/05/21 10:50:52 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/param.h>
@@ -70,10 +70,11 @@
 		opmask[PUFFS_VN_##upper] = 1;				\
 } while (/*CONSTCOND*/0)
 static void
-fillvnopmask(struct puffs_ops *pops, uint8_t *opmask)
+fillvnopmask(struct puffs_ops *pops, struct puffs_kargs *pa)
 {
+	uint8_t *opmask = pa->pa_vnopmask;
 
-	memset(opmask, 0, PUFFS_VN_MAX);
+	memset(opmask, 0, sizeof(pa->pa_vnopmask));
 
 	FILLOP(create,   CREATE);
 	FILLOP(mknod,    MKNOD);
@@ -100,6 +101,11 @@
 	FILLOP(read,     READ);
 	FILLOP(write,    WRITE);
 	FILLOP(abortop,  ABORTOP);
+
+	FILLOP(getextattr,  GETEXTATTR);
+	FILLOP(setextattr,  SETEXTATTR);
+	FILLOP(listextattr, LISTEXTATTR);
+	FILLOP(deleteextattr, DELETEEXTATTR);
 }
 #undef FILLOP
 
@@ -609,9 +615,8 @@
 	return rv;
 }
 
-/*ARGSUSED*/
 struct puffs_usermount *
-_puffs_init(int dummy, struct puffs_ops *pops, const char *mntfromname,
+puffs_init(struct puffs_ops *pops, const char *mntfromname,
 	const char *puffsname, void *priv, uint32_t pflags)
 {
 	struct puffs_usermount *pu;
@@ -635,9 +640,9 @@
 		goto failfree;
 	memset(pargs, 0, sizeof(struct puffs_kargs));
 
-	pargs->pa_vers = PUFFSDEVELVERS | PUFFSVERSION;
+	pargs->pa_vers = PUFFSVERSION;
 	pargs->pa_flags = PUFFS_FLAG_KERN(pflags);
-	fillvnopmask(pops, pargs->pa_vnopmask);
+	fillvnopmask(pops, pargs);
 	puffs_setmntinfo(pu, mntfromname, puffsname);
 
 	puffs_zerostatvfs(&pargs->pa_svfsb);

Index: src/lib/libpuffs/puffs.h
diff -u src/lib/libpuffs/puffs.h:1.114 src/lib/libpuffs/puffs.h:1.115
--- src/lib/libpuffs/puffs.h:1.114	Tue Jan 12 18:42:39 2010
+++ src/lib/libpuffs/puffs.h	Fri May 21 10:50:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.h,v 1.114 2010/01/12 18:42:39 pooka Exp $	*/
+/*	$NetBSD: puffs.h,v 1.115 2010/05/21 10:50:52 pooka Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -89,6 +89,8 @@
 	LIST_ENTRY(puffs_node)	pn_entries;
 
 	LIST_HEAD(,puffs_kcache)pn_cacheinfo;	/* PUFFS_KFLAG_CACHE	*/
+
+	void			*pn_spare[4];
 };
 #define PUFFS_NODE_REMOVED	0x01		/* not on entry list	*/
 
@@ -159,7 +161,8 @@
 	    struct puffs_newinfo *);
 	int (*puffs_fs_nodetofh)(struct puffs_usermount *, puffs_cookie_t,
 	    void *, size_t *);
-	void (*puffs_fs_suspend)(struct puffs_usermount *, int);
+	int (*puffs_fs_extattrctl)(struct puffs_usermount *, int,
+	    puffs_cookie_t, int, int, const char *);
 
 	int (*puffs_node_lookup)(struct puffs_usermount *,
 	    puffs_cookie_t, struct puffs_newinfo *, const struct puffs_cn *);
@@ -220,11 +223,17 @@
 	    uint8_t *, off_t, size_t *, const struct puffs_cred *, int);
 	int (*puffs_node_abortop)(struct puffs_usermount *, puffs_cookie_t,
 	    const struct puffs_cn *);
+	int (*puffs_node_getextattr)(struct puffs_usermount *, puffs_cookie_t,
+	    int, const char *, size_t *, uint8_t *, size_t *,
+	    const struct puffs_cred *);
+	int (*puffs_node_setextattr)(struct puffs_usermount *, puffs_cookie_t,
+	    int, const char *, uint8_t *, size_t *, const struct puffs_cred *);
+	int (*puffs_node_listextattr)(struct puffs_usermount *, puffs_cookie_t,
+	    int, size_t *, uint8_t *, size_t *, const struct puffs_cred *);
+	int (*puffs_node_deleteextattr)(struct puffs_usermount *,
+	    puffs_cookie_t, int, const char *, const struct puffs_cred *);
 
-#if 0
-	/* enable next time this structure is changed */
 	void *puffs_ops_spare[32];
-#endif
 };
 
 typedef	int (*pu_pathbuild_fn)(struct puffs_usermount *,
@@ -289,7 +298,8 @@
 	    size_t, struct puffs_newinfo *);				\
 	int fsname##_fs_nodetofh(struct puffs_usermount *,		\
 	    puffs_cookie_t, void *, size_t *);				\
-	void fsname##_fs_suspend(struct puffs_usermount *, int);	\
+	int fsname##_fs_extattrctl(struct puffs_usermount *, int,	\
+	    puffs_cookie_t, int, int, const char *);			\
 									\
 	int fsname##_node_lookup(struct puffs_usermount *,		\
 	    puffs_cookie_t, struct puffs_newinfo *,			\
@@ -358,7 +368,19 @@
 	    puffs_cookie_t, uint8_t *, off_t, size_t *,			\
 	    const struct puffs_cred *, int);				\
 	int fsname##_node_abortop(struct puffs_usermount *,		\
-	    puffs_cookie_t, const struct puffs_cn *);
+	    puffs_cookie_t, const struct puffs_cn *);			\
+	int fsname##_node_getextattr(struct puffs_usermount *,		\
+	    puffs_cookie_t, int, const char *, size_t *, uint8_t *,	\
+	    size_t *, const struct puffs_cred *);			\
+	int fsname##_node_setextattr(struct puffs_usermount *,		\
+	    puffs_cookie_t, int, const char *, uint8_t *, size_t *,	\
+	    const struct puffs_cred *);					\
+	int fsname##_node_listextattr(struct puffs_usermount *,		\
+	    puffs_cookie_t, int, size_t *, uint8_t *, size_t *,		\
+	    const struct puffs_cred *);					\
+	int fsname##_node_deleteextattr(struct puffs_usermount *,	\
+	    puffs_cookie_t, int, const char *,				\
+	    const struct puffs_cred *);
 
 #define PUFFSOP_INIT(ops)						\
     ops = malloc(sizeof(struct puffs_ops));				\
@@ -370,11 +392,6 @@
 
 PUFFSOP_PROTOS(puffs_null)	/* XXX */
 
-#define PUFFS_DEVEL_LIBVERSION 34
-#define puffs_init(a,b,c,d,e) \
-    _puffs_init(PUFFS_DEVEL_LIBVERSION,a,b,c,d,e)
-
-
 #define PNPATH(pnode)	((pnode)->pn_po.po_path)
 #define PNPLEN(pnode)	((pnode)->pn_po.po_len)
 #define PCNPATH(pcnode)	((pcnode)->pcn_po_full.po_path)
@@ -419,7 +436,7 @@
 __BEGIN_DECLS
 
 #define PUFFS_DEFER ((void *)-1)
-struct puffs_usermount *_puffs_init(int, struct puffs_ops *, const char *,
+struct puffs_usermount *puffs_init(struct puffs_ops *, const char *,
 				    const char *, void *, uint32_t);
 int		puffs_mount(struct puffs_usermount *, const char *, int, void*);
 int		puffs_exit(struct puffs_usermount *, int);

Index: src/lib/libpuffs/shlib_version
diff -u src/lib/libpuffs/shlib_version:1.4 src/lib/libpuffs/shlib_version:1.5
--- src/lib/libpuffs/shlib_version:1.4	Sun Oct 18 20:26:33 2009
+++ src/lib/libpuffs/shlib_version	Fri May 21 10:50:52 2010
@@ -1,12 +1,4 @@
-#	$NetBSD: shlib_version,v 1.4 2009/10/18 20:26:33 pooka Exp $
+#	$NetBSD: shlib_version,v 1.5 2010/05/21 10:50:52 pooka Exp $
 #
-
-#
-# NOTE!
-#
-#  next time major is bumped:
-#    1) enable puffs_ops_spare
-#    2) get rid of PUFFS_DEVEL_LIBVERSION
-#
-major=1
-minor=1
+major=2
+minor=0

Reply via email to