static void push_log_entry(struct log_entry *le) { struct object *o = clone_object( aap_log_object_program, 0 ); struct log_object *lo = (struct log_object*)o->storage; lo->time = le->t; lo->sent_bytes = le->sent_bytes; lo->reply = le->reply; lo->received_bytes = le->received_bytes; lo->raw = make_shared_binary_string(le->raw.str, le->raw.len); lo->url = make_shared_binary_string(le->url.str, le->url.len); lo->method = make_shared_binary_string(le->method.str, le->method.len); lo->protocol = le->protocol; le->protocol->refs++; #ifdef HAVE_INET_NTOP { char buffer[64]; lo->from = make_shared_string( inet_ntop(SOCKADDR_FAMILY(le->from), SOCKADDR_IN_ADDR(le->from), buffer, sizeof(buffer)) ); } #else lo->from = make_shared_string( inet_ntoa(*SOCKADDR_IN_ADDR(le->from)) ); #endif push_object( o ); }
/*! @decl string query_address() *! *! Get the address and port of the local socket end-point. *! *! @returns *! This function returns the address and port of a socket end-point *! on the form @expr{"x.x.x.x port"@} (IPv4) or *! @expr{"x:x:x:x:x:x:x:x port"@} (IPv6). *! *! If there is some error querying or formatting the address, *! @expr{0@} (zero) is returned and @[errno()] will return the *! error code. *! *! @throws *! An error is thrown if the socket isn't bound. */ static void socket_query_address(INT32 args) { PIKE_SOCKADDR addr; int i; char buffer[496]; ACCEPT_SIZE_T len; if(THIS->box.fd <0) Pike_error("Stdio.Port->query_address(): Socket not bound yet.\n"); len=sizeof(addr); i=fd_getsockname(THIS->box.fd,(struct sockaddr *)&addr,&len); pop_n_elems(args); if(i < 0 || len < (int)sizeof(addr.ipv4)) { THIS->my_errno=errno; push_int(0); return; } #ifdef fd_inet_ntop if(!fd_inet_ntop(SOCKADDR_FAMILY(addr), SOCKADDR_IN_ADDR(addr), buffer, sizeof(buffer)-20)) { THIS->my_errno = errno; push_int(0); return; } #else if(SOCKADDR_FAMILY(addr) == AF_INET) { char *q = inet_ntoa(*SOCKADDR_IN_ADDR(addr)); strncpy(buffer,q,sizeof(buffer)-20); buffer[sizeof(buffer)-20]=0; }else{ #ifdef EAFNOSUPPORT THIS->my_errno = EAFNOSUPPORT; #else THIS->my_errno = EINVAL; #endif push_int(0); return; } #endif sprintf(buffer+strlen(buffer)," %d",(int)(ntohs(addr.ipv4.sin_port))); push_text(buffer); }
int main(int argc, char ** argv) { event_loop * evl; io_pipe * io_c2p; io_pipe * io_p2s; io_bridge * br; sockaddr_in sa; char buf[128]; int sk, c2p, p2s; int yes = 1; // // signal(SIGPIPE, SIG_IGN); // evl = new_event_loop_select(); // if (sk_init() < 0) return 1; sk = sk_create(AF_INET, SOCK_STREAM, 0); if (sk < 0) return 2; sockaddr_in_init(&sa); SOCKADDR_IN_PORT(&sa) = htons(55555); if (sk_setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) < 0 || sk_bind_ip4(sk, &sa) < 0 || sk_listen(sk, 8) < 0) return 3; printf("listening on %s ...\n", sa_to_str(&sa, buf, sizeof buf)); // c2p = sk_accept_ip4(sk, &sa); if (c2p < 0) return 4; printf("accepted\n"); sk_unblock(c2p); // SOCKADDR_IN_ADDR(&sa) = inet_addr(argc > 1 ? argv[1] : "127.0.0.1"); SOCKADDR_IN_PORT(&sa) = htons( (argc > 2) ? atoi(argv[2]) : 22 ); p2s = sk_create(AF_INET, SOCK_STREAM, 0); if (p2s < 0) return 5; if (sk_unblock(p2s) < 0) return 6; printf("connecting to %s ...\n", sa_to_str(&sa, buf, sizeof buf)); if (sk_connect_ip4(p2s, &sa) < 0 && sk_conn_fatal(sk_errno(p2s))) return 7; // io_c2p = new_tcp_pipe(c2p); io_p2s = new_tcp_pipe(p2s); br = new_io_bridge(io_c2p, io_p2s); br->on_shutdown = on_bridge_down; br->init(br, evl); while (! enough) { static uint tick = 0; evl->monitor(evl, 100); if ( (tick++ % 17) && ! enough ) continue; printf("\r%u | [%c%c %10llu %10llu %4u] [%c%c %10llu %10llu %4u]", tick++, br->l->pipe->writable ? 'w' : br->l->pipe->fin_sent ? 'x' : '-', br->l->pipe->readable ? 'r' : br->l->pipe->fin_rcvd ? 'x' : '-', br->l->tx, br->l->rx, br->l->congestions, br->r->pipe->writable ? 'w' : br->r->pipe->fin_sent ? 'x' : '-', br->r->pipe->readable ? 'r' : br->r->pipe->fin_rcvd ? 'x' : '-', br->r->tx, br->r->rx, br->r->congestions); fflush(stdout); } printf("\n"); return 0; }
void f_aap_log_as_commonlog_to_file(INT32 args) { struct log_entry *le; struct log *l = LTHIS->log; int n = 0; int mfd, ot=0; struct object *f; struct tm tm; FILE *foo; static const char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Oct", "Sep", "Nov", "Dec", }; get_all_args("log_as_commonlog_to_file", args, "%o", &f); f->refs++; pop_n_elems(args); apply(f, "query_fd", 0); mfd = fd_dup(sp[-1].u.integer); if(mfd < 1)Pike_error("Bad fileobject to ->log_as_commonlog_to_file\n"); pop_stack(); foo = fdopen( mfd, "w" ); if(!foo) Pike_error("Bad fileobject to ->log_as_commonlog_to_file\n"); THREADS_ALLOW(); mt_lock( &l->log_lock ); le = l->log_head; l->log_head = l->log_tail = 0; mt_unlock( &l->log_lock ); while(le) { int i; struct tm *tm_p; struct log_entry *l = le->next; /* remotehost rfc931 authuser [date] "request" status bytes */ if(le->t != ot) { time_t t = (time_t)le->t; #ifdef HAVE_GMTIME_R gmtime_r( &t, &tm ); #else #ifdef HAVE_GMTIME tm_p = gmtime( &t ); /* This will break if two threads run gmtime() at once. */ #else #ifdef HAVE_LOCALTIME tm_p = localtime( &t ); /* This will break if two threads run localtime() at once. */ #endif #endif if (tm_p) tm = *tm_p; #endif ot = le->t; } /* date format: [03/Feb/1998:23:08:20 +0000] */ /* GET [URL] HTTP/1.0 */ for(i=13; i<le->raw.len; i++) if(le->raw.str[i] == '\r') { le->raw.str[i] = 0; break; } #ifdef HAVE_INET_NTOP if(SOCKADDR_FAMILY(le->from) != AF_INET) { char buffer[64]; fprintf(foo, "%s - %s [%02d/%s/%d:%02d:%02d:%02d +0000] \"%s\" %d %ld\n", inet_ntop(SOCKADDR_FAMILY(le->from), SOCKADDR_IN_ADDR(le->from), buffer, sizeof(buffer)), /* hostname */ "-", /* remote-user */ tm.tm_mday, month[tm.tm_mon], tm.tm_year+1900, tm.tm_hour, tm.tm_min, tm.tm_sec, /* date */ le->raw.str, /* request line */ le->reply, /* reply code */ DO_NOT_WARN((long)le->sent_bytes)); /* bytes transfered */ } else #endif /* HAVE_INET_NTOP */ fprintf(foo, "%d.%d.%d.%d - %s [%02d/%s/%d:%02d:%02d:%02d +0000] \"%s\" %d %ld\n", ((unsigned char *)&le->from.ipv4.sin_addr)[ 0 ], ((unsigned char *)&le->from.ipv4.sin_addr)[ 1 ], ((unsigned char *)&le->from.ipv4.sin_addr)[ 2 ], ((unsigned char *)&le->from.ipv4.sin_addr)[ 3 ], /* hostname */ "-", /* remote-user */ tm.tm_mday, month[tm.tm_mon], tm.tm_year+1900, tm.tm_hour, tm.tm_min, tm.tm_sec, /* date */ le->raw.str, /* request line */ le->reply, /* reply code */ DO_NOT_WARN((long)le->sent_bytes)); /* bytes transfered */ free_log_entry( le ); n++; le = l; } fclose(foo); fd_close(mfd); THREADS_DISALLOW(); push_int(n); }