---
 rtemsbsd/sys/fs/devfs/devfs_vnops.c | 136 ++++++++++++++++++++++++++++++++++++
 1 file changed, 136 insertions(+)
 create mode 100755 rtemsbsd/sys/fs/devfs/devfs_vnops.c

diff --git a/rtemsbsd/sys/fs/devfs/devfs_vnops.c 
b/rtemsbsd/sys/fs/devfs/devfs_vnops.c
new file mode 100755
index 0000000..8c4a786
--- /dev/null
+++ b/rtemsbsd/sys/fs/devfs/devfs_vnops.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rt...@embedded-brains.de>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/rtems-bsd-kernel-space.h>
+
+#include <sys/types.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/file.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <fs/devfs/devfs_int.h>
+
+static MALLOC_DEFINE(M_CDEVPDATA, "DEVFSP", "Metainfo for cdev-fp data");
+
+struct mtx     cdevpriv_mtx;
+MTX_SYSINIT(cdevpriv_mtx, &cdevpriv_mtx, "cdevpriv lock", MTX_DEF);
+
+int
+devfs_get_cdevpriv(void **datap)
+{
+       struct file *fp;
+       struct cdev_privdata *p;
+       int error;
+
+       fp = curthread->td_fpop;
+       if (fp == NULL)
+               return (EBADF);
+       p = fp->f_cdevpriv;
+       if (p != NULL) {
+               error = 0;
+               *datap = p->cdpd_data;
+       } else
+               error = ENOENT;
+       return (error);
+}
+
+int
+devfs_set_cdevpriv(void *priv, d_priv_dtor_t *priv_dtr)
+{
+       struct file *fp;
+       struct cdev_priv *cdp;
+       struct cdev_privdata *p;
+       int error;
+
+       fp = curthread->td_fpop;
+       if (fp == NULL)
+               return (ENOENT);
+       cdp = cdev2priv((struct cdev *)fp->f_data);
+       p = malloc(sizeof(struct cdev_privdata), M_CDEVPDATA, M_WAITOK);
+       p->cdpd_data = priv;
+       p->cdpd_dtr = priv_dtr;
+       p->cdpd_fp = fp;
+       mtx_lock(&cdevpriv_mtx);
+       if (fp->f_cdevpriv == NULL) {
+               LIST_INSERT_HEAD(&cdp->cdp_fdpriv, p, cdpd_list);
+               fp->f_cdevpriv = p;
+               mtx_unlock(&cdevpriv_mtx);
+               error = 0;
+       } else {
+               mtx_unlock(&cdevpriv_mtx);
+               free(p, M_CDEVPDATA);
+               error = EBUSY;
+       }
+       return (error);
+}
+
+void
+devfs_destroy_cdevpriv(struct cdev_privdata *p)
+{
+
+       mtx_assert(&cdevpriv_mtx, MA_OWNED);
+       KASSERT(p->cdpd_fp->f_cdevpriv == p,
+           ("devfs_destoy_cdevpriv %p != %p", p->cdpd_fp->f_cdevpriv, p));
+       p->cdpd_fp->f_cdevpriv = NULL;
+       LIST_REMOVE(p, cdpd_list);
+       mtx_unlock(&cdevpriv_mtx);
+       (p->cdpd_dtr)(p->cdpd_data);
+       free(p, M_CDEVPDATA);
+}
+
+static void
+devfs_fpdrop(struct file *fp)
+{
+  struct cdev_privdata *p;
+
+  mtx_lock(&cdevpriv_mtx);
+  if ((p = fp->f_cdevpriv) == NULL) {
+    mtx_unlock(&cdevpriv_mtx);
+    return;
+  }
+  devfs_destroy_cdevpriv(p);
+}
+
+void
+devfs_clear_cdevpriv(void)
+{
+  struct file *fp;
+
+  fp = curthread->td_fpop;
+  if (fp == NULL)
+    return;
+  devfs_fpdrop(fp);
+}
-- 
1.9.1

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to