static void _pkr_close(struct incoming_conn_state* ics, int log_level, const char* reason) { char rbuf[128]; char lbuf[128]; /* FIXME: Log more useful things about the connection. */ pk_log(PK_LOG_TUNNEL_CONNS | log_level, "%s; remote=%s; local=%s; hostname=%s; proto=%s; fd=%d", reason, in_addr_to_str((struct sockaddr*) &(ics->remote_addr), rbuf, 128), in_addr_to_str((struct sockaddr*) &(ics->local_addr), lbuf, 128), ics->hostname, known_protos[ics->parsed_as], ics->pkb->conn.sockfd); if (ics->pkb) { pkc_reset_conn(&(ics->pkb->conn), 0); pkm_free_be_conn(ics->pkb); } ics->parse_state = PARSE_FAILED; /* A horrible hack */ if (ics->unparsed_data != NULL) free(ics->unparsed_data); free(ics); }
int main(int argc, char **argv) { char pbuffer[64000]; struct pk_conn pkc; struct pk_parser* pkp; struct pk_pagekite kite; struct pk_kite_request kite_r; struct pk_kite_request* kite_rp; SSL_CTX* ctx; if (argc < 3) { usage(); exit(1); } pks_global_init(PK_LOG_ALL); pk_state.log_file = NULL; PKS_SSL_INIT(ctx); kite_r.kite = &kite; strcpy(kite.protocol, "http"); strncpyz(kite.public_domain, argv[1], PK_DOMAIN_LENGTH); kite.public_port = 0; strncpyz(kite.auth_secret, argv[2], PK_SECRET_LENGTH); kite_r.bsalt[0] = '\0'; kite_r.fsalt[0] = '\0'; kite_rp = &kite_r; srand(time(0) ^ getpid()); if (0 > pk_connect(&pkc, argv[1], 443, 1, &kite_r, NULL, ctx)) { pk_perror(argv[1]); usage(); return 1; } pkp = pk_parser_init(sizeof(pbuffer), pbuffer, &handle_request, &pkc); if (NULL == pkp) { pk_perror(argv[1]); usage(); return 1; } fprintf(stderr, "*** Connected! ***\n"); while (pkc_wait(&pkc, -1)) { pkc_read(&pkc); pk_parser_parse(pkp, pkc.in_buffer_pos, (char *) pkc.in_buffer); pkc.in_buffer_pos = 0; } pkc_reset_conn(&pkc, 0); return 0; }