static imgtoolerr_t write_fork(imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *sourcef, UINT64 pos, UINT64 fork_len, option_resolution *opts) { imgtoolerr_t err = IMGTOOLERR_SUCCESS; imgtool_stream *mem_stream = NULL; size_t len; if (fork_len > 0) { mem_stream = stream_open_mem(NULL, 0); if (!mem_stream) { err = IMGTOOLERR_OUTOFMEMORY; goto done; } stream_seek(sourcef, pos, SEEK_SET); len = stream_transfer(mem_stream, sourcef, fork_len); if (len < fork_len) stream_fill(mem_stream, 0, fork_len); stream_seek(mem_stream, 0, SEEK_SET); err = imgtool_partition_write_file(partition, filename, fork, mem_stream, opts, NULL); if (err) goto done; } done: if (mem_stream) stream_close(mem_stream); return err; }
static void *manage_voice_thread(void *param) { int ret = 0; struct stream_transfer *transfer_stream = (struct stream_transfer*)param; while(transfer_stream->manage_thread_run_flag){ ALOGV("common manager thread sleep\n"); sem_wait(&(transfer_stream->sem)); ALOGV("common manager thread wakeup\n"); if(transfer_stream->voice_thread_run_flag){ ret = init_stream(transfer_stream->stream_receiver); if (ret <0 ){ ALOGE("err: voice_thread init stream receive_stream failed, ret=%d, ****LINE:%d,FUNC:%s", ret, __LINE__, __FUNCTION__); goto stream_close; //return NULL; } ret = init_stream(transfer_stream->stream_sender); if (ret <0 ){ ALOGE("err: voice_thread init stream send_stream failed, ret=%d, ****LINE:%d,FUNC:%s", ret, __LINE__, __FUNCTION__); goto stream_close; //return NULL; } transfer_stream->voice_thread_exit_flag = 0; ALOGD("voice_thread start\n"); stream_transfer(transfer_stream); ALOGD("voice_thread end\n"); stream_close: close_stream(transfer_stream->stream_receiver); close_stream(transfer_stream->stream_sender); transfer_stream->voice_thread_exit_flag = 1; } } ALOGD("common manager thread exit\n"); return param; }
int svrapp::on_recv(app_connection *n, char* content, int length){ if(content[0] == '$'){ return stream_transfer(n, content, length); } cJSON * json = cJSON_Parse(content); if(!json){ return -1; } cJSON * jscmd = cJSON_GetObjectItem(json, "cmd"); cJSON * jsser = cJSON_GetObjectItem(json, "serial"); cJSON * jsdata = cJSON_GetObjectItem(json, "data"); if(!jscmd || jscmd->type != cJSON_String || !jsser || jsser->type != cJSON_String || !jsdata ){ cJSON_Delete(json); log_out(log_error, "on_recv::invalid json %s\n", content); return -1; } fun_map::fun_info * fi = m_fun_map.get(jscmd->valuestring); if(fi){ param_list pl = {0}; pl.n = n; pl.content = content; pl.length = length; pl.json = json; pl.cmd = jscmd->valuestring; pl.ack_cmd = fi->ack; pl.serial = jsser->valuestring; pl.jsdata = jsdata; (this->*fi->fun)(&pl); } else{ log_out(log_error, "on_recv::invalid cmd: %s\n", jscmd->valuestring); } cJSON_Delete(json); return 0; }
UINT64 stream_transfer_all(imgtool_stream *dest, imgtool_stream *source) { return stream_transfer(dest, source, stream_size(source)); }
void interconnect_stream (FILE *sock_in, FILE *sock_out, int sock_fd) { /* 具体的には、以下の挙動をすれば良いと思われる。 * - selectを使って、stdin(STDIN_FILENO)とソケットのどちらかから * データが読み取れる状態になるのを待つ。 * -- stdin(STDIN_FILENO)が読み出しokになったら、 * 読み出せる限り読み出して、それをソケットに書き出す。 * -- ソケットが読み出しokになったら、 * 読み出せる限り読み出して、それをstdoutに書き出す。 * -- どちらかがEOFまたは何からのエラーが来たら、それに応じた終了処理を行う */ /* sigmaskを生成する * ……が、前提として、予めSIGPIPEは無視してある、という事にする。 * ここでは省略する。 */ /* SIGPIPEを無視する事については以下を参照 * http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.19 */ /* stdinのEOFはフラグ管理する必要がある */ char stdin_is_eof = 0; while (1) { /* nfdsを生成する */ int nfds; if (stdin_is_eof) { nfds = sock_fd + 1; } else { nfds = ((STDIN_FILENO < sock_fd) ? sock_fd : STDIN_FILENO) + 1; } /* fd_setを生成する */ fd_set readfds; FD_ZERO(&readfds); if (!stdin_is_eof) FD_SET(STDIN_FILENO, &readfds); FD_SET(sock_fd, &readfds); /* timevalを生成する(man 2 selectによると、 * select時にtimeoutが破壊される環境があるらしいので毎回生成する) */ struct timeval timeout; timeout.tv_sec = SELECT_TIMEOUT; /* 秒 */ timeout.tv_usec = 0; /* マイクロ秒 */ /* selectを実行する */ int r = select(nfds, &readfds, NULL, NULL, &timeout); if (r == -1) { if (errno == EINTR) { /* シグナルを受信した */ /* とりあえず終了でいいと思う */ perror("caught a signal"); break; } else { /* よく分からないエラー */ /* エラー内容をstderrに書き出す必要がある */ perror("unknown error in select"); break; } } if (!FD_ISSET(sock_fd, &readfds) && (stdin_is_eof || !FD_ISSET(STDIN_FILENO, &readfds))) { /* エラーでもないし、読み取り可能にもなってない状況なら、 * タイムアウトしたものと考えられる。 * (本来ならcontinue等を使って分かりやすい構造にしたいが、 * ソケットとstdinが同時の読み取り可能になった時に、 * 片方に偏らせたくないので、 * 一回のselectで両方とも処理可能にする為に、 * こんなややっこしい構造になってしまった) * 尚、この処理は、下のstdin確認よりも先にチェックする必要がある。 * (stdin確認の内部でstdin_is_eofフラグを変更している為) */ fprintf(stderr, "socket response timeout\n"); break; } if (FD_ISSET(sock_fd, &readfds)) { /* ソケットから読み取り可能 */ /* 適当に読み取り、読み取った分をstdoutに書き出す */ int r = stream_transfer(sock_in, stdout); if (r <= 0) { /* socketがEOFになったら、stdoutのcloseを行う * (実際には不要だが、一応しておく) */ fclose(stdout); break; /* ソケットがEOFになったら即終了 */ } } if (!stdin_is_eof && FD_ISSET(STDIN_FILENO, &readfds)) { /* stdinから読み取り可能 */ /* 適当に読み取り、読み取った分をソケットに書き出す */ int r = stream_transfer(stdin, sock_out); if (r <= 0) { /* stdinがEOFになったら、sock_outのshutdownを行う * (closeするとreadの方までcloseされてしまうので、closeはしない) */ fflush(sock_out); shutdown(sock_fd, SHUT_WR); stdin_is_eof = 1; /* stdinがEOFになっても即終了しない */ } } } return; }