diff options
Diffstat (limited to 'PICA_client.c')
| -rw-r--r--[-rwxr-xr-x] | PICA_client.c | 2994 |
1 files changed, 1500 insertions, 1494 deletions
diff --git a/PICA_client.c b/PICA_client.c index 94ef553..0d728f4 100755..100644 --- a/PICA_client.c +++ b/PICA_client.c @@ -33,27 +33,28 @@ static int PICA_sendfile_open_read(struct PICA_c2c *chn, const char *filename_ut static int PICA_recvfile_open_write(struct PICA_c2c *chn, const char *filename_utf8, unsigned int filenamesize); static int PICA_send_filecontrol(struct PICA_c2c *chan, int senderctl, int receiverctl); -static unsigned int procmsg_INITRESP(unsigned char*,unsigned int,void*); -static unsigned int procmsg_CONNREQINC(unsigned char*,unsigned int,void*); -static unsigned int procmsg_NOTFOUND(unsigned char*,unsigned int,void*); -static unsigned int procmsg_FOUND(unsigned char*,unsigned int,void*); -static unsigned int procmsg_CLNODELIST(unsigned char*,unsigned int,void*); -static unsigned int procmsg_MSGUTF8(unsigned char*,unsigned int,void*); -static unsigned int procmsg_MSGOK(unsigned char*,unsigned int,void*); -static unsigned int procmsg_PINGREQ(unsigned char*,unsigned int,void*); -static unsigned int procmsg_SENDFILEREQUEST(unsigned char*,unsigned int,void*); -static unsigned int procmsg_ACCEPTEDFILE(unsigned char*,unsigned int,void*); -static unsigned int procmsg_DENIEDFILE(unsigned char*,unsigned int,void*); -static unsigned int procmsg_FILEFRAGMENT(unsigned char*,unsigned int,void*); -static unsigned int procmsg_FILECONTROL(unsigned char*,unsigned int,void*); -static unsigned int procmsg_INITRESP_c2c(unsigned char*,unsigned int,void*); -static unsigned int procmsg_C2CCONNREQ(unsigned char* buf, unsigned int nb,void* p); +static unsigned int procmsg_INITRESP(unsigned char*, unsigned int, void*); +static unsigned int procmsg_CONNREQINC(unsigned char*, unsigned int, void*); +static unsigned int procmsg_NOTFOUND(unsigned char*, unsigned int, void*); +static unsigned int procmsg_FOUND(unsigned char*, unsigned int, void*); +static unsigned int procmsg_CLNODELIST(unsigned char*, unsigned int, void*); +static unsigned int procmsg_MSGUTF8(unsigned char*, unsigned int, void*); +static unsigned int procmsg_MSGOK(unsigned char*, unsigned int, void*); +static unsigned int procmsg_PINGREQ(unsigned char*, unsigned int, void*); +static unsigned int procmsg_SENDFILEREQUEST(unsigned char*, unsigned int, void*); +static unsigned int procmsg_ACCEPTEDFILE(unsigned char*, unsigned int, void*); +static unsigned int procmsg_DENIEDFILE(unsigned char*, unsigned int, void*); +static unsigned int procmsg_FILEFRAGMENT(unsigned char*, unsigned int, void*); +static unsigned int procmsg_FILECONTROL(unsigned char*, unsigned int, void*); +static unsigned int procmsg_INITRESP_c2c(unsigned char*, unsigned int, void*); +static unsigned int procmsg_C2CCONNREQ(unsigned char* buf, unsigned int nb, void* p); static struct PICA_proto_msg* c2n_writebuf_push(struct PICA_c2n *ci, unsigned int msgid, unsigned int size); static struct PICA_proto_msg* c2c_writebuf_push(struct PICA_c2c *chn, unsigned int msgid, unsigned int size); #define MSGINFO_MSGSNUM(arr) (sizeof(arr)/sizeof(struct PICA_msginfo)) -const struct PICA_msginfo c2n_messages[] = { +const struct PICA_msginfo c2n_messages[] = +{ {PICA_PROTO_CONNREQINC, PICA_MSG_FIXED_SIZE, PICA_PROTO_CONNREQINC_SIZE, procmsg_CONNREQINC}, {PICA_PROTO_NOTFOUND, PICA_MSG_FIXED_SIZE, PICA_PROTO_NOTFOUND_SIZE, procmsg_NOTFOUND}, {PICA_PROTO_FOUND, PICA_MSG_FIXED_SIZE, PICA_PROTO_FOUND_SIZE, procmsg_FOUND}, @@ -61,7 +62,8 @@ const struct PICA_msginfo c2n_messages[] = { {PICA_PROTO_PINGREQ, PICA_MSG_FIXED_SIZE, PICA_PROTO_PINGREQ_SIZE, procmsg_PINGREQ} };//---!!! PING!!! -const struct PICA_msginfo c2c_messages[] = { +const struct PICA_msginfo c2c_messages[] = +{ {PICA_PROTO_MSGUTF8, PICA_MSG_VAR_SIZE, PICA_MSG_VARSIZE_INT16, procmsg_MSGUTF8}, {PICA_PROTO_MSGOK, PICA_MSG_FIXED_SIZE, PICA_PROTO_MSGOK_SIZE, procmsg_MSGOK}, {PICA_PROTO_SENDFILEREQUEST, PICA_MSG_VAR_SIZE, PICA_MSG_VARSIZE_INT16, procmsg_SENDFILEREQUEST}, @@ -71,13 +73,15 @@ const struct PICA_msginfo c2c_messages[] = { {PICA_PROTO_FILECONTROL, PICA_MSG_FIXED_SIZE, PICA_PROTO_FILECONTROL_SIZE, procmsg_FILECONTROL} }; -struct PICA_msginfo c2n_init_messages[] = { +struct PICA_msginfo c2n_init_messages[] = +{ {PICA_PROTO_INITRESPOK, PICA_MSG_FIXED_SIZE, PICA_PROTO_INITRESPOK_SIZE, procmsg_INITRESP}, {PICA_PROTO_VERDIFFER, PICA_MSG_FIXED_SIZE, PICA_PROTO_VERDIFFER_SIZE, procmsg_INITRESP} }; -struct PICA_msginfo c2c_init_messages[] = { - {PICA_PROTO_C2CCONNREQ, PICA_MSG_FIXED_SIZE,PICA_PROTO_C2CCONNREQ_SIZE, procmsg_C2CCONNREQ}, +struct PICA_msginfo c2c_init_messages[] = +{ + {PICA_PROTO_C2CCONNREQ, PICA_MSG_FIXED_SIZE, PICA_PROTO_C2CCONNREQ_SIZE, procmsg_C2CCONNREQ}, {PICA_PROTO_INITRESPOK, PICA_MSG_FIXED_SIZE, PICA_PROTO_INITRESPOK_SIZE, procmsg_INITRESP_c2c}, {PICA_PROTO_VERDIFFER, PICA_MSG_FIXED_SIZE, PICA_PROTO_VERDIFFER_SIZE, procmsg_INITRESP_c2c} }; @@ -123,809 +127,811 @@ return 1; int PICA_get_id_from_cert_file(const char *cert_file, unsigned char *id) { -X509 *x; -FILE *f; + X509 *x; + FILE *f; -f=fopen(cert_file,"r"); + f = fopen(cert_file, "r"); -if (!f) -{ - perror(cert_file); - return 0; -} + if (!f) + { + perror(cert_file); + return 0; + } -x=PEM_read_X509(f,0,0,0); -fclose(f); + x = PEM_read_X509(f, 0, 0, 0); + fclose(f); -if (!x) -{ - return 0; -} + if (!x) + { + return 0; + } -return PICA_id_from_X509(x, id); + return PICA_id_from_X509(x, id); } int PICA_get_id_from_cert_string(const char *cert_pem, unsigned char *id) { -X509 *x; -BIO *biomem; + X509 *x; + BIO *biomem; -biomem = BIO_new_mem_buf(cert_pem, -1); + biomem = BIO_new_mem_buf(cert_pem, -1); -x = PEM_read_bio_X509(biomem, NULL, 0, NULL); + x = PEM_read_bio_X509(biomem, NULL, 0, NULL); -if (!x) -{ - return 0; -} + if (!x) + { + return 0; + } -return PICA_id_from_X509(x, id); + return PICA_id_from_X509(x, id); } static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) -{ //return 1 for self-signed certificates -char buf[256]; -X509 *err_cert; -int err, depth; -SSL *ssl; +{ + //return 1 for self-signed certificates + char buf[256]; + X509 *err_cert; + int err, depth; + SSL *ssl; -err_cert = X509_STORE_CTX_get_current_cert(ctx); -err = X509_STORE_CTX_get_error(ctx); -depth = X509_STORE_CTX_get_error_depth(ctx); + err_cert = X509_STORE_CTX_get_current_cert(ctx); + err = X509_STORE_CTX_get_error(ctx); + depth = X509_STORE_CTX_get_error_depth(ctx); -X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); + X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); -if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && depth == 0) - preverify_ok = 1; + if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && depth == 0) + preverify_ok = 1; -if (!preverify_ok) { - printf("verify error:num=%d:%s:depth=%d:%s\n", err, - X509_verify_cert_error_string(err), depth, buf); - } + if (!preverify_ok) + { + printf("verify error:num=%d:%s:depth=%d:%s\n", err, + X509_verify_cert_error_string(err), depth, buf); + } - /* - * At this point, err contains the last verification error. We can use - * it for something special - */ - if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) - { - X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256); - printf("issuer= %s\n", buf); - } + /* + * At this point, err contains the last verification error. We can use + * it for something special + */ + if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) + { + X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256); + printf("issuer= %s\n", buf); + } - return preverify_ok; + return preverify_ok; } static int add_chaninfo(struct PICA_c2n *ci, struct PICA_c2c **chn, const unsigned char *peer_id, int is_outgoing) { -struct PICA_c2c *chnl,*ipt; + struct PICA_c2c *chnl, *ipt; -chnl=*chn=(struct PICA_c2c*)calloc(sizeof(struct PICA_c2c),1); + chnl = *chn = (struct PICA_c2c*)calloc(sizeof(struct PICA_c2c), 1); -if (!chnl) - return 0;//ERR_CHECK + if (!chnl) + return 0;//ERR_CHECK -chnl->conn = ci; -chnl->outgoing = is_outgoing; -memcpy(chnl->peer_id, peer_id, PICA_ID_SIZE); + chnl->conn = ci; + chnl->outgoing = is_outgoing; + memcpy(chnl->peer_id, peer_id, PICA_ID_SIZE); -chnl->acc = ci->acc; + chnl->acc = ci->acc; -chnl->timestamp = time(0); + chnl->timestamp = time(0); -chnl->sck_data = -1;//prevent closing stdin when closing non-active connection + chnl->sck_data = -1;//prevent closing stdin when closing non-active connection -chnl->read_buf = calloc(PICA_CHANREADBUFSIZE, 1); + chnl->read_buf = calloc(PICA_CHANREADBUFSIZE, 1); -if (ci->chan_list_head) + if (ci->chan_list_head) { - ci->chan_list_end->next=chnl; - chnl->prev=ci->chan_list_end; - ci->chan_list_end=chnl; + ci->chan_list_end->next = chnl; + chnl->prev = ci->chan_list_end; + ci->chan_list_end = chnl; } -else + else { - ci->chan_list_head=chnl; - ci->chan_list_end=chnl; + ci->chan_list_head = chnl; + ci->chan_list_end = chnl; } -return 1; + return 1; } static int establish_data_connection(struct PICA_c2c *chnl) { -char* DN_str; + char* DN_str; //unsigned char buf[12]; -int ret,err_ret; -unsigned int tmp_uid; -struct PICA_proto_msg *mp; + int ret, err_ret; + unsigned int tmp_uid; + struct PICA_proto_msg *mp; -chnl->sck_data=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + chnl->sck_data = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -{ -struct sockaddr_in addr=chnl->conn->srv_addr; + { + struct sockaddr_in addr = chnl->conn->srv_addr; -addr.sin_port = htons(ntohs(addr.sin_port)); + addr.sin_port = htons(ntohs(addr.sin_port)); -ret=connect( chnl->sck_data, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); + ret = connect( chnl->sck_data, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); /////////////////state_ -if (ret==SOCKET_ERROR) - { - err_ret=PICA_ERRSOCK; - goto error_ret; + if (ret == SOCKET_ERROR) + { + err_ret = PICA_ERRSOCK; + goto error_ret; + } } -} -mp = c2c_writebuf_push( chnl, PICA_PROTO_CONNID, PICA_PROTO_CONNID_SIZE); -if (mp) + mp = c2c_writebuf_push( chnl, PICA_PROTO_CONNID, PICA_PROTO_CONNID_SIZE); + if (mp) { - if (chnl->outgoing) + if (chnl->outgoing) { - memcpy(mp->tail, chnl->acc->id, PICA_ID_SIZE);//вызвывающий - memcpy(mp->tail + PICA_ID_SIZE, chnl->peer_id, PICA_ID_SIZE);//вызываемый + memcpy(mp->tail, chnl->acc->id, PICA_ID_SIZE);//вызвывающий + memcpy(mp->tail + PICA_ID_SIZE, chnl->peer_id, PICA_ID_SIZE);//вызываемый } - else + else { - memcpy(mp->tail, chnl->peer_id, PICA_ID_SIZE);//вызвывающий - memcpy(mp->tail + PICA_ID_SIZE, chnl->acc->id, PICA_ID_SIZE);//вызываемый - } + memcpy(mp->tail, chnl->peer_id, PICA_ID_SIZE);//вызвывающий + memcpy(mp->tail + PICA_ID_SIZE, chnl->acc->id, PICA_ID_SIZE);//вызываемый + } } -else + else { - err_ret=PICA_ERRNOMEM; - goto error_ret; + err_ret = PICA_ERRNOMEM; + goto error_ret; } -do + do { - err_ret = PICA_write_c2c(chnl); - if (PICA_OK != err_ret) - goto error_ret; + err_ret = PICA_write_c2c(chnl); + if (PICA_OK != err_ret) + goto error_ret; } -while( chnl->write_pos > 0); + while( chnl->write_pos > 0); -chnl->ssl=SSL_new(chnl->acc->ctx); + chnl->ssl = SSL_new(chnl->acc->ctx); -if (!chnl->ssl) + if (!chnl->ssl) { - //puts("SSL_new !- 0");//debug - err_ret=PICA_ERRSSL; - goto error_ret; + //puts("SSL_new !- 0");//debug + err_ret = PICA_ERRSSL; + goto error_ret; } -ret=SSL_set_fd(chnl->ssl, chnl->sck_data); + ret = SSL_set_fd(chnl->ssl, chnl->sck_data); -if (!ret) + if (!ret) { - //puts("SSL_set_fd returned 0");//debug - err_ret=PICA_ERRSSL; - goto error_ret_; + //puts("SSL_set_fd returned 0");//debug + err_ret = PICA_ERRSSL; + goto error_ret_; } -SSL_set_verify(chnl->ssl, SSL_VERIFY_PEER, verify_callback); -SSL_set_verify_depth(chnl->ssl, 1);//peer certificate and one CA + SSL_set_verify(chnl->ssl, SSL_VERIFY_PEER, verify_callback); + SSL_set_verify_depth(chnl->ssl, 1);//peer certificate and one CA -if (chnl->outgoing) -ret=SSL_connect(chnl->ssl); -else -ret=SSL_accept(chnl->ssl); + if (chnl->outgoing) + ret = SSL_connect(chnl->ssl); + else + ret = SSL_accept(chnl->ssl); /////////////////state_ //printf("verify result:%i\n",(int)SSL_get_verify_result(chnl->ssl));//debug -if (ret!=1) + if (ret != 1) { - //printf("ret=%i of SSL_connect or accept\n",ret);//debug - //printf("SSL_get_error says:%i\n",SSL_get_error(chnl->ssl,ret));//debug - err_ret=PICA_ERRSSL; - goto error_ret_; + //printf("ret=%i of SSL_connect or accept\n",ret);//debug + //printf("SSL_get_error says:%i\n",SSL_get_error(chnl->ssl,ret));//debug + err_ret = PICA_ERRSSL; + goto error_ret_; } //проверить сертификат собеседника -chnl->peer_cert=SSL_get_peer_certificate(chnl->ssl); + chnl->peer_cert = SSL_get_peer_certificate(chnl->ssl); -if (!chnl->peer_cert) + if (!chnl->peer_cert) { - err_ret=PICA_ERRNOPEERCERT; - goto error_ret_; + err_ret = PICA_ERRNOPEERCERT; + goto error_ret_; } -{ -unsigned char temp_id[PICA_ID_SIZE]; - -if (PICA_id_from_X509(chnl->peer_cert, temp_id) == 0) { - err_ret=PICA_ERRNOPEERCERT; - goto error_ret_; - } + unsigned char temp_id[PICA_ID_SIZE]; -if (memcmp(temp_id, chnl->peer_id, PICA_ID_SIZE) != 0) - { - err_ret=PICA_ERRINVPEERCERT; - goto error_ret_; - } -} -/* -DN_str=X509_NAME_oneline(X509_get_subject_name(chnl->peer_cert), 0, 0); + if (PICA_id_from_X509(chnl->peer_cert, temp_id) == 0) + { + err_ret = PICA_ERRNOPEERCERT; + goto error_ret_; + } -if (!DN_str) - { - //puts("no DN_str");//debug - err_ret=PICA_ERRSSL; - goto error_ret_; + if (memcmp(temp_id, chnl->peer_id, PICA_ID_SIZE) != 0) + { + err_ret = PICA_ERRINVPEERCERT; + goto error_ret_; + } } + /* + DN_str=X509_NAME_oneline(X509_get_subject_name(chnl->peer_cert), 0, 0); -if (!get_id_fromsubjstr(DN_str,&tmp_uid) || tmp_uid!=chnl->peer_id) - { - err_ret=PICA_ERRINVPEERCERT; - goto error_ret_; - } -//puts(DN_str);//debug + if (!DN_str) + { + //puts("no DN_str");//debug + err_ret=PICA_ERRSSL; + goto error_ret_; + } -OPENSSL_free(DN_str);*/ + if (!get_id_fromsubjstr(DN_str,&tmp_uid) || tmp_uid!=chnl->peer_id) + { + err_ret=PICA_ERRINVPEERCERT; + goto error_ret_; + } + //puts(DN_str);//debug + OPENSSL_free(DN_str);*/ -{ -BIO *mem = BIO_new(BIO_s_mem()); -char *cert_pem; -unsigned int cert_pem_nb; -PEM_write_bio_X509(mem, chnl->peer_cert); + { + BIO *mem = BIO_new(BIO_s_mem()); + char *cert_pem; + unsigned int cert_pem_nb; -cert_pem_nb = (unsigned int)BIO_get_mem_data(mem, &cert_pem); + PEM_write_bio_X509(mem, chnl->peer_cert); -if (callbacks.peer_cert_verify_cb(chnl->peer_id, (const char*)cert_pem, cert_pem_nb) == 0) - { - BIO_free(mem); - err_ret=PICA_ERRINVPEERCERT; - goto error_ret_; - } + cert_pem_nb = (unsigned int)BIO_get_mem_data(mem, &cert_pem); -BIO_free(mem); -} + if (callbacks.peer_cert_verify_cb(chnl->peer_id, (const char*)cert_pem, cert_pem_nb) == 0) + { + BIO_free(mem); + err_ret = PICA_ERRINVPEERCERT; + goto error_ret_; + } + + BIO_free(mem); + } -chnl->state=PICA_C2C_STATE_ACTIVE; + chnl->state = PICA_C2C_STATE_ACTIVE; -IOCTLSETNONBLOCKINGSOCKET(chnl->sck_data, 1); + IOCTLSETNONBLOCKINGSOCKET(chnl->sck_data, 1); -return PICA_OK; + return PICA_OK; error_ret_: error_ret: -callbacks.c2c_failed(chnl->peer_id); -PICA_close_c2c(chnl); -return err_ret; + callbacks.c2c_failed(chnl->peer_id); + PICA_close_c2c(chnl); + return err_ret; } -static unsigned int procmsg_C2CCONNREQ(unsigned char* buf, unsigned int nb,void* p) +static unsigned int procmsg_C2CCONNREQ(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *cc=(struct PICA_c2n *)p; + struct PICA_c2c *cc = (struct PICA_c2n *)p; -if (buf[2] == PICA_C2CPROTO_VER_HIGH && buf[3] == PICA_C2CPROTO_VER_LOW) - { - //send ok - } -else - { - //send verdiffer, disconnect after sending - } + if (buf[2] == PICA_C2CPROTO_VER_HIGH && buf[3] == PICA_C2CPROTO_VER_LOW) + { + //send ok + } + else + { + //send verdiffer, disconnect after sending + } -return 1; + return 1; } -static unsigned int procmsg_INITRESP_c2c(unsigned char* buf, unsigned int nb,void* p) +static unsigned int procmsg_INITRESP_c2c(unsigned char* buf, unsigned int nb, void* p) { } -static unsigned int procmsg_INITRESP(unsigned char* buf, unsigned int nb,void* p) +static unsigned int procmsg_INITRESP(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2n *ci=(struct PICA_c2n *)p; + struct PICA_c2n *ci = (struct PICA_c2n *)p; -switch(buf[0]) + switch(buf[0]) { case PICA_PROTO_INITRESPOK: - ci -> init_resp_ok = 1; - break; - + ci -> init_resp_ok = 1; + break; + case PICA_PROTO_VERDIFFER: - ci->init_resp_ok = -1; - ci->node_ver_major = buf[2]; - ci->node_ver_minor = buf[3]; - break; - + ci->init_resp_ok = -1; + ci->node_ver_major = buf[2]; + ci->node_ver_minor = buf[3]; + break; + default: - return 0; - } + return 0; + } -return 1; + return 1; } -static unsigned int procmsg_CONNREQINC(unsigned char* buf,unsigned int nb,void* p) +static unsigned int procmsg_CONNREQINC(unsigned char* buf, unsigned int nb, void* p) { -int ret; -struct PICA_c2n *ci=(struct PICA_c2n *)p; -struct PICA_proto_msg *mp; -unsigned char *peer_id = buf + 2; + int ret; + struct PICA_c2n *ci = (struct PICA_c2n *)p; + struct PICA_proto_msg *mp; + unsigned char *peer_id = buf + 2; if (callbacks.accept_cb(peer_id)) - { + { struct PICA_c2c *_chnl; - + mp = c2n_writebuf_push( ci, PICA_PROTO_CONNALLOW, PICA_PROTO_CONNALLOW_SIZE); - + if (mp) - { + { memcpy(mp->tail, peer_id, PICA_ID_SIZE); - } + } else return 0; - + ret = add_chaninfo( ci, &_chnl, peer_id, 0); if (!ret) return 0; //ERR_CHECK - кончилась память - + do - { + { ret = PICA_write_c2n(ci); if (PICA_OK != ret) return 0; - } + } while( ci->write_pos > 0); ret = establish_data_connection(_chnl); - if (ret!=PICA_OK) + if (ret != PICA_OK) return 1; - callbacks.c2c_established_cb(_chnl->peer_id);//*nchn=_chnl; + callbacks.c2c_established_cb(_chnl->peer_id);//*nchn=_chnl; return 1; - } + } else - { + { mp = c2n_writebuf_push(ci, PICA_PROTO_CONNDENY, PICA_PROTO_CONNDENY_SIZE); - + if (mp) - { + { memcpy(mp->tail, peer_id, PICA_ID_SIZE); - } + } else return 0;//ERR_CHECK - } -return 1; + } + return 1; } -static unsigned int procmsg_NOTFOUND(unsigned char* buf,unsigned int nb,void* p) +static unsigned int procmsg_NOTFOUND(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2n *ci=(struct PICA_c2n *)p; -struct PICA_c2c *ipt,*rq=0; -unsigned char *peer_id = buf + 2; + struct PICA_c2n *ci = (struct PICA_c2n *)p; + struct PICA_c2c *ipt, *rq = 0; + unsigned char *peer_id = buf + 2; //puts("procmsg_NOTFOUND");//debug -ipt=ci->chan_list_end; -while(ipt) + ipt = ci->chan_list_end; + while(ipt) { - if (memcmp(ipt->peer_id, peer_id, PICA_ID_SIZE) == 0) + if (memcmp(ipt->peer_id, peer_id, PICA_ID_SIZE) == 0) { - rq=ipt; - break; + rq = ipt; + break; } - ipt=ipt->prev; + ipt = ipt->prev; } -if (!rq) - return 0;// ERR_CHECK -левое сообщение, такой запрос не посылался + if (!rq) + return 0;// ERR_CHECK -левое сообщение, такой запрос не посылался //puts("procmsg_NOTFOUND_chkp0");//debug -PICA_close_c2c(rq); + PICA_close_c2c(rq); //puts("procmsg_NOTFOUND_chkp1");//debug -callbacks.notfound_cb(peer_id); -return 1; + callbacks.notfound_cb(peer_id); + return 1; } -static unsigned int procmsg_FOUND(unsigned char* buf,unsigned int nb,void* p) +static unsigned int procmsg_FOUND(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2n *ci=(struct PICA_c2n *)p; -struct PICA_c2c *ipt,*rq=0; -unsigned char *peer_id = buf + 2; -int ret; + struct PICA_c2n *ci = (struct PICA_c2n *)p; + struct PICA_c2c *ipt, *rq = 0; + unsigned char *peer_id = buf + 2; + int ret; -ipt=ci->chan_list_end; -while(ipt) + ipt = ci->chan_list_end; + while(ipt) { - if (memcmp(ipt->peer_id, peer_id, PICA_ID_SIZE) == 0) + if (memcmp(ipt->peer_id, peer_id, PICA_ID_SIZE) == 0) { - rq=ipt; - break; + rq = ipt; + break; } - ipt=ipt->prev; - } + ipt = ipt->prev; + } -if (!rq) - return 0;// ERR_CHECK -левое сообщение, такой запрос не посылался + if (!rq) + return 0;// ERR_CHECK -левое сообщение, такой запрос не посылался -ret=establish_data_connection(rq); + ret = establish_data_connection(rq); -if (ret!=PICA_OK) - return 0; + if (ret != PICA_OK) + return 0; -callbacks.c2c_established_cb(rq->peer_id);//*nchn=_chnl; + callbacks.c2c_established_cb(rq->peer_id);//*nchn=_chnl; -return 1; + return 1; } static unsigned int procmsg_CLNODELIST(unsigned char* buf, unsigned int nb, void* p) { -unsigned int pos = 4; -char ipaddr_string[INET6_ADDRSTRLEN]; -char temp_zeroswap; -unsigned int port; + unsigned int pos = 4; + char ipaddr_string[INET6_ADDRSTRLEN]; + char temp_zeroswap; + unsigned int port; //puts("CLNODELIST");//debug //callbacks.nodelist_cb(buf + 4, nb - 4); -do + do { - switch(buf[pos]) + switch(buf[pos]) { - case PICA_PROTO_NEWNODE_IPV4: - - callbacks.nodelist_cb( - PICA_PROTO_NEWNODE_IPV4, - buf + pos +1, - inet_ntop(AF_INET, buf + pos +1, ipaddr_string, INET6_ADDRSTRLEN), - ntohs(*(uint16_t*)(buf + pos + 5)) - ); - - pos += PICA_PROTO_NODELIST_ITEM_IPV4_SIZE; - break; - - case PICA_PROTO_NEWNODE_IPV6: - - callbacks.nodelist_cb( - PICA_PROTO_NEWNODE_IPV6, - buf + pos +1, - inet_ntop(AF_INET6, buf + pos +1, ipaddr_string, INET6_ADDRSTRLEN), - ntohs(*(uint16_t*)(buf + pos + 17)) - ); - - pos += PICA_PROTO_NODELIST_ITEM_IPV6_SIZE; - break; - - case PICA_PROTO_NEWNODE_DNS: - - port = ntohs(*(uint16_t*)(buf + pos + buf[pos+1] + 2)); - - temp_zeroswap = buf[pos + 2 + buf[pos+1]]; //save byte after hostname string - buf[pos + 2 + buf[pos+1]] = '\0';// and replace it with string terminating zero - - callbacks.nodelist_cb( - PICA_PROTO_NEWNODE_DNS, - buf + pos +2, - buf + pos +2, - port - ); - - buf[pos + 2 + buf[pos+1]] = temp_zeroswap; - - pos += 4 + buf[pos+1]; - break; - - default: - //puts("unknown node address type");//debug - return 0; + case PICA_PROTO_NEWNODE_IPV4: + + callbacks.nodelist_cb( + PICA_PROTO_NEWNODE_IPV4, + buf + pos + 1, + inet_ntop(AF_INET, buf + pos + 1, ipaddr_string, INET6_ADDRSTRLEN), + ntohs(*(uint16_t*)(buf + pos + 5)) + ); + + pos += PICA_PROTO_NODELIST_ITEM_IPV4_SIZE; + break; + + case PICA_PROTO_NEWNODE_IPV6: + + callbacks.nodelist_cb( + PICA_PROTO_NEWNODE_IPV6, + buf + pos + 1, + inet_ntop(AF_INET6, buf + pos + 1, ipaddr_string, INET6_ADDRSTRLEN), + ntohs(*(uint16_t*)(buf + pos + 17)) + ); + + pos += PICA_PROTO_NODELIST_ITEM_IPV6_SIZE; + break; + + case PICA_PROTO_NEWNODE_DNS: + + port = ntohs(*(uint16_t*)(buf + pos + buf[pos + 1] + 2)); + + temp_zeroswap = buf[pos + 2 + buf[pos + 1]]; //save byte after hostname string + buf[pos + 2 + buf[pos + 1]] = '\0'; // and replace it with string terminating zero + + callbacks.nodelist_cb( + PICA_PROTO_NEWNODE_DNS, + buf + pos + 2, + buf + pos + 2, + port + ); + + buf[pos + 2 + buf[pos + 1]] = temp_zeroswap; + + pos += 4 + buf[pos + 1]; + break; + + default: + //puts("unknown node address type");//debug + return 0; } } -while(pos < nb); + while(pos < nb); -return 1; + return 1; } static unsigned int procmsg_MSGUTF8(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; -struct PICA_proto_msg *mp; + struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_proto_msg *mp; -callbacks.newmsg_cb(chan->peer_id, buf + 4, nb - 4, buf[0]); + callbacks.newmsg_cb(chan->peer_id, buf + 4, nb - 4, buf[0]); //send PICA_PROTO_MSGOK -mp = c2c_writebuf_push( chan, PICA_PROTO_MSGOK, PICA_PROTO_MSGOK_SIZE); + mp = c2c_writebuf_push( chan, PICA_PROTO_MSGOK, PICA_PROTO_MSGOK_SIZE); -if (mp) + if (mp) { - RAND_bytes( mp->tail, 2); + RAND_bytes( mp->tail, 2); } -else - return 0; + else + return 0; -return 1; + return 1; } static unsigned int procmsg_MSGOK(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_c2c *chan = (struct PICA_c2c *)p; -callbacks.msgok_cb(chan -> peer_id); -return 1; + callbacks.msgok_cb(chan -> peer_id); + return 1; } -unsigned int procmsg_PINGREQ(unsigned char* buf,unsigned int nb,void* p) +unsigned int procmsg_PINGREQ(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2n *ci=(struct PICA_c2n *)p; -struct PICA_proto_msg *mp; + struct PICA_c2n *ci = (struct PICA_c2n *)p; + struct PICA_proto_msg *mp; -mp = c2n_writebuf_push(ci, PICA_PROTO_PINGREP, PICA_PROTO_PINGREP_SIZE); + mp = c2n_writebuf_push(ci, PICA_PROTO_PINGREP, PICA_PROTO_PINGREP_SIZE); -if (mp) - { - RAND_bytes(mp->tail, 2); - } -else - return 0; + if (mp) + { + RAND_bytes(mp->tail, 2); + } + else + return 0; -return 1; + return 1; } int PICA_deny_file(struct PICA_c2c *chan) { -struct PICA_proto_msg *mp; + struct PICA_proto_msg *mp; -if (chan->recvfilestate != PICA_CHANRECVFILESTATE_WAITACCEPT) - return PICA_ERRINVARG; + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_WAITACCEPT) + return PICA_ERRINVARG; -chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; + chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; -mp = c2c_writebuf_push(chan, PICA_PROTO_DENIEDFILE, PICA_PROTO_DENIEDFILE_SIZE); + mp = c2c_writebuf_push(chan, PICA_PROTO_DENIEDFILE, PICA_PROTO_DENIEDFILE_SIZE); -if (mp) - { - RAND_bytes(mp->tail, 2); - } -else - return PICA_ERRNOMEM; + if (mp) + { + RAND_bytes(mp->tail, 2); + } + else + return PICA_ERRNOMEM; -return PICA_OK; + return PICA_OK; } int PICA_accept_file(struct PICA_c2c *chan, char *filename, unsigned int filenamesize) { -struct PICA_proto_msg *mp; -int ret; + struct PICA_proto_msg *mp; + int ret; -if (chan->recvfilestate != PICA_CHANRECVFILESTATE_WAITACCEPT) - return PICA_ERRINVARG; + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_WAITACCEPT) + return PICA_ERRINVARG; //open file -ret = PICA_recvfile_open_write(chan, filename, filenamesize); + ret = PICA_recvfile_open_write(chan, filename, filenamesize); -if (ret != PICA_OK) - return ret; + if (ret != PICA_OK) + return ret; -mp = c2c_writebuf_push(chan, PICA_PROTO_ACCEPTEDFILE, PICA_PROTO_ACCEPTEDFILE_SIZE); + mp = c2c_writebuf_push(chan, PICA_PROTO_ACCEPTEDFILE, PICA_PROTO_ACCEPTEDFILE_SIZE); -if (mp) - { - RAND_bytes(mp->tail, 2); - } -else - return PICA_ERRNOMEM; + if (mp) + { + RAND_bytes(mp->tail, 2); + } + else + return PICA_ERRNOMEM; -chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; + chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; -return PICA_OK; + return PICA_OK; } static unsigned int procmsg_SENDFILEREQUEST(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; -struct PICA_proto_msg *mp; -int ret; + struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_proto_msg *mp; + int ret; -char *filename = buf + 12; -unsigned int filenamesize = *(uint16_t*)(buf + 2) - 8; + char *filename = buf + 12; + unsigned int filenamesize = *(uint16_t*)(buf + 2) - 8; -if (chan->recvfilestate != PICA_CHANRECVFILESTATE_IDLE) - return 0; + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_IDLE) + return 0; -chan->recvfilestate = PICA_CHANRECVFILESTATE_WAITACCEPT; -chan->recvfile_size = *(uint64_t*)(buf + 4); -chan->recvfile_pos = 0; + chan->recvfilestate = PICA_CHANRECVFILESTATE_WAITACCEPT; + chan->recvfile_size = *(uint64_t*)(buf + 4); + chan->recvfile_pos = 0; -ret = callbacks.accept_file_cb(chan->peer_id, *(uint64_t*)(buf + 4), filename, filenamesize); + ret = callbacks.accept_file_cb(chan->peer_id, *(uint64_t*)(buf + 4), filename, filenamesize); -if (ret > 0) + if (ret > 0) { - if (ret == 1) - { - if (PICA_accept_file(chan, filename, filenamesize) != PICA_OK) - if (PICA_deny_file(chan) != PICA_OK) - return 0; - } + if (ret == 1) + { + if (PICA_accept_file(chan, filename, filenamesize) != PICA_OK) + if (PICA_deny_file(chan) != PICA_OK) + return 0; + } } -else - { - if (PICA_deny_file(chan) != PICA_OK) - return 0; - } + else + { + if (PICA_deny_file(chan) != PICA_OK) + return 0; + } -return 1; + return 1; } static unsigned int procmsg_ACCEPTEDFILE(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_c2c *chan = (struct PICA_c2c *)p; -if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENTREQ) - return 0; + if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENTREQ) + return 0; -callbacks.accepted_file_cb(chan->peer_id); + callbacks.accepted_file_cb(chan->peer_id); -chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; + chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; -return 1; + return 1; } static unsigned int procmsg_DENIEDFILE(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_c2c *chan = (struct PICA_c2c *)p; -if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENTREQ) - return 0; + if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENTREQ) + return 0; -callbacks.denied_file_cb(chan->peer_id); + callbacks.denied_file_cb(chan->peer_id); -chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; + chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; -fclose(chan->sendfile_stream); -chan->sendfile_stream = NULL; + fclose(chan->sendfile_stream); + chan->sendfile_stream = NULL; -return 1; + return 1; } static unsigned int procmsg_FILEFRAGMENT(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; + struct PICA_c2c *chan = (struct PICA_c2c *)p; -/* - *Allow incoming FILEFRAGMENTs while paused - */ -if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING - && chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) - return 0; + /* + *Allow incoming FILEFRAGMENTs while paused + */ + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING + && chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) + return 0; -if (nb - 4 != *(uint16_t*)(buf + 2)) - return 0; + if (nb - 4 != *(uint16_t*)(buf + 2)) + return 0; -if (fwrite(buf + 4, nb - 4, 1, chan->recvfile_stream) != 1) - { - struct PICA_proto_msg *mp; + if (fwrite(buf + 4, nb - 4, 1, chan->recvfile_stream) != 1) + { + struct PICA_proto_msg *mp; - fclose(chan->recvfile_stream); - chan->recvfile_stream = NULL; + fclose(chan->recvfile_stream); + chan->recvfile_stream = NULL; - chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; + chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; - if (PICA_OK != PICA_send_filecontrol(chan, PICA_PROTO_FILECONTROL_VOID, PICA_PROTO_FILECONTROL_IOERROR)) - return 0; - } + if (PICA_OK != PICA_send_filecontrol(chan, PICA_PROTO_FILECONTROL_VOID, PICA_PROTO_FILECONTROL_IOERROR)) + return 0; + } -chan->recvfile_pos += (nb - 4); + chan->recvfile_pos += (nb - 4); -if (chan->recvfile_pos > chan->recvfile_size) //received more than file_size - return 0; + if (chan->recvfile_pos > chan->recvfile_size) //received more than file_size + return 0; -callbacks.file_progress(chan->peer_id, 0, chan->recvfile_pos); + callbacks.file_progress(chan->peer_id, 0, chan->recvfile_pos); -if (chan->recvfile_pos == chan->recvfile_size) - { - chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; - fclose(chan->recvfile_stream); - chan->recvfile_stream = NULL; + if (chan->recvfile_pos == chan->recvfile_size) + { + chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; + fclose(chan->recvfile_stream); + chan->recvfile_stream = NULL; - callbacks.file_finished(chan->peer_id, 0); - } + callbacks.file_finished(chan->peer_id, 0); + } -return 1; + return 1; } static unsigned int procmsg_FILECONTROL(unsigned char* buf, unsigned int nb, void* p) { -struct PICA_c2c *chan = (struct PICA_c2c *)p; -unsigned int sender_cmd, receiver_cmd; - -sender_cmd = buf[2]; -receiver_cmd = buf[3]; - -fprintf(stderr, "procmsg_FILECONTROL sender_cmd = %i receiver_cmd = %i\n", sender_cmd, receiver_cmd);//debug - -if ((chan->sendfilestate == PICA_CHANSENDFILESTATE_IDLE || chan->sendfilestate == PICA_CHANSENDFILESTATE_SENTREQ) - && receiver_cmd != PICA_PROTO_FILECONTROL_VOID) - return 0; - -if (chan->recvfilestate == PICA_CHANRECVFILESTATE_IDLE && sender_cmd != PICA_PROTO_FILECONTROL_VOID) - return 0; - -fprintf(stderr, "procmsg_FILECONTROL switch(sender_cmd)\n"); - -switch(sender_cmd) - { - case PICA_PROTO_FILECONTROL_PAUSE: - if (chan->recvfilestate == PICA_CHANRECVFILESTATE_RECEIVING) - chan->recvfilestate = PICA_CHANRECVFILESTATE_PAUSED; - else - return 0; - break; - - case PICA_PROTO_FILECONTROL_RESUME: - if (chan->recvfilestate == PICA_CHANRECVFILESTATE_PAUSED) - chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; - else - return 0; - break; - - case PICA_PROTO_FILECONTROL_CANCEL: - case PICA_PROTO_FILECONTROL_IOERROR: - chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; - fclose(chan->recvfile_stream); - chan->recvfile_stream = NULL; - break; - - case PICA_PROTO_FILECONTROL_VOID: - break; - - default: - return 0; - } - -fprintf(stderr, "procmsg_FILECONTROL switch(receiver_cmd)\n"); -switch(receiver_cmd) - { - case PICA_PROTO_FILECONTROL_PAUSE: - if (chan->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) - chan->sendfilestate = PICA_CHANSENDFILESTATE_PAUSED; - else - return 0; - break; - - case PICA_PROTO_FILECONTROL_RESUME: - if (chan->sendfilestate == PICA_CHANSENDFILESTATE_PAUSED) - chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; - else - return 0; - break; - - case PICA_PROTO_FILECONTROL_CANCEL: - case PICA_PROTO_FILECONTROL_IOERROR: - chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; - fclose(chan->sendfile_stream); - chan->sendfile_stream = NULL; - break; - - case PICA_PROTO_FILECONTROL_VOID: - break; - - default: - return 0; - } - -fprintf(stderr, "procmsg_FILECONTROL calling callback\n"); -callbacks.file_control(chan->peer_id, sender_cmd, receiver_cmd); + struct PICA_c2c *chan = (struct PICA_c2c *)p; + unsigned int sender_cmd, receiver_cmd; -return 1; + sender_cmd = buf[2]; + receiver_cmd = buf[3]; + + fprintf(stderr, "procmsg_FILECONTROL sender_cmd = %i receiver_cmd = %i\n", sender_cmd, receiver_cmd);//debug + + if ((chan->sendfilestate == PICA_CHANSENDFILESTATE_IDLE || chan->sendfilestate == PICA_CHANSENDFILESTATE_SENTREQ) + && receiver_cmd != PICA_PROTO_FILECONTROL_VOID) + return 0; + + if (chan->recvfilestate == PICA_CHANRECVFILESTATE_IDLE && sender_cmd != PICA_PROTO_FILECONTROL_VOID) + return 0; + + fprintf(stderr, "procmsg_FILECONTROL switch(sender_cmd)\n"); + + switch(sender_cmd) + { + case PICA_PROTO_FILECONTROL_PAUSE: + if (chan->recvfilestate == PICA_CHANRECVFILESTATE_RECEIVING) + chan->recvfilestate = PICA_CHANRECVFILESTATE_PAUSED; + else + return 0; + break; + + case PICA_PROTO_FILECONTROL_RESUME: + if (chan->recvfilestate == PICA_CHANRECVFILESTATE_PAUSED) + chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; + else + return 0; + break; + + case PICA_PROTO_FILECONTROL_CANCEL: + case PICA_PROTO_FILECONTROL_IOERROR: + chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; + fclose(chan->recvfile_stream); + chan->recvfile_stream = NULL; + break; + + case PICA_PROTO_FILECONTROL_VOID: + break; + + default: + return 0; + } + + fprintf(stderr, "procmsg_FILECONTROL switch(receiver_cmd)\n"); + switch(receiver_cmd) + { + case PICA_PROTO_FILECONTROL_PAUSE: + if (chan->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) + chan->sendfilestate = PICA_CHANSENDFILESTATE_PAUSED; + else + return 0; + break; + + case PICA_PROTO_FILECONTROL_RESUME: + if (chan->sendfilestate == PICA_CHANSENDFILESTATE_PAUSED) + chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; + else + return 0; + break; + + case PICA_PROTO_FILECONTROL_CANCEL: + case PICA_PROTO_FILECONTROL_IOERROR: + chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; + fclose(chan->sendfile_stream); + chan->sendfile_stream = NULL; + break; + + case PICA_PROTO_FILECONTROL_VOID: + break; + + default: + return 0; + } + + fprintf(stderr, "procmsg_FILECONTROL calling callback\n"); + callbacks.file_control(chan->peer_id, sender_cmd, receiver_cmd); + + return 1; } #ifdef PICA_MULTITHREADED @@ -933,23 +939,23 @@ return 1; #ifdef WIN32 void locking_cb(int mode, int type, char *file, int line) { - if (mode & CRYPTO_LOCK) - WaitForSingleObject(mt_locks[type],INFINITE); - else - ReleaseMutex(mt_locks[type]); + if (mode & CRYPTO_LOCK) + WaitForSingleObject(mt_locks[type], INFINITE); + else + ReleaseMutex(mt_locks[type]); } #else unsigned long thread_id_cb(void) { - return (unsigned long)pthread_self(); + return (unsigned long)pthread_self(); } void locking_cb(int mode, int type, char *file, int line) { - if (mode & CRYPTO_LOCK) - pthread_mutex_lock(&mt_locks[type]); - else - pthread_mutex_unlock(&mt_locks[type]); + if (mode & CRYPTO_LOCK) + pthread_mutex_lock(&mt_locks[type]); + else + pthread_mutex_unlock(&mt_locks[type]); } #endif @@ -958,48 +964,48 @@ void locking_cb(int mode, int type, char *file, int line) int PICA_client_init(struct PICA_client_callbacks *clcbs) { -struct sockaddr_in sd; + struct sockaddr_in sd; #ifdef WIN32 -WSADATA wsd; -WSAStartup(MAKEWORD(2,2),&wsd); + WSADATA wsd; + WSAStartup(MAKEWORD(2, 2), &wsd); #endif -if (!clcbs) - return 0; + if (!clcbs) + return 0; -callbacks=*clcbs; + callbacks = *clcbs; -SSL_load_error_strings(); -SSL_library_init(); + SSL_load_error_strings(); + SSL_library_init(); -#ifdef NO_RAND_DEV -PICA_rand_seed(); +#ifdef NO_RAND_DEV + PICA_rand_seed(); #endif #ifdef PICA_MULTITHREADED -{ - int i; + { + int i; #ifdef WIN32 -mt_locks = malloc(CRYPTO_num_locks()*sizeof(HANDLE)); + mt_locks = malloc(CRYPTO_num_locks() * sizeof(HANDLE)); -for (i=0; i<CRYPTO_num_locks(); i++) - mt_locks[i] = CreateMutex(NULL,FALSE,NULL); + for (i = 0; i < CRYPTO_num_locks(); i++) + mt_locks[i] = CreateMutex(NULL, FALSE, NULL); -CRYPTO_set_locking_callback(locking_cb); + CRYPTO_set_locking_callback(locking_cb); #else -mt_locks = malloc(CRYPTO_num_locks()*sizeof(pthread_mutex_t)); + mt_locks = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); -memset(mt_locks,0,CRYPTO_num_locks()*sizeof(pthread_mutex_t)); + memset(mt_locks, 0, CRYPTO_num_locks()*sizeof(pthread_mutex_t)); -for (i=0; i<CRYPTO_num_locks(); i++) - pthread_mutex_init(&mt_locks[i],NULL); + for (i = 0; i < CRYPTO_num_locks(); i++) + pthread_mutex_init(&mt_locks[i], NULL); -CRYPTO_set_id_callback(thread_id_cb); -CRYPTO_set_locking_callback(locking_cb); + CRYPTO_set_id_callback(thread_id_cb); + CRYPTO_set_locking_callback(locking_cb); #endif -} + } #endif //ctx=SSL_CTX_new(TLSv1_method()); @@ -1007,43 +1013,43 @@ CRYPTO_set_locking_callback(locking_cb); //;//ERR_CHECK #ifndef WIN32 -signal(SIGPIPE, SIG_IGN); + signal(SIGPIPE, SIG_IGN); #endif -return 1; + return 1; } static int check_pkey_passphrase(const char *pkey_file, int (*password_cb)(char *buf, int size, int rwflag, void *userdata), void *userdata) { -RSA *rsa; -FILE *f; + RSA *rsa; + FILE *f; -f = fopen(pkey_file, "r"); + f = fopen(pkey_file, "r"); -if (!f) - return PICA_ERRINVPKEYFILE; + if (!f) + return PICA_ERRINVPKEYFILE; -rsa = PEM_read_RSAPrivateKey(f, NULL, password_cb, userdata); + rsa = PEM_read_RSAPrivateKey(f, NULL, password_cb, userdata); -fclose(f); + fclose(f); -if (!rsa) - { - unsigned long int e = ERR_get_error(); + if (!rsa) + { + unsigned long int e = ERR_get_error(); - // 0x6065064 is an OpenSSL error code corresponding to decryption failure - if (e == 0x6065064 || strcmp("bad decrypt", ERR_reason_error_string(e)) == 0) - return PICA_ERRINVPKEYPASSPHRASE; + // 0x6065064 is an OpenSSL error code corresponding to decryption failure + if (e == 0x6065064 || strcmp("bad decrypt", ERR_reason_error_string(e)) == 0) + return PICA_ERRINVPKEYPASSPHRASE; - return PICA_ERRINVPKEYFILE; - } + return PICA_ERRINVPKEYFILE; + } -RSA_free(rsa); + RSA_free(rsa); -return PICA_OK; + return PICA_OK; } // Opens socket to listen for incoming direct c2c connections bypassing nodes @@ -1060,77 +1066,77 @@ return PICA_OK; // // l - address of pointer that will be filled with address of created PICA_listener structure // -int PICA_new_listener(const struct PICA_acc *acc,const char *public_addr, int public_port, int local_port, struct PICA_listener **l) +int PICA_new_listener(const struct PICA_acc *acc, const char *public_addr, int public_port, int local_port, struct PICA_listener **l) { - int ret, ret_err, flag; - struct PICA_listener *lst = NULL; - struct sockaddr_in s; + int ret, ret_err, flag; + struct PICA_listener *lst = NULL; + struct sockaddr_in s; - if (!acc || !public_addr || public_port <= 0 || public_port > 65535 || local_port <= 0 || local_port > 65535 || !l) - return PICA_ERRINVARG; + if (!acc || !public_addr || public_port <= 0 || public_port > 65535 || local_port <= 0 || local_port > 65535 || !l) + return PICA_ERRINVARG; - lst = *l = (struct PICA_listener*)calloc(sizeof(struct PICA_listener), 1); + lst = *l = (struct PICA_listener*)calloc(sizeof(struct PICA_listener), 1); - if (!lst) - return PICA_ERRNOMEM; + if (!lst) + return PICA_ERRNOMEM; - lst->public_addr_dns = strdup(public_addr); + lst->public_addr_dns = strdup(public_addr); - if (!lst->public_addr_dns) - return PICA_ERRNOMEM; + if (!lst->public_addr_dns) + return PICA_ERRNOMEM; - lst->public_addr_ipv4 = inet_addr(public_addr); + lst->public_addr_ipv4 = inet_addr(public_addr); - lst->acc = acc; - lst->public_port = public_port; - lst->local_port = local_port; + lst->acc = acc; + lst->public_port = public_port; + lst->local_port = local_port; - lst->sck_listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //(1) + lst->sck_listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //(1) - if (lst->sck_listener == SOCKET_ERROR) - { - ret_err = PICA_ERRSOCK; - goto error_ret_1; - } + if (lst->sck_listener == SOCKET_ERROR) + { + ret_err = PICA_ERRSOCK; + goto error_ret_1; + } - flag = 1; - setsockopt(lst->sck_listener, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); + flag = 1; + setsockopt(lst->sck_listener, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); - memset(&s, 0, sizeof(s)); - s.sin_family = AF_INET; - s.sin_addr.s_addr = INADDR_ANY; - s.sin_port = htons(local_port); + memset(&s, 0, sizeof(s)); + s.sin_family = AF_INET; + s.sin_addr.s_addr = INADDR_ANY; + s.sin_port = htons(local_port); - ret = bind(lst->sck_listener, (const struct sockaddr*) &s, sizeof(s));//(2) + ret = bind(lst->sck_listener, (const struct sockaddr*) &s, sizeof(s));//(2) - if (ret == SOCKET_ERROR) - { - ret_err = PICA_ERRSOCK; - goto error_ret_2; - } + if (ret == SOCKET_ERROR) + { + ret_err = PICA_ERRSOCK; + goto error_ret_2; + } - ret = listen(lst->sck_listener, 10); + ret = listen(lst->sck_listener, 10); - if (ret == SOCKET_ERROR) - { - ret_err = PICA_ERRSOCK; - goto error_ret_2; - } + if (ret == SOCKET_ERROR) + { + ret_err = PICA_ERRSOCK; + goto error_ret_2; + } - return PICA_OK; + return PICA_OK; - error_ret_2: //(2) +error_ret_2: //(2) - CLOSE(lst->sck_listener); + CLOSE(lst->sck_listener); - error_ret_1: //(1) +error_ret_1: //(1) - free(lst->public_addr_dns); - free(lst); - *l = 0; + free(lst->public_addr_dns); + free(lst); + *l = 0; - return ret_err; + return ret_err; } int PICA_open_acc(const char *cert_file, @@ -1139,173 +1145,173 @@ int PICA_open_acc(const char *cert_file, int (*password_cb)(char *buf, int size, int rwflag, void *userdata), struct PICA_acc **acc) { -int ret,ret_err; -DH *dh = NULL; -FILE *dh_file = NULL; -struct PICA_acc *a = NULL; + int ret, ret_err; + DH *dh = NULL; + FILE *dh_file = NULL; + struct PICA_acc *a = NULL; -if (!(cert_file && pkey_file && dh_param_file && acc)) - return PICA_ERRINVARG; + if (!(cert_file && pkey_file && dh_param_file && acc)) + return PICA_ERRINVARG; -a = *acc = (struct PICA_acc*)calloc(sizeof(struct PICA_acc), 1);//(1) + a = *acc = (struct PICA_acc*)calloc(sizeof(struct PICA_acc), 1);//(1) -if (!a) - return PICA_ERRNOMEM; + if (!a) + return PICA_ERRNOMEM; -a->ctx = SSL_CTX_new(TLSv1_2_method());//(2) + a->ctx = SSL_CTX_new(TLSv1_2_method());//(2) -if (!a->ctx) - { - ret_err=PICA_ERRSSL; - goto error_ret_1; - } + if (!a->ctx) + { + ret_err = PICA_ERRSSL; + goto error_ret_1; + } -dh_file = fopen(dh_param_file, "r"); + dh_file = fopen(dh_param_file, "r"); -if (dh_file) - { - dh = PEM_read_DHparams(dh_file, NULL, NULL, NULL); - fclose(dh_file); - } + if (dh_file) + { + dh = PEM_read_DHparams(dh_file, NULL, NULL, NULL); + fclose(dh_file); + } -if (1 != SSL_CTX_set_tmp_dh(a->ctx, dh)) -{ - ret_err = PICA_ERRSSL; - goto error_ret_2; -} + if (1 != SSL_CTX_set_tmp_dh(a->ctx, dh)) + { + ret_err = PICA_ERRSSL; + goto error_ret_2; + } -DH_free(dh); + DH_free(dh); -SSL_CTX_set_options(a->ctx, SSL_OP_SINGLE_DH_USE); + SSL_CTX_set_options(a->ctx, SSL_OP_SINGLE_DH_USE); -if (!PICA_get_id_from_cert_file(cert_file, a->id)) - { - ret_err = PICA_ERRINVCERT; - goto error_ret_2; - } + if (!PICA_get_id_from_cert_file(cert_file, a->id)) + { + ret_err = PICA_ERRINVCERT; + goto error_ret_2; + } -ret = check_pkey_passphrase(pkey_file, password_cb, a->id); + ret = check_pkey_passphrase(pkey_file, password_cb, a->id); -if (ret != PICA_OK) - { - ret_err = ret; - goto error_ret_2; - } + if (ret != PICA_OK) + { + ret_err = ret; + goto error_ret_2; + } ////<< -if (password_cb) - { - SSL_CTX_set_default_passwd_cb(a->ctx, password_cb); - SSL_CTX_set_default_passwd_cb_userdata(a->ctx, a->id); - } - -ret = SSL_CTX_use_certificate_file(a->ctx, cert_file, SSL_FILETYPE_PEM); - -if (ret != 1) - { - ret_err=PICA_ERRSSL; - goto error_ret_2; - } - -ret = SSL_CTX_use_PrivateKey_file(a->ctx, pkey_file, SSL_FILETYPE_PEM); -if (ret != 1) - { - ret_err = PICA_ERRSSL; - goto error_ret_2; - } + if (password_cb) + { + SSL_CTX_set_default_passwd_cb(a->ctx, password_cb); + SSL_CTX_set_default_passwd_cb_userdata(a->ctx, a->id); + } + + ret = SSL_CTX_use_certificate_file(a->ctx, cert_file, SSL_FILETYPE_PEM); + + if (ret != 1) + { + ret_err = PICA_ERRSSL; + goto error_ret_2; + } + + ret = SSL_CTX_use_PrivateKey_file(a->ctx, pkey_file, SSL_FILETYPE_PEM); + if (ret != 1) + { + ret_err = PICA_ERRSSL; + goto error_ret_2; + } ////<< //ret=SSL_CTX_load_verify_locations(cid->ctx,CA_file,0/*"trustedCA/"*/); //printf("loadverifylocations ret=%i\n",ret);//debug //SSL_CTX_set_client_CA_list(cid->ctx,SSL_load_client_CA_file(CA_file)); -ret = SSL_CTX_set_cipher_list(a->ctx,"DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CAMELLIA256-SHA"); + ret = SSL_CTX_set_cipher_list(a->ctx, "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CAMELLIA256-SHA"); -if (ret != 1) -{ - ret_err = PICA_ERRSSL; - goto error_ret_2; -} + if (ret != 1) + { + ret_err = PICA_ERRSSL; + goto error_ret_2; + } -return PICA_OK; + return PICA_OK; error_ret_2: //(2) -SSL_CTX_free(a->ctx); + SSL_CTX_free(a->ctx); error_ret_1: //(1) -free(a); -*acc = 0; + free(a); + *acc = 0; -return ret_err; + return ret_err; } static int c2n_stage2_sendreq(struct PICA_c2n *c2n) { -struct PICA_proto_msg *mp; + struct PICA_proto_msg *mp; -puts("c2n_stage2_sendreq");//debug + puts("c2n_stage2_sendreq");//debug -mp = c2n_writebuf_push(c2n, PICA_PROTO_INITREQ, PICA_PROTO_INITREQ_SIZE); + mp = c2n_writebuf_push(c2n, PICA_PROTO_INITREQ, PICA_PROTO_INITREQ_SIZE); -if (mp) - { - mp->tail[0] = PICA_PROTO_VER_HIGH; - mp->tail[1] = PICA_PROTO_VER_LOW; - } -else - return PICA_ERRNOMEM; + if (mp) + { + mp->tail[0] = PICA_PROTO_VER_HIGH; + mp->tail[1] = PICA_PROTO_VER_LOW; + } + else + return PICA_ERRNOMEM; -c2n->state = PICA_C2N_STATE_WAITINGREP; + c2n->state = PICA_C2N_STATE_WAITINGREP; -return PICA_OK; + return PICA_OK; } static int c2n_stage3_starttls(struct PICA_c2n *c2n) { -int ret; + int ret; -ret = SSL_set_fd(c2n->ssl_comm, c2n->sck_comm); + ret = SSL_set_fd(c2n->ssl_comm, c2n->sck_comm); -if (ret != 1) - return PICA_ERRSSL; + if (ret != 1) + return PICA_ERRSSL; -ret = SSL_accept(c2n->ssl_comm); + ret = SSL_accept(c2n->ssl_comm); -if (ret == 0) - return PICA_ERRSSL; + if (ret == 0) + return PICA_ERRSSL; -if (ret < 0) - { - ret = SSL_get_error(c2n->ssl_comm, ret); + if (ret < 0) + { + ret = SSL_get_error(c2n->ssl_comm, ret); - if (ret != SSL_ERROR_WANT_READ && ret != SSL_ERROR_WANT_WRITE) - return PICA_ERRSSL; - } + if (ret != SSL_ERROR_WANT_READ && ret != SSL_ERROR_WANT_WRITE) + return PICA_ERRSSL; + } -c2n->state = PICA_C2N_STATE_WAITINGTLS; + c2n->state = PICA_C2N_STATE_WAITINGTLS; -return PICA_OK; + return PICA_OK; } static int c2n_stage4_nodelistrequest(struct PICA_c2n *c2n) { -struct PICA_proto_msg *mp; + struct PICA_proto_msg *mp; -mp = c2n_writebuf_push(c2n, PICA_PROTO_CLNODELISTREQ, PICA_PROTO_CLNODELISTREQ_SIZE); + mp = c2n_writebuf_push(c2n, PICA_PROTO_CLNODELISTREQ, PICA_PROTO_CLNODELISTREQ_SIZE); -if (mp) - { - RAND_bytes(mp->tail, 2); - } -else - return PICA_ERRNOMEM; + if (mp) + { + RAND_bytes(mp->tail, 2); + } + else + return PICA_ERRNOMEM; -c2n->state = PICA_C2N_STATE_CONNECTED; + c2n->state = PICA_C2N_STATE_CONNECTED; -callbacks.c2n_established_cb(c2n); + callbacks.c2n_established_cb(c2n); -return PICA_OK; + return PICA_OK; } /*адрес сервера, сертификат клиента и закрытый ключ*/ @@ -1325,141 +1331,141 @@ return PICA_OK; //.... int PICA_new_c2n(const struct PICA_acc *acc, const char *nodeaddr, - unsigned int port, - struct PICA_c2n **ci) + unsigned int port, + struct PICA_c2n **ci) { -int ret,ret_err; -struct PICA_c2n *cid; -struct sockaddr_in a; + int ret, ret_err; + struct PICA_c2n *cid; + struct sockaddr_in a; -if (!(nodeaddr && acc && port && ci)) - return PICA_ERRINVARG; + if (!(nodeaddr && acc && port && ci)) + return PICA_ERRINVARG; -cid=*ci=(struct PICA_c2n*)calloc(sizeof(struct PICA_c2n),1);//(1) -if (!cid) - return PICA_ERRNOMEM; + cid = *ci = (struct PICA_c2n*)calloc(sizeof(struct PICA_c2n), 1); //(1) + if (!cid) + return PICA_ERRNOMEM; -cid->acc = acc; + cid->acc = acc; -cid->read_buf = calloc(PICA_CONNREADBUFSIZE, 1);//(2) -if (!cid->read_buf) - { - ret_err = PICA_ERRNOMEM; - goto error_ret_1; - } + cid->read_buf = calloc(PICA_CONNREADBUFSIZE, 1);//(2) + if (!cid->read_buf) + { + ret_err = PICA_ERRNOMEM; + goto error_ret_1; + } -cid->ssl_comm=SSL_new(acc->ctx);//(3) + cid->ssl_comm = SSL_new(acc->ctx); //(3) -if (!cid->ssl_comm) + if (!cid->ssl_comm) { - ret_err=PICA_ERRSSL; - goto error_ret_2; + ret_err = PICA_ERRSSL; + goto error_ret_2; } //resolving name -{ - struct addrinfo h,*r; + { + struct addrinfo h, *r; - memset(&h,0,sizeof(struct addrinfo)); + memset(&h, 0, sizeof(struct addrinfo)); - h.ai_flags=0; + h.ai_flags = 0; #ifdef AI_IDN - h.ai_flags = h.ai_flags | AI_IDN; + h.ai_flags = h.ai_flags | AI_IDN; #endif #ifdef AI_ADDRCONFIG - h.ai_flags = h.ai_flags | AI_ADDRCONFIG; + h.ai_flags = h.ai_flags | AI_ADDRCONFIG; #endif - h.ai_family=AF_INET;//CONF - h.ai_socktype=SOCK_STREAM; - h.ai_protocol=IPPROTO_TCP; + h.ai_family = AF_INET; //CONF + h.ai_socktype = SOCK_STREAM; + h.ai_protocol = IPPROTO_TCP; - if (0!=getaddrinfo(nodeaddr,NULL,&h,&r)) - { - ret_err=PICA_ERRDNSRESOLVE; - goto error_ret_4; - } + if (0 != getaddrinfo(nodeaddr, NULL, &h, &r)) + { + ret_err = PICA_ERRDNSRESOLVE; + goto error_ret_4; + } - memset(&a,0,sizeof(a)); - memcpy(&a,r->ai_addr,r->ai_addrlen); - a.sin_family = AF_INET; - //a.sin_addr.s_addr = inet_addr (nodeaddr); - a.sin_port = htons(port); + memset(&a, 0, sizeof(a)); + memcpy(&a, r->ai_addr, r->ai_addrlen); + a.sin_family = AF_INET; + //a.sin_addr.s_addr = inet_addr (nodeaddr); + a.sin_port = htons(port); - freeaddrinfo(r); -} + freeaddrinfo(r); + } -cid->srv_addr=a; + cid->srv_addr = a; -cid->sck_comm=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//(5) -if (cid->sck_comm==SOCKET_ERROR) + cid->sck_comm = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //(5) + if (cid->sck_comm == SOCKET_ERROR) { - ret_err=PICA_ERRSOCK; - goto error_ret_3; + ret_err = PICA_ERRSOCK; + goto error_ret_3; } -IOCTLSETNONBLOCKINGSOCKET(cid->sck_comm, 1); + IOCTLSETNONBLOCKINGSOCKET(cid->sck_comm, 1); -cid->state = PICA_C2N_STATE_CONNECTING; + cid->state = PICA_C2N_STATE_CONNECTING; -ret=connect(cid->sck_comm,(struct sockaddr*)&cid->srv_addr,sizeof(cid->srv_addr)); + ret = connect(cid->sck_comm, (struct sockaddr*)&cid->srv_addr, sizeof(cid->srv_addr)); /////////////////state_ -if (ret == 0) - return c2n_stage2_sendreq(cid); + if (ret == 0) + return c2n_stage2_sendreq(cid); -if (ret==SOCKET_ERROR) + if (ret == SOCKET_ERROR) { #ifndef WIN32 - if (errno == EINPROGRESS || errno == EINTR) - return PICA_OK; + if (errno == EINPROGRESS || errno == EINTR) + return PICA_OK; #else - if (WSAGetLastError() == WSAEWOULDBLOCK) - return PICA_OK; + if (WSAGetLastError() == WSAEWOULDBLOCK) + return PICA_OK; #endif - ret_err=PICA_ERRSOCK; - goto error_ret_4; + ret_err = PICA_ERRSOCK; + goto error_ret_4; } -/* -do - { - ret = PICA_write_c2n(cid); - if (ret != PICA_OK) + /* + do { - ret_err = ret; - break; + ret = PICA_write_c2n(cid); + if (ret != PICA_OK) + { + ret_err = ret; + break; + } + ret = PICA_read_c2n(cid); + if (ret != PICA_OK) + { + ret_err = ret; + break; + } + //TODO Timeout } - ret = PICA_read_c2n(cid); - if (ret != PICA_OK) + while (cid->init_resp_ok == 0); + + if (cid->init_resp_ok != 1) { - ret_err = ret; - break; + if (cid->init_resp_ok == -1) + { + if (cid->node_ver_major > PICA_PROTO_VER_HIGH || + (cid->node_ver_major == PICA_PROTO_VER_HIGH && cid->node_ver_minor > PICA_PROTO_VER_LOW)) + ret_err = PICA_ERRPROTONEW; + else + ret_err = PICA_ERRPROTOOLD; + } + goto error_ret_4; } - //TODO Timeout - } -while (cid->init_resp_ok == 0); - -if (cid->init_resp_ok != 1) - { - if (cid->init_resp_ok == -1) - { - if (cid->node_ver_major > PICA_PROTO_VER_HIGH || - (cid->node_ver_major == PICA_PROTO_VER_HIGH && cid->node_ver_minor > PICA_PROTO_VER_LOW)) - ret_err = PICA_ERRPROTONEW; - else - ret_err = PICA_ERRPROTOOLD; - } - goto error_ret_4; - } -//printf("6\n");//debug -*/ /* + //printf("6\n");//debug + */ /* ret=SSL_set_fd(cid->ssl_comm,cid->sck_comm); //printf("SSL_set_fd=%i\n",ret); @@ -1480,167 +1486,167 @@ cid->state = PICA_C2N_STATE_CONNECTED;//<<<!!! struct PICA_proto_msg *mp; mp = c2n_writebuf_push( cid, PICA_PROTO_CLNODELISTREQ, PICA_PROTO_CLNODELISTREQ_SIZE); - + if (mp) { RAND_bytes(mp->tail, 2); - } + } } */ -return PICA_OK; + return PICA_OK; error_ret_4: //(4) - SHUTDOWN(cid->sck_comm); - CLOSE(cid->sck_comm); + SHUTDOWN(cid->sck_comm); + CLOSE(cid->sck_comm); error_ret_3: //(3) - SSL_free(cid->ssl_comm); + SSL_free(cid->ssl_comm); error_ret_2: //(2) - free(cid->read_buf); + free(cid->read_buf); error_ret_1: //(1) - free(cid); - *ci=0; + free(cid); + *ci = 0; -return ret_err; + return ret_err; } //создает ИСХОДЯЩИЙ логический зашифрованный канал связи с указанным собеседником, если тот доступен // в данный момент. -int PICA_new_c2c(struct PICA_c2n *ci,const unsigned char *peer_id, struct PICA_listener *l,struct PICA_c2c **chn) +int PICA_new_c2c(struct PICA_c2n *ci, const unsigned char *peer_id, struct PICA_listener *l, struct PICA_c2c **chn) { -struct PICA_proto_msg *mp; -struct PICA_c2c *chnl; + struct PICA_proto_msg *mp; + struct PICA_c2c *chnl; -if (!(ci && chn)) - return PICA_ERRINVARG; + if (!(ci && chn)) + return PICA_ERRINVARG; -if (!add_chaninfo(ci, chn, peer_id, PICA_c2c_OUTGOING)) - return PICA_ERRNOMEM; + if (!add_chaninfo(ci, chn, peer_id, PICA_c2c_OUTGOING)) + return PICA_ERRNOMEM; -chnl=*chn; + chnl = *chn; + + mp = c2n_writebuf_push( ci, PICA_PROTO_CONNREQOUTG, PICA_PROTO_CONNREQOUTG_SIZE); -mp = c2n_writebuf_push( ci, PICA_PROTO_CONNREQOUTG, PICA_PROTO_CONNREQOUTG_SIZE); - if (mp) - { + { memcpy(mp->tail, peer_id, PICA_ID_SIZE); - } + } else - return PICA_ERRNOMEM; + return PICA_ERRNOMEM; -return PICA_OK; + return PICA_OK; } static int process_c2n(struct PICA_c2n *c2n, fd_set *rfds, fd_set *wfds) { -int ret = PICA_OK; + int ret = PICA_OK; //puts("process_c2n()");//debug -switch(c2n->state) - { - case PICA_C2N_STATE_NEW: - break; + switch(c2n->state) + { + case PICA_C2N_STATE_NEW: + break; - case PICA_C2N_STATE_CONNECTING: + case PICA_C2N_STATE_CONNECTING: - if (FD_ISSET(c2n->sck_comm, wfds)) - { - ret = PICA_ERRSOCK; + if (FD_ISSET(c2n->sck_comm, wfds)) + { + ret = PICA_ERRSOCK; - //check if connect() finished successfully + //check if connect() finished successfully #ifndef WIN32 - int optval; - socklen_t optlen = sizeof(optval); - - if (0 == getsockopt(c2n->sck_comm, SOL_SOCKET, SO_ERROR, &optval, &optlen)) - { - if (optval == 0) - { - ret = c2n_stage2_sendreq(c2n); - } - } + int optval; + socklen_t optlen = sizeof(optval); + + if (0 == getsockopt(c2n->sck_comm, SOL_SOCKET, SO_ERROR, &optval, &optlen)) + { + if (optval == 0) + { + ret = c2n_stage2_sendreq(c2n); + } + } #else - if (SOCKET_ERROR == connect(c2n->ssl_comm, (struct sockaddr*)&c2n->srv_addr, sizeof(c2n->srv_addr)) && - WSAEISCONN == WSAGetLastError()) - { - ret = c2n_stage2_sendreq(c2n); - } + if (SOCKET_ERROR == connect(c2n->ssl_comm, (struct sockaddr*)&c2n->srv_addr, sizeof(c2n->srv_addr)) && + WSAEISCONN == WSAGetLastError()) + { + ret = c2n_stage2_sendreq(c2n); + } #endif - } + } - break; + break; - case PICA_C2N_STATE_WAITINGREP: + case PICA_C2N_STATE_WAITINGREP: - if (FD_ISSET(c2n->sck_comm, wfds)) - { - ret = PICA_write_c2n(c2n); - } + if (FD_ISSET(c2n->sck_comm, wfds)) + { + ret = PICA_write_c2n(c2n); + } - if (FD_ISSET(c2n->sck_comm, rfds)) - { - ret = PICA_read_c2n(c2n); - } + if (FD_ISSET(c2n->sck_comm, rfds)) + { + ret = PICA_read_c2n(c2n); + } - if (ret == PICA_OK && c2n->init_resp_ok != 0) - { - if (c2n->init_resp_ok == 1) - ret = c2n_stage3_starttls(c2n); - else - { - if (c2n->node_ver_major > PICA_PROTO_VER_HIGH || - (c2n->node_ver_major == PICA_PROTO_VER_HIGH && c2n->node_ver_minor > PICA_PROTO_VER_LOW)) - ret = PICA_ERRPROTONEW; - else - ret = PICA_ERRPROTOOLD; - } - } + if (ret == PICA_OK && c2n->init_resp_ok != 0) + { + if (c2n->init_resp_ok == 1) + ret = c2n_stage3_starttls(c2n); + else + { + if (c2n->node_ver_major > PICA_PROTO_VER_HIGH || + (c2n->node_ver_major == PICA_PROTO_VER_HIGH && c2n->node_ver_minor > PICA_PROTO_VER_LOW)) + ret = PICA_ERRPROTONEW; + else + ret = PICA_ERRPROTOOLD; + } + } - break; + break; - case PICA_C2N_STATE_WAITINGTLS: + case PICA_C2N_STATE_WAITINGTLS: - if (FD_ISSET(c2n->sck_comm, wfds) || FD_ISSET(c2n->sck_comm, rfds)) - { - int sslret; + if (FD_ISSET(c2n->sck_comm, wfds) || FD_ISSET(c2n->sck_comm, rfds)) + { + int sslret; - sslret = SSL_accept(c2n->ssl_comm); + sslret = SSL_accept(c2n->ssl_comm); - if (sslret == 1) - ret = c2n_stage4_nodelistrequest(c2n); - else if (sslret == 0) - ret = PICA_ERRSSL; - else if (sslret < 0) - { - sslret = SSL_get_error(c2n->ssl_comm, sslret); + if (sslret == 1) + ret = c2n_stage4_nodelistrequest(c2n); + else if (sslret == 0) + ret = PICA_ERRSSL; + else if (sslret < 0) + { + sslret = SSL_get_error(c2n->ssl_comm, sslret); - if (sslret != SSL_ERROR_WANT_READ && sslret != SSL_ERROR_WANT_WRITE) - ret = PICA_ERRSSL; - } - } + if (sslret != SSL_ERROR_WANT_READ && sslret != SSL_ERROR_WANT_WRITE) + ret = PICA_ERRSSL; + } + } - break; + break; - case PICA_C2N_STATE_CONNECTED: + case PICA_C2N_STATE_CONNECTED: - if (FD_ISSET(c2n->sck_comm, wfds)) - ret = PICA_write_c2n(c2n); + if (FD_ISSET(c2n->sck_comm, wfds)) + ret = PICA_write_c2n(c2n); - if (FD_ISSET(c2n->sck_comm, rfds)) - ret = PICA_read_c2n(c2n); + if (FD_ISSET(c2n->sck_comm, rfds)) + ret = PICA_read_c2n(c2n); - break; - } + break; + } -return ret; + return ret; } static int process_c2c(struct PICA_c2c *c2c, fd_set *rfds, fd_set *wfds) @@ -1649,355 +1655,355 @@ static int process_c2c(struct PICA_c2c *c2c, fd_set *rfds, fd_set *wfds) // { // // } -return PICA_OK; + return PICA_OK; } static int process_listener(struct PICA_listener *lst, fd_set *rfds) { -return PICA_OK; + return PICA_OK; } static void fdset_add(fd_set *fds, int fd, int *max) { -FD_SET(fd, fds); + FD_SET(fd, fds); -if (fd > *max) - *max = fd; + if (fd > *max) + *max = fd; } int PICA_event_loop(struct PICA_c2n **connections, struct PICA_listener **listeners, int timeout) { -fd_set rfds, wfds; -struct timeval tv; -int ret, nfds = 0; -struct PICA_c2n **ic2n; -struct PICA_listener **ilst; + fd_set rfds, wfds; + struct timeval tv; + int ret, nfds = 0; + struct PICA_c2n **ic2n; + struct PICA_listener **ilst; //puts("PICA_event_loop");//debug -tv.tv_sec = timeout / 1000; -tv.tv_usec = (timeout % 1000) * 1000; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; -FD_ZERO(&rfds); -FD_ZERO(&wfds); + FD_ZERO(&rfds); + FD_ZERO(&wfds); -ilst = listeners; + ilst = listeners; -while(ilst && *ilst) - { - fdset_add(&rfds, (*ilst)->sck_listener, &nfds); - ilst++; - } + while(ilst && *ilst) + { + fdset_add(&rfds, (*ilst)->sck_listener, &nfds); + ilst++; + } -ic2n = connections; + ic2n = connections; -while(ic2n && *ic2n) - { - struct PICA_c2c *ic2c; + while(ic2n && *ic2n) + { + struct PICA_c2c *ic2c; - //printf("event_loop: adding c2n %p\n", *ic2n);//debug + //printf("event_loop: adding c2n %p\n", *ic2n);//debug - fdset_add(&rfds, (*ic2n)->sck_comm, &nfds); + fdset_add(&rfds, (*ic2n)->sck_comm, &nfds); - if ((*ic2n)->write_pos || (*ic2n)->state == PICA_C2N_STATE_CONNECTING - || (*ic2n)->state == PICA_C2N_STATE_WAITINGTLS) - fdset_add(&wfds, (*ic2n)->sck_comm, &nfds); + if ((*ic2n)->write_pos || (*ic2n)->state == PICA_C2N_STATE_CONNECTING + || (*ic2n)->state == PICA_C2N_STATE_WAITINGTLS) + fdset_add(&wfds, (*ic2n)->sck_comm, &nfds); - ic2c = (*ic2n)->chan_list_head; + ic2c = (*ic2n)->chan_list_head; - while(ic2c) - { - if (ic2c->state == PICA_C2C_STATE_ACTIVE) - { - fdset_add(&rfds, ic2c->sck_data, &nfds); + while(ic2c) + { + if (ic2c->state == PICA_C2C_STATE_ACTIVE) + { + fdset_add(&rfds, ic2c->sck_data, &nfds); - if (ic2c->write_pos || ic2c->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) - fdset_add(&wfds, ic2c->sck_data, &nfds); - } + if (ic2c->write_pos || ic2c->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) + fdset_add(&wfds, ic2c->sck_data, &nfds); + } - ic2c = ic2c->next; - } + ic2c = ic2c->next; + } - ic2n++; - } + ic2n++; + } -ret = select(nfds + 1, &rfds, &wfds, NULL, &tv); + ret = select(nfds + 1, &rfds, &wfds, NULL, &tv); -if (ret == -1) - { + if (ret == -1) + { #ifndef WIN32 - if (errno == EINTR) - return PICA_OK; - else - return PICA_ERRSOCK; + if (errno == EINTR) + return PICA_OK; + else + return PICA_ERRSOCK; #else #warning "implement handling of select() errors on Windows!" #endif - } + } //printf("select() returned %i\n", ret);//debug //processing listeners, c2n and c2c connections -ilst = listeners; + ilst = listeners; -while(ilst && *ilst) - { - ret = process_listener(*ilst, &rfds); + while(ilst && *ilst) + { + ret = process_listener(*ilst, &rfds); - if (ret != PICA_OK) - { - callbacks.listener_error(*ilst, ret); - PICA_close_listener(*ilst); - } + if (ret != PICA_OK) + { + callbacks.listener_error(*ilst, ret); + PICA_close_listener(*ilst); + } - ilst++; - } + ilst++; + } -ic2n = connections; + ic2n = connections; -while(ic2n && *ic2n) - { - struct PICA_c2c *ic2c; + while(ic2n && *ic2n) + { + struct PICA_c2c *ic2c; - //processing current c2n + //processing current c2n - ret = process_c2n(*ic2n, &rfds, &wfds); + ret = process_c2n(*ic2n, &rfds, &wfds); - if (ret != PICA_OK) - { - if ((*ic2n)->state == PICA_C2N_STATE_CONNECTED) - callbacks.c2n_closed_cb(*ic2n); - else - callbacks.c2n_failed_cb(*ic2n); + if (ret != PICA_OK) + { + if ((*ic2n)->state == PICA_C2N_STATE_CONNECTED) + callbacks.c2n_closed_cb(*ic2n); + else + callbacks.c2n_failed_cb(*ic2n); - PICA_close_c2n(*ic2n); - } - else - { - struct PICA_c2c *kill_ptr = 0; + PICA_close_c2n(*ic2n); + } + else + { + struct PICA_c2c *kill_ptr = 0; - ic2c = (*ic2n)->chan_list_head; + ic2c = (*ic2n)->chan_list_head; - //processing c2c connections associated with current c2n - while(ic2c) - { - ret = process_c2c(ic2c, &rfds, &wfds); + //processing c2c connections associated with current c2n + while(ic2c) + { + ret = process_c2c(ic2c, &rfds, &wfds); - if (ret != PICA_OK) - kill_ptr = ic2c; + if (ret != PICA_OK) + kill_ptr = ic2c; - ic2c = ic2c->next; + ic2c = ic2c->next; - if (kill_ptr) - { - PICA_close_c2c(kill_ptr); - kill_ptr = 0; - } - } - } - ic2n++; - } + if (kill_ptr) + { + PICA_close_c2c(kill_ptr); + kill_ptr = 0; + } + } + } + ic2n++; + } -return PICA_OK; + return PICA_OK; } -int PICA_read(struct PICA_c2n *ci,int timeout) +int PICA_read(struct PICA_c2n *ci, int timeout) { -fd_set fds; -struct timeval tv={0,1000}; -struct PICA_c2c *ipt, *kill_ptr = 0; -int ret,nfds; + fd_set fds; + struct timeval tv = {0, 1000}; + struct PICA_c2c *ipt, *kill_ptr = 0; + int ret, nfds; //puts("PICA_read<<");//debug -tv.tv_usec=timeout; + tv.tv_usec = timeout; -FD_ZERO(&fds); + FD_ZERO(&fds); -nfds=ci->sck_comm; -FD_SET(ci->sck_comm,&fds); + nfds = ci->sck_comm; + FD_SET(ci->sck_comm, &fds); -ipt=ci->chan_list_head; + ipt = ci->chan_list_head; -while(ipt) + while(ipt) { - if (ipt->state==PICA_C2C_STATE_ACTIVE) + if (ipt->state == PICA_C2C_STATE_ACTIVE) { - FD_SET(ipt->sck_data,&fds); + FD_SET(ipt->sck_data, &fds); - if (ipt->sck_data>nfds) - nfds=ipt->sck_data; - } + if (ipt->sck_data > nfds) + nfds = ipt->sck_data; + } - if (ipt->state != PICA_C2C_STATE_ACTIVE && (time(0) - ipt->timestamp) > PICA_CHAN_ACTIVATE_TIMEOUT) + if (ipt->state != PICA_C2C_STATE_ACTIVE && (time(0) - ipt->timestamp) > PICA_CHAN_ACTIVATE_TIMEOUT) { - kill_ptr = ipt; + kill_ptr = ipt; } - ipt=ipt->next; + ipt = ipt->next; - if (kill_ptr) + if (kill_ptr) { - PICA_close_c2c(kill_ptr); - kill_ptr = 0; + PICA_close_c2c(kill_ptr); + kill_ptr = 0; } } //#warning "make sockets non-blocking!!!!" -ret=select(nfds+1,&fds,0,0,&tv); + ret = select(nfds + 1, &fds, 0, 0, &tv); -if (ret>0) + if (ret > 0) { - - if (FD_ISSET(ci->sck_comm,&fds)) + + if (FD_ISSET(ci->sck_comm, &fds)) { - ret=PICA_read_c2n(ci); - if (ret!=PICA_OK) - return ret; + ret = PICA_read_c2n(ci); + if (ret != PICA_OK) + return ret; } - ipt=ci->chan_list_head; - while(ipt) + ipt = ci->chan_list_head; + while(ipt) { - if (ipt->state==PICA_C2C_STATE_ACTIVE && FD_ISSET(ipt->sck_data, &fds)) + if (ipt->state == PICA_C2C_STATE_ACTIVE && FD_ISSET(ipt->sck_data, &fds)) { - if (PICA_OK != (ret = PICA_read_c2c(ipt)) ) + if (PICA_OK != (ret = PICA_read_c2c(ipt)) ) { - puts("PICA_read_c2c() failed");//debug - callbacks.c2c_closed_cb(ipt->peer_id, ret); - kill_ptr = ipt; + puts("PICA_read_c2c() failed");//debug + callbacks.c2c_closed_cb(ipt->peer_id, ret); + kill_ptr = ipt; } - + } - - ipt=ipt->next; - if (kill_ptr) + ipt = ipt->next; + + if (kill_ptr) { - PICA_close_c2c(kill_ptr); - kill_ptr = 0; + PICA_close_c2c(kill_ptr); + kill_ptr = 0; } } } //puts("PICA_read>>");//debug -return PICA_OK; + return PICA_OK; } int PICA_write(struct PICA_c2n *ci) { -struct PICA_c2c *ipt, *kill_ptr = 0; -int ret = PICA_OK; + struct PICA_c2c *ipt, *kill_ptr = 0; + int ret = PICA_OK; //puts("PICA_write>>");//debug -if (ci->write_pos) - ret = PICA_write_c2n(ci); + if (ci->write_pos) + ret = PICA_write_c2n(ci); -if (PICA_OK != ret) - return ret; + if (PICA_OK != ret) + return ret; -ipt=ci->chan_list_head; + ipt = ci->chan_list_head; -while(ipt) + while(ipt) { - if (ipt->write_pos) + if (ipt->write_pos) { - if (PICA_OK != (ret = PICA_write_c2c(ipt))) + if (PICA_OK != (ret = PICA_write_c2c(ipt))) { - fprintf(stderr,"PICA_write_c2c() failed, ret = %i\n", ret);//debug - callbacks.c2c_closed_cb(ipt->peer_id, ret); - kill_ptr = ipt; + fprintf(stderr, "PICA_write_c2c() failed, ret = %i\n", ret); //debug + callbacks.c2c_closed_cb(ipt->peer_id, ret); + kill_ptr = ipt; + } + } + else if (ipt->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) + { + if (PICA_OK != (ret = PICA_send_file_fragment(ipt))) + { + callbacks.c2c_closed_cb(ipt->peer_id, ret); + kill_ptr = ipt; } } - else if (ipt->sendfilestate == PICA_CHANSENDFILESTATE_SENDING) - { - if (PICA_OK != (ret = PICA_send_file_fragment(ipt))) - { - callbacks.c2c_closed_cb(ipt->peer_id, ret); - kill_ptr = ipt; - } - } - ipt = ipt->next; - - if (kill_ptr) + ipt = ipt->next; + + if (kill_ptr) { - PICA_close_c2c(kill_ptr); - kill_ptr = 0; + PICA_close_c2c(kill_ptr); + kill_ptr = 0; } } //puts("PICA_write<<");//debug -return PICA_OK; + return PICA_OK; } int PICA_write_socket(SOCKET s, unsigned char *buf, unsigned int *ppos) { -int ret; + int ret; -if (*ppos > 0 ) + if (*ppos > 0 ) { - ret = send( s, buf, *ppos, MSG_NOSIGNAL); + ret = send( s, buf, *ppos, MSG_NOSIGNAL); - if (ret > 0) + if (ret > 0) { - if (ret < *ppos) - memmove( buf, buf + ret, *ppos - ret); - *ppos -= ret; + if (ret < *ppos) + memmove( buf, buf + ret, *ppos - ret); + *ppos -= ret; } - - if (ret < 0) + + if (ret < 0) { #ifdef WIN32 - ret = WSAGetLastError(); - if (! (ret == WSAEWOULDBLOCK || ret == WSAENOBUFS)) + ret = WSAGetLastError(); + if (! (ret == WSAEWOULDBLOCK || ret == WSAENOBUFS)) #else - ret = errno; - if (! (ret == EAGAIN || ret == ENOBUFS || ret == EINTR)) + ret = errno; + if (! (ret == EAGAIN || ret == ENOBUFS || ret == EINTR)) #endif - return PICA_ERRSOCK; + return PICA_ERRSOCK; } - if (ret == 0) - return PICA_ERRSERV; - + if (ret == 0) + return PICA_ERRSERV; + } -return PICA_OK; + return PICA_OK; } int PICA_write_ssl(SSL *ssl, unsigned char *buf, unsigned int *ppos, unsigned int *btw) { -int ret; + int ret; -if (*ppos > 0 ) + if (*ppos > 0 ) { - if (*btw == 0) - *btw = *ppos; + if (*btw == 0) + *btw = *ppos; - ret = SSL_write( ssl, buf, *btw); - - if (ret > 0) + ret = SSL_write( ssl, buf, *btw); + + if (ret > 0) { - if (ret < *ppos) - memmove( buf, buf + ret, *ppos - ret); - *ppos -= ret; - *btw = 0; + if (ret < *ppos) + memmove( buf, buf + ret, *ppos - ret); + *ppos -= ret; + *btw = 0; } - - if (ret < 0) + + if (ret < 0) { - ret = SSL_get_error( ssl, ret); - if (! (ret == SSL_ERROR_WANT_WRITE || ret == SSL_ERROR_WANT_READ)) + ret = SSL_get_error( ssl, ret); + if (! (ret == SSL_ERROR_WANT_WRITE || ret == SSL_ERROR_WANT_READ)) return PICA_ERRSSL; } - if (ret == 0) - return PICA_ERRSERV; - + if (ret == 0) + return PICA_ERRSERV; + } -return PICA_OK; + return PICA_OK; } //int PICA_read_socket() @@ -2005,41 +2011,41 @@ return PICA_OK; int PICA_write_c2n(struct PICA_c2n *ci) { -int ret = PICA_ERRINVARG; + int ret = PICA_ERRINVARG; -if (PICA_C2N_STATE_WAITINGREP == ci->state) - ret = PICA_write_socket( ci->sck_comm, ci->write_buf, &ci->write_pos); -else if (PICA_C2N_STATE_CONNECTED == ci->state) - ret = PICA_write_ssl( ci->ssl_comm, ci->write_buf, &ci->write_pos, &ci->write_sslbytestowrite); + if (PICA_C2N_STATE_WAITINGREP == ci->state) + ret = PICA_write_socket( ci->sck_comm, ci->write_buf, &ci->write_pos); + else if (PICA_C2N_STATE_CONNECTED == ci->state) + ret = PICA_write_ssl( ci->ssl_comm, ci->write_buf, &ci->write_pos, &ci->write_sslbytestowrite); -return ret; + return ret; } int PICA_write_c2c(struct PICA_c2c *chn) { -int ret = PICA_ERRINVARG; + int ret = PICA_ERRINVARG; -if (PICA_C2C_STATE_ACTIVE != chn->state) - ret = PICA_write_socket( chn->sck_data, chn->write_buf, &chn->write_pos); -else - ret = PICA_write_ssl( chn->ssl, chn->write_buf, &chn->write_pos, &chn->write_sslbytestowrite); + if (PICA_C2C_STATE_ACTIVE != chn->state) + ret = PICA_write_socket( chn->sck_data, chn->write_buf, &chn->write_pos); + else + ret = PICA_write_ssl( chn->ssl, chn->write_buf, &chn->write_pos, &chn->write_sslbytestowrite); -return ret; + return ret; } int PICA_read_socket(SOCKET s, unsigned char *buf, unsigned int *ppos, unsigned int size) { -int ret; + int ret; -ret = recv(s, buf + *ppos, size - *ppos, 0); + ret = recv(s, buf + *ppos, size - *ppos, 0); -if (ret == 0) - return PICA_ERRDISCONNECT; + if (ret == 0) + return PICA_ERRDISCONNECT; -if (ret < 0) + if (ret < 0) { #ifdef WIN32 - switch(WSAGetLastError()) + switch(WSAGetLastError()) { case WSAEINTR: case WSAEINPROGRESS: @@ -2049,517 +2055,517 @@ if (ret < 0) return PICA_ERRSOCK; } #else - switch(errno) + switch(errno) { case EAGAIN : #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif case EINTR: - break; - + break; + default: return PICA_ERRSOCK;//ERR_CHECK } #endif } - -if (ret > 0) + + if (ret > 0) { - *ppos += ret; + *ppos += ret; } - -return PICA_OK; + + return PICA_OK; } int PICA_read_ssl(SSL *ssl, unsigned char *buf, unsigned int *ppos, unsigned int size) { -int ret; + int ret; -ret = SSL_read(ssl, buf + *ppos, size - *ppos); + ret = SSL_read(ssl, buf + *ppos, size - *ppos); -if (!ret) - return PICA_ERRSSL; + if (!ret) + return PICA_ERRSSL; -if (ret < 0) - switch(SSL_get_error(ssl, ret)) + if (ret < 0) + switch(SSL_get_error(ssl, ret)) { case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_READ: - break; + break; default: - return PICA_ERRSSL; + return PICA_ERRSSL; }; - -if (ret > 0) + + if (ret > 0) { - *ppos += ret; + *ppos += ret; } - -return PICA_OK; + + return PICA_OK; } int PICA_read_c2c(struct PICA_c2c *chn) { -int ret; + int ret; -if (chn->state != PICA_C2C_STATE_ACTIVE) - return PICA_OK;// ??? + if (chn->state != PICA_C2C_STATE_ACTIVE) + return PICA_OK;// ??? //ret = SSL_read(chn->ssl , chn->read_buf + chn->read_pos, PICA_CHANREADBUFSIZE - chn->read_pos); -ret = PICA_read_ssl(chn->ssl, chn->read_buf, &chn->read_pos, PICA_CHANREADBUFSIZE); - -if (ret == PICA_OK) + ret = PICA_read_ssl(chn->ssl, chn->read_buf, &chn->read_pos, PICA_CHANREADBUFSIZE); + + if (ret == PICA_OK) { - if(!PICA_processdatastream(chn->read_buf, &(chn->read_pos ), chn, c2c_messages, MSGINFO_MSGSNUM(c2c_messages))) - return PICA_ERRSERV; + if(!PICA_processdatastream(chn->read_buf, &(chn->read_pos ), chn, c2c_messages, MSGINFO_MSGSNUM(c2c_messages))) + return PICA_ERRSERV; } -return ret; + return ret; } //функция читает и обрабатывает данные, приходящие от сервера по управляющему соединению. -int PICA_read_c2n(struct PICA_c2n *ci) +int PICA_read_c2n(struct PICA_c2n *ci) { -int ret; + int ret; //ret=SSL_read(ci->ssl_comm, ci->read_buf + ci->read_pos, PICA_CONNREADBUFSIZE - ci->read_pos); -if (PICA_C2N_STATE_WAITINGREP == ci->state) - ret = PICA_read_socket(ci->sck_comm, ci->read_buf, &ci->read_pos, PICA_CONNREADBUFSIZE); -else if (PICA_C2N_STATE_CONNECTED == ci->state) - ret = PICA_read_ssl(ci->ssl_comm, ci->read_buf, &ci->read_pos, PICA_CONNREADBUFSIZE); + if (PICA_C2N_STATE_WAITINGREP == ci->state) + ret = PICA_read_socket(ci->sck_comm, ci->read_buf, &ci->read_pos, PICA_CONNREADBUFSIZE); + else if (PICA_C2N_STATE_CONNECTED == ci->state) + ret = PICA_read_ssl(ci->ssl_comm, ci->read_buf, &ci->read_pos, PICA_CONNREADBUFSIZE); -if (ret == PICA_OK) + if (ret == PICA_OK) { - if (PICA_C2N_STATE_WAITINGREP == ci->state) - if(!PICA_processdatastream( ci->read_buf, &(ci->read_pos), ci, c2n_init_messages, MSGINFO_MSGSNUM(c2n_init_messages))) - return PICA_ERRSERV; - - if (PICA_C2N_STATE_CONNECTED == ci->state) - if(!PICA_processdatastream( ci->read_buf, &(ci->read_pos), ci, c2n_messages, MSGINFO_MSGSNUM(c2n_messages))) - return PICA_ERRSERV; + if (PICA_C2N_STATE_WAITINGREP == ci->state) + if(!PICA_processdatastream( ci->read_buf, &(ci->read_pos), ci, c2n_init_messages, MSGINFO_MSGSNUM(c2n_init_messages))) + return PICA_ERRSERV; + + if (PICA_C2N_STATE_CONNECTED == ci->state) + if(!PICA_processdatastream( ci->read_buf, &(ci->read_pos), ci, c2n_messages, MSGINFO_MSGSNUM(c2n_messages))) + return PICA_ERRSERV; } -return ret; -} + return ret; +} struct PICA_proto_msg* c2n_writebuf_push(struct PICA_c2n *ci, unsigned int msgid, unsigned int size) { -struct PICA_proto_msg *mp; - -if (! ci->write_buf) + struct PICA_proto_msg *mp; + + if (! ci->write_buf) { - ci->write_buf = calloc(PICA_CONNWRITEBUFSIZE, 1); - if (!ci->write_buf) - return 0; - ci->write_buflen = PICA_CONNWRITEBUFSIZE; + ci->write_buf = calloc(PICA_CONNWRITEBUFSIZE, 1); + if (!ci->write_buf) + return 0; + ci->write_buflen = PICA_CONNWRITEBUFSIZE; } - -if (ci->write_buflen - ci->write_pos < size) + + if (ci->write_buflen - ci->write_pos < size) { - unsigned char*p; - p = realloc(ci->write_buf, size + ci->write_pos); - - if (p) + unsigned char*p; + p = realloc(ci->write_buf, size + ci->write_pos); + + if (p) { - ci->write_buf = p; - ci->write_buflen = size + ci->write_pos; + ci->write_buf = p; + ci->write_buflen = size + ci->write_pos; } - else - return 0; + else + return 0; } - -mp = (struct PICA_proto_msg *)(ci->write_buf + ci->write_pos); -mp->head[0] = mp->head[1] = msgid; -ci->write_pos += size; -return mp; + mp = (struct PICA_proto_msg *)(ci->write_buf + ci->write_pos); + mp->head[0] = mp->head[1] = msgid; + ci->write_pos += size; + + return mp; } struct PICA_proto_msg* c2c_writebuf_push(struct PICA_c2c *chn, unsigned int msgid, unsigned int size) { -struct PICA_proto_msg *mp; - -if (! chn->write_buf) + struct PICA_proto_msg *mp; + + if (! chn->write_buf) { - chn->write_buf = calloc(PICA_CHANWRITEBUFSIZE, 1); - if (!chn->write_buf) - return 0; - chn->write_buflen = PICA_CHANWRITEBUFSIZE; + chn->write_buf = calloc(PICA_CHANWRITEBUFSIZE, 1); + if (!chn->write_buf) + return 0; + chn->write_buflen = PICA_CHANWRITEBUFSIZE; } - -if (chn->write_buflen - chn->write_pos < size) + + if (chn->write_buflen - chn->write_pos < size) { - unsigned char*p; - p = realloc(chn->write_buf, size + chn->write_pos); - - if (p) + unsigned char*p; + p = realloc(chn->write_buf, size + chn->write_pos); + + if (p) { - chn->write_buf = p; - chn->write_buflen = size + chn->write_pos; + chn->write_buf = p; + chn->write_buflen = size + chn->write_pos; } - else - return 0; + else + return 0; } - -mp = (struct PICA_proto_msg *)(chn->write_buf + chn->write_pos); -mp->head[0] = mp->head[1] = msgid; -chn->write_pos += size; -return mp; + mp = (struct PICA_proto_msg *)(chn->write_buf + chn->write_pos); + mp->head[0] = mp->head[1] = msgid; + chn->write_pos += size; + + return mp; } -int PICA_send_msg(struct PICA_c2c *chn, char *buf,unsigned int len) +int PICA_send_msg(struct PICA_c2c *chn, char *buf, unsigned int len) { -struct PICA_proto_msg *mp; + struct PICA_proto_msg *mp; -if (len > PICA_PROTO_C2CMSG_MAXDATASIZE) - return PICA_ERRMSGSIZE; + if (len > PICA_PROTO_C2CMSG_MAXDATASIZE) + return PICA_ERRMSGSIZE; -if ((mp = c2c_writebuf_push(chn, PICA_PROTO_MSGUTF8, len + 4))) + if ((mp = c2c_writebuf_push(chn, PICA_PROTO_MSGUTF8, len + 4))) { - *((uint16_t*)mp->tail) = len; - memcpy(mp->tail + 2, buf, len); + *((uint16_t*)mp->tail) = len; + memcpy(mp->tail + 2, buf, len); } -else - return PICA_ERRNOMEM; + else + return PICA_ERRNOMEM; -return PICA_OK; + return PICA_OK; } int PICA_send_file(struct PICA_c2c *chn, const char *filepath) { -struct PICA_proto_msg *mp; -size_t namelen; -uint64_t file_size; -int ret; -const char *filename;//file name part of the filepath + struct PICA_proto_msg *mp; + size_t namelen; + uint64_t file_size; + int ret; + const char *filename;//file name part of the filepath -if (chn->sendfilestate != PICA_CHANSENDFILESTATE_IDLE) - return PICA_ERRFILETRANSFERINPROGRESS; + if (chn->sendfilestate != PICA_CHANSENDFILESTATE_IDLE) + return PICA_ERRFILETRANSFERINPROGRESS; -if (filepath == NULL) - return PICA_ERRINVFILENAME; + if (filepath == NULL) + return PICA_ERRINVFILENAME; #ifndef WIN32 -filename = strrchr(filepath, '/'); + filename = strrchr(filepath, '/'); #else -filename = strrchr(filepath, '\\'); + filename = strrchr(filepath, '\\'); #endif -if (filename) - filename++; -else - filename = filepath; + if (filename) + filename++; + else + filename = filepath; -namelen = strlen(filename); + namelen = strlen(filename); -if (namelen == 0 || namelen > PICA_PROTO_C2CMSG_MAXFILENAMESIZE) - return PICA_ERRINVFILENAME; + if (namelen == 0 || namelen > PICA_PROTO_C2CMSG_MAXFILENAMESIZE) + return PICA_ERRINVFILENAME; -if ((ret = PICA_sendfile_open_read(chn, filepath, &file_size)) != PICA_OK) - return ret; + if ((ret = PICA_sendfile_open_read(chn, filepath, &file_size)) != PICA_OK) + return ret; -if ((mp = c2c_writebuf_push(chn, PICA_PROTO_SENDFILEREQUEST, namelen + 12))) + if ((mp = c2c_writebuf_push(chn, PICA_PROTO_SENDFILEREQUEST, namelen + 12))) { - *((uint16_t*)mp->tail) = namelen + 8; - *((uint64_t*)(mp->tail + 2)) = file_size; + *((uint16_t*)mp->tail) = namelen + 8; + *((uint64_t*)(mp->tail + 2)) = file_size; - memcpy(mp->tail + 10, filename, namelen); + memcpy(mp->tail + 10, filename, namelen); } -else - return PICA_ERRNOMEM; + else + return PICA_ERRNOMEM; -chn->sendfilestate = PICA_CHANSENDFILESTATE_SENTREQ; -chn->sendfile_size = file_size; -chn->sendfile_pos = 0; + chn->sendfilestate = PICA_CHANSENDFILESTATE_SENTREQ; + chn->sendfile_size = file_size; + chn->sendfile_pos = 0; -return PICA_OK; + return PICA_OK; } int PICA_pause_file(struct PICA_c2c *chan, int sending) { -int senderctl = PICA_PROTO_FILECONTROL_VOID; -int receiverctl = PICA_PROTO_FILECONTROL_VOID; + int senderctl = PICA_PROTO_FILECONTROL_VOID; + int receiverctl = PICA_PROTO_FILECONTROL_VOID; -fprintf(stderr, "PICA_pause_file(%p, %i)\n", chan, sending);//debug + fprintf(stderr, "PICA_pause_file(%p, %i)\n", chan, sending);//debug -if (sending) - { - if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENDING) - return PICA_ERRINVARG; + if (sending) + { + if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENDING) + return PICA_ERRINVARG; - chan->sendfilestate = PICA_CHANSENDFILESTATE_PAUSED; + chan->sendfilestate = PICA_CHANSENDFILESTATE_PAUSED; - senderctl = PICA_PROTO_FILECONTROL_PAUSE; - } - else - { - if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING) - return PICA_ERRINVARG; + senderctl = PICA_PROTO_FILECONTROL_PAUSE; + } + else + { + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING) + return PICA_ERRINVARG; - chan->recvfilestate = PICA_CHANRECVFILESTATE_PAUSED; + chan->recvfilestate = PICA_CHANRECVFILESTATE_PAUSED; - receiverctl = PICA_PROTO_FILECONTROL_PAUSE; - } + receiverctl = PICA_PROTO_FILECONTROL_PAUSE; + } -return PICA_send_filecontrol(chan, senderctl, receiverctl); + return PICA_send_filecontrol(chan, senderctl, receiverctl); } int PICA_resume_file(struct PICA_c2c *chan, int sending) { -int senderctl = PICA_PROTO_FILECONTROL_VOID; -int receiverctl = PICA_PROTO_FILECONTROL_VOID; + int senderctl = PICA_PROTO_FILECONTROL_VOID; + int receiverctl = PICA_PROTO_FILECONTROL_VOID; -if (sending) - { - if (chan->sendfilestate != PICA_CHANSENDFILESTATE_PAUSED) - return PICA_ERRINVARG; + if (sending) + { + if (chan->sendfilestate != PICA_CHANSENDFILESTATE_PAUSED) + return PICA_ERRINVARG; - chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; + chan->sendfilestate = PICA_CHANSENDFILESTATE_SENDING; - senderctl = PICA_PROTO_FILECONTROL_RESUME; - } - else - { - if (chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) - return PICA_ERRINVARG; + senderctl = PICA_PROTO_FILECONTROL_RESUME; + } + else + { + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) + return PICA_ERRINVARG; - chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; + chan->recvfilestate = PICA_CHANRECVFILESTATE_RECEIVING; - receiverctl = PICA_PROTO_FILECONTROL_RESUME; - } + receiverctl = PICA_PROTO_FILECONTROL_RESUME; + } -return PICA_send_filecontrol(chan, senderctl, receiverctl); + return PICA_send_filecontrol(chan, senderctl, receiverctl); } int PICA_cancel_file(struct PICA_c2c *chan, int sending) { -int senderctl = PICA_PROTO_FILECONTROL_VOID; -int receiverctl = PICA_PROTO_FILECONTROL_VOID; + int senderctl = PICA_PROTO_FILECONTROL_VOID; + int receiverctl = PICA_PROTO_FILECONTROL_VOID; -if (sending) - { - if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENDING - && chan->sendfilestate != PICA_CHANSENDFILESTATE_PAUSED) - return PICA_ERRINVARG; + if (sending) + { + if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENDING + && chan->sendfilestate != PICA_CHANSENDFILESTATE_PAUSED) + return PICA_ERRINVARG; - fclose(chan->sendfile_stream); - chan->sendfile_stream = NULL; - chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; + fclose(chan->sendfile_stream); + chan->sendfile_stream = NULL; + chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; - senderctl = PICA_PROTO_FILECONTROL_CANCEL; - } - else - { - if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING - && chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) - return PICA_ERRINVARG; + senderctl = PICA_PROTO_FILECONTROL_CANCEL; + } + else + { + if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING + && chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED) + return PICA_ERRINVARG; - fclose(chan->recvfile_stream); - chan->recvfile_stream = NULL; - chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; + fclose(chan->recvfile_stream); + chan->recvfile_stream = NULL; + chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE; - receiverctl = PICA_PROTO_FILECONTROL_CANCEL; - } + receiverctl = PICA_PROTO_FILECONTROL_CANCEL; + } -return PICA_send_filecontrol(chan, senderctl, receiverctl); + return PICA_send_filecontrol(chan, senderctl, receiverctl); } int PICA_send_filecontrol(struct PICA_c2c *chan, int senderctl, int receiverctl) { -struct PICA_proto_msg *mp; + struct PICA_proto_msg *mp; -fprintf(stderr, "PICA_send_filecontrol(%p, %i, %i)\n", chan, senderctl, receiverctl);//debug + fprintf(stderr, "PICA_send_filecontrol(%p, %i, %i)\n", chan, senderctl, receiverctl);//debug -if ((mp = c2c_writebuf_push(chan, PICA_PROTO_FILECONTROL, PICA_PROTO_FILECONTROL_SIZE))) - { - mp->tail[0] = senderctl; //sender's command - mp->tail[1] = receiverctl; //receiver's command - } -else - return PICA_ERRNOMEM; + if ((mp = c2c_writebuf_push(chan, PICA_PROTO_FILECONTROL, PICA_PROTO_FILECONTROL_SIZE))) + { + mp->tail[0] = senderctl; //sender's command + mp->tail[1] = receiverctl; //receiver's command + } + else + return PICA_ERRNOMEM; -return PICA_OK; + return PICA_OK; } int PICA_send_file_fragment(struct PICA_c2c *chn) { -struct PICA_proto_msg *mp; -char buf[PICA_FILEFRAGMENTSIZE]; -size_t fragment_size; + struct PICA_proto_msg *mp; + char buf[PICA_FILEFRAGMENTSIZE]; + size_t fragment_size; -if (chn->sendfilestate != PICA_CHANSENDFILESTATE_SENDING) - return PICA_ERRFILETRANSFERNOTINPROGRESS; + if (chn->sendfilestate != PICA_CHANSENDFILESTATE_SENDING) + return PICA_ERRFILETRANSFERNOTINPROGRESS; -fragment_size = fread(buf, 1, PICA_FILEFRAGMENTSIZE, chn->sendfile_stream); + fragment_size = fread(buf, 1, PICA_FILEFRAGMENTSIZE, chn->sendfile_stream); -if (fragment_size == 0) - { - fclose(chn->sendfile_stream); - chn->sendfile_stream = NULL; - chn->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; + if (fragment_size == 0) + { + fclose(chn->sendfile_stream); + chn->sendfile_stream = NULL; + chn->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; - PICA_send_filecontrol(chn, PICA_PROTO_FILECONTROL_IOERROR, PICA_PROTO_FILECONTROL_VOID); + PICA_send_filecontrol(chn, PICA_PROTO_FILECONTROL_IOERROR, PICA_PROTO_FILECONTROL_VOID); - return PICA_ERRFILEIO; - } + return PICA_ERRFILEIO; + } -if ((mp = c2c_writebuf_push(chn, PICA_PROTO_FILEFRAGMENT, fragment_size + 4))) - { - *((uint16_t*)mp->tail) = fragment_size; + if ((mp = c2c_writebuf_push(chn, PICA_PROTO_FILEFRAGMENT, fragment_size + 4))) + { + *((uint16_t*)mp->tail) = fragment_size; - memcpy(mp->tail + 2, buf, fragment_size); - } -else - { - return PICA_ERRNOMEM; - } + memcpy(mp->tail + 2, buf, fragment_size); + } + else + { + return PICA_ERRNOMEM; + } -chn->sendfile_pos += fragment_size; + chn->sendfile_pos += fragment_size; -callbacks.file_progress(chn->peer_id, chn->sendfile_pos, 0); + callbacks.file_progress(chn->peer_id, chn->sendfile_pos, 0); -if (chn->sendfile_pos >= chn->sendfile_size) - { - chn->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; - fclose(chn->sendfile_stream); - chn->sendfile_stream = NULL; + if (chn->sendfile_pos >= chn->sendfile_size) + { + chn->sendfilestate = PICA_CHANSENDFILESTATE_IDLE; + fclose(chn->sendfile_stream); + chn->sendfile_stream = NULL; - callbacks.file_finished(chn->peer_id, 1); - } + callbacks.file_finished(chn->peer_id, 1); + } -if (chn->sendfile_pos > chn->sendfile_size) - return PICA_ERRFILEFRAGMENTCROSSEDSIZE; + if (chn->sendfile_pos > chn->sendfile_size) + return PICA_ERRFILEFRAGMENTCROSSEDSIZE; -return PICA_OK; + return PICA_OK; } void PICA_close_c2c(struct PICA_c2c *chn) { -struct PICA_c2c *ipt; + struct PICA_c2c *ipt; + + fprintf(stderr, "PICA_close_c2c(%p)\n", chn);//debug -fprintf(stderr, "PICA_close_c2c(%p)\n", chn);//debug - -ipt=chn->conn->chan_list_head; + ipt = chn->conn->chan_list_head; //puts("PICA_close_c2c_chkp0");//debug -while(ipt) + while(ipt) { - if (ipt==chn) + if (ipt == chn) { - if (ipt->next) - ipt->next->prev=ipt->prev; - else - chn->conn->chan_list_end=ipt->prev; + if (ipt->next) + ipt->next->prev = ipt->prev; + else + chn->conn->chan_list_end = ipt->prev; - if (ipt->prev) - ipt->prev->next=ipt->next; - else - chn->conn->chan_list_head=ipt->next; + if (ipt->prev) + ipt->prev->next = ipt->next; + else + chn->conn->chan_list_head = ipt->next; - break; + break; } - ipt=ipt->next; + ipt = ipt->next; } //puts("PICA_close_c2c_chkp1");//debug -if (chn -> sendfile_stream) - fclose(chn -> sendfile_stream); + if (chn -> sendfile_stream) + fclose(chn -> sendfile_stream); -if (chn -> recvfile_stream) - fclose(chn -> recvfile_stream); + if (chn -> recvfile_stream) + fclose(chn -> recvfile_stream); -if (chn -> read_buf) - free(chn -> read_buf); + if (chn -> read_buf) + free(chn -> read_buf); -if (chn -> write_buf) - free(chn -> write_buf); + if (chn -> write_buf) + free(chn -> write_buf); -if (chn->peer_cert) - X509_free(chn->peer_cert); + if (chn->peer_cert) + X509_free(chn->peer_cert); //puts("PICA_close_c2c_chkp2");//debug -if (chn->ssl) - SSL_shutdown(chn->ssl); - //puts("PICA_close_c2c_chkp3");//debug + if (chn->ssl) + SSL_shutdown(chn->ssl); + //puts("PICA_close_c2c_chkp3");//debug -if (chn->ssl) + if (chn->ssl) { - //printf("3 SSL_free(%X)\n",chn->ssl);//debug - SSL_free(chn->ssl); + //printf("3 SSL_free(%X)\n",chn->ssl);//debug + SSL_free(chn->ssl); } //puts("PICA_close_c2c_chkp4");//debug -SHUTDOWN(chn->sck_data); + SHUTDOWN(chn->sck_data); //puts("PICA_close_c2c_chkp5");//debug -CLOSE(chn->sck_data); + CLOSE(chn->sck_data); //puts("PICA_close_c2c_chkp6");//debug -free(chn); + free(chn); //puts("PICA_close_c2c_chkp7");//debug } void PICA_close_c2n(struct PICA_c2n *cid) { -struct PICA_c2c *ipt; + struct PICA_c2c *ipt; -while((ipt = cid->chan_list_head)) - PICA_close_c2c(ipt); + while((ipt = cid->chan_list_head)) + PICA_close_c2c(ipt); -SSL_shutdown(cid->ssl_comm); + SSL_shutdown(cid->ssl_comm); //printf("4 SSL_free(%X)\n",cid->ssl_comm);//debug -SSL_free(cid->ssl_comm); -SHUTDOWN(cid->sck_comm); -CLOSE(cid->sck_comm); + SSL_free(cid->ssl_comm); + SHUTDOWN(cid->sck_comm); + CLOSE(cid->sck_comm); -free(cid->read_buf); + free(cid->read_buf); -if (cid->write_buf) - free(cid->write_buf); + if (cid->write_buf) + free(cid->write_buf); -free(cid); + free(cid); } void PICA_close_acc(struct PICA_acc *a) { -SSL_CTX_free(a->ctx); -free(a); + SSL_CTX_free(a->ctx); + free(a); } void PICA_close_listener(struct PICA_listener *l) { -CLOSE(l->sck_listener); -free(l->public_addr_dns); -free(l); + CLOSE(l->sck_listener); + free(l->public_addr_dns); + free(l); } #ifdef WIN32 - const char *PICA_inet_ntop(int af, const void *src, char *dst, size_t size) +const char *PICA_inet_ntop(int af, const void *src, char *dst, size_t size) { - unsigned char *chsrc = (unsigned char*)src; - switch(af) - { - case AF_INET: - sprintf(dst, "%u.%u.%u.%u", chsrc[0], chsrc[1], chsrc[2], chsrc[3]); - break; + unsigned char *chsrc = (unsigned char*)src; + switch(af) + { + case AF_INET: + sprintf(dst, "%u.%u.%u.%u", chsrc[0], chsrc[1], chsrc[2], chsrc[3]); + break; - case AF_INET6: - sprintf(dst, "%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x", chsrc[0], chsrc[1], chsrc[2], chsrc[3], - chsrc[4], chsrc[5], chsrc[6], chsrc[7], - chsrc[8], chsrc[9], chsrc[10], chsrc[11], - chsrc[12],chsrc[13], chsrc[14], chsrc[15]); - break; + case AF_INET6: + sprintf(dst, "%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x", chsrc[0], chsrc[1], chsrc[2], chsrc[3], + chsrc[4], chsrc[5], chsrc[6], chsrc[7], + chsrc[8], chsrc[9], chsrc[10], chsrc[11], + chsrc[12], chsrc[13], chsrc[14], chsrc[15]); + break; - default: - return NULL; - } + default: + return NULL; + } - return dst; + return dst; } #endif @@ -2567,93 +2573,93 @@ free(l); int PICA_sendfile_open_read(struct PICA_c2c *chn, const char *filename_utf8, uint64_t *file_size) { #ifdef WIN32 -{ -wchar_t *wfilename = NULL; -int wlen; + { + wchar_t *wfilename = NULL; + int wlen; -wlen = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, NULL, 0); + wlen = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, NULL, 0); -if (wlen == 0 || wlen == 0xFFFD) - return PICA_ERRINVFILENAME; + if (wlen == 0 || wlen == 0xFFFD) + return PICA_ERRINVFILENAME; -wfilename = (wchar_t*)malloc(wlen * sizeof(wchar_t)); + wfilename = (wchar_t*)malloc(wlen * sizeof(wchar_t)); -if (!wfilename) - return PICA_ERRNOMEM; + if (!wfilename) + return PICA_ERRNOMEM; -MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, wfilename, wlen); + MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, wfilename, wlen); -chn->sendfile_stream = _wfopen(wfilename, L"rb"); + chn->sendfile_stream = _wfopen(wfilename, L"rb"); -free(wfilename); + free(wfilename); -if (chn->sendfile_stream == NULL) - return PICA_ERRFILEOPEN; + if (chn->sendfile_stream == NULL) + return PICA_ERRFILEOPEN; -if (_fseeki64(chn->sendfile_stream, 0, SEEK_END) != 0) - return PICA_ERRFILEOPEN; + if (_fseeki64(chn->sendfile_stream, 0, SEEK_END) != 0) + return PICA_ERRFILEOPEN; -*file_size = _ftelli64(chn->sendfile_stream); + *file_size = _ftelli64(chn->sendfile_stream); -if (_fseeki64(chn->sendfile_stream, 0, SEEK_SET) != 0) - return PICA_ERRFILEOPEN; -} + if (_fseeki64(chn->sendfile_stream, 0, SEEK_SET) != 0) + return PICA_ERRFILEOPEN; + } #else -chn->sendfile_stream = fopen(filename_utf8, "rb"); + chn->sendfile_stream = fopen(filename_utf8, "rb"); -if (chn->sendfile_stream == NULL) - return PICA_ERRFILEOPEN; + if (chn->sendfile_stream == NULL) + return PICA_ERRFILEOPEN; -if (fseeko(chn->sendfile_stream, 0, SEEK_END) != 0) - return PICA_ERRFILEOPEN; + if (fseeko(chn->sendfile_stream, 0, SEEK_END) != 0) + return PICA_ERRFILEOPEN; -*file_size = ftello(chn->sendfile_stream); + *file_size = ftello(chn->sendfile_stream); -if (fseeko(chn->sendfile_stream, 0, SEEK_SET) != 0) - return PICA_ERRFILEOPEN; + if (fseeko(chn->sendfile_stream, 0, SEEK_SET) != 0) + return PICA_ERRFILEOPEN; #endif -return PICA_OK; + return PICA_OK; } int PICA_recvfile_open_write(struct PICA_c2c *chn, const char *filename_utf8, unsigned int filenamesize) { ///////////// #ifdef WIN32 -{ -wchar_t *rfilename = NULL; -int rlen; + { + wchar_t *rfilename = NULL; + int rlen; -rlen = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, filenamesize, NULL, 0); + rlen = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, filenamesize, NULL, 0); -if (rlen == 0 || rlen == 0xFFFD) - return PICA_ERRINVFILENAME; + if (rlen == 0 || rlen == 0xFFFD) + return PICA_ERRINVFILENAME; -rlen++;//space for terminating zero character + rlen++;//space for terminating zero character -rfilename = malloc(rlen * sizeof(wchar_t)); + rfilename = malloc(rlen * sizeof(wchar_t)); -if (!rfilename) - return PICA_ERRNOMEM; + if (!rfilename) + return PICA_ERRNOMEM; -MultiByteToWideChar(CP_UTF8, 0, filename_utf8, filenamesize, rfilename, rlen); + MultiByteToWideChar(CP_UTF8, 0, filename_utf8, filenamesize, rfilename, rlen); -rfilename[rlen - 1] = L'\0'; + rfilename[rlen - 1] = L'\0'; -chn->recvfile_stream = _wfopen(rfilename, L"wb"); + chn->recvfile_stream = _wfopen(rfilename, L"wb"); -free(rfilename); + free(rfilename); -if (chn->recvfile_stream == NULL) - return PICA_ERRFILEOPEN; + if (chn->recvfile_stream == NULL) + return PICA_ERRFILEOPEN; -} + } #else -chn->recvfile_stream = fopen(filename_utf8, "wb"); + chn->recvfile_stream = fopen(filename_utf8, "wb"); -if (chn->recvfile_stream == NULL) - return PICA_ERRFILEOPEN; + if (chn->recvfile_stream == NULL) + return PICA_ERRFILEOPEN; #endif ///////////// -return PICA_OK; + return PICA_OK; } |
