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>
|
2009-10-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Don't set localedir manually. Leave it to autoconf.
|
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. */
|
/* Define to 1 if you have the `usleep' function. */
|
||||||
#undef HAVE_USLEEP
|
#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
|
/* Define to 1 or 0, depending whether the compiler supports simple visibility
|
||||||
declarations. */
|
declarations. */
|
||||||
#undef HAVE_VISIBILITY
|
#undef HAVE_VISIBILITY
|
||||||
|
@ -479,6 +485,12 @@
|
||||||
/* Define if you have the 'wint_t' type. */
|
/* Define if you have the 'wint_t' type. */
|
||||||
#undef HAVE_WINT_T
|
#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. */
|
/* Define to 1 if you have the <ws2tcpip.h> header file. */
|
||||||
#undef HAVE_WS2TCPIP_H
|
#undef HAVE_WS2TCPIP_H
|
||||||
|
|
||||||
|
@ -690,6 +702,9 @@
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
/* Define to `long int' if <sys/types.h> does not define. */
|
||||||
#undef off_t
|
#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
|
/* Define as the type of the result of subtracting two pointers, if the system
|
||||||
doesn't define it. */
|
doesn't define it. */
|
||||||
#undef ptrdiff_t
|
#undef ptrdiff_t
|
||||||
|
@ -720,6 +735,9 @@
|
||||||
<inttypes.h> don't define. */
|
<inttypes.h> don't define. */
|
||||||
#undef uintmax_t
|
#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
|
/* Define to empty if the keyword `volatile' does not work. Warning: valid
|
||||||
code using `volatile' can become incorrect without. Disable with care. */
|
code using `volatile' can become incorrect without. Disable with care. */
|
||||||
#undef volatile
|
#undef volatile
|
||||||
|
|
|
@ -14054,11 +14054,235 @@ fi
|
||||||
done
|
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 \
|
for ac_func in __argz_count \
|
||||||
__argz_next \
|
__argz_next \
|
||||||
__argz_stringify \
|
__argz_stringify \
|
||||||
atexit \
|
atexit \
|
||||||
fork \
|
|
||||||
ftruncate \
|
ftruncate \
|
||||||
getcwd \
|
getcwd \
|
||||||
gethostbyaddr \
|
gethostbyaddr \
|
||||||
|
|
|
@ -251,11 +251,11 @@ AC_FUNC_SELECT_ARGTYPES
|
||||||
AC_FUNC_STAT
|
AC_FUNC_STAT
|
||||||
AC_FUNC_STRFTIME
|
AC_FUNC_STRFTIME
|
||||||
AC_FUNC_VPRINTF
|
AC_FUNC_VPRINTF
|
||||||
|
AC_FUNC_FORK
|
||||||
AC_CHECK_FUNCS([__argz_count \
|
AC_CHECK_FUNCS([__argz_count \
|
||||||
__argz_next \
|
__argz_next \
|
||||||
__argz_stringify \
|
__argz_stringify \
|
||||||
atexit \
|
atexit \
|
||||||
fork \
|
|
||||||
ftruncate \
|
ftruncate \
|
||||||
getcwd \
|
getcwd \
|
||||||
gethostbyaddr \
|
gethostbyaddr \
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace aria2 {
|
||||||
int daemon(int nochdir, int noclose)
|
int daemon(int nochdir, int noclose)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
#ifdef HAVE_FORK
|
#ifdef HAVE_WORKING_FORK
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if(pid == -1) {
|
if(pid == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -75,7 +75,7 @@ int daemon(int nochdir, int noclose)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // HAVE_FORK
|
#endif // HAVE_WORKING_FORK
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue