Exemple #1
0
static s48_value
s48_socket_number(s48_value channel)
{
  int			socket_fd,
			len;
  struct sockaddr_in	address;

  S48_CHECK_CHANNEL(channel);
  socket_fd = S48_UNSAFE_EXTRACT_FIXNUM(S48_UNSAFE_CHANNEL_OS_INDEX(channel));

  address.sin_addr.s_addr = htonl(INADDR_ANY);

  len = sizeof(address);

  if ((getsockname(socket_fd, (struct sockaddr *)&address, &len) < 0)
	|| (address.sin_family != AF_INET))
    s48_raise_os_error(errno);

  return s48_enter_fixnum(htons(address.sin_port));
}
Exemple #2
0
static s48_value
s48_connect(s48_value channel, s48_value machine, s48_value port)
{
  int			socket_fd,
			output_fd,
    			port_number;
  char			*machine_name;
  struct hostent	*host;
  struct sockaddr_in	address;
  s48_value		output_channel;

  S48_CHECK_CHANNEL(channel);
  socket_fd = S48_UNSAFE_EXTRACT_FIXNUM(S48_UNSAFE_CHANNEL_OS_INDEX(channel));

  S48_CHECK_STRING(machine);
  machine_name = S48_UNSAFE_EXTRACT_STRING(machine);
  
  S48_CHECK_FIXNUM(port);
  port_number = S48_UNSAFE_EXTRACT_FIXNUM(port);
  
  /*
   * Get the host and initialize `address'.
   */

  host = gethostbyname(machine_name);
  if (host == NULL)
    s48_raise_os_error(errno);
  
  memset((void *)&address, 0, sizeof(address));
  address.sin_family = host->h_addrtype;

  if (host->h_length > sizeof(address.sin_addr))
    s48_raise_range_error(s48_enter_fixnum(host->h_length),
			  S48_UNSAFE_ENTER_FIXNUM(0),
			  s48_enter_fixnum(sizeof(address.sin_addr)));
  memcpy((void *)&address.sin_addr, (void *)host->h_addr, host->h_length);
  address.sin_port = htons(port_number);

  /*
   * Try the connection.  If it works we make an output channel and return it.
   * The original socket channel will be used as the input channel.
   */

  if (connect(socket_fd, (struct sockaddr *)&address, sizeof(address)) >= 0) {
    S48_STOB_SET(channel, S48_CHANNEL_STATUS_OFFSET, S48_CHANNEL_STATUS_INPUT);
    
    output_fd = dup(socket_fd);
    
    if (output_fd == -1)
      s48_raise_os_error(errno);
    
    output_channel = s48_add_channel(S48_CHANNEL_STATUS_OUTPUT,
				     s48_enter_string("socket connection"),
				     output_fd);
    
    if (!S48_CHANNEL_P(output_channel)) {
      ps_close_fd(output_fd);		/* retries if interrupted */
      s48_raise_scheme_exception(s48_extract_fixnum(output_channel), 0); };
    
    return output_channel;
  }

  /*
   * Check for errors.  If we need to retry we mark the socket as pending
   * and return #F to tell the Scheme procedure to wait.
   */

  /* already connected, will raise an error from Scheme */
  if (errno == EISCONN)
    return S48_TRUE;

  if (errno != EWOULDBLOCK && errno != EINTR && errno != EALREADY
      && errno != EINPROGRESS && errno != EAGAIN)
    s48_raise_os_error(errno);

  if (! (s48_add_pending_fd(socket_fd, FALSE)))
    s48_raise_out_of_memory_error();

  return S48_FALSE;
}
Exemple #3
0
void s48_on_load(void) {
#ifdef OPOST
s48_define_exported_binding("OPOST", s48_enter_fixnum(OPOST));
#else
s48_define_exported_binding("OPOST", S48_FALSE);
#endif
#ifdef OPOST
s48_define_exported_binding("OPOST", s48_enter_fixnum(OPOST));
#else
s48_define_exported_binding("OPOST", S48_FALSE);
#endif
#ifdef ONOEOT
s48_define_exported_binding("ONOEOT", s48_enter_fixnum(ONOEOT));
#else
s48_define_exported_binding("ONOEOT", S48_FALSE);
#endif
#ifdef OXTABS
s48_define_exported_binding("OXTABS", s48_enter_fixnum(OXTABS));
#else
s48_define_exported_binding("OXTABS", S48_FALSE);
#endif
#ifdef OCRNL
s48_define_exported_binding("OCRNL", s48_enter_fixnum(OCRNL));
#else
s48_define_exported_binding("OCRNL", S48_FALSE);
#endif
#ifdef OFDEL
s48_define_exported_binding("OFDEL", s48_enter_fixnum(OFDEL));
#else
s48_define_exported_binding("OFDEL", S48_FALSE);
#endif
#ifdef OFILL
s48_define_exported_binding("OFILL", s48_enter_fixnum(OFILL));
#else
s48_define_exported_binding("OFILL", S48_FALSE);
#endif
#ifdef OLCUC
s48_define_exported_binding("OLCUC", s48_enter_fixnum(OLCUC));
#else
s48_define_exported_binding("OLCUC", S48_FALSE);
#endif
#ifdef ONLRET
s48_define_exported_binding("ONLRET", s48_enter_fixnum(ONLRET));
#else
s48_define_exported_binding("ONLRET", S48_FALSE);
#endif
#ifdef ONOCR
s48_define_exported_binding("ONOCR", s48_enter_fixnum(ONOCR));
#else
s48_define_exported_binding("ONOCR", S48_FALSE);
#endif
#ifdef NLDLY
s48_define_exported_binding("NLDLY", s48_enter_fixnum(NLDLY));
#else
s48_define_exported_binding("NLDLY", S48_FALSE);
#endif
#ifdef NL0
s48_define_exported_binding("NL0", s48_enter_fixnum(NL0));
#else
s48_define_exported_binding("NL0", S48_FALSE);
#endif
#ifdef NL1
s48_define_exported_binding("NL1", s48_enter_fixnum(NL1));
#else
s48_define_exported_binding("NL1", S48_FALSE);
#endif
#ifdef TABDLY
s48_define_exported_binding("TABDLY", s48_enter_fixnum(TABDLY));
#else
s48_define_exported_binding("TABDLY", S48_FALSE);
#endif
#ifdef TAB0
s48_define_exported_binding("TAB0", s48_enter_fixnum(TAB0));
#else
s48_define_exported_binding("TAB0", S48_FALSE);
#endif
#ifdef TAB1
s48_define_exported_binding("TAB1", s48_enter_fixnum(TAB1));
#else
s48_define_exported_binding("TAB1", S48_FALSE);
#endif
#ifdef TAB2
s48_define_exported_binding("TAB2", s48_enter_fixnum(TAB2));
#else
s48_define_exported_binding("TAB2", S48_FALSE);
#endif
#ifdef TAB3
s48_define_exported_binding("TAB3", s48_enter_fixnum(TAB3));
#else
s48_define_exported_binding("TAB3", S48_FALSE);
#endif
#ifdef CRDLY
s48_define_exported_binding("CRDLY", s48_enter_fixnum(CRDLY));
#else
s48_define_exported_binding("CRDLY", S48_FALSE);
#endif
#ifdef CR0
s48_define_exported_binding("CR0", s48_enter_fixnum(CR0));
#else
s48_define_exported_binding("CR0", S48_FALSE);
#endif
#ifdef CR1
s48_define_exported_binding("CR1", s48_enter_fixnum(CR1));
#else
s48_define_exported_binding("CR1", S48_FALSE);
#endif
#ifdef CR2
s48_define_exported_binding("CR2", s48_enter_fixnum(CR2));
#else
s48_define_exported_binding("CR2", S48_FALSE);
#endif
#ifdef CR3
s48_define_exported_binding("CR3", s48_enter_fixnum(CR3));
#else
s48_define_exported_binding("CR3", S48_FALSE);
#endif
#ifdef VTDLY
s48_define_exported_binding("VTDLY", s48_enter_fixnum(VTDLY));
#else
s48_define_exported_binding("VTDLY", S48_FALSE);
#endif
#ifdef VT0
s48_define_exported_binding("VT0", s48_enter_fixnum(VT0));
#else
s48_define_exported_binding("VT0", S48_FALSE);
#endif
#ifdef VT1
s48_define_exported_binding("VT1", s48_enter_fixnum(VT1));
#else
s48_define_exported_binding("VT1", S48_FALSE);
#endif
#ifdef BSDLY
s48_define_exported_binding("BSDLY", s48_enter_fixnum(BSDLY));
#else
s48_define_exported_binding("BSDLY", S48_FALSE);
#endif
#ifdef BS0
s48_define_exported_binding("BS0", s48_enter_fixnum(BS0));
#else
s48_define_exported_binding("BS0", S48_FALSE);
#endif
#ifdef BS1
s48_define_exported_binding("BS1", s48_enter_fixnum(BS1));
#else
s48_define_exported_binding("BS1", S48_FALSE);
#endif
#ifdef FFDLY
s48_define_exported_binding("FFDLY", s48_enter_fixnum(FFDLY));
#else
s48_define_exported_binding("FFDLY", S48_FALSE);
#endif
#ifdef FF0
s48_define_exported_binding("FF0", s48_enter_fixnum(FF0));
#else
s48_define_exported_binding("FF0", S48_FALSE);
#endif
#ifdef FF1
s48_define_exported_binding("FF1", s48_enter_fixnum(FF1));
#else
s48_define_exported_binding("FF1", S48_FALSE);
#endif
}
void s48_on_load(void) {
#ifdef VEOF
s48_define_exported_binding("VEOF", s48_enter_fixnum(VEOF));
#else
s48_define_exported_binding("VEOF", S48_FALSE);
#endif
#ifdef VEOL
s48_define_exported_binding("VEOL", s48_enter_fixnum(VEOL));
#else
s48_define_exported_binding("VEOL", S48_FALSE);
#endif
#ifdef VERASE
s48_define_exported_binding("VERASE", s48_enter_fixnum(VERASE));
#else
s48_define_exported_binding("VERASE", S48_FALSE);
#endif
#ifdef VKILL
s48_define_exported_binding("VKILL", s48_enter_fixnum(VKILL));
#else
s48_define_exported_binding("VKILL", S48_FALSE);
#endif
#ifdef VINTR
s48_define_exported_binding("VINTR", s48_enter_fixnum(VINTR));
#else
s48_define_exported_binding("VINTR", S48_FALSE);
#endif
#ifdef VQUIT
s48_define_exported_binding("VQUIT", s48_enter_fixnum(VQUIT));
#else
s48_define_exported_binding("VQUIT", S48_FALSE);
#endif
#ifdef VSUSP
s48_define_exported_binding("VSUSP", s48_enter_fixnum(VSUSP));
#else
s48_define_exported_binding("VSUSP", S48_FALSE);
#endif
#ifdef VSTART
s48_define_exported_binding("VSTART", s48_enter_fixnum(VSTART));
#else
s48_define_exported_binding("VSTART", S48_FALSE);
#endif
#ifdef VSTOP
s48_define_exported_binding("VSTOP", s48_enter_fixnum(VSTOP));
#else
s48_define_exported_binding("VSTOP", S48_FALSE);
#endif
#ifdef VMIN
s48_define_exported_binding("VMIN", s48_enter_fixnum(VMIN));
#else
s48_define_exported_binding("VMIN", S48_FALSE);
#endif
#ifdef VTIME
s48_define_exported_binding("VTIME", s48_enter_fixnum(VTIME));
#else
s48_define_exported_binding("VTIME", S48_FALSE);
#endif
#ifdef VWERASE
s48_define_exported_binding("VWERASE", s48_enter_fixnum(VWERASE));
#else
s48_define_exported_binding("VWERASE", S48_FALSE);
#endif
#ifdef VREPRINT
s48_define_exported_binding("VREPRINT", s48_enter_fixnum(VREPRINT));
#else
s48_define_exported_binding("VREPRINT", S48_FALSE);
#endif
#ifdef VLNEXT
s48_define_exported_binding("VLNEXT", s48_enter_fixnum(VLNEXT));
#else
s48_define_exported_binding("VLNEXT", S48_FALSE);
#endif
#ifdef VDISCARD
s48_define_exported_binding("VDISCARD", s48_enter_fixnum(VDISCARD));
#else
s48_define_exported_binding("VDISCARD", S48_FALSE);
#endif
#ifdef VDSUSP
s48_define_exported_binding("VDSUSP", s48_enter_fixnum(VDSUSP));
#else
s48_define_exported_binding("VDSUSP", S48_FALSE);
#endif
#ifdef VEOL2
s48_define_exported_binding("VEOL2", s48_enter_fixnum(VEOL2));
#else
s48_define_exported_binding("VEOL2", S48_FALSE);
#endif
#ifdef VSTATUS
s48_define_exported_binding("VSTATUS", s48_enter_fixnum(VSTATUS));
#else
s48_define_exported_binding("VSTATUS", S48_FALSE);
#endif
#ifdef NCCS
s48_define_exported_binding("NCCS", s48_enter_fixnum(NCCS));
#else
s48_define_exported_binding("NCCS", S48_FALSE);
#endif
}
Exemple #5
0
void s48_on_load(void) {
#ifdef B0
s48_define_exported_binding("B0", s48_enter_fixnum(B0));
#else
s48_define_exported_binding("B0", S48_FALSE);
#endif
#ifdef B50
s48_define_exported_binding("B50", s48_enter_fixnum(B50));
#else
s48_define_exported_binding("B50", S48_FALSE);
#endif
#ifdef B75
s48_define_exported_binding("B75", s48_enter_fixnum(B75));
#else
s48_define_exported_binding("B75", S48_FALSE);
#endif
#ifdef B110
s48_define_exported_binding("B110", s48_enter_fixnum(B110));
#else
s48_define_exported_binding("B110", S48_FALSE);
#endif
#ifdef B134
s48_define_exported_binding("B134", s48_enter_fixnum(B134));
#else
s48_define_exported_binding("B134", S48_FALSE);
#endif
#ifdef B150
s48_define_exported_binding("B150", s48_enter_fixnum(B150));
#else
s48_define_exported_binding("B150", S48_FALSE);
#endif
#ifdef B200
s48_define_exported_binding("B200", s48_enter_fixnum(B200));
#else
s48_define_exported_binding("B200", S48_FALSE);
#endif
#ifdef B300
s48_define_exported_binding("B300", s48_enter_fixnum(B300));
#else
s48_define_exported_binding("B300", S48_FALSE);
#endif
#ifdef B600
s48_define_exported_binding("B600", s48_enter_fixnum(B600));
#else
s48_define_exported_binding("B600", S48_FALSE);
#endif
#ifdef B1200
s48_define_exported_binding("B1200", s48_enter_fixnum(B1200));
#else
s48_define_exported_binding("B1200", S48_FALSE);
#endif
#ifdef B1800
s48_define_exported_binding("B1800", s48_enter_fixnum(B1800));
#else
s48_define_exported_binding("B1800", S48_FALSE);
#endif
#ifdef B2400
s48_define_exported_binding("B2400", s48_enter_fixnum(B2400));
#else
s48_define_exported_binding("B2400", S48_FALSE);
#endif
#ifdef B4800
s48_define_exported_binding("B4800", s48_enter_fixnum(B4800));
#else
s48_define_exported_binding("B4800", S48_FALSE);
#endif
#ifdef B9600
s48_define_exported_binding("B9600", s48_enter_fixnum(B9600));
#else
s48_define_exported_binding("B9600", S48_FALSE);
#endif
#ifdef B19200
s48_define_exported_binding("B19200", s48_enter_fixnum(B19200));
#else
s48_define_exported_binding("B19200", S48_FALSE);
#endif
#ifdef B38400
s48_define_exported_binding("B38400", s48_enter_fixnum(B38400));
#else
s48_define_exported_binding("B38400", S48_FALSE);
#endif
#ifdef EXTA
s48_define_exported_binding("EXTA", s48_enter_fixnum(EXTA));
#else
s48_define_exported_binding("EXTA", S48_FALSE);
#endif
#ifdef EXTB
s48_define_exported_binding("EXTB", s48_enter_fixnum(EXTB));
#else
s48_define_exported_binding("EXTB", S48_FALSE);
#endif
}
Exemple #6
0
/*
 * Interface to regexec.
 *
 * Returns #f if there is no match, #t if there is a match and submatches_p
 * is false, and a list of regex-match records otherwise.
 *
 * Most of this is making the buffer for the match structs and then translating
 * them into Scheme match records.
 */
static s48_value
posix_regexp_match(s48_value sch_regex, s48_value string,
		   s48_value submatches_p,
		   s48_value bol_p, s48_value eol_p,
		   s48_value sch_start)
{
  int status;
  s48_value result;
  int start, len;
  /* re_nsub doesn't include the full pattern */
  size_t nmatch   = 1 + S48_EXTRACT_VALUE_POINTER(sch_regex, regex_t)->re_nsub;
  regmatch_t *pmatch,
             pmatch_buffer[32];
  int flags = S48_EXTRACT_BOOLEAN(bol_p) ? 0 : REG_NOTBOL |
              S48_EXTRACT_BOOLEAN(eol_p) ? 0 : REG_NOTEOL;

  start = s48_extract_fixnum(sch_start);
  len = S48_STRING_LENGTH(string);
  if ((start < 0) || (start > len))
    s48_raise_range_error(sch_start,
			  s48_enter_fixnum(0), 
			  s48_enter_fixnum(len));

  if (nmatch <= 32)
    pmatch = pmatch_buffer;
  else {
    pmatch = (regmatch_t *) malloc(nmatch * sizeof(regmatch_t));
    if (pmatch == NULL)
      s48_raise_out_of_memory_error(); }
    
  status = regexec(S48_EXTRACT_VALUE_POINTER(sch_regex, regex_t),
		   S48_UNSAFE_EXTRACT_STRING(string) + start,
		   nmatch, pmatch, flags);

  if (status == REG_NOMATCH)
    result = S48_FALSE;
  else if (! S48_EXTRACT_BOOLEAN(submatches_p))
    result = S48_TRUE;
  else {
    s48_value match = S48_FALSE;
    s48_value matches = S48_NULL;
    int i;
    S48_DECLARE_GC_PROTECT(2);
  
    S48_GC_PROTECT_2(match, matches);
    
    for(i = nmatch - 1; i > -1; i--) {
      if (pmatch[i].rm_so == -1)
	match = S48_FALSE;
      else {
	match = s48_make_record(posix_regexp_match_type_binding);
	S48_UNSAFE_RECORD_SET(match, 0,
			      s48_enter_fixnum(pmatch[i].rm_so + start));
	S48_UNSAFE_RECORD_SET(match, 1,
			      s48_enter_fixnum(pmatch[i].rm_eo + start));
	S48_UNSAFE_RECORD_SET(match, 2, S48_FALSE); }  /* submatches */
      matches = s48_cons(match, matches); }
    
    S48_GC_UNPROTECT();

    result = matches; }

  if (nmatch > 32)
    free(pmatch);
  
  return result;
}