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)); }
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; }
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 }
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 }
/* * 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; }