SendHelper_HandleWrite_res SendHelper_HandleWrite(bus *b, boxed_msg *box) { SSL *ssl = box->ssl; ssize_t wrsz = 0; /* Attempt a single write to the socket. */ if (ssl == BUS_NO_SSL) { wrsz = write_plain(b, box); } else { assert(ssl); wrsz = write_ssl(b, box, ssl); } BUS_LOG_SNPRINTF(b, 5, LOG_SENDER, b->udata, 64, "wrote %zd", wrsz); if (wrsz == -1) { Send_HandleFailure(b, box, BUS_SEND_TX_FAILURE); return SHHW_ERROR; } else if (wrsz == 0) { /* If the OS set POLLOUT but we can't actually write, then * just go back to the poll() loop with no progress. * If we busywait on this, something is deeply wrong. */ BUS_LOG_SNPRINTF(b, 1, LOG_SENDER, b->udata, 128, "suspicious: wrote %zd bytes to <fd:%d, seq_id%lld>", wrsz, box->fd, (long long)box->out_seq_id); } else { /* Update amount written so far */ box->out_sent_size += wrsz; } size_t msg_size = box->out_msg_size; size_t sent_size = box->out_sent_size; size_t rem = msg_size - sent_size; BUS_LOG_SNPRINTF(b, 5, LOG_SENDER, b->udata, 64, "wrote %zd, rem is %zd", wrsz, rem); if (rem == 0) { /* check if whole message is written */ #ifndef TEST struct timeval done; #endif if (Util_Timestamp(&done, true)) { box->tv_send_done = done; } else { Send_HandleFailure(b, box, BUS_SEND_TIMESTAMP_ERROR); return SHHW_ERROR; } if (enqueue_EXPECT_message_to_listener(b, box)) { return SHHW_DONE; } else { Send_HandleFailure(b, box, BUS_SEND_TX_TIMEOUT_NOTIFYING_LISTENER); return SHHW_ERROR; } } else { return SHHW_OK; } }
void child_process(struct spead_client *cl, sslKeys_t *keys) { #define BUFF 1000 //#define REPLY "HTTP/1.1 200 OK\nServer: pshr\nConnection: Keep-Alive\nContent-Type: audio/mpeg\nCache-Control: no-cache\nPragma: no-cache\n\n" #define REPLY "HTTP/1.1 200 OK\nServer: pshr\nConnection: Keep-Alive\nContent-Type: text/plain\nCache-Control: no-cache\nPragma: no-cache\n\nhello world" #define MODE_CONNECTING 0 #define MODE_SENDING 1 //int bytes, mode = MODE_CONNECTING; //unsigned char data[BUFF]; unsigned char *data, *res; uint32 err, len ,rb, wb; ssl_t *ssl; //int fd = (-1), initial=1450-300; data = NULL; res = NULL; ssl = NULL; if (cl == NULL || keys == NULL){ #ifdef DEBUG fprintf(stderr, "%s: parameter error\n", __func__); #endif exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "%s: child created with fd[%d]\n", __func__, cl->c_fd); #endif err = matrixSslNewServerSession(&ssl, keys, NULL, 0); if (err != PS_SUCCESS){ #ifdef DEBUG switch(err){ case PS_ARG_FAIL: fprintf(stderr, "Bad input function parameter\n"); break; case PS_FAILURE: fprintf(stderr, "Internal memory allocation failure\n"); break; } #endif #if 0 matrixSslDeleteKeys(keys); matrixSslClose(); #endif exit(EXIT_FAILURE); } while(run){ READ_STATE: len = matrixSslGetReadbuf(ssl, &data); if (rb < 0){ #ifdef DEBUG fprintf(stderr, "%s: matrixssl getreadbuf error\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "%s: matrixssl getreadbuf rtn [%d]\n", __func__, len); #endif rb = read(cl->c_fd, data, len); if (rb == 0){ #ifdef DEBUG fprintf(stderr, "%s: read EOF\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } else if (rb < 0){ #ifdef DEBUG fprintf(stderr, "%s: read error (%s)\n", __func__, strerror(errno)); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "%s: read rtn [%d]\n", __func__, rb); #endif rb = matrixSslReceivedData(ssl, rb, &data, &len); if (rb < 0){ #ifdef DEBUG fprintf(stderr, "%s: matrixssl receiveddata error\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } else if (rb == 0){ #ifdef DEBUG fprintf(stderr, "%s: matrix ssl received 0 bytes (false start?)\n", __func__); #endif } else if (rb > 0){ switch(rb){ case MATRIXSSL_REQUEST_SEND: #ifdef DEBUG fprintf(stderr, "%s: RS req send\n", __func__); #endif goto WRITE_STATE; break; case MATRIXSSL_REQUEST_RECV: #ifdef DEBUG fprintf(stderr, "%s: RS req recv\n", __func__); #endif goto READ_STATE; break; case MATRIXSSL_HANDSHAKE_COMPLETE: #ifdef DEBUG fprintf(stderr, "%s: RS handshake complete\n", __func__); #endif goto READ_STATE; break; case MATRIXSSL_RECEIVED_ALERT: #ifdef DEBUG fprintf(stderr, "%s: RS rec alert\n", __func__); #endif break; case MATRIXSSL_APP_DATA: #ifdef DEBUG fprintf(stderr, "%s: RS app data\n", __func__); #endif #ifdef DEBUG fprintf(stderr, "%s: RS got data [%s]\n", __func__, data); #endif /*process client data here*/ res = get_resource_str(data); if (res == NULL){ #ifdef DEBUG fprintf(stderr, "%s: NULL RESOURCE\n", __func__); #endif run = 0; } #ifdef DEBUG fprintf(stderr, "%s: got resource [%s]\n", __func__, res); #endif unsigned char *tbuf; int32 tbuflen; tbuflen = matrixSslGetWritebuf(ssl, &tbuf, strlen(REPLY)); if (tbuflen < 0){ #ifdef DEBUG fprintf(stderr, "%s: matrixssl getwritebuf error\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } strncpy((char *) tbuf, REPLY, tbuflen); if (matrixSslEncodeWritebuf(ssl, strlen((char *) tbuf)) < 0){ matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } matrixSslEncodeClosureAlert(ssl); rb = matrixSslProcessedData(ssl, &data, &len); #ifdef DEBUG fprintf(stderr, "%s: processed data rtn [%d]\n", __func__, rb); #endif goto WRITE_STATE; break; } } WRITE_STATE: len = matrixSslGetOutdata(ssl, &data); if (len < 0){ #ifdef DEBUG fprintf(stderr, "%s: matrixssl getoutdata error\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "%s: getoutdata rtn [%d]\n", __func__, len); #endif wb = write(cl->c_fd, data, len); if (wb == 0){ #ifdef DEBUG fprintf(stderr, "%s: write 0\n", __func__); #endif goto READ_STATE; } else if (wb < 0){ #ifdef DEBUG fprintf(stderr, "%s: write error (%s)\n", __func__, strerror(errno)); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "%s: write rtn [%d]\n", __func__, wb); #endif wb = matrixSslSentData(ssl, wb); if (wb < 0) { #ifdef DEBUG fprintf(stderr, "%s: matrixssl sentdata error\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); } else if (wb > 0){ switch(wb){ case MATRIXSSL_REQUEST_SEND: #ifdef DEBUG fprintf(stderr, "%s: WS req send\n", __func__); #endif goto WRITE_STATE; break; case MATRIXSSL_REQUEST_CLOSE: #ifdef DEBUG fprintf(stderr, "%s: WS req close\n", __func__); #endif matrixSslDeleteSession(ssl); destroy_spead_client(cl); exit(EXIT_FAILURE); break; case MATRIXSSL_HANDSHAKE_COMPLETE: #ifdef DEBUG fprintf(stderr, "%s: WS handshake complete\n", __func__); #endif goto READ_STATE; /*note might need to jump to receiveddata*/ break; } } } matrixSslDeleteSession(ssl); #if 0 const char *filename = "/home/adam/live_audio_streaming/tenc/agoria-scala_original_mixwww.mp3vip.org.mp3"; //fd = open("/home/adam/build/lame-3.99.5/testcase.mp3", O_RDONLY); fd = open("/home/adam/live_audio_streaming/tenc/agoria-scala_original_mixwww.mp3vip.org.mp3", O_RDONLY); if (fd < 0){ #ifdef DEBUG fprintf(stderr, "%s: open error (%s)\n", __func__, strerror(errno)); #endif exit(EXIT_SUCCESS); } while((bytes = read_ssl(ssl, data, BUFF)) > 0){ #ifdef DEBUG fprintf(stderr, "%s: read [%d] [%s:%d] [%s]\n", __func__, bytes, get_client_address(cl), get_client_port(cl), data); #endif } #endif #if 0 while (run){ switch (mode){ case MODE_CONNECTING: bytes = read_ssl(ssl, data, BUFF); switch (bytes){ case 0: #ifdef DEBUG fprintf(stderr, "%s: read EOF client[%s:%d]\n", __func__, get_client_address(cl), get_client_port(cl)); #endif run = 0; break; case -1: #ifdef DEBUG fprintf(stderr, "%s: read error client[%s:%d] (%s)\n", __func__, get_client_address(cl), get_client_port(cl), strerror(errno)); #endif run = 0; break; } #ifdef DEBUG fprintf(stderr, "%s: [%s:%d] [%s]\n", __func__, get_client_address(cl), get_client_port(cl), data); #endif res = get_resource_str(data); if (res == NULL){ #ifdef DEBUG fprintf(stderr, "%s: NULL RESOURCE\n", __func__); #endif run = 0; } #ifdef DEBUG fprintf(stderr, "%s: got resource [%s]\n", __func__, res); #endif if (strncmp(res, "/sound", 6) == 0){ bytes = write_ssl(ssl, REPLY, sizeof(REPLY)); switch(bytes){ case -1: #ifdef DEBUG fprintf(stderr, "%s: write error client[%s:%d] (%s)\n", __func__, get_client_address(cl), get_client_port(cl), strerror(errno)); #endif run = 0; break; } mode = MODE_SENDING; } else { run = 0; } break; case MODE_SENDING: #if 0 bytes = sendfile(cl->c_fd, fd, NULL, BUFF+initial); if (bytes == 0){ close(fd); #if 0 fd = open("/srv/beats/Meditations On Afrocentrism EP/03 Down The Line (It Takes A Number).mp3", O_RDONLY); if (fd < 0){ #ifdef DEBUG fprintf(stderr, "%s: open error (%s)\n", __func__, strerror(errno)); #endif exit(EXIT_SUCCESS); } #endif } else if (bytes < 0){ #ifdef DEBUG fprintf(stderr, "%s: sendfile error client[%s:%d] (%s)\n", __func__, get_client_address(cl), get_client_port(cl), strerror(errno)); #endif exit(EXIT_SUCCESS); } if (initial > 1){ initial--; } #if 0 def DEBUG fprintf(stderr, "%s: [%s:%d] sent %d bytes\n", __func__, get_client_address(cl), get_client_port(cl), bytes); #endif usleep(9766/initial); #endif run = 0; break; } } #endif #ifdef DEBUG fprintf(stderr, "%s: child[%d] ending\n", __func__, getpid()); #endif #if 0 if (fd > 0){ close(fd); } #endif destroy_spead_client(cl); //shutdown(cl->c_fd, SHUT_RDWR); exit(EXIT_SUCCESS); }