r14624: - add timelimit.c
authorStefan Metzmacher <metze@samba.org>
Tue, 21 Mar 2006 15:33:14 +0000 (15:33 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:15:39 +0000 (11:15 -0500)
- add configure tests --with-selftest-prefix=/tmp/samba-test
  this is needed because the path name of unix socket can only be 108 chars long
- add configure test --with-smbtorture4-path=/home/foo/prefix/samba4/bin/smbtorture
  this will be used to run samba4's smbtorture inside samba3's make test later

metze
(This used to be commit d9df1853b947c70f747ea30a353162f2985ef250)

source3/Makefile.in
source3/configure.in
source3/script/tests/timelimit.c [new file with mode: 0644]

index e413c8cafbb7d693588ff61d64b10e897d094611..c47af0ebe984605e6e02f74a5ae7eeddb5dded1e 100644 (file)
@@ -11,6 +11,9 @@
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 
+selftest_prefix=@selftest_prefix@
+smbtorture4_path=@smbtorture4_path@
+
 LIBS=@LIBS@
 CC=@CC@
 SHLD=@SHLD@
@@ -1405,6 +1408,10 @@ bin/t_push_ucs2@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_push_ucs2.o
 
 bin/t_snprintf@EXEEXT@: lib/snprintf.c
        $(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(DYNEXP) -DTEST_SNPRINTF lib/snprintf.c -lm
+
+bin/timelimit@EXEEXT@: script/tests/timelimit.c
+       $(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(DYNEXP) script/tests/timelimit.c
+
 install: installservers installbin @INSTALL_CIFSMOUNT@ installman installscripts installdat installswat installmodules @INSTALL_LIBSMBCLIENT@ @INSTALL_LIBMSRPC@
 
 install-everything: install installmodules
index 25b1700aac6f9633a71471864130d679884a72f0..4b883a28ac003a7653f6999e47657bdb1a24f98c 100644 (file)
@@ -308,6 +308,41 @@ AC_ARG_ENABLE(socket-wrapper,
        SOCKWRAP="\$(SOCKET_WRAPPER_OBJ)"
     fi])
 
+#################################################
+# set prefix for 'make test'
+selftest_prefix="./"
+AC_SUBST(selftest_prefix)
+AC_ARG_WITH(selftest-prefix,
+[  --with-selftest-prefix=DIR    The prefix where make test will be runned ($selftest_prefix)],
+[ case "$withval" in
+  yes|no)
+    AC_MSG_WARN([--with-selftest-prefix called without argument - will use default])
+  ;;
+  * )
+    selftest_prefix="$withval"
+    ;;
+  esac
+])
+
+#################################################
+# set path of samba4's smbtorture
+smbtorture4_path=""
+AC_SUBST(smbtorture4_path)
+AC_ARG_WITH(smbtorture4_path,
+[  --with-smbtorture4-path=PATH    The path to a samba4 smbtorture for make test (none)],
+[ case "$withval" in
+  yes|no)
+    AC_MSG_ERROR([--with-smbtorture4-path should take a path])
+  ;;
+  * )
+    smbtorture4_path="$withval"
+    if test -z "$smbtorture4_path" -a ! -f $smbtorture4_path; then
+       AC_MSG_ERROR(['$smbtorture_path' does not  exist!]) 
+    fi
+  ;;
+ esac
+])
+
 # compile with optimization and without debugging by default, but
 # allow people to set their own preference.
 # do this here since AC_CACHE_CHECK apparently sets the CFLAGS to "-g -O2"
diff --git a/source3/script/tests/timelimit.c b/source3/script/tests/timelimit.c
new file mode 100644 (file)
index 0000000..93d7f64
--- /dev/null
@@ -0,0 +1,78 @@
+/* run a command with a limited timeout
+   tridge@samba.org, June 2005
+
+   attempt to be as portable as possible (fighting posix all the way)
+*/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+static void usage(void)
+{
+       printf("usage: timelimit <time> <command>\n");
+}
+
+static void sig_alrm(int sig)
+{
+       kill(0, SIGKILL);
+       exit(1);
+}
+
+static void sig_term_kill(int sig)
+{
+       static int c = 0;
+
+       if (c > 2) {
+               kill(0, SIGKILL);
+               exit(0);
+       }
+
+       c++;
+}
+
+static void sig_term(int sig)
+{
+       kill(0, SIGTERM);
+       signal(SIGTERM, sig_term_kill);
+}
+
+int main(int argc, char *argv[])
+{
+       int maxtime, ret=1;
+
+       if (argc < 3) {
+               usage();
+               exit(1);
+       }
+
+       if (setpgrp() == -1) {
+               perror("setpgrp");
+               exit(1);
+       }
+
+       maxtime = atoi(argv[1]);
+       signal(SIGALRM, sig_alrm);
+       alarm(maxtime);
+       signal(SIGTERM, sig_term);
+
+       if (fork() == 0) {
+               execvp(argv[2], argv+2);
+       }
+
+       do {
+               int status;
+               pid_t pid = wait(&status);
+               if (pid != -1) {
+                       ret = WEXITSTATUS(status);
+               } else if (errno == ECHILD) {
+                       break;
+               }
+       } while (1);
+
+       exit(ret);
+}