The HyperNews Linux KHG Discussion Pages

## the solution to the problem

  Forum: How System Calls Work on Linux/i86
  Re: the directory /usr/src/libc/syscall/ (vijay gupta)
  Re: ...no longer exists. (Michael K. Johnson)
  Keywords: system call libc
  Date: Tue, 21 May 1996 23:05:39 GMT
  From: Vijay Gupta <vijay@crhc.uiuc.edu>

Hi everybody,
           Thanks to the two people who replied to me on
    this. The solution to the problem is as follows :
the khg seems to be wrong in assuming there was a directory syscall in the C library. Instead, there is a directory sysdeps/linux, which contains, among others, socketpair.c, which defines the function
    int
    socketpair(int family, int type, int protocol, int sockvec[2])
    {
        unsigned long args[4];
        args[0] = family;
        args[1] = type;
        args[2] = protocol;
        args[3] = (unsigned long)sockvec;
        return socketcall(SYS_SOCKETPAIR, args);
    }
If you look at /usr/src/linux/net/socket.c, you will find a good match with that code. The socketcall function then is not defined by a C macro, but by an assembler macro in __socketcall.S:
    SYSCALL__ (socketcall, 2)
        ret
    Please note that the socket system calls are special because of that level
    of indirection. The wait(2) function is declared as
    #ifdef __SVR4_I386_ABI_L1__
    #define wait4   __wait4
    #else
    static inline
    _syscall4(__pid_t,wait4,__pid_t,pid,__WAIT_STATUS_DEFN,status,int,options,struc
    t
     rusage *,ru)
    #endif
    __pid_t
    __wait(__WAIT_STATUS_DEFN wait_stat)
    {
        return wait4(WAIT_ANY, wait_stat, 0, NULL);
    }
(so it is actually wait(3) in Linux, with wait4(2) being the system call). ------------------------
    Thanks again,
           Vijay