svn commit: r185219 - head/tools/regression/fstest

Pawel Jakub Dawidek pjd at FreeBSD.org
Sun Nov 23 11:56:40 PST 2008


Author: pjd
Date: Sun Nov 23 19:56:40 2008
New Revision: 185219
URL: http://svn.freebsd.org/changeset/base/185219

Log:
  Add support for pathconf(2).

Modified:
  head/tools/regression/fstest/fstest.c

Modified: head/tools/regression/fstest/fstest.c
==============================================================================
--- head/tools/regression/fstest/fstest.c	Sun Nov 23 19:56:09 2008	(r185218)
+++ head/tools/regression/fstest/fstest.c	Sun Nov 23 19:56:40 2008	(r185219)
@@ -75,6 +75,7 @@ enum action {
 	ACTION_TRUNCATE,
 	ACTION_STAT,
 	ACTION_LSTAT,
+	ACTION_PATHCONF
 };
 
 #define	TYPE_NONE	0x0000
@@ -116,6 +117,7 @@ static struct syscall_desc syscalls[] = 
 	{ "truncate", ACTION_TRUNCATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
 	{ "stat", ACTION_STAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
 	{ "lstat", ACTION_LSTAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+	{ "pathconf", ACTION_PATHCONF, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
 	{ NULL, -1, { TYPE_NONE } }
 };
 
@@ -209,6 +211,27 @@ static struct flag chflags_flags[] = {
 };
 #endif
 
+struct name {
+	int	 n_name;
+	char	*n_str;
+};
+
+static struct name pathconf_names[] = {
+#ifdef _PC_LINK_MAX
+	{ _PC_LINK_MAX, "_PC_LINK_MAX" },
+#endif
+#ifdef _PC_NAME_MAX
+	{ _PC_NAME_MAX, "_PC_NAME_MAX" },
+#endif
+#ifdef _PC_PATH_MAX
+	{ _PC_PATH_MAX, "_PC_PATH_MAX" },
+#endif
+#ifdef _PC_SYMLINK_MAX
+	{ _PC_SYMLINK_MAX, "_PC_SYMLINK_MAX" },
+#endif
+	{ 0, NULL }
+};
+
 static const char *err2str(int error);
 
 static void
@@ -264,6 +287,18 @@ flags2str(struct flag *tflags, long long
 }
 #endif
 
+static int
+str2name(struct name *names, char *name)
+{
+	unsigned int i;
+
+	for (i = 0; names[i].n_str != NULL; i++) {
+		if (strcmp(names[i].n_str, name) == 0)
+			return (names[i].n_name);
+	}
+	return (-1);
+}
+
 static struct syscall_desc *
 find_syscall(const char *name)
 {
@@ -357,7 +392,7 @@ call_syscall(struct syscall_desc *scall,
 	long long flags;
 	unsigned int i;
 	char *endp;
-	int rval;
+	int name, rval;
 	union {
 		char *str;
 		long long num;
@@ -484,6 +519,27 @@ call_syscall(struct syscall_desc *scall,
 			return (i);
 		}
 		break;
+	case ACTION_PATHCONF:
+	    {
+		long lrval;
+
+		name = str2name(pathconf_names, STR(1));
+		if (name == -1) {
+			fprintf(stderr, "unknown name %s", STR(1));
+			exit(1);
+		}
+		errno = 0;
+		lrval = pathconf(STR(0), name);
+		if (lrval == -1 && errno == 0) {
+			printf("unlimited\n");
+			return (i);
+		} else if (lrval >= 0) {
+			printf("%ld\n", lrval);
+			return (i);
+		}
+		rval = -1;
+		break;
+	    }
 	default:
 		fprintf(stderr, "unsupported syscall\n");
 		exit(1);


More information about the svn-src-all mailing list