--- a/dav/main.c Wed Apr 01 11:42:38 2015 +0200 +++ b/dav/main.c Fri Apr 03 14:53:28 2015 +0200 @@ -101,6 +101,8 @@ ret = cmd_set_property(args); } else if(!strcasecmp(cmd, "get-property")) { ret = cmd_get_property(args); + } else if(!strcasecmp(cmd, "info")) { + ret = cmd_info(args); } else { print_usage(argv[0]); } @@ -992,6 +994,73 @@ return 0; } +static int count_children(DavResource *res) { + DavResource *child = res->children; + int count = 0; + while(child) { + count++; + child = child->next; + } + return count; +} + +int cmd_info(CmdArgs *a) { + if(a->argc < 1) { + fprintf(stderr, "Too few arguments\n"); + return -1; + } + + char *url = a->argv[0]; + char *path = NULL; + DavSession *sn = connect_to_repo(url2repo(url, &path)); + + if(set_session_config(sn, a)) { + return -1; + } + + DavResource *res = dav_resource_new(sn, path); + if(!dav_load(res)) { + printf("name: %s\n", res->name); + printf("path: %s\n", res->path); + + char *url = util_path_to_url(sn, res->path); + printf("url: %s\n", url); + free(url); + + if(res->iscollection) { + printf("type: collection\n"); + printf("size: %d\n", count_children(res)); + } else { + printf("type: resource\n"); + char *len = ls_size_str(res); + printf("size: %s\n", len); + free(len); + } + + size_t count = 0; + DavPropName *properties = dav_get_property_names(res, &count); + + char *last_ns = NULL; + for(int i=0;i<count;i++) { + DavPropName p = properties[i]; + if(!last_ns || strcmp(last_ns, p.ns)) { + printf("\nnamespace: %s\n", p.ns); + last_ns = p.ns; + } + + sstr_t value = sstr(dav_get_property_ns(res, p.ns, p.name)); + value = sstrtrim(value); + printf(" %s: %.*s\n", p.name, (int)value.length, value.ptr); + } + + dav_session_free(sn, properties); + } else { + print_resource_error(sn, res->path); + return -1; + } +} + + char* stdin2str() { UcxBuffer *buf = ucx_buffer_new(NULL, 1024, UCX_BUFFER_AUTOEXTEND); size_t size = ucx_stream_hcopy(stdin, buf, fread, ucx_buffer_write);