*** empty log message ***
[bpt/guile.git] / libguile / posix.c
CommitLineData
1146b6cd 1/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
0f2d19dd
JB
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
82892bed
JB
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
0f2d19dd
JB
17 *
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
20 *
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
26 *
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
29 *
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
37 *
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
82892bed 40 * If you do not wish that, delete this exception notice. */
0f2d19dd
JB
41\f
42
43#include <stdio.h>
44#include "_scm.h"
20e6290e 45#include "fports.h"
20e6290e 46#include "scmsigs.h"
20e6290e 47#include "feature.h"
0f2d19dd 48
20e6290e 49#include "posix.h"
0f2d19dd
JB
50\f
51
02b754d3
GH
52#ifdef HAVE_STRING_H
53#include <string.h>
54#endif
0f2d19dd
JB
55#ifdef TIME_WITH_SYS_TIME
56# include <sys/time.h>
57# include <time.h>
58#else
59# if HAVE_SYS_TIME_H
60# include <sys/time.h>
61# else
62# include <time.h>
63# endif
64#endif
65
66#ifdef HAVE_UNISTD_H
67#include <unistd.h>
95b88819
GH
68#else
69#ifndef ttyname
70extern char *ttyname();
71#endif
0f2d19dd
JB
72#endif
73
3594582b 74#ifdef LIBC_H_WITH_UNISTD_H
bab0f4e5
JB
75#include <libc.h>
76#endif
77
8cc71382 78#include <sys/types.h>
0f2d19dd
JB
79#include <sys/stat.h>
80#include <fcntl.h>
81
82#include <pwd.h>
83
84#if HAVE_SYS_WAIT_H
85# include <sys/wait.h>
86#endif
87#ifndef WEXITSTATUS
88# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
89#endif
90#ifndef WIFEXITED
91# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
92#endif
93
94#include <signal.h>
95
0f2d19dd
JB
96extern FILE *popen ();
97extern char ** environ;
98
99#include <grp.h>
100#include <sys/utsname.h>
101
102#if HAVE_DIRENT_H
103# include <dirent.h>
104# define NAMLEN(dirent) strlen((dirent)->d_name)
105#else
106# define dirent direct
107# define NAMLEN(dirent) (dirent)->d_namlen
108# if HAVE_SYS_NDIR_H
109# include <sys/ndir.h>
110# endif
111# if HAVE_SYS_DIR_H
112# include <sys/dir.h>
113# endif
114# if HAVE_NDIR_H
115# include <ndir.h>
116# endif
117#endif
118
0f2d19dd
JB
119#ifdef HAVE_SETLOCALE
120#include <locale.h>
121#endif
122
bab0f4e5
JB
123/* Some Unix systems don't define these. CPP hair is dangerous, but
124 this seems safe enough... */
125#ifndef R_OK
126#define R_OK 4
127#endif
128
129#ifndef W_OK
130#define W_OK 2
131#endif
132
133#ifndef X_OK
134#define X_OK 1
135#endif
136
137#ifndef F_OK
138#define F_OK 0
139#endif
398609a5
JB
140
141/* On NextStep, <utime.h> doesn't define struct utime, unless we
142 #define _POSIX_SOURCE before #including it. I think this is less
143 of a kludge than defining struct utimbuf ourselves. */
144#ifdef UTIMBUF_NEEDS_POSIX
145#define _POSIX_SOURCE
146#endif
147
148#ifdef HAVE_SYS_UTIME_H
149#include <sys/utime.h>
150#endif
151
152#ifdef HAVE_UTIME_H
153#include <utime.h>
154#endif
155
156/* Please don't add any more #includes or #defines here. The hack
157 above means that _POSIX_SOURCE may be #defined, which will
158 encourage header files to do strange things. */
159
0f2d19dd
JB
160\f
161
162
f93ddd39 163SCM_PROC (s_pipe, "pipe", 0, 0, 0, scm_pipe);
1cc91f1b 164
0f2d19dd 165SCM
f93ddd39 166scm_pipe ()
0f2d19dd
JB
167{
168 int fd[2], rv;
169 FILE *f_rd, *f_wt;
170 SCM p_rd, p_wt;
02b754d3
GH
171 struct scm_port_table * ptr;
172 struct scm_port_table * ptw;
173
0f2d19dd
JB
174 SCM_NEWCELL (p_rd);
175 SCM_NEWCELL (p_wt);
176 rv = pipe (fd);
177 if (rv)
f93ddd39 178 scm_syserror (s_pipe);
0f2d19dd
JB
179 f_rd = fdopen (fd[0], "r");
180 if (!f_rd)
181 {
182 SCM_SYSCALL (close (fd[0]));
183 SCM_SYSCALL (close (fd[1]));
f93ddd39 184 scm_syserror (s_pipe);
0f2d19dd
JB
185 }
186 f_wt = fdopen (fd[1], "w");
187 if (!f_wt)
188 {
189 int en;
190 en = errno;
191 fclose (f_rd);
192 SCM_SYSCALL (close (fd[1]));
02b754d3 193 errno = en;
f93ddd39 194 scm_syserror (s_pipe);
0f2d19dd 195 }
02b754d3
GH
196 ptr = scm_add_to_port_table (p_rd);
197 ptw = scm_add_to_port_table (p_wt);
198 SCM_SETPTAB_ENTRY (p_rd, ptr);
199 SCM_SETPTAB_ENTRY (p_wt, ptw);
a6c64c3c
MD
200 SCM_SETCAR (p_rd, scm_tc16_fport | scm_mode_bits ("r"));
201 SCM_SETCAR (p_wt, scm_tc16_fport | scm_mode_bits ("w"));
02b754d3
GH
202 SCM_SETSTREAM (p_rd, (SCM)f_rd);
203 SCM_SETSTREAM (p_wt, (SCM)f_wt);
204
0f2d19dd
JB
205 SCM_ALLOW_INTS;
206 return scm_cons (p_rd, p_wt);
207}
208
209
0e958795 210#ifdef HAVE_GETGROUPS
f93ddd39 211SCM_PROC (s_getgroups, "getgroups", 0, 0, 0, scm_getgroups);
1cc91f1b 212
0f2d19dd 213SCM
f93ddd39 214scm_getgroups()
0f2d19dd
JB
215{
216 SCM grps, ans;
217 int ngroups = getgroups (0, NULL);
02b754d3 218 if (!ngroups)
f93ddd39 219 scm_syserror (s_getgroups);
0f2d19dd
JB
220 SCM_NEWCELL(grps);
221 SCM_DEFER_INTS;
222 {
223 GETGROUPS_T *groups;
224 int val;
225
bab0f4e5 226 groups = (GETGROUPS_T *) scm_must_malloc(ngroups * sizeof(GETGROUPS_T),
f93ddd39 227 s_getgroups);
0f2d19dd
JB
228 val = getgroups(ngroups, groups);
229 if (val < 0)
230 {
231 scm_must_free((char *)groups);
f93ddd39 232 scm_syserror (s_getgroups);
0f2d19dd
JB
233 }
234 SCM_SETCHARS(grps, groups); /* set up grps as a GC protect */
235 SCM_SETLENGTH(grps, 0L + ngroups * sizeof(GETGROUPS_T), scm_tc7_string);
236 SCM_ALLOW_INTS;
237 ans = scm_make_vector(SCM_MAKINUM(ngroups), SCM_UNDEFINED, SCM_BOOL_F);
238 while (--ngroups >= 0) SCM_VELTS(ans)[ngroups] = SCM_MAKINUM(groups[ngroups]);
239 SCM_SETCHARS(grps, groups); /* to make sure grps stays around. */
240 return ans;
241 }
242}
0e958795 243#endif
0f2d19dd
JB
244
245
f93ddd39 246SCM_PROC (s_getpwuid, "getpw", 0, 1, 0, scm_getpwuid);
1cc91f1b 247
0f2d19dd 248SCM
f93ddd39 249scm_getpwuid (user)
0f2d19dd 250 SCM user;
0f2d19dd
JB
251{
252 SCM result;
253 struct passwd *entry;
254 SCM *ve;
255
256 result = scm_make_vector (SCM_MAKINUM (7), SCM_UNSPECIFIED, SCM_BOOL_F);
257 ve = SCM_VELTS (result);
258 if (SCM_UNBNDP (user) || SCM_FALSEP (user))
259 {
260 SCM_DEFER_INTS;
261 SCM_SYSCALL (entry = getpwent ());
3d781d49
JB
262 if (! entry)
263 {
264 SCM_ALLOW_INTS;
265 return SCM_BOOL_F;
266 }
0f2d19dd
JB
267 }
268 else if (SCM_INUMP (user))
269 {
270 SCM_DEFER_INTS;
271 entry = getpwuid (SCM_INUM (user));
272 }
273 else
274 {
f93ddd39 275 SCM_ASSERT (SCM_NIMP (user) && SCM_ROSTRINGP (user), user, SCM_ARG1, s_getpwuid);
0f2d19dd
JB
276 if (SCM_SUBSTRP (user))
277 user = scm_makfromstr (SCM_ROCHARS (user), SCM_ROLENGTH (user), 0);
278 SCM_DEFER_INTS;
279 entry = getpwnam (SCM_ROCHARS (user));
280 }
281 if (!entry)
f93ddd39 282 scm_syserror (s_getpwuid);
02b754d3 283
0f2d19dd
JB
284 ve[0] = scm_makfrom0str (entry->pw_name);
285 ve[1] = scm_makfrom0str (entry->pw_passwd);
286 ve[2] = scm_ulong2num ((unsigned long) entry->pw_uid);
287 ve[3] = scm_ulong2num ((unsigned long) entry->pw_gid);
288 ve[4] = scm_makfrom0str (entry->pw_gecos);
289 if (!entry->pw_dir)
290 ve[5] = scm_makfrom0str ("");
291 else
292 ve[5] = scm_makfrom0str (entry->pw_dir);
293 if (!entry->pw_shell)
294 ve[6] = scm_makfrom0str ("");
295 else
296 ve[6] = scm_makfrom0str (entry->pw_shell);
297 SCM_ALLOW_INTS;
298 return result;
299}
300
301
0e958795 302#ifdef HAVE_SETPWENT
0f2d19dd 303SCM_PROC (s_setpwent, "setpw", 0, 1, 0, scm_setpwent);
1cc91f1b 304
0f2d19dd
JB
305SCM
306scm_setpwent (arg)
307 SCM arg;
0f2d19dd
JB
308{
309 if (SCM_UNBNDP (arg) || SCM_FALSEP (arg))
310 endpwent ();
311 else
312 setpwent ();
313 return SCM_UNSPECIFIED;
314}
0e958795 315#endif
0f2d19dd
JB
316
317
318
319/* Combines getgrgid and getgrnam. */
f93ddd39 320SCM_PROC (s_getgrgid, "getgr", 0, 1, 0, scm_getgrgid);
1cc91f1b 321
0f2d19dd 322SCM
f93ddd39 323scm_getgrgid (name)
0f2d19dd 324 SCM name;
0f2d19dd
JB
325{
326 SCM result;
327 struct group *entry;
328 SCM *ve;
329 result = scm_make_vector (SCM_MAKINUM (4), SCM_UNSPECIFIED, SCM_BOOL_F);
330 ve = SCM_VELTS (result);
331 SCM_DEFER_INTS;
332 if (SCM_UNBNDP (name) || (name == SCM_BOOL_F))
3d781d49
JB
333 {
334 SCM_SYSCALL (entry = getgrent ());
335 if (! entry)
336 {
337 SCM_ALLOW_INTS;
338 return SCM_BOOL_F;
339 }
340 }
0f2d19dd
JB
341 else if (SCM_INUMP (name))
342 SCM_SYSCALL (entry = getgrgid (SCM_INUM (name)));
343 else
344 {
ae2fa5bc
GH
345 SCM_ASSERT (SCM_NIMP (name) && SCM_ROSTRINGP (name), name, SCM_ARG1,
346 s_getgrgid);
89958ad0 347 SCM_COERCE_SUBSTR (name);
ae2fa5bc 348 SCM_SYSCALL (entry = getgrnam (SCM_ROCHARS (name)));
0f2d19dd
JB
349 }
350 if (!entry)
f93ddd39 351 scm_syserror (s_getgrgid);
02b754d3 352
0f2d19dd
JB
353 ve[0] = scm_makfrom0str (entry->gr_name);
354 ve[1] = scm_makfrom0str (entry->gr_passwd);
355 ve[2] = scm_ulong2num ((unsigned long) entry->gr_gid);
356 ve[3] = scm_makfromstrs (-1, entry->gr_mem);
357 SCM_ALLOW_INTS;
358 return result;
359}
360
361
362
363SCM_PROC (s_setgrent, "setgr", 0, 1, 0, scm_setgrent);
1cc91f1b 364
0f2d19dd
JB
365SCM
366scm_setgrent (arg)
367 SCM arg;
0f2d19dd
JB
368{
369 if (SCM_UNBNDP (arg) || SCM_FALSEP (arg))
370 endgrent ();
371 else
372 setgrent ();
373 return SCM_UNSPECIFIED;
374}
375
376
377
f93ddd39 378SCM_PROC (s_kill, "kill", 2, 0, 0, scm_kill);
1cc91f1b 379
0f2d19dd 380SCM
f93ddd39 381scm_kill (pid, sig)
0f2d19dd
JB
382 SCM pid;
383 SCM sig;
0f2d19dd 384{
f93ddd39
GH
385 SCM_ASSERT (SCM_INUMP (pid), pid, SCM_ARG1, s_kill);
386 SCM_ASSERT (SCM_INUMP (sig), sig, SCM_ARG2, s_kill);
0f2d19dd 387 /* Signal values are interned in scm_init_posix(). */
02b754d3 388 if (kill ((int) SCM_INUM (pid), (int) SCM_INUM (sig)) != 0)
f93ddd39 389 scm_syserror (s_kill);
02b754d3 390 return SCM_UNSPECIFIED;
0f2d19dd
JB
391}
392
393
394
f93ddd39 395SCM_PROC (s_waitpid, "waitpid", 1, 1, 0, scm_waitpid);
1cc91f1b 396
0f2d19dd 397SCM
f93ddd39 398scm_waitpid (pid, options)
0f2d19dd
JB
399 SCM pid;
400 SCM options;
0f2d19dd 401{
1fd838af 402#ifdef HAVE_WAITPID
0f2d19dd
JB
403 int i;
404 int status;
405 int ioptions;
f93ddd39 406 SCM_ASSERT (SCM_INUMP (pid), pid, SCM_ARG1, s_waitpid);
0f2d19dd
JB
407 if (SCM_UNBNDP (options))
408 ioptions = 0;
409 else
410 {
f93ddd39 411 SCM_ASSERT (SCM_INUMP (options), options, SCM_ARG2, s_waitpid);
0f2d19dd
JB
412 /* Flags are interned in scm_init_posix. */
413 ioptions = SCM_INUM (options);
414 }
415 SCM_SYSCALL (i = waitpid (SCM_INUM (pid), &status, ioptions));
02b754d3 416 if (i == -1)
f93ddd39 417 scm_syserror (s_waitpid);
02b754d3 418 return scm_cons (SCM_MAKINUM (0L + i), SCM_MAKINUM (0L + status));
1fd838af 419#else
f93ddd39 420 scm_sysmissing (s_waitpid);
1fd838af
JB
421 /* not reached. */
422 return SCM_BOOL_F;
423#endif
0f2d19dd
JB
424}
425
67ec3667
GH
426SCM_PROC (s_status_exit_val, "status:exit-val", 1, 0, 0, scm_status_exit_val);
427SCM
428scm_status_exit_val (status)
429 SCM status;
430{
e67dc2be
JB
431 int lstatus;
432
67ec3667 433 SCM_ASSERT (SCM_INUMP (status), status, SCM_ARG1,s_status_exit_val);
e67dc2be
JB
434
435 /* On Ultrix, the WIF... macros assume their argument is an lvalue;
436 go figure. SCM_INUM does not yield an lvalue. */
437 lstatus = SCM_INUM (status);
438 if (WIFEXITED (lstatus))
439 return (SCM_MAKINUM (WEXITSTATUS (lstatus)));
67ec3667
GH
440 else
441 return SCM_BOOL_F;
442}
e67dc2be 443
67ec3667
GH
444SCM_PROC (s_status_term_sig, "status:term-sig", 1, 0, 0, scm_status_term_sig);
445SCM
446scm_status_term_sig (status)
447 SCM status;
448{
e67dc2be
JB
449 int lstatus;
450
67ec3667 451 SCM_ASSERT (SCM_INUMP (status), status, SCM_ARG1,s_status_term_sig);
e67dc2be
JB
452
453 lstatus = SCM_INUM (status);
454 if (WIFSIGNALED (lstatus))
455 return SCM_MAKINUM (WTERMSIG (lstatus));
67ec3667
GH
456 else
457 return SCM_BOOL_F;
458}
0f2d19dd 459
67ec3667
GH
460SCM_PROC (s_status_stop_sig, "status:stop-sig", 1, 0, 0, scm_status_stop_sig);
461SCM
462scm_status_stop_sig (status)
463 SCM status;
464{
e67dc2be
JB
465 int lstatus;
466
67ec3667 467 SCM_ASSERT (SCM_INUMP (status), status, SCM_ARG1,s_status_stop_sig);
e67dc2be
JB
468
469 lstatus = SCM_INUM (status);
470 if (WIFSTOPPED (lstatus))
471 return SCM_MAKINUM (WSTOPSIG (lstatus));
67ec3667
GH
472 else
473 return SCM_BOOL_F;
474}
0f2d19dd
JB
475
476SCM_PROC (s_getppid, "getppid", 0, 0, 0, scm_getppid);
1cc91f1b 477
0f2d19dd
JB
478SCM
479scm_getppid ()
0f2d19dd
JB
480{
481 return SCM_MAKINUM (0L + getppid ());
482}
483
484
485
486SCM_PROC (s_getuid, "getuid", 0, 0, 0, scm_getuid);
1cc91f1b 487
0f2d19dd
JB
488SCM
489scm_getuid ()
0f2d19dd
JB
490{
491 return SCM_MAKINUM (0L + getuid ());
492}
493
494
495
496SCM_PROC (s_getgid, "getgid", 0, 0, 0, scm_getgid);
1cc91f1b 497
0f2d19dd
JB
498SCM
499scm_getgid ()
0f2d19dd
JB
500{
501 return SCM_MAKINUM (0L + getgid ());
502}
503
504
505
506SCM_PROC (s_geteuid, "geteuid", 0, 0, 0, scm_geteuid);
1cc91f1b 507
0f2d19dd
JB
508SCM
509scm_geteuid ()
0f2d19dd
JB
510{
511#ifdef HAVE_GETEUID
512 return SCM_MAKINUM (0L + geteuid ());
513#else
514 return SCM_MAKINUM (0L + getuid ());
515#endif
516}
517
518
519
520SCM_PROC (s_getegid, "getegid", 0, 0, 0, scm_getegid);
1cc91f1b 521
0f2d19dd
JB
522SCM
523scm_getegid ()
0f2d19dd
JB
524{
525#ifdef HAVE_GETEUID
526 return SCM_MAKINUM (0L + getegid ());
527#else
528 return SCM_MAKINUM (0L + getgid ());
529#endif
530}
531
532
f93ddd39 533SCM_PROC (s_setuid, "setuid", 1, 0, 0, scm_setuid);
1cc91f1b 534
0f2d19dd 535SCM
f93ddd39 536scm_setuid (id)
0f2d19dd 537 SCM id;
0f2d19dd 538{
f93ddd39 539 SCM_ASSERT (SCM_INUMP (id), id, SCM_ARG1, s_setuid);
02b754d3 540 if (setuid (SCM_INUM (id)) != 0)
f93ddd39 541 scm_syserror (s_setuid);
02b754d3 542 return SCM_UNSPECIFIED;
0f2d19dd
JB
543}
544
f93ddd39 545SCM_PROC (s_setgid, "setgid", 1, 0, 0, scm_setgid);
1cc91f1b 546
0f2d19dd 547SCM
f93ddd39 548scm_setgid (id)
0f2d19dd 549 SCM id;
0f2d19dd 550{
f93ddd39 551 SCM_ASSERT (SCM_INUMP (id), id, SCM_ARG1, s_setgid);
02b754d3 552 if (setgid (SCM_INUM (id)) != 0)
f93ddd39 553 scm_syserror (s_setgid);
02b754d3 554 return SCM_UNSPECIFIED;
0f2d19dd
JB
555}
556
f93ddd39 557SCM_PROC (s_seteuid, "seteuid", 1, 0, 0, scm_seteuid);
1cc91f1b 558
0f2d19dd 559SCM
f93ddd39 560scm_seteuid (id)
0f2d19dd 561 SCM id;
0f2d19dd 562{
02b754d3
GH
563 int rv;
564
f93ddd39 565 SCM_ASSERT (SCM_INUMP (id), id, SCM_ARG1, s_seteuid);
0f2d19dd 566#ifdef HAVE_SETEUID
02b754d3 567 rv = seteuid (SCM_INUM (id));
0f2d19dd 568#else
02b754d3 569 rv = setuid (SCM_INUM (id));
0f2d19dd 570#endif
02b754d3 571 if (rv != 0)
f93ddd39 572 scm_syserror (s_seteuid);
02b754d3 573 return SCM_UNSPECIFIED;
0f2d19dd
JB
574}
575
0e958795 576#ifdef HAVE_SETEGID
f93ddd39 577SCM_PROC (s_setegid, "setegid", 1, 0, 0, scm_setegid);
1cc91f1b 578
0f2d19dd 579SCM
f93ddd39 580scm_setegid (id)
0f2d19dd 581 SCM id;
0f2d19dd 582{
02b754d3
GH
583 int rv;
584
f93ddd39 585 SCM_ASSERT (SCM_INUMP (id), id, SCM_ARG1, s_setegid);
0f2d19dd 586#ifdef HAVE_SETEUID
02b754d3 587 rv = setegid (SCM_INUM (id));
0f2d19dd 588#else
02b754d3 589 rv = setgid (SCM_INUM (id));
0f2d19dd 590#endif
02b754d3 591 if (rv != 0)
f93ddd39 592 scm_syserror (s_setegid);
02b754d3
GH
593 return SCM_UNSPECIFIED;
594
0f2d19dd 595}
0e958795 596#endif
0f2d19dd
JB
597
598SCM_PROC (s_getpgrp, "getpgrp", 0, 0, 0, scm_getpgrp);
599SCM
600scm_getpgrp ()
601{
602 int (*fn)();
4625e44f 603 fn = (int (*) ()) getpgrp;
0f2d19dd
JB
604 return SCM_MAKINUM (fn (0));
605}
606
f93ddd39 607SCM_PROC (s_setpgid, "setpgid", 2, 0, 0, scm_setpgid);
0f2d19dd
JB
608SCM
609scm_setpgid (pid, pgid)
610 SCM pid, pgid;
611{
1fd838af 612#ifdef HAVE_SETPGID
f93ddd39
GH
613 SCM_ASSERT (SCM_INUMP (pid), pid, SCM_ARG1, s_setpgid);
614 SCM_ASSERT (SCM_INUMP (pgid), pgid, SCM_ARG2, s_setpgid);
02b754d3
GH
615 /* FIXME(?): may be known as setpgrp. */
616 if (setpgid (SCM_INUM (pid), SCM_INUM (pgid)) != 0)
f93ddd39 617 scm_syserror (s_setpgid);
02b754d3 618 return SCM_UNSPECIFIED;
1fd838af 619#else
f93ddd39 620 scm_sysmissing (s_setpgid);
1fd838af
JB
621 /* not reached. */
622 return SCM_BOOL_F;
623#endif
0f2d19dd
JB
624}
625
f93ddd39 626SCM_PROC (s_setsid, "setsid", 0, 0, 0, scm_setsid);
0f2d19dd
JB
627SCM
628scm_setsid ()
629{
1fd838af 630#ifdef HAVE_SETSID
0f2d19dd 631 pid_t sid = setsid ();
02b754d3 632 if (sid == -1)
f93ddd39 633 scm_syserror (s_setsid);
02b754d3 634 return SCM_UNSPECIFIED;
1fd838af 635#else
f93ddd39 636 scm_sysmissing (s_setsid);
1fd838af
JB
637 /* not reached. */
638 return SCM_BOOL_F;
639#endif
0f2d19dd
JB
640}
641
02b754d3 642SCM_PROC (s_ttyname, "ttyname", 1, 0, 0, scm_ttyname);
1cc91f1b 643
0f2d19dd
JB
644SCM
645scm_ttyname (port)
646 SCM port;
0f2d19dd
JB
647{
648 char *ans;
649 int fd;
650 SCM_ASSERT (SCM_NIMP (port) && SCM_OPPORTP (port), port, SCM_ARG1, s_ttyname);
651 if (scm_tc16_fport != SCM_TYP16 (port))
652 return SCM_BOOL_F;
653 fd = fileno ((FILE *)SCM_STREAM (port));
02b754d3 654 if (fd == -1)
52859adf 655 scm_syserror (s_ttyname);
02b754d3
GH
656 SCM_SYSCALL (ans = ttyname (fd));
657 if (!ans)
52859adf 658 scm_syserror (s_ttyname);
0f2d19dd 659 /* ans could be overwritten by another call to ttyname */
02b754d3 660 return (scm_makfrom0str (ans));
0f2d19dd
JB
661}
662
663
f93ddd39 664SCM_PROC (s_ctermid, "ctermid", 0, 0, 0, scm_ctermid);
0f2d19dd
JB
665SCM
666scm_ctermid ()
667{
1fd838af 668#ifdef HAVE_CTERMID
0f2d19dd 669 char *result = ctermid (NULL);
02b754d3 670 if (*result == '\0')
f93ddd39 671 scm_syserror (s_ctermid);
02b754d3 672 return scm_makfrom0str (result);
1fd838af 673#else
f93ddd39 674 scm_sysmissing (s_ctermid);
1fd838af
JB
675 /* not reached. */
676 return SCM_BOOL_F;
677#endif
0f2d19dd
JB
678}
679
f93ddd39 680SCM_PROC (s_tcgetpgrp, "tcgetpgrp", 1, 0, 0, scm_tcgetpgrp);
0f2d19dd
JB
681SCM
682scm_tcgetpgrp (port)
683 SCM port;
684{
1fd838af 685#ifdef HAVE_TCGETPGRP
0f2d19dd
JB
686 int fd;
687 pid_t pgid;
f93ddd39 688 SCM_ASSERT (SCM_NIMP (port) && SCM_OPFPORTP (port), port, SCM_ARG1, s_tcgetpgrp);
0f2d19dd
JB
689 fd = fileno ((FILE *)SCM_STREAM (port));
690 if (fd == -1 || (pgid = tcgetpgrp (fd)) == -1)
f93ddd39 691 scm_syserror (s_tcgetpgrp);
02b754d3 692 return SCM_MAKINUM (pgid);
1fd838af 693#else
f93ddd39 694 scm_sysmissing (s_tcgetpgrp);
1fd838af
JB
695 /* not reached. */
696 return SCM_BOOL_F;
697#endif
0f2d19dd
JB
698}
699
f93ddd39 700SCM_PROC (s_tcsetpgrp, "tcsetpgrp", 2, 0, 0, scm_tcsetpgrp);
0f2d19dd
JB
701SCM
702scm_tcsetpgrp (port, pgid)
703 SCM port, pgid;
704{
1fd838af 705#ifdef HAVE_TCSETPGRP
0f2d19dd 706 int fd;
f93ddd39
GH
707 SCM_ASSERT (SCM_NIMP (port) && SCM_OPFPORTP (port), port, SCM_ARG1, s_tcsetpgrp);
708 SCM_ASSERT (SCM_INUMP (pgid), pgid, SCM_ARG2, s_tcsetpgrp);
0f2d19dd
JB
709 fd = fileno ((FILE *)SCM_STREAM (port));
710 if (fd == -1 || tcsetpgrp (fd, SCM_INUM (pgid)) == -1)
f93ddd39 711 scm_syserror (s_tcsetpgrp);
02b754d3 712 return SCM_UNSPECIFIED;
1fd838af 713#else
f93ddd39 714 scm_sysmissing (s_tcsetpgrp);
1fd838af
JB
715 /* not reached. */
716 return SCM_BOOL_F;
717#endif
0f2d19dd
JB
718}
719
720/* Copy exec args from an SCM vector into a new C array. */
1cc91f1b 721
0f2d19dd 722static char **
6afcd3b2 723scm_convert_exec_args (SCM args, int pos, char *subr)
0f2d19dd
JB
724{
725 char **execargv;
726 int num_args;
727 int i;
6afcd3b2
GH
728
729 SCM_ASSERT (SCM_NULLP (args)
730 || (SCM_NIMP (args) && SCM_CONSP (args)),
731 args, pos, subr);
0f2d19dd
JB
732 SCM_DEFER_INTS;
733 num_args = scm_ilength (args);
734 execargv = (char **)
6afcd3b2 735 scm_must_malloc ((num_args + 1) * sizeof (char *), subr);
0f2d19dd
JB
736 for (i = 0; SCM_NNULLP (args); args = SCM_CDR (args), ++i)
737 {
738 scm_sizet len;
739 char *dst;
740 char *src;
ae2fa5bc 741 SCM_ASSERT (SCM_NIMP (SCM_CAR (args)) && SCM_ROSTRINGP (SCM_CAR (args)),
6afcd3b2 742 SCM_CAR (args), SCM_ARGn, subr);
0f2d19dd 743 len = 1 + SCM_ROLENGTH (SCM_CAR (args));
6afcd3b2 744 dst = (char *) scm_must_malloc ((long) len, subr);
0f2d19dd
JB
745 src = SCM_ROCHARS (SCM_CAR (args));
746 while (len--)
747 dst[len] = src[len];
748 execargv[i] = dst;
749 }
750 execargv[i] = 0;
751 SCM_ALLOW_INTS;
752 return execargv;
753}
754
6afcd3b2 755SCM_PROC (s_execl, "execl", 1, 0, 1, scm_execl);
1cc91f1b 756
0f2d19dd 757SCM
6afcd3b2
GH
758scm_execl (filename, args)
759 SCM filename, args;
0f2d19dd
JB
760{
761 char **execargv;
6afcd3b2
GH
762 SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
763 SCM_ARG1, s_execl);
764 SCM_COERCE_SUBSTR (filename);
765 execargv = scm_convert_exec_args (args, SCM_ARG2, s_execl);
0f2d19dd 766 execv (SCM_ROCHARS (filename), execargv);
f93ddd39 767 scm_syserror (s_execl);
02b754d3
GH
768 /* not reached. */
769 return SCM_BOOL_F;
0f2d19dd
JB
770}
771
6afcd3b2 772SCM_PROC (s_execlp, "execlp", 1, 0, 1, scm_execlp);
1cc91f1b 773
0f2d19dd 774SCM
6afcd3b2
GH
775scm_execlp (filename, args)
776 SCM filename, args;
0f2d19dd
JB
777{
778 char **execargv;
ae2fa5bc
GH
779 SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
780 SCM_ARG1, s_execlp);
6afcd3b2
GH
781 SCM_COERCE_SUBSTR (filename);
782 execargv = scm_convert_exec_args (args, SCM_ARG2, s_execlp);
0f2d19dd 783 execvp (SCM_ROCHARS (filename), execargv);
f93ddd39 784 scm_syserror (s_execlp);
02b754d3
GH
785 /* not reached. */
786 return SCM_BOOL_F;
0f2d19dd
JB
787}
788
6afcd3b2
GH
789static char **
790environ_list_to_c (SCM envlist, int arg, char *proc)
791{
792 int num_strings;
793 char **result;
794 int i = 0;
795
796 SCM_REDEFER_INTS;
797 SCM_ASSERT (SCM_NULLP (envlist)
798 || (SCM_NIMP (envlist) && SCM_CONSP (envlist)),
799 envlist, arg, proc);
800 num_strings = scm_ilength (envlist);
801 result = (char **) malloc ((num_strings + 1) * sizeof (char *));
802 if (result == NULL)
803 scm_memory_error (proc);
804 while (SCM_NNULLP (envlist))
805 {
806 int len;
807 char *src;
808
809 SCM_ASSERT (SCM_NIMP (SCM_CAR (envlist))
810 && SCM_ROSTRINGP (SCM_CAR (envlist)),
811 envlist, arg, proc);
812 len = 1 + SCM_ROLENGTH (SCM_CAR (envlist));
813 result[i] = malloc ((long) len);
814 if (result[i] == NULL)
815 scm_memory_error (proc);
816 src = SCM_ROCHARS (SCM_CAR (envlist));
817 while (len--)
818 result[i][len] = src[len];
819 envlist = SCM_CDR (envlist);
820 i++;
821 }
822 result[i] = 0;
823 SCM_REALLOW_INTS;
824 return result;
825}
826
827SCM_PROC (s_execle, "execle", 2, 0, 1, scm_execle);
828
829SCM
830scm_execle (filename, env, args)
831 SCM filename, env, args;
832{
833 char **execargv;
834 char **exec_env;
835
836 SCM_ASSERT (SCM_NIMP (filename) && SCM_ROSTRINGP (filename), filename,
837 SCM_ARG1, s_execle);
838 SCM_COERCE_SUBSTR (filename);
839
840 execargv = scm_convert_exec_args (args, SCM_ARG1, s_execle);
841 exec_env = environ_list_to_c (env, SCM_ARG2, s_execle);
842 execve (SCM_ROCHARS (filename), execargv, exec_env);
843 scm_syserror (s_execle);
844 /* not reached. */
845 return SCM_BOOL_F;
846}
847
063e05be 848SCM_PROC (s_fork, "primitive-fork", 0, 0, 0, scm_fork);
1cc91f1b 849
0f2d19dd 850SCM
f93ddd39 851scm_fork()
0f2d19dd 852{
bab0f4e5 853 int pid;
0f2d19dd
JB
854 pid = fork ();
855 if (pid == -1)
f93ddd39 856 scm_syserror (s_fork);
02b754d3 857 return SCM_MAKINUM (0L+pid);
0f2d19dd
JB
858}
859
860
f93ddd39 861SCM_PROC (s_uname, "uname", 0, 0, 0, scm_uname);
1cc91f1b 862
0f2d19dd 863SCM
f93ddd39 864scm_uname ()
0f2d19dd
JB
865{
866#ifdef HAVE_UNAME
867 struct utsname buf;
868 SCM ans = scm_make_vector(SCM_MAKINUM(5), SCM_UNSPECIFIED, SCM_BOOL_F);
869 SCM *ve = SCM_VELTS (ans);
a574455a 870 SCM_DEFER_INTS;
e1a191a8 871 if (uname (&buf) < 0)
a574455a 872 scm_syserror (s_uname);
0f2d19dd
JB
873 ve[0] = scm_makfrom0str (buf.sysname);
874 ve[1] = scm_makfrom0str (buf.nodename);
875 ve[2] = scm_makfrom0str (buf.release);
876 ve[3] = scm_makfrom0str (buf.version);
877 ve[4] = scm_makfrom0str (buf.machine);
878/*
02b754d3 879 a linux special?
0f2d19dd
JB
880 ve[5] = scm_makfrom0str (buf.domainname);
881*/
a574455a 882 SCM_ALLOW_INTS;
0f2d19dd
JB
883 return ans;
884#else
f93ddd39 885 scm_sysmissing (s_uname);
02b754d3
GH
886 /* not reached. */
887 return SCM_BOOL_F;
0f2d19dd
JB
888#endif
889}
890
891SCM_PROC (s_environ, "environ", 0, 1, 0, scm_environ);
1cc91f1b 892
0f2d19dd
JB
893SCM
894scm_environ (env)
895 SCM env;
0f2d19dd
JB
896{
897 if (SCM_UNBNDP (env))
898 return scm_makfromstrs (-1, environ);
899 else
900 {
0f2d19dd 901 char **new_environ;
6afcd3b2
GH
902
903 SCM_DEFER_INTS;
904 new_environ = environ_list_to_c (env, SCM_ARG1, s_environ);
0f2d19dd
JB
905 /* Free the old environment, except when called for the first
906 * time.
907 */
908 {
909 char **ep;
910 static int first = 1;
911 if (!first)
912 {
913 for (ep = environ; *ep != NULL; ep++)
19468eff
GH
914 free (*ep);
915 free ((char *) environ);
0f2d19dd
JB
916 }
917 first = 0;
918 }
919 environ = new_environ;
6afcd3b2 920 SCM_ALLOW_INTS;
0f2d19dd
JB
921 return SCM_UNSPECIFIED;
922 }
923}
924
9ee5fce4
MD
925#ifdef L_tmpnam
926
927SCM_PROC (s_tmpnam, "tmpnam", 0, 0, 0, scm_tmpnam);
928
929SCM scm_tmpnam()
930{
931 char name[L_tmpnam];
932 SCM_SYSCALL (tmpnam (name););
933 return scm_makfrom0str (name);
934}
935#endif
0f2d19dd
JB
936
937SCM_PROC (s_open_pipe, "open-pipe", 2, 0, 0, scm_open_pipe);
1cc91f1b 938
0f2d19dd
JB
939SCM
940scm_open_pipe (pipestr, modes)
941 SCM pipestr;
942 SCM modes;
0f2d19dd
JB
943{
944 FILE *f;
945 register SCM z;
02b754d3
GH
946 struct scm_port_table * pt;
947
ae2fa5bc
GH
948 SCM_ASSERT (SCM_NIMP (pipestr) && SCM_ROSTRINGP (pipestr), pipestr,
949 SCM_ARG1, s_open_pipe);
0f2d19dd 950 if (SCM_SUBSTRP (pipestr))
ae2fa5bc
GH
951 pipestr = scm_makfromstr (SCM_ROCHARS (pipestr),
952 SCM_ROLENGTH (pipestr), 0);
953 SCM_ASSERT (SCM_NIMP (modes) && SCM_ROSTRINGP (modes), modes, SCM_ARG2,
954 s_open_pipe);
0f2d19dd
JB
955 if (SCM_SUBSTRP (modes))
956 modes = scm_makfromstr (SCM_ROCHARS (modes), SCM_ROLENGTH (modes), 0);
957 SCM_NEWCELL (z);
958 SCM_DEFER_INTS;
0f2d19dd 959 SCM_SYSCALL (f = popen (SCM_ROCHARS (pipestr), SCM_ROCHARS (modes)));
0f2d19dd 960 if (!f)
52859adf 961 scm_syserror (s_open_pipe);
02b754d3
GH
962 pt = scm_add_to_port_table (z);
963 SCM_SETPTAB_ENTRY (z, pt);
a6c64c3c
MD
964 SCM_SETCAR (z, scm_tc16_pipe | SCM_OPN
965 | (strchr (SCM_ROCHARS (modes), 'r') ? SCM_RDNG : SCM_WRTNG));
02b754d3 966 SCM_SETSTREAM (z, (SCM)f);
0f2d19dd
JB
967 SCM_ALLOW_INTS;
968 return z;
969}
970
19468eff 971SCM_PROC (s_close_pipe, "close-pipe", 1, 0, 0, scm_close_pipe);
0f2d19dd 972
19468eff
GH
973SCM
974scm_close_pipe (port)
975 SCM port;
0f2d19dd 976{
19468eff 977 int rv;
1cc91f1b 978
19468eff
GH
979 SCM_ASSERT (SCM_NIMP (port) && SCM_TYP16(port) == scm_tc16_pipe
980 && SCM_OPENP (port), port, SCM_ARG1, s_close_pipe);
981 SCM_DEFER_INTS;
982 rv = pclose ((FILE *) SCM_STREAM (port));
983 if (rv == -1)
984 scm_syserror (s_close_pipe);
985 SCM_ALLOW_INTS;
986 return SCM_MAKINUM (rv);
0f2d19dd
JB
987}
988
f93ddd39 989SCM_PROC (s_utime, "utime", 1, 2, 0, scm_utime);
1cc91f1b 990
0f2d19dd 991SCM
f93ddd39 992scm_utime (pathname, actime, modtime)
0f2d19dd
JB
993 SCM pathname;
994 SCM actime;
995 SCM modtime;
0f2d19dd
JB
996{
997 int rv;
998 struct utimbuf utm_tmp;
999
89958ad0 1000 SCM_ASSERT (SCM_NIMP (pathname) && SCM_ROSTRINGP (pathname), pathname,
ae2fa5bc 1001 SCM_ARG1, s_utime);
0f2d19dd 1002
89958ad0 1003 SCM_COERCE_SUBSTR (pathname);
0f2d19dd
JB
1004 if (SCM_UNBNDP (actime))
1005 SCM_SYSCALL (time (&utm_tmp.actime));
1006 else
f93ddd39 1007 utm_tmp.actime = scm_num2ulong (actime, (char *) SCM_ARG2, s_utime);
0f2d19dd
JB
1008
1009 if (SCM_UNBNDP (modtime))
1010 SCM_SYSCALL (time (&utm_tmp.modtime));
1011 else
f93ddd39 1012 utm_tmp.modtime = scm_num2ulong (modtime, (char *) SCM_ARG3, s_utime);
0f2d19dd 1013
89958ad0 1014 SCM_SYSCALL (rv = utime (SCM_ROCHARS (pathname), &utm_tmp));
02b754d3 1015 if (rv != 0)
f93ddd39 1016 scm_syserror (s_utime);
02b754d3 1017 return SCM_UNSPECIFIED;
0f2d19dd
JB
1018}
1019
f93ddd39 1020SCM_PROC (s_access, "access?", 2, 0, 0, scm_access);
1cc91f1b 1021
0f2d19dd 1022SCM
f93ddd39 1023scm_access (path, how)
0f2d19dd
JB
1024 SCM path;
1025 SCM how;
0f2d19dd
JB
1026{
1027 int rv;
1028
ae2fa5bc
GH
1029 SCM_ASSERT (SCM_NIMP (path) && SCM_ROSTRINGP (path), path, SCM_ARG1,
1030 s_access);
0f2d19dd
JB
1031 if (SCM_SUBSTRP (path))
1032 path = scm_makfromstr (SCM_ROCHARS (path), SCM_ROLENGTH (path), 0);
f93ddd39 1033 SCM_ASSERT (SCM_INUMP (how), how, SCM_ARG2, s_access);
0f2d19dd
JB
1034 rv = access (SCM_ROCHARS (path), SCM_INUM (how));
1035 return rv ? SCM_BOOL_F : SCM_BOOL_T;
1036}
1037
0f2d19dd 1038SCM_PROC (s_getpid, "getpid", 0, 0, 0, scm_getpid);
1cc91f1b 1039
0f2d19dd
JB
1040SCM
1041scm_getpid ()
0f2d19dd
JB
1042{
1043 return SCM_MAKINUM ((unsigned long) getpid ());
1044}
1045
f93ddd39 1046SCM_PROC (s_putenv, "putenv", 1, 0, 0, scm_putenv);
1cc91f1b 1047
0f2d19dd 1048SCM
f93ddd39 1049scm_putenv (str)
0f2d19dd 1050 SCM str;
0f2d19dd 1051{
f93ddd39 1052 int rv;
19468eff 1053 char *ptr;
f93ddd39 1054
89958ad0 1055 SCM_ASSERT (SCM_NIMP (str) && SCM_ROSTRINGP (str), str, SCM_ARG1, s_putenv);
19468eff
GH
1056 /* must make a new copy to be left in the environment, safe from gc. */
1057 ptr = malloc (SCM_LENGTH (str) + 1);
1058 if (ptr == NULL)
1059 scm_memory_error (s_putenv);
89958ad0
JB
1060 strncpy (ptr, SCM_ROCHARS (str), SCM_LENGTH (str));
1061 ptr[SCM_LENGTH(str)] = 0;
19468eff 1062 rv = putenv (ptr);
f93ddd39
GH
1063 if (rv < 0)
1064 scm_syserror (s_putenv);
1065 return SCM_UNSPECIFIED;
0f2d19dd
JB
1066}
1067
02b754d3 1068SCM_PROC (s_setlocale, "setlocale", 1, 1, 0, scm_setlocale);
1cc91f1b 1069
0f2d19dd
JB
1070SCM
1071scm_setlocale (category, locale)
1072 SCM category;
1073 SCM locale;
0f2d19dd
JB
1074{
1075#ifdef HAVE_SETLOCALE
1076 char *clocale;
1077 char *rv;
1078
1079 SCM_ASSERT (SCM_INUMP (category), category, SCM_ARG1, s_setlocale);
1080 if (SCM_UNBNDP (locale))
1081 {
1082 clocale = NULL;
1083 }
1084 else
1085 {
89958ad0 1086 SCM_ASSERT (SCM_NIMP (locale) && SCM_ROSTRINGP (locale), locale,
ae2fa5bc 1087 SCM_ARG2, s_setlocale);
89958ad0
JB
1088 SCM_COERCE_SUBSTR (locale);
1089 clocale = SCM_ROCHARS (locale);
0f2d19dd
JB
1090 }
1091
1092 rv = setlocale (SCM_INUM (category), clocale);
02b754d3 1093 if (rv == NULL)
52859adf 1094 scm_syserror (s_setlocale);
02b754d3 1095 return scm_makfrom0str (rv);
0f2d19dd 1096#else
52859adf 1097 scm_sysmissing (s_setlocale);
02b754d3 1098 /* not reached. */
0f2d19dd
JB
1099 return SCM_BOOL_F;
1100#endif
1101}
1102
19468eff 1103SCM_PROC (s_mknod, "mknod", 4, 0, 0, scm_mknod);
1cc91f1b 1104
0f2d19dd 1105SCM
19468eff 1106scm_mknod(path, type, perms, dev)
0f2d19dd 1107 SCM path;
19468eff
GH
1108 SCM type;
1109 SCM perms;
0f2d19dd 1110 SCM dev;
0f2d19dd
JB
1111{
1112#ifdef HAVE_MKNOD
1113 int val;
19468eff
GH
1114 char *p;
1115 int ctype;
1116
1117 SCM_ASSERT (SCM_NIMP(path) && SCM_ROSTRINGP(path), path, SCM_ARG1, s_mknod);
1118 SCM_ASSERT (SCM_NIMP(type) && SCM_SYMBOLP (type), type, SCM_ARG2, s_mknod);
1119 SCM_ASSERT (SCM_INUMP (perms), perms, SCM_ARG3, s_mknod);
1120 SCM_ASSERT (SCM_INUMP(dev), dev, SCM_ARG4, s_mknod);
89958ad0 1121 SCM_COERCE_SUBSTR (path);
19468eff
GH
1122
1123 p = SCM_CHARS (type);
1124 if (strcmp (p, "regular") == 0)
1125 ctype = S_IFREG;
1126 else if (strcmp (p, "directory") == 0)
1127 ctype = S_IFDIR;
1128 else if (strcmp (p, "symlink") == 0)
1129 ctype = S_IFLNK;
1130 else if (strcmp (p, "block-special") == 0)
1131 ctype = S_IFBLK;
1132 else if (strcmp (p, "char-special") == 0)
1133 ctype = S_IFCHR;
1134 else if (strcmp (p, "fifo") == 0)
1135 ctype = S_IFIFO;
1136 else if (strcmp (p, "socket") == 0)
1137 ctype = S_IFSOCK;
1138 else
1139 scm_out_of_range (s_mknod, type);
1140
1141 SCM_DEFER_INTS;
1142 SCM_SYSCALL (val = mknod(SCM_ROCHARS(path), ctype | SCM_INUM (perms),
1143 SCM_INUM (dev)));
02b754d3 1144 if (val != 0)
f93ddd39 1145 scm_syserror (s_mknod);
19468eff 1146 SCM_ALLOW_INTS;
02b754d3 1147 return SCM_UNSPECIFIED;
0f2d19dd 1148#else
f93ddd39 1149 scm_sysmissing (s_mknod);
02b754d3 1150 /* not reached. */
0f2d19dd
JB
1151 return SCM_BOOL_F;
1152#endif
1153}
1154
1155
f93ddd39 1156SCM_PROC (s_nice, "nice", 1, 0, 0, scm_nice);
1cc91f1b 1157
0f2d19dd 1158SCM
f93ddd39 1159scm_nice(incr)
0f2d19dd 1160 SCM incr;
0f2d19dd
JB
1161{
1162#ifdef HAVE_NICE
f93ddd39 1163 SCM_ASSERT(SCM_INUMP(incr), incr, SCM_ARG1, s_nice);
02b754d3 1164 if (nice(SCM_INUM(incr)) != 0)
f93ddd39 1165 scm_syserror (s_nice);
02b754d3 1166 return SCM_UNSPECIFIED;
0f2d19dd 1167#else
f93ddd39 1168 scm_sysmissing (s_nice);
02b754d3
GH
1169 /* not reached. */
1170 return SCM_BOOL_F;
0f2d19dd
JB
1171#endif
1172}
1173
1174
1175SCM_PROC (s_sync, "sync", 0, 0, 0, scm_sync);
1cc91f1b 1176
0f2d19dd
JB
1177SCM
1178scm_sync()
0f2d19dd
JB
1179{
1180#ifdef HAVE_SYNC
1181 sync();
52859adf
GH
1182#else
1183 scm_sysmissing (s_sync);
02b754d3 1184 /* not reached. */
52859adf 1185#endif
6afcd3b2 1186 return SCM_UNSPECIFIED;
0f2d19dd
JB
1187}
1188
0f2d19dd
JB
1189void
1190scm_init_posix ()
0f2d19dd
JB
1191{
1192 scm_add_feature ("posix");
1193#ifdef HAVE_GETEUID
1194 scm_add_feature ("EIDs");
1195#endif
1196#ifdef WAIT_ANY
1197 scm_sysintern ("WAIT_ANY", SCM_MAKINUM (WAIT_ANY));
1198#endif
1199#ifdef WAIT_MYPGRP
1200 scm_sysintern ("WAIT_MYPGRP", SCM_MAKINUM (WAIT_MYPGRP));
1201#endif
1202#ifdef WNOHANG
1203 scm_sysintern ("WNOHANG", SCM_MAKINUM (WNOHANG));
1204#endif
1205#ifdef WUNTRACED
1206 scm_sysintern ("WUNTRACED", SCM_MAKINUM (WUNTRACED));
1207#endif
1208
0f2d19dd 1209 /* access() symbols. */
bab0f4e5
JB
1210 scm_sysintern ("R_OK", SCM_MAKINUM (R_OK));
1211 scm_sysintern ("W_OK", SCM_MAKINUM (W_OK));
1212 scm_sysintern ("X_OK", SCM_MAKINUM (X_OK));
1213 scm_sysintern ("F_OK", SCM_MAKINUM (F_OK));
0f2d19dd
JB
1214
1215#ifdef LC_COLLATE
1216 scm_sysintern ("LC_COLLATE", SCM_MAKINUM (LC_COLLATE));
1217#endif
1218#ifdef LC_CTYPE
1219 scm_sysintern ("LC_CTYPE", SCM_MAKINUM (LC_CTYPE));
1220#endif
1221#ifdef LC_MONETARY
1222 scm_sysintern ("LC_MONETARY", SCM_MAKINUM (LC_MONETARY));
1223#endif
1224#ifdef LC_NUMERIC
1225 scm_sysintern ("LC_NUMERIC", SCM_MAKINUM (LC_NUMERIC));
1226#endif
1227#ifdef LC_TIME
1228 scm_sysintern ("LC_TIME", SCM_MAKINUM (LC_TIME));
1229#endif
1230#ifdef LC_MESSAGES
1231 scm_sysintern ("LC_MESSAGES", SCM_MAKINUM (LC_MESSAGES));
1232#endif
1233#ifdef LC_ALL
1234 scm_sysintern ("LC_ALL", SCM_MAKINUM (LC_ALL));
1235#endif
67ec3667 1236#include "cpp_sig_symbols.c"
0f2d19dd
JB
1237#include "posix.x"
1238}