diff options
Diffstat (limited to 'posix.c')
-rw-r--r-- | posix.c | 48 |
1 files changed, 24 insertions, 24 deletions
@@ -1,18 +1,18 @@ /* Copyright (C) 1994, 1995, 1998 Free Software Foundation, Inc. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111, USA. * * As a special exception, the Free Software Foundation gives permission * for additional uses of the text contained in its release of GUILE. @@ -36,7 +36,7 @@ * * If you write modifications of your own for GUILE, it is your choice * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. + * If you do not wish that, delete this exception notice. */ /* "posix.c" functions only in Posix (unix). @@ -101,15 +101,15 @@ SCM l_pipe() close(fd[0]); goto errout; } - SYSCALL(f_wt = fdopen(fd[1], "w");); + SCM_OPENCALL(f_wt = fdopen(fd[1], "w")); if (!f_wt) { fclose(f_rd); errout: close(fd[1]); wta(UNDEFINED, (char *)NALLOC, s_port_type); } - CAR(p_rd) = tc16_fport | mode_bits("r"); - CAR(p_wt) = tc16_fport | mode_bits("w"); + CAR(p_rd) = scm_port_entry(tc16_fport, mode_bits("r", (char *)0)); + CAR(p_wt) = scm_port_entry(tc16_fport, mode_bits("w", (char *)0)); SETSTREAM(p_rd, f_rd); SETSTREAM(p_wt, f_wt); ALLOW_INTS; @@ -128,22 +128,21 @@ SCM open_pipe(pipestr, modes) /* DEFER_INTS, SYSCALL, and ALLOW_INTS are probably paranoid here*/ DEFER_INTS; ignore_signals(); - SYSCALL(f = popen(CHARS(pipestr), CHARS(modes));); + SCM_OPENCALL(f = popen(CHARS(pipestr), CHARS(modes))); unignore_signals(); - if (!f) z = BOOL_F; + if (!f) { + ALLOW_INTS; + return BOOL_F; + } else { - CAR(z) = tc16_pipe | OPN | (strchr(CHARS(modes), 'r') ? RDNG : WRTNG); + CAR(z) = scm_port_entry(tc16_pipe, + OPN | (strchr(CHARS(modes), 'r') ? RDNG : WRTNG)); SETSTREAM(z, f); } ALLOW_INTS; + SCM_PORTDATA(z) = pipestr; return z; } -static int prinpipe(exp, port, writing) - SCM exp; SCM port; int writing; -{ - prinport(exp, port, s_pipe); - return !0; -} static char scm_s_getgroups[] = "getgroups"; SCM scm_getgroups() @@ -151,13 +150,14 @@ SCM scm_getgroups() SCM grps, ans; int ngroups = getgroups(0, 0); if (!ngroups) return BOOL_F; - NEWCELL(grps); + scm_protect_temp(&grps); DEFER_INTS; /* grps is used as a gc protect, its type used to be tc7_string, but - strings are now checked for null termination during gc. */ - grps = must_malloc_cell(ngroups * sizeof(gid_t), scm_s_getgroups); - /* length need not be exactly right */ - SETLENGTH(grps, (0L + ngroups * sizeof(gid_t))/sizeof(long), tc7_uvect); + strings are now checked for null termination during gc. + The length needs not be exactly right */ + grps = must_malloc_cell((0L + ngroups) * sizeof(gid_t), + MAKE_LENGTH(((0L + ngroups) * sizeof(gid_t))/sizeof(long), tc7_uvect), + scm_s_getgroups); ALLOW_INTS; { gid_t *groups = (gid_t *)CHARS(grps); @@ -167,7 +167,7 @@ SCM scm_getgroups() while (--ngroups >= 0) VELTS(ans)[ngroups] = MAKINUM(groups[ngroups]); return ans; } -} +} /* These 2 routines are not protected against `entry' being reused before access to that structure is completed */ @@ -396,9 +396,9 @@ void init_posix() init_iprocs(subr2s, tc7_subr_2); init_iprocs(subr3s, tc7_subr_3); add_feature("posix"); + ptobs[0x0ff & (tc16_pipe>>8)].name = s_pipe; ptobs[0x0ff & (tc16_pipe>>8)].fclose = pclose; ptobs[0x0ff & (tc16_pipe>>8)].free = pclose; - ptobs[0x0ff & (tc16_pipe>>8)].print = prinpipe; add_feature(s_pipe); scm_ldstr("\n\ (define (open-input-pipe cmd) (open-pipe cmd \"r\"))\n\ |