瀏覽代碼

Add in a fork test. Fix select so it works.

Eric Andersen 23 年之前
父節點
當前提交
7dafd3b520
共有 3 個文件被更改,包括 121 次插入5 次删除
  1. 11 5
      libc/sysdeps/linux/common/syscalls.c
  2. 49 0
      test/unistd/Makefile
  3. 61 0
      test/unistd/fork.c

+ 11 - 5
libc/sysdeps/linux/common/syscalls.c

@@ -515,11 +515,6 @@ _syscall2(int,setgroups,size_t,size,const gid_t *,list);
 #endif
 
 //#define __NR_select			82
-#ifdef L_select
-#include <unistd.h>
-_syscall5(int,select,int, n, fd_set *,readfds, fd_set *,writefds,
-       fd_set *,exceptfds, struct timeval *,timeout);
-#endif
 
 //#define __NR_symlink			83
 #ifdef L_symlink 
@@ -840,6 +835,17 @@ SYSCALL__ (getdents, 3)
 #endif
 
 //#define __NR__newselect		142
+#ifdef L__newselect
+#include <unistd.h>
+_syscall5(int,_newselect,int, n, fd_set *,readfds, fd_set *,writefds,
+       fd_set *,exceptfds, struct timeval *,timeout);
+
+int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 
+		struct timeval *timeout)
+{
+	return(_newselect(n, readfds, writefds, exceptfds, timeout));
+}
+#endif
 
 //#define __NR_flock			143
 #ifdef L_flock 

+ 49 - 0
test/unistd/Makefile

@@ -0,0 +1,49 @@
+TOPDIR=../../
+include $(TOPDIR)Rules.mak
+
+# Check if 'ls -sh' works or not 
+LSFLAGS = $(shell if ls -sh >/dev/null 2>&1; \
+    then echo "-sh"; else echo "-s" ; fi)
+
+XCFLAGS = -Wall -Os -fomit-frame-pointer -fno-builtin -nostdinc \
+	-I$(TOPDIR)include -I/usr/include/linux
+XLDFLAGS = -nostdlib -s -gc-sections
+EXTRA_LIBS=$(TOPDIR)libc.a -lgcc
+
+YCFLAGS = -Wall -Os -fomit-frame-pointer
+YLDFLAGS = -s --static 
+
+# Allow alternative stripping tools to be used...
+ifndef $(STRIPTOOL)
+	STRIPTOOL = strip
+endif
+STRIP    = $(STRIPTOOL) --remove-section=.note --remove-section=.comment $@
+
+TARGETS=fork fork_glibc
+
+all: $(TARGETS)
+
+fork: fork.c ../testsuite.h Makefile $(TOPDIR)libc.a
+	-@ echo "-------"
+	-@ echo " "
+	-@ echo "Compiling vs uCLibc: "
+	-@ echo " "
+	$(CC) $(XCFLAGS) -c $< -o $@.o
+	$(CC) $(XLDFLAGS) $@.o -o $@ $(EXTRA_LIBS)
+	./$@
+	-@ echo " "
+
+fork_glibc: fork.c ../testsuite.h Makefile $(TOPDIR)libc.a
+	-@ echo "-------"
+	-@ echo " "
+	-@ echo "Compiling vs GNU libc: "
+	-@ echo " "
+	$(CC) $(YCFLAGS) -c $< -o $@.o
+	$(CC) $(YLDFLAGS) --static $@.o -o $@
+	-./$@
+	-@ echo " "
+
+clean:
+	rm -f *.[oa] *~ core $(TARGETS)
+
+

+ 61 - 0
test/unistd/fork.c

@@ -0,0 +1,61 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * fork test for uclibc
+ *
+ * Copyright (C) 1999,2000 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+int main(void) 
+{
+	pid_t pid;
+	int status, wpid;
+
+	if ((pid = fork()) == 0) {
+		printf("The child process sleeps 5 seconds...\n");
+		sleep(5);
+		printf("Child exiting.\n");
+		exit(-1);
+	}
+
+	printf("Parent: waiting for the child to die.\n");
+	while (1) {
+		wpid = wait(&status);
+		if (wpid > 0 && wpid != pid) {
+			continue;
+		}
+		if (wpid == pid)
+			break;
+	}
+
+	printf("Child process exited.\nGoodbye.\n");
+	return EXIT_SUCCESS;
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/