Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 May 2010 16:18:47 GMT
From:      Jonathan Anderson <jona@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 178149 for review
Message-ID:  <201005121618.o4CGIlj6028258@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@178149?ac=10

Change 178149 by jona@jona-belle-freebsd8 on 2010/05/12 16:18:17

	Added lc_fdlist_find(), changed whitespace in lc_fdlist_lookup() for clarity

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#15 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#13 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#15 (text+ko) ====

@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#14 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#15 $
  */
 
 #ifndef _LIBCAPSICUM_H_
@@ -90,6 +90,19 @@
 	    cap_rights_t rights);
 
 /*
+ * Open a stored file descriptor.
+ *
+ * Given a filename '/foo/bar/fubar', this function will attempt to find the file
+ * in the FD list. If that fails, it will attempt to find a parent directory in the
+ * FD list and supply a filename relative to that FD (which will be a pointer to a
+ * location within the supplied filename - do NOT free it!).
+ */
+int
+lc_fdlist_find(struct lc_fdlist *lfp, const char *subsystem,
+	    const char *classname, const char *filename,
+	    const char **relative_name);
+
+/*
  * Look up a file descriptor.
  *
  * Multiple entries with the same classname are allowed, so iterating through

==== //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#13 (text+ko) ====

@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#12 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#13 $
  */
 
 #include <sys/mman.h>
@@ -393,6 +393,60 @@
 }
 
 int
+lc_fdlist_find(struct lc_fdlist *lfp, const char *subsystem,
+	    const char *classname, const char *filename,
+	    const char **relative_name)
+{
+	int pos = 0;
+	int fd = -1;
+
+	/* try to find the file itself in the FD list */
+	size_t len = strlen(filename);
+	*relative_name = filename + len;
+
+	while (fd == -1)
+	{
+		char *dirname;
+
+		if (lc_fdlist_lookup(lfp, subsystem, classname,
+		                     &dirname, &fd, &pos) == -1)
+			break;
+
+		if (strncmp(dirname, filename, len + 1)) fd = -1;
+		free(dirname);
+	}
+
+	if (fd >= 0) return fd;
+
+
+	/* now try to find a parent directory and a relative filename */
+	*relative_name = NULL;
+	pos = 0;
+
+	while (fd == -1)
+	{
+		char *dirname;
+
+		if (lc_fdlist_lookup(lfp, subsystem, classname,
+		                     &dirname, &fd, &pos) == -1)
+			return (-1);
+
+		len = strlen(dirname);
+		if (strncmp(dirname, filename, len)) fd = -1;
+		else
+		{
+			*relative_name = filename + len;
+			if (**relative_name == '/') (*relative_name)++;
+		}
+
+		free(dirname);
+	}
+
+	return fd;
+}
+
+
+int
 lc_fdlist_lookup(struct lc_fdlist *lfp, const char *subsystem,
     const char *classname, char **name, int *fdp, int *pos)
 {
@@ -412,28 +466,30 @@
 	for (u_int i = (pos ? *pos : 0); i < lfsp->count; i++) {
 		struct lc_fdlist_entry *entry = lfsp->entries + i;
 
-		if ((!subsystem ||
-		    !strncmp(subsystem, names + entry->sysoff,
-		    entry->syslen + 1))
-		    && (!classname || !strncmp(classname, names +
-		    entry->classoff, entry->classnamelen + 1))) {
+		if ((!subsystem
+		     || !strncmp(subsystem, names + entry->sysoff,
+		                 entry->syslen + 1))
+		    && (!classname
+		        || !strncmp(classname, names + entry->classoff,
+		                    entry->classnamelen + 1)))
+		{
+			/* found a matching entry! */
+			successful = 1;
+			*fdp = entry->fd;
 
-			/* found a matching entry! */
 			if (name) {
 				*name = malloc(entry->namelen + 1);
 				strncpy(*name, names + entry->nameoff,
 				        entry->namelen + 1);
 			}
-
-			*fdp = entry->fd;
-			if (pos != NULL) *pos = i + 1;
-			successful = 1;
+			if (pos) *pos = i + 1;
 			break;
 		}
 	}
 	UNLOCK(lfp);
 	if (successful)
 		return (0);
+
 	errno = ENOENT;
 	return (-1);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005121618.o4CGIlj6028258>