OSDN Git Service

mkostemp: fix implementation
[uclinux-h8/uClibc.git] / test / stdlib / test-mkostemp-O_CLOEXEC.c
diff --git a/test/stdlib/test-mkostemp-O_CLOEXEC.c b/test/stdlib/test-mkostemp-O_CLOEXEC.c
new file mode 100644 (file)
index 0000000..9ff229a
--- /dev/null
@@ -0,0 +1,45 @@
+#define _XOPEN_SOURCE_EXTENDED
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include <errno.h>
+
+#if !defined __ARCH_USE_MMU__
+# define fork vfork
+#endif
+
+int main(int argc, char *argv[]) {
+    int fd, status;
+    char buff[5];
+    char template[] = "/tmp/test-mkostemp.XXXXXX";
+
+    fd = mkostemp(template, O_CLOEXEC);
+    unlink(template);
+
+    snprintf(buff, 5, "%d", fd);
+
+    if(!fork())
+        if(execl("./test-mkostemp-child", "test-mkostemp-child", buff, NULL) == -1)
+            exit(EXIT_FAILURE);
+
+    wait(&status);
+
+    memset(buff, 0, 5);
+    lseek(fd, 0, SEEK_SET);
+    errno = 0;
+    if(read(fd, buff, 5) == -1)
+        exit(EXIT_FAILURE);
+
+    if(!strncmp(buff, "test", 5))
+        exit(EXIT_FAILURE);
+    else
+        exit(EXIT_SUCCESS);
+
+    close(fd);
+    exit(EXIT_SUCCESS);
+}