static int locking_available(void) { struct active_request_slot *slot; struct slot_results results; struct strbuf in_buffer = STRBUF_INIT; struct buffer out_buffer = { STRBUF_INIT, 0 }; struct curl_slist *dav_headers = http_copy_default_headers(); struct xml_ctx ctx; int lock_flags = 0; char *escaped; escaped = xml_entities(repo->url); strbuf_addf(&out_buffer.buf, PROPFIND_SUPPORTEDLOCK_REQUEST, escaped); free(escaped); dav_headers = curl_slist_append(dav_headers, "Depth: 0"); dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml"); slot = get_active_slot(); slot->results = &results; curl_setup_http(slot->curl, repo->url, DAV_PROPFIND, &out_buffer, fwrite_buffer); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, dav_headers); curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer); if (start_active_slot(slot)) { run_active_slot(slot); if (results.curl_result == CURLE_OK) { XML_Parser parser = XML_ParserCreate(NULL); enum XML_Status result; ctx.name = xcalloc(10, 1); ctx.len = 0; ctx.cdata = NULL; ctx.userFunc = handle_lockprop_ctx; ctx.userData = &lock_flags; XML_SetUserData(parser, &ctx); XML_SetElementHandler(parser, xml_start_tag, xml_end_tag); result = XML_Parse(parser, in_buffer.buf, in_buffer.len, 1); free(ctx.name); if (result != XML_STATUS_OK) { fprintf(stderr, "XML error: %s\n", XML_ErrorString( XML_GetErrorCode(parser))); lock_flags = 0; } XML_ParserFree(parser); if (!lock_flags) error("no DAV locking support on %s", repo->url); } else { error("Cannot access URL %s, return code %d", repo->url, results.curl_result); lock_flags = 0; } } else { error("Unable to start PROPFIND request on %s", repo->url); } strbuf_release(&out_buffer.buf); strbuf_release(&in_buffer); curl_slist_free_all(dav_headers); return lock_flags; }
static struct remote_lock *lock_remote(const char *path, long timeout) { struct active_request_slot *slot; struct slot_results results; struct buffer out_buffer = { STRBUF_INIT, 0 }; struct strbuf in_buffer = STRBUF_INIT; char *url; char *ep; char timeout_header[25]; struct remote_lock *lock = NULL; struct curl_slist *dav_headers = http_copy_default_headers(); struct xml_ctx ctx; char *escaped; url = xstrfmt("%s%s", repo->url, path); /* Make sure leading directories exist for the remote ref */ ep = strchr(url + strlen(repo->url) + 1, '/'); while (ep) { char saved_character = ep[1]; ep[1] = '\0'; slot = get_active_slot(); slot->results = &results; curl_setup_http_get(slot->curl, url, DAV_MKCOL); if (start_active_slot(slot)) { run_active_slot(slot); if (results.curl_result != CURLE_OK && results.http_code != 405) { fprintf(stderr, "Unable to create branch path %s\n", url); free(url); return NULL; } } else { fprintf(stderr, "Unable to start MKCOL request\n"); free(url); return NULL; } ep[1] = saved_character; ep = strchr(ep + 1, '/'); } escaped = xml_entities(ident_default_email()); strbuf_addf(&out_buffer.buf, LOCK_REQUEST, escaped); free(escaped); xsnprintf(timeout_header, sizeof(timeout_header), "Timeout: Second-%ld", timeout); dav_headers = curl_slist_append(dav_headers, timeout_header); dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml"); slot = get_active_slot(); slot->results = &results; curl_setup_http(slot->curl, url, DAV_LOCK, &out_buffer, fwrite_buffer); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, dav_headers); curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer); lock = xcalloc(1, sizeof(*lock)); lock->timeout = -1; if (start_active_slot(slot)) { run_active_slot(slot); if (results.curl_result == CURLE_OK) { XML_Parser parser = XML_ParserCreate(NULL); enum XML_Status result; ctx.name = xcalloc(10, 1); ctx.len = 0; ctx.cdata = NULL; ctx.userFunc = handle_new_lock_ctx; ctx.userData = lock; XML_SetUserData(parser, &ctx); XML_SetElementHandler(parser, xml_start_tag, xml_end_tag); XML_SetCharacterDataHandler(parser, xml_cdata); result = XML_Parse(parser, in_buffer.buf, in_buffer.len, 1); free(ctx.name); if (result != XML_STATUS_OK) { fprintf(stderr, "XML error: %s\n", XML_ErrorString( XML_GetErrorCode(parser))); lock->timeout = -1; } XML_ParserFree(parser); } } else { fprintf(stderr, "Unable to start LOCK request\n"); } curl_slist_free_all(dav_headers); strbuf_release(&out_buffer.buf); strbuf_release(&in_buffer); if (lock->token == NULL || lock->timeout <= 0) { free(lock->token); free(lock->owner); free(url); FREE_AND_NULL(lock); } else { lock->url = url; lock->start_time = time(NULL); lock->next = repo->locks; repo->locks = lock; } return lock; }
void oxml_print(struct dvd_info *dvd_info) { int j, i; char *escaped; XMLSTART; escaped = xml_entities(dvd_info->discinfo.device); XMLDEF("device", "%s", escaped); free(escaped); escaped = xml_entities(dvd_info->discinfo.disc_title); XMLDEF("title", "%s", escaped); free(escaped); escaped = xml_entities(dvd_info->discinfo.disc_alt_title); XMLDEF("alt_title", "%s", escaped); free(escaped); XMLDEF("serial_no", "%s", dvd_info->discinfo.disc_serial_no); XMLDEF("vmg_id", "%.12s", dvd_info->discinfo.vmg_id); XMLDEF("provider_id", "%.32s", dvd_info->discinfo.provider_id); for (j=0; j < dvd_info->title_count; j++) { if ( opt_t == j+1 || opt_t == 0 ) { // GENERAL if (dvd_info->titles[j].enabled) { XMLBOX("track"); XMLDEF("ix", "%d", j+1); XMLDEF("length", "%.3f", dvd_info->titles[j].general.length); XMLDEF("vts_id", "%.12s", dvd_info->titles[j].general.vts_id); if (dvd_info->titles[j].parameter.format != NULL ) { XMLDEF("vts", "%d", dvd_info->titles[j].parameter.vts); XMLDEF("ttn", "%d", dvd_info->titles[j].parameter.ttn); XMLDEF("fps", "%.2f", dvd_info->titles[j].parameter.fps); XMLDEF("format", "%s", dvd_info->titles[j].parameter.format); XMLDEF("aspect", "%s", dvd_info->titles[j].parameter.aspect); XMLDEF("width", "%s", dvd_info->titles[j].parameter.width); XMLDEF("height", "%s", dvd_info->titles[j].parameter.height); escaped = xml_entities(dvd_info->titles[j].parameter.df); XMLDEF("df", "%s", escaped); free(escaped); } // PALETTE if (dvd_info->titles[j].palette != NULL ) { XMLBOX("palette"); for (i=0; i < 16; i++) { XMLDEF("color","%06x", dvd_info->titles[j].palette[i]); } XMLRETURN; } // ANGLES if (dvd_info->titles[j].angle_count) { // poor check, but there's no other info anyway. XMLDEF("angles", "%d", dvd_info->titles[j].angle_count); } // AUDIO if (dvd_info->titles[j].audiostreams != NULL ) { for (i=0; i<dvd_info->titles[j].audiostream_count; i++) { XMLBOX("audio"); XMLDEF("ix", "%d", i+1); XMLDEF("langcode", "%s", dvd_info->titles[j].audiostreams[i].langcode); XMLDEF("language", "%s", dvd_info->titles[j].audiostreams[i].language); XMLDEF("format", "%s", dvd_info->titles[j].audiostreams[i].format); XMLDEF("frequency", "%s", dvd_info->titles[j].audiostreams[i].frequency); XMLDEF("quantization", "%s", dvd_info->titles[j].audiostreams[i].quantization); XMLDEF("channels", "%d", dvd_info->titles[j].audiostreams[i].channels); XMLDEF("ap_mode", "%d", dvd_info->titles[j].audiostreams[i].ap_mode); XMLDEF("content", "%s", dvd_info->titles[j].audiostreams[i].content); XMLDEF("streamid", "0x%x", dvd_info->titles[j].audiostreams[i].streamid); XMLRETURN; } } // CHAPTERS if (dvd_info->titles[j].chapters != NULL) { for (i=0; i<dvd_info->titles[j].chapter_count; i++) { XMLBOX("chapter"); XMLDEF("ix", "%d", i+1); XMLDEF("length", "%.3f", dvd_info->titles[j].chapters[i].length); XMLDEF("startcell", "%d", dvd_info->titles[j].chapters[i].startcell); XMLRETURN; } } // CELLS if (dvd_info->titles[j].cells != NULL) { for (i=0; i<dvd_info->titles[j].cell_count; i++) { XMLBOX("cell"); XMLDEF("ix", "%d", i+1); XMLDEF("length", "%.3f", dvd_info->titles[j].cells[i].length); XMLDEF("block_mode", "%d", dvd_info->titles[j].cells[i].block_mode); XMLDEF("block_type", "%d", dvd_info->titles[j].cells[i].block_type); XMLRETURN; } } // SUBTITLES if (dvd_info->titles[j].subtitles != NULL) { for (i=0; i<dvd_info->titles[j].subtitle_count; i++) { XMLBOX("subp"); XMLDEF("ix", "%d", i+1); XMLDEF("langcode", "%s", dvd_info->titles[j].subtitles[i].langcode); XMLDEF("language", "%s", dvd_info->titles[j].subtitles[i].language); XMLDEF("content", "%s", dvd_info->titles[j].subtitles[i].content); XMLDEF("streamid", "0x%x", dvd_info->titles[j].subtitles[i].streamid); XMLRETURN; } } XMLRETURN; } } } if (! opt_t) { int max_length = 0, max_track = 0; for (j=0; j < dvd_info->title_count; j++) { if (dvd_info->titles[j].general.length > max_length) { max_length = dvd_info->titles[j].general.length; max_track = j+1; } } XMLDEF("longest_track", "%d", max_track); } XMLSTOP; }