summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhem Raj <kraj@mvista.com>2009-04-07 06:23:17 +0000
committerKhem Raj <kraj@mvista.com>2009-04-07 06:23:17 +0000
commit6e9282175daabf0803bc6f63273fc3a4920de4fc (patch)
treed198cffd22d179b9b8ca8d4633474570c943efea
parent8058fb1efc594a771ae7c356c33abbf4bac28ff6 (diff)
downloaduClibc-alpine-6e9282175daabf0803bc6f63273fc3a4920de4fc.tar.bz2
uClibc-alpine-6e9282175daabf0803bc6f63273fc3a4920de4fc.tar.xz
Merged revisions 25971,26002 via svnmerge from
svn+ssh://svn.uclibc.org/svn/trunk/uClibc ........ r25971 | vapier | 2009-04-05 23:40:57 -0700 (Sun, 05 Apr 2009) | 1 line apply getline() fix from linux kernel ........ r26002 | vapier | 2009-04-06 22:52:48 -0700 (Mon, 06 Apr 2009) | 1 line implement daemon() using clone() on no-mmu systems as suggested by Jamie Lokier ........
-rw-r--r--extra/scripts/unifdef.c9
-rw-r--r--include/unistd.h2
-rw-r--r--libc/unistd/Makefile.in2
-rw-r--r--libc/unistd/daemon.c34
4 files changed, 30 insertions, 17 deletions
diff --git a/extra/scripts/unifdef.c b/extra/scripts/unifdef.c
index 0eb0d0900..5d1171e4d 100644
--- a/extra/scripts/unifdef.c
+++ b/extra/scripts/unifdef.c
@@ -206,7 +206,7 @@ static void done(void);
static void error(const char *);
static int findsym(const char *);
static void flushline(bool);
-static Linetype getline(void);
+static Linetype get_line(void);
static Linetype ifeval(const char **);
static void ignoreoff(void);
static void ignoreon(void);
@@ -517,7 +517,7 @@ process(void)
for (;;) {
linenum++;
- lineval = getline();
+ lineval = get_line();
trans_table[ifstate[depth]][lineval]();
debug("process %s -> %s depth %d",
linetype_name[lineval],
@@ -531,7 +531,7 @@ process(void)
* help from skipcomment().
*/
static Linetype
-getline(void)
+get_line(void)
{
const char *cp;
int cursym;
@@ -889,9 +889,8 @@ skipcomment(const char *cp)
cp += 1;
} else if (strchr(" \t", *cp) != NULL) {
cp += 1;
- } else {
+ } else
return (cp);
- }
continue;
case CXX_COMMENT:
if (strncmp(cp, "\n", 1) == 0) {
diff --git a/include/unistd.h b/include/unistd.h
index 30621634a..2fc4e447b 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -956,12 +956,10 @@ extern void endusershell (void) __THROW; /* Discard cached info. */
extern void setusershell (void) __THROW; /* Rewind and re-read the file. */
-#ifdef __ARCH_USE_MMU__
/* Put the program in the background, and dissociate from the controlling
terminal. If NOCHDIR is zero, do `chdir ("/")'. If NOCLOSE is zero,
redirects stdin, stdout, and stderr to /dev/null. */
extern int daemon (int __nochdir, int __noclose) __THROW __wur;
-#endif
#endif /* Use BSD || X/Open. */
diff --git a/libc/unistd/Makefile.in b/libc/unistd/Makefile.in
index f6ef98cf0..b4c5130a9 100644
--- a/libc/unistd/Makefile.in
+++ b/libc/unistd/Makefile.in
@@ -14,8 +14,6 @@ CSRC := $(filter-out exec.c,$(CSRC))
ifeq ($(ARCH_USE_MMU),y)
CSRC := $(filter-out __exec_alloc.c,$(CSRC))
-else
-CSRC := $(filter-out daemon.c,$(CSRC))
endif
ifeq ($(UCLIBC_HAS_GNU_GETOPT),y)
diff --git a/libc/unistd/daemon.c b/libc/unistd/daemon.c
index f5b9f44f6..0e439d1ba 100644
--- a/libc/unistd/daemon.c
+++ b/libc/unistd/daemon.c
@@ -61,18 +61,36 @@
/* libc_hidden_proto(chdir) */
/* libc_hidden_proto(fork) */
+#ifndef __ARCH_USE_MMU__
+#include <sys/syscall.h>
+/* use clone() to get fork() like behavior here -- we just want to disassociate
+ * from the controlling terminal
+ */
+static inline pid_t fork_parent(void)
+{
+ register unsigned long ret = INTERNAL_SYSCALL(clone, wtf, 2, CLONE_VM, 0);
+ if (ret != -1 && ret != 0)
+ /* parent needs to die now w/out touching stack */
+ INTERNAL_SYSCALL(exit, wtf, 0);
+ return ret;
+}
+#else
+static inline pid_t fork_parent(void)
+{
+ switch (fork()) {
+ case -1: return -1;
+ case 0: return 0;
+ default: _exit(0);
+ }
+}
+#endif
+
int daemon( int nochdir, int noclose )
{
int fd;
- switch (fork()) {
- case -1:
- return(-1);
- case 0:
- break;
- default:
- _exit(0);
- }
+ if (fork_parent() == -1)
+ return -1;
if (setsid() == -1)
return(-1);