mirror of https://github.com/aria2/aria2
				
				
				
			2009-10-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Use AC_FUNC_FORK. Replaced HAVE_FORK with HAVE_WORKING_FORK. * configure.ac * src/daemon.ccpull/1/head
							parent
							
								
									cb69cca675
								
							
						
					
					
						commit
						1af73e306c
					
				| 
						 | 
				
			
			@ -1,3 +1,9 @@
 | 
			
		|||
2009-10-10  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Use AC_FUNC_FORK. Replaced HAVE_FORK with HAVE_WORKING_FORK.
 | 
			
		||||
	* configure.ac
 | 
			
		||||
	* src/daemon.cc
 | 
			
		||||
 | 
			
		||||
2009-10-10  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Don't set localedir manually. Leave it to autoconf.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								config.h.in
								
								
								
								
							
							
						
						
									
										18
									
								
								config.h.in
								
								
								
								
							| 
						 | 
				
			
			@ -457,6 +457,12 @@
 | 
			
		|||
/* Define to 1 if you have the `usleep' function. */
 | 
			
		||||
#undef HAVE_USLEEP
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `vfork' function. */
 | 
			
		||||
#undef HAVE_VFORK
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the <vfork.h> header file. */
 | 
			
		||||
#undef HAVE_VFORK_H
 | 
			
		||||
 | 
			
		||||
/* Define to 1 or 0, depending whether the compiler supports simple visibility
 | 
			
		||||
   declarations. */
 | 
			
		||||
#undef HAVE_VISIBILITY
 | 
			
		||||
| 
						 | 
				
			
			@ -479,6 +485,12 @@
 | 
			
		|||
/* Define if you have the 'wint_t' type. */
 | 
			
		||||
#undef HAVE_WINT_T
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if `fork' works. */
 | 
			
		||||
#undef HAVE_WORKING_FORK
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if `vfork' works. */
 | 
			
		||||
#undef HAVE_WORKING_VFORK
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the <ws2tcpip.h> header file. */
 | 
			
		||||
#undef HAVE_WS2TCPIP_H
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -690,6 +702,9 @@
 | 
			
		|||
/* Define to `long int' if <sys/types.h> does not define. */
 | 
			
		||||
#undef off_t
 | 
			
		||||
 | 
			
		||||
/* Define to `int' if <sys/types.h> does not define. */
 | 
			
		||||
#undef pid_t
 | 
			
		||||
 | 
			
		||||
/* Define as the type of the result of subtracting two pointers, if the system
 | 
			
		||||
   doesn't define it. */
 | 
			
		||||
#undef ptrdiff_t
 | 
			
		||||
| 
						 | 
				
			
			@ -720,6 +735,9 @@
 | 
			
		|||
   <inttypes.h> don't define. */
 | 
			
		||||
#undef uintmax_t
 | 
			
		||||
 | 
			
		||||
/* Define as `fork' if `vfork' does not work. */
 | 
			
		||||
#undef vfork
 | 
			
		||||
 | 
			
		||||
/* Define to empty if the keyword `volatile' does not work. Warning: valid
 | 
			
		||||
   code using `volatile' can become incorrect without. Disable with care. */
 | 
			
		||||
#undef volatile
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14054,11 +14054,235 @@ fi
 | 
			
		|||
done
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ac_fn_cxx_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
 | 
			
		||||
if test "x$ac_cv_type_pid_t" = x""yes; then :
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
 | 
			
		||||
cat >>confdefs.h <<_ACEOF
 | 
			
		||||
#define pid_t int
 | 
			
		||||
_ACEOF
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for ac_header in vfork.h
 | 
			
		||||
do :
 | 
			
		||||
  ac_fn_cxx_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
 | 
			
		||||
if test "x$ac_cv_header_vfork_h" = x""yes; then :
 | 
			
		||||
  cat >>confdefs.h <<_ACEOF
 | 
			
		||||
#define HAVE_VFORK_H 1
 | 
			
		||||
_ACEOF
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
for ac_func in fork vfork
 | 
			
		||||
do :
 | 
			
		||||
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 | 
			
		||||
ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
 | 
			
		||||
eval as_val=\$$as_ac_var
 | 
			
		||||
   if test "x$as_val" = x""yes; then :
 | 
			
		||||
  cat >>confdefs.h <<_ACEOF
 | 
			
		||||
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 | 
			
		||||
_ACEOF
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if test "x$ac_cv_func_fork" = xyes; then
 | 
			
		||||
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
 | 
			
		||||
$as_echo_n "checking for working fork... " >&6; }
 | 
			
		||||
if test "${ac_cv_func_fork_works+set}" = set; then :
 | 
			
		||||
  $as_echo_n "(cached) " >&6
 | 
			
		||||
else
 | 
			
		||||
  if test "$cross_compiling" = yes; then :
 | 
			
		||||
  ac_cv_func_fork_works=cross
 | 
			
		||||
else
 | 
			
		||||
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 | 
			
		||||
/* end confdefs.h.  */
 | 
			
		||||
$ac_includes_default
 | 
			
		||||
int
 | 
			
		||||
main ()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	  /* By Ruediger Kuhlmann. */
 | 
			
		||||
	  return fork () < 0;
 | 
			
		||||
 | 
			
		||||
  ;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
_ACEOF
 | 
			
		||||
if ac_fn_cxx_try_run "$LINENO"; then :
 | 
			
		||||
  ac_cv_func_fork_works=yes
 | 
			
		||||
else
 | 
			
		||||
  ac_cv_func_fork_works=no
 | 
			
		||||
fi
 | 
			
		||||
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
 | 
			
		||||
  conftest.$ac_objext conftest.beam conftest.$ac_ext
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
 | 
			
		||||
$as_echo "$ac_cv_func_fork_works" >&6; }
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
  ac_cv_func_fork_works=$ac_cv_func_fork
 | 
			
		||||
fi
 | 
			
		||||
if test "x$ac_cv_func_fork_works" = xcross; then
 | 
			
		||||
  case $host in
 | 
			
		||||
    *-*-amigaos* | *-*-msdosdjgpp*)
 | 
			
		||||
      # Override, as these systems have only a dummy fork() stub
 | 
			
		||||
      ac_cv_func_fork_works=no
 | 
			
		||||
      ;;
 | 
			
		||||
    *)
 | 
			
		||||
      ac_cv_func_fork_works=yes
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
 | 
			
		||||
$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
 | 
			
		||||
fi
 | 
			
		||||
ac_cv_func_vfork_works=$ac_cv_func_vfork
 | 
			
		||||
if test "x$ac_cv_func_vfork" = xyes; then
 | 
			
		||||
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
 | 
			
		||||
$as_echo_n "checking for working vfork... " >&6; }
 | 
			
		||||
if test "${ac_cv_func_vfork_works+set}" = set; then :
 | 
			
		||||
  $as_echo_n "(cached) " >&6
 | 
			
		||||
else
 | 
			
		||||
  if test "$cross_compiling" = yes; then :
 | 
			
		||||
  ac_cv_func_vfork_works=cross
 | 
			
		||||
else
 | 
			
		||||
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 | 
			
		||||
/* end confdefs.h.  */
 | 
			
		||||
/* Thanks to Paul Eggert for this test.  */
 | 
			
		||||
$ac_includes_default
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#ifdef HAVE_VFORK_H
 | 
			
		||||
# include <vfork.h>
 | 
			
		||||
#endif
 | 
			
		||||
/* On some sparc systems, changes by the child to local and incoming
 | 
			
		||||
   argument registers are propagated back to the parent.  The compiler
 | 
			
		||||
   is told about this with #include <vfork.h>, but some compilers
 | 
			
		||||
   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
 | 
			
		||||
   static variable whose address is put into a register that is
 | 
			
		||||
   clobbered by the vfork.  */
 | 
			
		||||
static void
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
sparc_address_test (int arg)
 | 
			
		||||
# else
 | 
			
		||||
sparc_address_test (arg) int arg;
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
  static pid_t child;
 | 
			
		||||
  if (!child) {
 | 
			
		||||
    child = vfork ();
 | 
			
		||||
    if (child < 0) {
 | 
			
		||||
      perror ("vfork");
 | 
			
		||||
      _exit(2);
 | 
			
		||||
    }
 | 
			
		||||
    if (!child) {
 | 
			
		||||
      arg = getpid();
 | 
			
		||||
      write(-1, "", 0);
 | 
			
		||||
      _exit (arg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main ()
 | 
			
		||||
{
 | 
			
		||||
  pid_t parent = getpid ();
 | 
			
		||||
  pid_t child;
 | 
			
		||||
 | 
			
		||||
  sparc_address_test (0);
 | 
			
		||||
 | 
			
		||||
  child = vfork ();
 | 
			
		||||
 | 
			
		||||
  if (child == 0) {
 | 
			
		||||
    /* Here is another test for sparc vfork register problems.  This
 | 
			
		||||
       test uses lots of local variables, at least as many local
 | 
			
		||||
       variables as main has allocated so far including compiler
 | 
			
		||||
       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
 | 
			
		||||
       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
 | 
			
		||||
       reuse the register of parent for one of the local variables,
 | 
			
		||||
       since it will think that parent can't possibly be used any more
 | 
			
		||||
       in this routine.  Assigning to the local variable will thus
 | 
			
		||||
       munge parent in the parent process.  */
 | 
			
		||||
    pid_t
 | 
			
		||||
      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
 | 
			
		||||
      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
 | 
			
		||||
    /* Convince the compiler that p..p7 are live; otherwise, it might
 | 
			
		||||
       use the same hardware register for all 8 local variables.  */
 | 
			
		||||
    if (p != p1 || p != p2 || p != p3 || p != p4
 | 
			
		||||
	|| p != p5 || p != p6 || p != p7)
 | 
			
		||||
      _exit(1);
 | 
			
		||||
 | 
			
		||||
    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
 | 
			
		||||
       from child file descriptors.  If the child closes a descriptor
 | 
			
		||||
       before it execs or exits, this munges the parent's descriptor
 | 
			
		||||
       as well.  Test for this by closing stdout in the child.  */
 | 
			
		||||
    _exit(close(fileno(stdout)) != 0);
 | 
			
		||||
  } else {
 | 
			
		||||
    int status;
 | 
			
		||||
    struct stat st;
 | 
			
		||||
 | 
			
		||||
    while (wait(&status) != child)
 | 
			
		||||
      ;
 | 
			
		||||
    return (
 | 
			
		||||
	 /* Was there some problem with vforking?  */
 | 
			
		||||
	 child < 0
 | 
			
		||||
 | 
			
		||||
	 /* Did the child fail?  (This shouldn't happen.)  */
 | 
			
		||||
	 || status
 | 
			
		||||
 | 
			
		||||
	 /* Did the vfork/compiler bug occur?  */
 | 
			
		||||
	 || parent != getpid()
 | 
			
		||||
 | 
			
		||||
	 /* Did the file descriptor bug occur?  */
 | 
			
		||||
	 || fstat(fileno(stdout), &st) != 0
 | 
			
		||||
	 );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
_ACEOF
 | 
			
		||||
if ac_fn_cxx_try_run "$LINENO"; then :
 | 
			
		||||
  ac_cv_func_vfork_works=yes
 | 
			
		||||
else
 | 
			
		||||
  ac_cv_func_vfork_works=no
 | 
			
		||||
fi
 | 
			
		||||
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
 | 
			
		||||
  conftest.$ac_objext conftest.beam conftest.$ac_ext
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
 | 
			
		||||
$as_echo "$ac_cv_func_vfork_works" >&6; }
 | 
			
		||||
 | 
			
		||||
fi;
 | 
			
		||||
if test "x$ac_cv_func_fork_works" = xcross; then
 | 
			
		||||
  ac_cv_func_vfork_works=$ac_cv_func_vfork
 | 
			
		||||
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
 | 
			
		||||
$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test "x$ac_cv_func_vfork_works" = xyes; then
 | 
			
		||||
 | 
			
		||||
$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
 | 
			
		||||
$as_echo "#define vfork fork" >>confdefs.h
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
if test "x$ac_cv_func_fork_works" = xyes; then
 | 
			
		||||
 | 
			
		||||
$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for ac_func in __argz_count \
 | 
			
		||||
                __argz_next \
 | 
			
		||||
                __argz_stringify \
 | 
			
		||||
                atexit \
 | 
			
		||||
                fork \
 | 
			
		||||
                ftruncate \
 | 
			
		||||
                getcwd \
 | 
			
		||||
                gethostbyaddr \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -251,11 +251,11 @@ AC_FUNC_SELECT_ARGTYPES
 | 
			
		|||
AC_FUNC_STAT
 | 
			
		||||
AC_FUNC_STRFTIME
 | 
			
		||||
AC_FUNC_VPRINTF
 | 
			
		||||
AC_FUNC_FORK
 | 
			
		||||
AC_CHECK_FUNCS([__argz_count \
 | 
			
		||||
                __argz_next \
 | 
			
		||||
                __argz_stringify \
 | 
			
		||||
                atexit \
 | 
			
		||||
                fork \
 | 
			
		||||
                ftruncate \
 | 
			
		||||
                getcwd \
 | 
			
		||||
                gethostbyaddr \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ namespace aria2 {
 | 
			
		|||
int daemon(int nochdir, int noclose)
 | 
			
		||||
{
 | 
			
		||||
  pid_t pid;
 | 
			
		||||
#ifdef HAVE_FORK
 | 
			
		||||
#ifdef HAVE_WORKING_FORK
 | 
			
		||||
  pid = fork();
 | 
			
		||||
  if(pid == -1) {
 | 
			
		||||
    return -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +75,7 @@ int daemon(int nochdir, int noclose)
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif // HAVE_FORK
 | 
			
		||||
#endif // HAVE_WORKING_FORK
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue