OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [stdlib/] [system.c] - Diff between revs 1325 and 1765

Only display areas with differences | Details | Blame | View Log

Rev 1325 Rev 1765
#include <stdio.h>
#include <stdio.h>
#include <stddef.h>
#include <stddef.h>
#include <signal.h>
#include <signal.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/wait.h>
 
 
/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */
#include <sys/syscall.h>
#include <sys/syscall.h>
#if ! defined __NR_vfork
#if ! defined __NR_vfork
#define vfork fork      
#define vfork fork      
#endif
#endif
 
 
int __libc_system(char *command)
int __libc_system(char *command)
{
{
        int wait_val, pid;
        int wait_val, pid;
        __sighandler_t save_quit, save_int, save_chld;
        __sighandler_t save_quit, save_int, save_chld;
 
 
        if (command == 0)
        if (command == 0)
                return 1;
                return 1;
 
 
        save_quit = signal(SIGQUIT, SIG_IGN);
        save_quit = signal(SIGQUIT, SIG_IGN);
        save_int = signal(SIGINT, SIG_IGN);
        save_int = signal(SIGINT, SIG_IGN);
        save_chld = signal(SIGCHLD, SIG_DFL);
        save_chld = signal(SIGCHLD, SIG_DFL);
 
 
        if ((pid = vfork()) < 0) {
        if ((pid = vfork()) < 0) {
                signal(SIGQUIT, save_quit);
                signal(SIGQUIT, save_quit);
                signal(SIGINT, save_int);
                signal(SIGINT, save_int);
                signal(SIGCHLD, save_chld);
                signal(SIGCHLD, save_chld);
                return -1;
                return -1;
        }
        }
        if (pid == 0) {
        if (pid == 0) {
                signal(SIGQUIT, SIG_DFL);
                signal(SIGQUIT, SIG_DFL);
                signal(SIGINT, SIG_DFL);
                signal(SIGINT, SIG_DFL);
                signal(SIGCHLD, SIG_DFL);
                signal(SIGCHLD, SIG_DFL);
 
 
                execl("/bin/sh", "sh", "-c", command, (char *) 0);
                execl("/bin/sh", "sh", "-c", command, (char *) 0);
                _exit(127);
                _exit(127);
        }
        }
        /* Signals are not absolutly guarenteed with vfork */
        /* Signals are not absolutly guarenteed with vfork */
        signal(SIGQUIT, SIG_IGN);
        signal(SIGQUIT, SIG_IGN);
        signal(SIGINT, SIG_IGN);
        signal(SIGINT, SIG_IGN);
 
 
#if 0
#if 0
        printf("Waiting for child %d\n", pid);
        printf("Waiting for child %d\n", pid);
#endif
#endif
 
 
        if (wait4(pid, &wait_val, 0, 0) == -1)
        if (wait4(pid, &wait_val, 0, 0) == -1)
                wait_val = -1;
                wait_val = -1;
 
 
        signal(SIGQUIT, save_quit);
        signal(SIGQUIT, save_quit);
        signal(SIGINT, save_int);
        signal(SIGINT, save_int);
        signal(SIGCHLD, save_chld);
        signal(SIGCHLD, save_chld);
        return wait_val;
        return wait_val;
}
}
weak_alias(__libc_system, system)
weak_alias(__libc_system, system)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.