示例#1
0
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;
}
示例#3
0
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;
}
示例#4
0
文件: stream.c 项目: cdenix/psmame
UINT64 stream_transfer_all(imgtool_stream *dest, imgtool_stream *source)
{
    return stream_transfer(dest, source, stream_size(source));
}
示例#5
0
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;
}