Include stdlib.h for malloc and friends.
- (dtucker) [configure.ac openbsd-compat/bsd-closefrom.c] Use F_CLOSEM fcntl
for closefrom() on AIX. Pointed out by William Ahern.
+ - (dtucker) [openbsd-compat/regress/{Makefile.in,closefromtest.c}] Regress
+ test for closefrom() in compat code.
20060816
- (djm) [audit-bsm.c] Sprinkle in some headers
LDFLAGS=-L.. -lopenbsd-compat @LDFLAGS@
LIBCOMPAT=../libopenbsd-compat.a
-TESTPROGS=strtonumtest strduptest snprintftest
+TESTPROGS=closefromtest strtonumtest strduptest snprintftest
all: t-exec ${OTHERTESTS}
strduptest: strduptest.c $(LIBCOMPAT)
$(CC) $(CFLAGS) $(CPPFLAGS) -o strduptest $< $(LDFLAGS)
+closefromtest: closefromtest.c $(LIBCOMPAT)
+ $(CC) $(CFLAGS) $(CPPFLAGS) -o closefromtest $< $(LDFLAGS)
+
clean:
rm -f *.o *.a core $(TESTPROGS) valid.out
--- /dev/null
+/*
+ * Copyright (c) 2006 Darren Tucker
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define NUM_OPENS 10
+
+void
+fail(char *msg)
+{
+ fprintf(stderr, "closefrom: %s\n", msg);
+ exit(1);
+}
+
+int
+main(void)
+{
+ int i, max, fds[NUM_OPENS];
+ char buf[512];
+
+ for (i = 0; i < NUM_OPENS; i++)
+ if ((fds[i] = open("/dev/null", "r")) == -1)
+ exit(0); /* can't test */
+ max = i - 1;
+
+ /* should close last fd only */
+ closefrom(fds[max]);
+ if (close(fds[max]) != -1)
+ fail("failed to close highest fd");
+
+ /* make sure we can still use remaining descriptors */
+ for (i = 0; i < max; i++)
+ if (read(fds[i], buf, sizeof(buf)) == -1)
+ fail("closed descriptors it should not have");
+
+ /* should close all fds */
+ closefrom(fds[0]);
+ for (i = 0; i < NUM_OPENS; i++)
+ if (close(fds[i]) != -1)
+ fail("failed to close from lowest fd");
+}