mescc: Mes C Library: Add x86_64 libc+gnu support.
[mes.git] / lib / linux / gnu.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <sys/resource.h>
22
23 int
24 link (char const *old_name, char const *new_name)
25 {
26   return _sys_call2 (SYS_link, (long)old_name, (long)new_name);
27 }
28
29 pid_t
30 getpid ()
31 {
32   return _sys_call (SYS_getpid);
33 }
34
35 uid_t
36 getuid ()
37 {
38   return _sys_call (SYS_getuid);
39 }
40
41 int
42 kill (pid_t pid, int signum)
43 {
44   return _sys_call2 (SYS_kill, (long)pid, (long)signum);
45 }
46
47 int
48 rename (char const *old_name, char const *new_name)
49 {
50   return _sys_call2 (SYS_rename, (long)old_name, (long)new_name);
51 }
52
53 int
54 mkdir (char const *file_name, mode_t mode)
55 {
56   return _sys_call2 (SYS_mkdir, (long)file_name, (long)mode);
57 }
58
59 int
60 dup (int old)
61 {
62   return _sys_call1 (SYS_dup, (long)old);
63 }
64
65 gid_t
66 getgid ()
67 {
68   return _sys_call (SYS_getgid);
69 }
70
71 #if __i386__
72 #if __MESC__
73 void *
74 signal (int signum, void * action)
75 #else
76 sighandler_t
77 signal (int signum, sighandler_t action)
78 #endif
79 {
80   return _sys_call2 (SYS_signal, signum, action);
81 }
82 #elif __x86_64__
83 sighandler_t
84 signal (int signum, sighandler_t action)
85 {
86   sighandler_t old;
87   _sys_call3 (SYS_rt_sigaction, signum, action, &old);
88   return old;
89 }
90 #else
91 #error arch not supported
92 #endif
93
94 int
95 fcntl (int filedes, int command, ...)
96 {
97   va_list ap;
98   va_start (ap, command);
99   int data = va_arg (ap, int);
100   int r = _sys_call3 (SYS_fcntl, (long)filedes, (long)command, (long)data);
101   va_end (ap);
102   return r;
103 }
104
105 int
106 pipe (int filedes[2])
107 {
108   return _sys_call1 (SYS_pipe, (long)filedes);
109 }
110
111 int
112 dup2 (int old, int new)
113 {
114   return _sys_call2 (SYS_dup2, (long)old, (long)new);
115 }
116
117 int
118 getrusage (int processes, struct rusage *rusage)
119 {
120   return _sys_call2 (SYS_getrusage, (long)processes, (long)rusage);
121 }
122
123 int
124 lstat (char const *file_name, struct stat *statbuf)
125 {
126   return _sys_call2 (SYS_lstat, (long)file_name, (long)statbuf);
127 }
128
129 int
130 nanosleep (const struct timespec *requested_time,
131            struct timespec *remaining)
132 {
133   return _sys_call2 (SYS_nanosleep, (long)requested_time, (long)remaining);
134 }
135
136 int
137 setitimer (int which, struct itimerval const *new,
138           struct itimerval *old)
139 {
140   return _sys_call3 (SYS_setitimer, (long)which, (long)new, (long)old);
141 }
142
143 int
144 fstat (int fd, struct stat *statbuf)
145 {
146   return _sys_call2 (SYS_fstat, (long)fd, (long)statbuf);
147 }