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