/* * Invoked once on module load. * * This routine should return 0 on success, and -1 otherwise. */ int codegen_init(hsignature_t *sig) { const char *url; hcfg_t *cfg; url = session_getcfg(CFGKEY_TARGET_URL); if (!url || url[0] == '\0') { session_error("Destination URL for" " generated code objects not specified"); return -1; } url = session_getcfg(CFGKEY_SERVER_URL); if (!url || url[0] == '\0') { session_error("Codegen server URL not specified"); return -1; } sockfd = url_connect(url); if (sockfd == -1) { session_error("Invalid codegen server URL"); return -1; } /* In the future, we should rewrite the code generator system to * avoid using hmesg_t types. Until then, generate a fake * HMESG_SESSION message to maintain compatibility. */ mesg = HMESG_INITIALIZER; hsignature_copy(&mesg.data.session.sig, sig); cfg = hcfg_alloc(); hcfg_set(cfg, CFGKEY_SERVER_URL, session_getcfg(CFGKEY_SERVER_URL)); hcfg_set(cfg, CFGKEY_TARGET_URL, session_getcfg(CFGKEY_TARGET_URL)); hcfg_set(cfg, CFGKEY_REPLY_URL, session_getcfg(CFGKEY_REPLY_URL)); hcfg_set(cfg, CFGKEY_SLAVE_LIST, session_getcfg(CFGKEY_SLAVE_LIST)); hcfg_set(cfg, CFGKEY_SLAVE_PATH, session_getcfg(CFGKEY_SLAVE_PATH)); mesg.data.session.cfg = cfg; mesg.type = HMESG_SESSION; mesg.status = HMESG_STATUS_REQ; if (mesg_send(sockfd, &mesg) < 1) return -1; if (mesg_recv(sockfd, &mesg) < 1) return -1; if (callback_generate(sockfd, codegen_callback) != 0) { session_error("Could not register callback for codegen plugin"); return -1; } return 0; }
int url_open(URLContext **puc, const char *filename, int flags) { int ret = url_alloc(puc, filename, flags); if (ret) return ret; ret = url_connect(*puc); if (!ret) return 0; url_close(*puc); *puc = NULL; return ret; }
int url_open_protocol (URLContext **puc, struct URLProtocol *up, const char *filename, int flags) { int ret; ret = url_alloc_for_protocol(puc, up, filename, flags); if (ret) goto fail; ret = url_connect(*puc); if (!ret) return 0; fail: url_close(*puc); *puc = NULL; return ret; }
static int open_input(struct variant *var) { struct segment *seg = var->segments[var->cur_seq_no - var->start_seq_no]; if (seg->key_type == KEY_NONE) { return open_url(var->parent->priv_data, &var->input, seg->url); } else if (seg->key_type == KEY_AES_128) { HLSContext *c = var->parent->priv_data; char iv[33], key[33], url[MAX_URL_SIZE]; int ret; if (strcmp(seg->key, var->key_url)) { URLContext *uc; if (open_url(var->parent->priv_data, &uc, seg->key) == 0) { if (ffurl_read_complete(uc, var->key, sizeof(var->key)) != sizeof(var->key)) { av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n", seg->key); } ffurl_close(uc); } else { av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n", seg->key); } av_strlcpy(var->key_url, seg->key, sizeof(var->key_url)); } ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0); ff_data_to_hex(key, var->key, sizeof(var->key), 0); iv[32] = key[32] = '\0'; if (strstr(seg->url, "://")) snprintf(url, sizeof(url), "crypto+%s", seg->url); else snprintf(url, sizeof(url), "crypto:%s", seg->url); if ((ret = ffurl_alloc(&var->input, url, AVIO_FLAG_READ, &var->parent->interrupt_callback)) < 0) return ret; av_opt_set(var->input->priv_data, "key", key, 0); av_opt_set(var->input->priv_data, "iv", iv, 0); return url_connect(var, c->avio_opts); } return AVERROR(ENOSYS); }
int open_radio( struct transcode_ctx *ctx, struct media_file_info *mfi ) { ctx->fmtctx = avformat_alloc_context(); URLContext *stream; url_alloc(&stream, mfi->url, URL_RDONLY ); ff_http_set_headers( stream, "Icy-MetaData:1\r\n"); DPRINTF(E_DBG, L_XCODE, "Trying to open url %s\n", mfi->url); int ret = url_connect(stream); if (ret != 0) { DPRINTF(E_WARN, L_XCODE, "Could not open url %s: %s\n", mfi->url, strerror(AVUNERROR(ret))); return -1; } DPRINTF(E_DBG, L_XCODE, "URL opened successfully"); if (icy) free(icy); icy = (struct icy_ctx *)malloc(sizeof(struct icy_ctx)); icy->context = stream; icy->data_pos = 0; icy->icy_metaint = get_meta_int( stream ); icy->rewritten_album = 0; icy->mfi = mfi; ctx->fmtctx = avformat_alloc_context(); if (buff) av_free( buff ); buff = (uint8_t *) av_malloc( BIO_BUFFER_SIZE ); ctx->fmtctx->pb = avio_alloc_context(buff, BIO_BUFFER_SIZE, 0, icy, ReadFunc2, NULL, NULL); return avformat_open_input(&ctx->fmtctx, mfi->url, NULL, NULL); }
static int mmsh_open(URLContext *h, const char *uri, int flags) { int i, port, err; char httpname[256], path[256], host[128], location[1024]; char *stream_selection = NULL; char headers[1024]; MMSHContext *mmsh; MMSContext *mms; mmsh = h->priv_data = av_mallocz(sizeof(MMSHContext)); if (!h->priv_data) return AVERROR(ENOMEM); mmsh->request_seq = h->is_streamed = 1; mms = &mmsh->mms; av_strlcpy(location, uri, sizeof(location)); av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port, path, sizeof(path), location); if (port<0) port = 80; // default mmsh protocol port ff_url_join(httpname, sizeof(httpname), "http", NULL, host, port, path); if (url_alloc(&mms->mms_hd, httpname, URL_RDONLY) < 0) { return AVERROR(EIO); } snprintf(headers, sizeof(headers), "Accept: */*\r\n" USERAGENT "Host: %s:%d\r\n" "Pragma: no-cache,rate=1.000000,stream-time=0," "stream-offset=0:0,request-context=%u,max-duration=0\r\n" CLIENTGUID "Connection: Close\r\n\r\n", host, port, mmsh->request_seq++); ff_http_set_headers(mms->mms_hd, headers); err = url_connect(mms->mms_hd); if (err) { goto fail; } err = get_http_header_data(mmsh); if (err) { av_log(NULL, AV_LOG_ERROR, "Get http header data failed!\n"); goto fail; } // close the socket and then reopen it for sending the second play request. url_close(mms->mms_hd); memset(headers, 0, sizeof(headers)); if (url_alloc(&mms->mms_hd, httpname, URL_RDONLY) < 0) { return AVERROR(EIO); } stream_selection = av_mallocz(mms->stream_num * 19 + 1); if (!stream_selection) return AVERROR(ENOMEM); for (i = 0; i < mms->stream_num; i++) { char tmp[20]; err = snprintf(tmp, sizeof(tmp), "ffff:%d:0 ", mms->streams[i].id); if (err < 0) goto fail; av_strlcat(stream_selection, tmp, mms->stream_num * 19 + 1); } // send play request err = snprintf(headers, sizeof(headers), "Accept: */*\r\n" USERAGENT "Host: %s:%d\r\n" "Pragma: no-cache,rate=1.000000,request-context=%u\r\n" "Pragma: xPlayStrm=1\r\n" CLIENTGUID "Pragma: stream-switch-count=%d\r\n" "Pragma: stream-switch-entry=%s\r\n" "Connection: Close\r\n\r\n", host, port, mmsh->request_seq++, mms->stream_num, stream_selection); av_freep(&stream_selection); if (err < 0) { av_log(NULL, AV_LOG_ERROR, "Build play request failed!\n"); goto fail; } av_dlog(NULL, "out_buffer is %s", headers); ff_http_set_headers(mms->mms_hd, headers); err = url_connect(mms->mms_hd); if (err) { goto fail; } err = get_http_header_data(mmsh); if (err) { av_log(NULL, AV_LOG_ERROR, "Get http header data failed!\n"); goto fail; } av_dlog(NULL, "Connection successfully open\n"); return 0; fail: av_freep(&stream_selection); mmsh_close(h); av_dlog(NULL, "Connection failed with error %d\n", err); return err; }