예제 #1
0
파일: ctx.c 프로젝트: Sweebr/couchnode
static void
Cw_handler(lcb_sockdata_t *sd, int status, void *arg)
{
    lcbio__EASYRB *erb = arg;
    lcbio_CTX *ctx = erb->parent;
    (void)sd;

    ctx->npending--;

    if (!ctx->output) {
        ctx->output = erb;
        ringbuffer_reset(&erb->rb);

    } else {
        ringbuffer_destruct(&erb->rb);
        free(erb);
    }

    if (ctx->state == ES_ACTIVE && status) {
        invoke_entered_errcb(ctx, convert_lcberr(ctx, LCBIO_IOERR));
    }

    if (ctx->state != ES_ACTIVE && ctx->npending == 0) {
        free_ctx(ctx);
    }
}
예제 #2
0
파일: ctx.c 프로젝트: Sweebr/couchnode
static void
Cr_handler(lcb_sockdata_t *sd, lcb_ssize_t nr, void *arg)
{
    lcbio_CTX *ctx = arg;
    sd->is_reading = 0;
    ctx->npending--;

    if (ctx->state == ES_ACTIVE) {
        if (nr > 0) {
            unsigned total;
            rdb_rdend(&ctx->ior, nr);
            total = rdb_get_nused(&ctx->ior);
            if (total >= ctx->rdwant) {
                invoke_read_cb(ctx, total);
            }

            lcbio_ctx_schedule(ctx);
        } else {
            lcb_error_t err =
                    convert_lcberr(ctx, nr ? LCBIO_SHUTDOWN : LCBIO_IOERR);
            ctx->rdwant = 0;
            invoke_entered_errcb(ctx, err);
        }
    }

    if (ctx->state != ES_ACTIVE && ctx->npending == 0) {
        free_ctx(ctx);
    }
}
예제 #3
0
파일: movie_alt.c 프로젝트: top4e/libtmdb
/*
	MOVIE / ALTERNATIVE TITLES
*/
tmdb_movie_t *tmdb_movie_alt_titles(const char *movie_id, const char *country)
{
	int			result;
	char			*url_str;
	net_data_t		data;
	tmdb_request_ctx_t	ctx;
	tmdb_movie_t		*info = NULL;

	init_data_chunk(&data);

	memset(&ctx, 0, sizeof(tmdb_request_ctx_t));
	tmdb_ctx_set(&ctx, API_URL_F, NULL);
	tmdb_ctx_set(&ctx, API_HEADER_F, NULL);
	tmdb_ctx_set(&ctx, API_KEY_F, NULL);
	ctx.request_type.type = MOVIE_ALT_TITLES;
	tmdb_ctx_set(&ctx, MOVIE_ID, movie_id);
	if (country)
		tmdb_ctx_set(&ctx, COUNTRY, country);

	url_str = tmdb_get_url_from_ctx(&ctx);

	result = nethelper_get(url_str, API_HEADER, &data);

	free(url_str);
	free_ctx(&ctx);

	if (!result) {
		header_process(&data);
		body_process(&data, MOVIE_ALT_NUM_TOKENS,
			     movie_alt_parse, &info);
	}
	free_data_chunk(&data);

	return info;
}
예제 #4
0
/*
	MOVIE / GET_TRAILERS
*/
tmdb_movie_trailers_t *tmdb_movie_trailers(const char *movie_id)
{
	int			result;
	char			*url_str;
	net_data_t		data;
	tmdb_request_ctx_t	ctx;
	tmdb_movie_trailers_t	*movie_trailers = NULL;

	init_data_chunk(&data);

	memset(&ctx, 0, sizeof(tmdb_request_ctx_t));
	tmdb_ctx_set(&ctx, API_URL_F, NULL);
	tmdb_ctx_set(&ctx, API_HEADER_F, NULL);
	tmdb_ctx_set(&ctx, API_KEY_F, NULL);
	ctx.request_type.type = MOVIE_TRAILERS;
	tmdb_ctx_set(&ctx, MOVIE_ID, movie_id);

	url_str = tmdb_get_url_from_ctx(&ctx);

	result = nethelper_get(url_str, API_HEADER, &data);

	free(url_str);
	free_ctx(&ctx);

	if (!result) {
		header_process(&data);
		body_process(&data, MOVIE_TRAILERS_NUM_TOKENS,
			     movie_trailers_parse, &movie_trailers);
	}
	free_data_chunk(&data);

	return movie_trailers;
}
예제 #5
0
파일: genre_list.c 프로젝트: top4e/libtmdb
/*
	GENRE / LIST
*/
tmdb_genre_t *tmdb_genre_list(const char *language)
{
	int			result;
	char			*url_str;
	net_data_t		data;
	tmdb_request_ctx_t	ctx;
	tmdb_genre_t		*genres = NULL;

	init_data_chunk(&data);

	memset(&ctx, 0, sizeof(tmdb_request_ctx_t));
	tmdb_ctx_set(&ctx, API_URL_F, NULL);
	tmdb_ctx_set(&ctx, API_HEADER_F, NULL);
	tmdb_ctx_set(&ctx, API_KEY_F, NULL);
	ctx.request_type.type = GENRE_LIST;
	if (language)
		tmdb_ctx_set(&ctx, LANGUAGE, language);

	url_str = tmdb_get_url_from_ctx(&ctx);

	result = nethelper_get(url_str, API_HEADER, &data);

	free(url_str);
	free_ctx(&ctx);

	if (!result) {
		header_process(&data);
		body_process(&data, GENRE_LIST_NUM_TOKENS,
			     genre_list_parse, &genres);
	}
	free_data_chunk(&data);

	return genres;
}
예제 #6
0
static int stop_record_alsa(void *context) {

    pthread_t k;
    rec_ctx *ctx = (rec_ctx *) context;
#ifdef DEBUG_CONTEXTS
    int ctx_idx;
#endif
        if(!ctx) {
            log_err("zero context");
            return 0;
        }
#ifdef DEBUG_CONTEXTS
        for(ctx_idx = 0; ctx_idx < MAX_CTX; ctx_idx++) if(contexts[ctx_idx] == ctx) break;
        if(ctx_idx == MAX_CTX) {
            log_err("no such context");
            return 0;
        }
	contexts[ctx_idx] = 0;
#endif
	pthread_mutex_lock(&mutty);
	log_info("stop_record (ctx=%p)", ctx);
	ctx->running = 0;
        pthread_join(ctx->rec,0);
	log_info("recording thread stopped");
	if(ctx->snd) snd_pcm_close(ctx->snd);
        free_ctx(ctx);
	pthread_mutex_unlock(&mutty);
    return 1;	
}
예제 #7
0
파일: ctx.c 프로젝트: Sweebr/couchnode
static int
E_free_detached(lcbio_CTX *ctx)
{
    if (ctx->state == ES_DETACHED) {
        free_ctx(ctx);
        return 1;
    }
    return 0;
}
예제 #8
0
파일: ctx.c 프로젝트: Sweebr/couchnode
void
lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg,
                   lcbio_CTXDTOR_cb dtor, void *dtor_arg)
{
    unsigned oldrc;
    ctx->state = ES_DETACHED;
    assert(ctx->sock);

    if (ctx->event) {
        deactivate_watcher(ctx);
        IOT_V0EV(CTX_IOT(ctx)).destroy(IOT_ARG(CTX_IOT(ctx)), ctx->event);
        ctx->event = NULL;
    }

    if (ctx->as_err) {
        lcbio_timer_destroy(ctx->as_err);
        ctx->as_err = NULL;
    }

    oldrc = ctx->sock->refcount;
    lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying. PND=%d,ENT=%d,SORC=%d", CTX_LOGID(ctx), (int)ctx->npending, (int)ctx->entered, oldrc);

    if (cb) {
        int reusable =
                ctx->npending == 0 && /* no pending events */
                ctx->err == LCB_SUCCESS && /* no socket errors */
                ctx->rdwant == 0 && /* no expected input */
                ctx->wwant == 0 && /* no expected output */
                (ctx->output == NULL || ctx->output->rb.nbytes == 0);
        cb(ctx->sock, reusable, arg);
    }

    if (oldrc == ctx->sock->refcount) {
        lcbio_shutdown(ctx->sock);
    }

    if (ctx->output) {
        ringbuffer_destruct(&ctx->output->rb);
        free(ctx->output);
        ctx->output = NULL;
    }

    ctx->fd = INVALID_SOCKET;
    ctx->sd = NULL;

    if (dtor) {
        ctx->data = dtor_arg;
        ctx->procs.cb_flush_ready = dtor;

    } else {
        ctx->procs.cb_flush_ready = NULL;
    }

    if (ctx->npending == 0 && ctx->entered == 0) {
        free_ctx(ctx);
    }
}
예제 #9
0
static void *start_record_alsa(char *file) {

    pthread_attr_t attr;
    const char *folder = 0;
    struct stat st;
    rec_ctx *ctx = 0;
#ifdef DEBUG_CONTEXTS
    int ctx_idx;
#endif
	pthread_mutex_lock(&mutty);
	log_info("start_record");

#ifdef DEBUG_CONTEXTS
	for(ctx_idx = 0; ctx_idx < MAX_CTX; ctx_idx++) if(!contexts[ctx_idx]) break;
	if(ctx_idx == MAX_CTX) {
	    log_err("no free contexts");
	    return 0;		
	}
#endif
	ctx = (rec_ctx *) calloc(sizeof(rec_ctx),1);
	if(!ctx) {
	    log_err("no memory!");
	    goto fail;
	}

	ctx->fd_out = -1; 

	ctx->cur_file = (char *) malloc(strlen(file)+1);
	if(!ctx->cur_file) {
            log_err("no memory!");
	    goto fail;	
        }
	strcpy(ctx->cur_file,file);

	/* Open/configure the device, and open output file */	

	if(!init_recording(ctx)) goto fail;
	
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

	pthread_create(&ctx->rec,&attr,record,ctx);
	log_info("started recording to %s (ctx=%p)", file, ctx);

	pthread_attr_destroy(&attr);
	pthread_mutex_unlock(&mutty);
#ifdef DEBUG_CONTEXTS
	contexts[ctx_idx] = ctx;
#endif
	return ctx;

    fail:
	free_ctx(ctx);
	pthread_mutex_unlock(&mutty);

	return 0;
}
예제 #10
0
파일: terminal.c 프로젝트: rdebath/sgt
/*
 * Force a screen update.
 */
void term_update(void) {
    Context ctx;
    ctx = get_ctx();
    if (ctx) {
	do_paint (ctx, TRUE);
	free_ctx (ctx);
	nl_count = 0;
	scroll_heuristic = 0;
    }
}
예제 #11
0
void server()
{
	ctx_t *ctx = make_ctx(SIZE);
	ctx->sock = make_server_socket();
	ctx->who = SERVER;

	/* both delay */
	ctx->mili = unit;
	do_server_run(ctx);

	/* server delay */
	do_server_run(ctx);

	/* client delay */
	ctx->mili = 0;
	do_server_run(ctx);

	shutdown(ctx->sock, 0);
	free_ctx(ctx);
	return;
}
예제 #12
0
void client()
{
	ctx_t *ctx = make_ctx(SIZE);
	ctx->sock = make_client_socket();
	ctx->who = CLIENT;

	/* both delay */
	ctx->mili = unit;
	do_client_run(ctx);

	/* server delay */
	ctx->mili = 0;
	do_client_run(ctx);

	/* client delay */
	ctx->mili = unit;
	do_client_run(ctx);

	shutdown(ctx->sock, 0);
	free_ctx(ctx);
	return;
}
예제 #13
0
/*
	SEARCH / COMPANY
*/
tmdb_company_t *tmdb_search_company(const char *name)
{
	int			result;
	char			*url_str;
	char			*esc_name;
	net_data_t		data;
	tmdb_request_ctx_t	ctx;
	tmdb_company_t		*companies = NULL;

	init_data_chunk(&data);

	esc_name = escaped_string(name);

	memset(&ctx, 0, sizeof(tmdb_request_ctx_t));
	tmdb_ctx_set(&ctx, API_URL_F, NULL);
	tmdb_ctx_set(&ctx, API_HEADER_F, NULL);
	tmdb_ctx_set(&ctx, API_KEY_F, NULL);
	ctx.request_type.type = SEARCH_COMPANY;
	tmdb_ctx_set(&ctx, QUERY, esc_name);

	url_str = tmdb_get_url_from_ctx(&ctx);

	result = nethelper_get(url_str, API_HEADER, &data);

	free(url_str);
	free_ctx(&ctx);
	free(esc_name);

	if (!result) {
		header_process(&data);
		body_process(&data, SEARCH_COMPANY_NUM_TOKENS,
			     company_search_parse, &companies);
	}
	free_data_chunk(&data);

	return companies;
}
예제 #14
0
/*
	COLLECTION / INFO
*/
tmdb_collection_t *tmdb_collection_info(const char *collection_id,
					const char *language)
{
	int			result;
	char			*url_str;
	net_data_t		data;
	tmdb_request_ctx_t	ctx;
	tmdb_collection_t	*collection_info = NULL;

	init_data_chunk(&data);

	memset(&ctx, 0, sizeof(tmdb_request_ctx_t));
	tmdb_ctx_set(&ctx, API_URL_F, NULL);
	tmdb_ctx_set(&ctx, API_HEADER_F, NULL);
	tmdb_ctx_set(&ctx, API_KEY_F, NULL);
	ctx.request_type.type = COLLECTION;
	tmdb_ctx_set(&ctx, COLLECTION_ID, collection_id);
	if (language)
		tmdb_ctx_set(&ctx, LANGUAGE, language);

	url_str = tmdb_get_url_from_ctx(&ctx);

	result = nethelper_get(url_str, API_HEADER, &data);

	free(url_str);
	free_ctx(&ctx);

	if (!result) {
		header_process(&data);
		body_process(&data, COLLECTION_INFO_NUM_TOKENS,
			     collection_info_parse, &collection_info);
	}
	free_data_chunk(&data);

	return collection_info;
}
예제 #15
0
int 
demonize(ctx * Ctx){

	int  fd;

/*	int i;
	struct rlimit       rl;
	
	if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
        perror("can't get file limit");
	if (rl.rlim_max == RLIM_INFINITY)
        rl.rlim_max = 1024;
    for (i = 0; i < rl.rlim_max; i++)
        close(i);
*/

    switch (fork()) {
    case -1:
        perror("demonize fork failed");
        return -1;

    case 0:
        break;

    default:
		free_ctx(Ctx);
        exit(0);
    }

    int pid = getpid();



    if (setsid() == -1) {
//		tolog(Ctx, LOG_ERROR, "setsid() failed");
		perror("setsid() failed");        
        return -1;
    }

    umask(0);

    fd = open("/dev/null", O_RDWR);
    if (fd == -1) {
//		tolog("open(\"/dev/null\") failed", LOG_ERROR, Ctx);
		perror("open(\"/dev/null\") failed");        
        return -1;
    }

    if (dup2(fd, STDIN_FILENO) == -1) {
//		tolog("dup2(STDIN) failed", LOG_ERROR, Ctx);
		perror("dup2(STDIN) failed");        
        return -1;
    }

    if (dup2(fd, STDOUT_FILENO) == -1) {
//		tolog("dup2(STDOUT) failed", LOG_ERROR, Ctx);
		perror("dup2(STDOUT) failed");        		
        return -1;
    }

    if (dup2(fd, STDERR_FILENO) == -1) {
		tolog(Ctx, LOG_ERROR, "dup2(STDERR) failed", "");
//        logs << "dup2(STDERR) failed";
        return -1;
    }


    if (fd > STDERR_FILENO) {
        if (close(fd) == -1) {
//			tolog("close(fd) failed", LOG_ERROR, Ctx);
			perror("close(fd) failed");        		
            return -1;
        }
    }

    return pid;
}
예제 #16
0
int main(int argc, char *argv[])
{
   signed char c;
   struct ctx_t *ctx;

   static struct option longopts[] = {
      {"version",     no_argument,       0, 'v'},
      {"help",        no_argument,       0, 'h'},
      {"infile",      required_argument, 0, 'f'},
      {"outfile",     required_argument, 0, 'F'},
      {"outtype",     required_argument, 0, 'o'},
      {"gsw230",      no_argument,       0, '2'},
      {0, 0, 0, 0}
   };

   ctx = init_ctx();
   if (ctx == NULL)
      return 1;

#ifdef WIN32
#ifdef _MSC_VER
   _set_output_format(_TWO_DIGIT_EXPONENT);
#else
   putenv("PRINTF_EXPONENT_DIGITS=2");
#endif
#endif

   while ((c = getopt_long(argc, argv, "vh?f:F:o:2",longopts,NULL)) != -1) {
      switch (c) {
	 case 'f':
	    if (set_file(&ctx->opts.infile, optarg) != 0) {
	       free_ctx(ctx);
	       return 1;
	    }
	    break;
	 case 'F':
	    if (set_file(&ctx->opts.outfile, optarg) != 0) {
	       free_ctx(ctx);
	       return 1;
	    }
	    break;
	 case 'o':
	    if (strcmp(optarg, "nmea") == 0) {
	       ctx->opts.output_type = OUTPUT_NMEA;
	    }else if (strcmp(optarg, "dump") == 0) {
	       ctx->opts.output_type = OUTPUT_DUMP;
	    }else if (strcmp(optarg, "rinex") == 0) {
	       ctx->opts.output_type = OUTPUT_RINEX;
	    }else if (strcmp(optarg, "rinex-nav") == 0) {
	       ctx->opts.output_type = OUTPUT_RINEX_NAV;
	    }else if (strcmp(optarg, "rtcm") == 0) {
	       ctx->opts.output_type = OUTPUT_RTCM;
	    }else {
	       fputs("Wrong output type\n", stderr);
	       return 1;
	    }
	    break;
	 case '2':
	    ctx->opts.gsw230_byte_order = 1;
	    break;
	 case 'v':
	    version();
	    free_ctx(ctx);
	    exit(0);
	    break;
	 default:
	    help();
	    free_ctx(ctx);
	    exit(0);
	    break;
      }
   }
   argc -= optind;
   argv += optind;

   /* infile  */
   if (ctx->opts.infile != NULL) {
      ctx->in.fd = open(ctx->opts.infile, O_RDONLY
#ifdef O_BINARY
	 | O_BINARY
#endif
      );
      if (ctx->in.fd < 0) {
	 perror(NULL);
	 free_ctx(ctx);
	 return 1;
      }
   }else
      ctx->in.fd = STDIN_FILENO;

   /* outfile  */
   if (ctx->opts.outfile != NULL) {
      ctx->outfh = fopen(ctx->opts.outfile,
#ifdef WIN32
	"wb"
#else
	"w"
#endif
	);

      if (ctx->outfh == NULL) {
	 perror(NULL);
	 free_ctx(ctx);
	 return 1;
      }
   }else
      ctx->outfh = stdout;

   /* output_type  */
   switch (ctx->opts.output_type) {
      case OUTPUT_NMEA:
	 ctx->dump_f = &output_nmea;
	 break;
      case OUTPUT_RINEX:
	 ctx->dump_f = &output_rinex;
	 ctx->user_ctx = new_rinex_ctx(argc, argv, ctx->opts.gsw230_byte_order);
	 if (ctx->user_ctx == NULL) {
	    perror(NULL);
	    free_ctx(ctx);
	    return 1;
	 }
	 break;
      case OUTPUT_RINEX_NAV:
	 ctx->dump_f = &output_rinex_nav;
	 ctx->user_ctx = new_rinex_nav_ctx(argc, argv);
	 if (ctx->user_ctx == NULL) {
	    perror(NULL);
	    free_ctx(ctx);
	    return 1;
	 }
	 break;
      case OUTPUT_RTCM:
	 ctx->dump_f = &output_rtcm;
	 ctx->user_ctx = new_rtcm_ctx(argc, argv, ctx->opts.gsw230_byte_order);
	 setvbuf(ctx->outfh, NULL, _IONBF, 0);
	 if (ctx->user_ctx == NULL) {
	    perror(NULL);
	    free_ctx(ctx);
	    return 1;
	 }
	 break;
      case OUTPUT_DUMP:
      default:
	 output_dump_use_gsw230_byte_order = ctx->opts.gsw230_byte_order;
	 ctx->dump_f = &output_dump;
	 break;
   }

   process(ctx);

   switch (ctx->opts.output_type) {
      case OUTPUT_RINEX:
	 free_rinex_ctx(ctx->user_ctx);
	 break;
      case OUTPUT_RINEX_NAV:
	 free_rinex_nav_ctx(ctx->user_ctx);
	 break;
      case OUTPUT_RTCM:
	 free_rtcm_ctx(ctx->user_ctx);
	 break;
      default:
	 break;
   }

   free_ctx(ctx);
   return 0;
}