diff options
Diffstat (limited to 'socket.c')
| -rw-r--r-- | socket.c | 43 | 
1 files changed, 24 insertions, 19 deletions
@@ -1,18 +1,18 @@  /* Copyright (C) 1994, 1995 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.   */  /* "socket.c" internet stream socket support for client/server in SCM @@ -308,11 +308,13 @@ SCM l_socket(fam, proto)    SYSCALL(sd = socket(tp, SOCK_STREAM, INUM(proto)););    if (-1==sd) wta(UNDEFINED, (char *)NALLOC, s_socket);    SYSCALL(f = fdopen(sd, "r+");); +  /*  SCM_OPENCALL(f = fdopen(sd, "r+")); */    if (!f) {      close(sd);      wta(MAKINUM(sd), (char *)NALLOC, s_port_type);    } -  CAR(port) = tc_socket | (tp<<24) | BUF0; +  CAR(port) = scm_port_entry(tc_socket, BUF0); +  SCM_PORTDATA(port) = fam;    SETSTREAM(port, f);    i_setbuf0(port);    ALLOW_INTS; @@ -341,18 +343,19 @@ SCM l_socketpair(fam, proto)    DEFER_INTS;    SYSCALL(sts = socketpair(tp, SOCK_STREAM, INUM(proto), sv););    if (-1==sts) wta(UNDEFINED, (char *)NALLOC, s_socketpair); -  SYSCALL(f[0] = fdopen(sv[0], "r+");); +  SCM_OPENCALL(f[0] = fdopen(sv[0], "r+"));    if (!f[0]) {      close(sv[0]);      wta(MAKINUM(sv[0]), (char *)NALLOC, s_port_type);    } -  SYSCALL(f[1] = fdopen(sv[1], "r+");); +  SCM_OPENCALL(f[1] = fdopen(sv[1], "r+"));    if (!f[1]) {      fclose(f[0]);      close(sv[1]);      wta(MAKINUM(sv[1]), (char *)NALLOC, s_port_type);    } -  CAR(port[0]) = CAR(port[1]) = tc16_fport | mode_bits("r+0"); +  CAR(port[0]) = scm_port_entry(tc16_fport, mode_bits("r+0", (char *)0)); +  CAR(port[1]) = scm_port_entry(tc16_fport, mode_bits("r+0", (char *)0));    SETSTREAM(port[0], f[0]); SETSTREAM(port[1], f[1]);    i_setbuf0(port[0]); i_setbuf0(port[1]);    ALLOW_INTS; @@ -364,7 +367,7 @@ SCM l_shutdown(port, how)       SCM port, how;  {    int sts; -  ASSERT(NIMP(port) && OPPORTP(port), port, ARG1, s_shutdown); +  ASSERT(NIMP(port) && OPFPORTP(port), port, ARG1, s_shutdown);    ASSERT(INUMP(how) && 0 <= INUM(how) && 2 >= INUM(how),  	 how, ARG2, s_shutdown);    SYSCALL(sts = shutdown(fileno(STREAM(port)), INUM(how));); @@ -416,7 +419,8 @@ SCM l_connect (sockpt, address, arg)      break;    }    if (sts) return BOOL_F; -  CAR(sockpt) = tc16_fport | mode_bits("r+0"); +  CAR(sockpt) = scm_port_entry(tc16_fport, mode_bits("r+0", (char *)0)); +  SCM_PORTDATA(sockpt) = cons(address, arg);    return sockpt;  } @@ -465,7 +469,9 @@ SCM l_listen(port, backlog)    ASSERT(INUMP(backlog), backlog, ARG2, s_listen);    SYSCALL(sts = listen(fileno(STREAM(port)), INUM(backlog)););    if (sts) return BOOL_F; -  CAR(port) = tc16_fport | mode_bits("r0"); +  DEFER_INTS; +  CAR(port) = scm_port_entry(tc16_fport, mode_bits("r0", (char *)0)); +  ALLOW_INTS;    return port;  } @@ -489,12 +495,12 @@ SCM l_accept(sockpt)          wta(sockpt, "couldn't", s_accept);    }    DEFER_INTS; -  SYSCALL(newfd = fdopen(newsd, "r+");); +  SCM_OPENCALL(newfd = fdopen(newsd, "r+"));    if (!newfd) {      close(newsd);      wta(MAKINUM(newsd), (char *)NALLOC, s_port_type);    } -  CAR(newpt) = tc16_fport | mode_bits("r+0"); +  CAR(newpt) = scm_port_entry(tc16_fport, mode_bits("r+0", (char *)0));    SETSTREAM(newpt, newfd);    i_setbuf0(newpt);    ALLOW_INTS; @@ -527,7 +533,7 @@ sizet sknm_free(p)       CELLPTR p;  {    must_free(CHARS((SCM)p), sizeof(struct sockaddr)); -  return sizeof(struct sockaddr); +  return 0;  }  long tc16_sknm;  static smobfuns sknm_smob = {mark0, sknm_free, sknm_print, 0}; @@ -574,10 +580,9 @@ SCM maksknm(sad)    SCM sknm;    struct sockaddr *msknm;    DEFER_INTS; -  sknm = must_malloc_cell(0L+sizeof(struct sockaddr), "sknm"); +  sknm = must_malloc_cell(0L+sizeof(struct sockaddr), (SCM)tc16_sknm, "sknm");    msknm = (struct sockaddr *)CDR(sknm);    *msknm = *sad; -  CAR(sknm) = tc16_sknm;    ALLOW_INTS;    return sknm;  } @@ -589,7 +594,7 @@ SCM l_getpeername(sockpt)    struct sockaddr_in sad;    int sts, sadlen = sizeof(sad);    bzero((char *) &sad, sizeof(sad)); -  ASSERT(NIMP(sockpt) && OPPORTP(sockpt), sockpt, ARG1, s_getpeername); +  ASSERT(NIMP(sockpt) && OPFPORTP(sockpt), sockpt, ARG1, s_getpeername);    SYSCALL(sts = getpeername(fileno(STREAM(sockpt)),  			    (struct sockaddr*)&sad, &sadlen););    if (sts || sizeof(sad) != sadlen) return BOOL_F; @@ -603,7 +608,7 @@ SCM l_getsockname(sockpt)    struct sockaddr_in sad;    int sts, sadlen = sizeof(sad);    bzero((char *) &sad, sizeof(sad)); -  ASSERT(NIMP(sockpt) && OPPORTP(sockpt), sockpt, ARG1, s_getsockname); +  ASSERT(NIMP(sockpt) && OPFPORTP(sockpt), sockpt, ARG1, s_getsockname);    SYSCALL(sts = getsockname(fileno(STREAM(sockpt)),  			    (struct sockaddr*)&sad, &sadlen););    if (sts || sizeof(sad) != sadlen) return BOOL_F;  | 
