161 "put [-pcRA] [-k <key>] [-L <lock>] <url> <file>", |
161 "put [-pcRA] [-k <key>] [-L <lock>] <url> <file>", |
162 "mkdir [-pc] [-k <key>] [-L <lock>] <url>", |
162 "mkdir [-pc] [-k <key>] [-L <lock>] <url>", |
163 "remove [-pc] [-L <lock>] <url>", |
163 "remove [-pc] [-L <lock>] <url>", |
164 "copy [-pcO] [-L <lock>] <url> <url>", |
164 "copy [-pcO] [-L <lock>] <url> <url>", |
165 "move [-pcO] [-L <lock>] <url> <url>", |
165 "move [-pcO] [-L <lock>] <url> <url>", |
166 "get-property [-pc] [-n <uri>] <url> <property>", |
166 "get-property [-pcx] [-n <uri>] <url> <property>", |
167 "set-property [-pc] [-L <lock>] [-n <uri>] <url> <property> [value]", |
167 "set-property [-pcx] [-L <lock>] [-n <uri>] <url> <property> [value]", |
168 "remove-property [-pc] [-n <uri>] <url> <property>", |
168 "remove-property [-pc] [-n <uri>] <url> <property>", |
169 "lock [-pc] [-T timeout] <url>", |
169 "lock [-pc] [-T timeout] <url>", |
170 "unlock [-pc] [-L <lock>] <url>", |
170 "unlock [-pc] [-L <lock>] <url>", |
171 "info [-pc] <url>", |
171 "info [-pc] <url>", |
172 "date [url]", |
172 "date [url]", |
220 fprintf(stderr, " -O override resources\n"); |
220 fprintf(stderr, " -O override resources\n"); |
221 fprintf(stderr, " -A tar import/export\n"); |
221 fprintf(stderr, " -A tar import/export\n"); |
222 fprintf(stderr, " -L <lock> specificy lock token\n"); |
222 fprintf(stderr, " -L <lock> specificy lock token\n"); |
223 fprintf(stderr, " -T <sec> timeout in seconds\n"); |
223 fprintf(stderr, " -T <sec> timeout in seconds\n"); |
224 fprintf(stderr, " -n <uri> specify namespace uri\n"); |
224 fprintf(stderr, " -n <uri> specify namespace uri\n"); |
|
225 fprintf(stderr, " -x xml property content\n"); |
225 fprintf(stderr, " -N disable authentication prompt (all commands)\n"); |
226 fprintf(stderr, " -N disable authentication prompt (all commands)\n"); |
226 fprintf(stderr, " -i disable cert verification (all commands)\n"); |
227 fprintf(stderr, " -i disable cert verification (all commands)\n"); |
227 fprintf(stderr, " -v verbose output (all commands)\n"); |
228 fprintf(stderr, " -v verbose output (all commands)\n"); |
228 fprintf(stderr, "\n"); |
229 fprintf(stderr, "\n"); |
229 fprintf(stderr, "Config commands:\n"); |
230 fprintf(stderr, "Config commands:\n"); |
1433 print_resource_error(sn, res->path); |
1434 print_resource_error(sn, res->path); |
1434 return -1; |
1435 return -1; |
1435 } |
1436 } |
1436 break; |
1437 break; |
1437 } |
1438 } |
1438 |
1439 free(path); |
1439 // TODO: show xml |
1440 |
1440 //DavXmlNode *x = dav_get_property_ns(res, propname.ns, propname.name); |
1441 DavXmlNode *x = dav_get_property_ns(res, propname.ns, propname.name); |
1441 char *value = dav_get_string_property_ns(res, propname.ns, propname.name); |
1442 if(!x) { |
1442 if(!value) { |
|
1443 fprintf(stderr, "Error: no property value.\n"); |
1443 fprintf(stderr, "Error: no property value.\n"); |
1444 return -1; |
1444 return -1; |
1445 } |
1445 } |
1446 |
1446 |
1447 int ret = 0; |
1447 if(cmd_getoption(a, "xml")) { |
1448 if(value) { |
1448 // print a real xml document on stdout |
1449 printf("%s\n", value); |
1449 printxmldoc(stdout, propname.name, propname.ns, x); |
1450 } else { |
1450 } else { |
1451 // TODO: correct error message |
1451 // in this mode a simple string is printed on stdout |
1452 fprintf(stderr, "Error: property not found.\n"); |
1452 // or simplified and nicely formatted xml is printed on stderr |
1453 ret = -1; |
1453 if(dav_xml_isstring(x)) { |
1454 } |
1454 printf("%s\n", dav_xml_getstring(x)); |
1455 |
1455 } else { |
1456 free(path); |
1456 char *str = xml2str(x); |
1457 return ret; |
1457 fprintf(stderr, "%s", str); |
|
1458 free(str); |
|
1459 } |
|
1460 } |
|
1461 |
|
1462 return 0; |
1458 } |
1463 } |
1459 |
1464 |
1460 int cmd_set_property(CmdArgs *a) { |
1465 int cmd_set_property(CmdArgs *a) { |
1461 if(a->argc < 2) { |
1466 if(a->argc < 2) { |
1462 fprintf(stderr, "Too few arguments\n"); |
1467 fprintf(stderr, "Too few arguments\n"); |
1735 DavPropName p = properties[i]; |
1740 DavPropName p = properties[i]; |
1736 if(!last_ns || strcmp(last_ns, p.ns)) { |
1741 if(!last_ns || strcmp(last_ns, p.ns)) { |
1737 printf("\nnamespace: %s\n", p.ns); |
1742 printf("\nnamespace: %s\n", p.ns); |
1738 last_ns = p.ns; |
1743 last_ns = p.ns; |
1739 } |
1744 } |
1740 |
1745 |
1741 sstr_t value = sstr(dav_get_string_property_ns(res, p.ns, p.name)); |
1746 DavXmlNode *xval = dav_get_property_ns(res, p.ns, p.name); |
1742 value = sstrtrim(value); |
1747 if(dav_xml_isstring(xval)) { |
1743 printf(" %s: %.*s\n", p.name, (int)value.length, value.ptr); |
1748 sstr_t value = sstr(dav_xml_getstring(xval)); |
|
1749 printf(" %s: %.*s\n", p.name, (int)value.length, value.ptr); |
|
1750 } else { |
|
1751 printf(" %s: $xml\n", p.name); |
|
1752 } |
1744 } |
1753 } |
1745 |
1754 |
1746 dav_session_free(sn, properties); |
1755 dav_session_free(sn, properties); |
1747 return 0; |
1756 return 0; |
1748 } else { |
1757 } else { |
1769 free(buf); |
1778 free(buf); |
1770 return str; |
1779 return str; |
1771 } |
1780 } |
1772 } |
1781 } |
1773 |
1782 |
|
1783 static void xml2str_i(DavXmlNode *node, UcxBuffer *buf, int indent) { |
|
1784 while(node) { |
|
1785 if(node->type == DAV_XML_ELEMENT) { |
|
1786 if(node->children) { |
|
1787 if(dav_xml_isstring(node->children)) { |
|
1788 sstr_t s = sstrtrim(sstr(dav_xml_getstring(node->children))); |
|
1789 ucx_bprintf( |
|
1790 buf, |
|
1791 "%*s<%s>%.*s</%s>\n", |
|
1792 indent, |
|
1793 "", |
|
1794 node->name, |
|
1795 (int)s.length, |
|
1796 s.ptr, |
|
1797 node->name); |
|
1798 } else { |
|
1799 ucx_bprintf(buf, "%*s<%s>\n", indent, "", node->name); |
|
1800 xml2str_i(node->children, buf, indent+2); |
|
1801 ucx_bprintf(buf, "%*s</%s>\n", indent, "", node->name); |
|
1802 } |
|
1803 } else { |
|
1804 ucx_bprintf(buf, "%*s<%s />", indent, "", node->name); |
|
1805 ucx_buffer_putc(buf, '\n'); |
|
1806 } |
|
1807 } else if(node->type == DAV_XML_TEXT) { |
|
1808 sstr_t val = sstrtrim(sstrn(node->content, node->contentlength)); |
|
1809 if(val.length > 0) { |
|
1810 ucx_bprintf(buf, "%*.*s", indent, (int)val.length, val.ptr); |
|
1811 } |
|
1812 } |
|
1813 |
|
1814 node = node->next; |
|
1815 } |
|
1816 } |
|
1817 |
|
1818 char* xml2str(DavXmlNode *node) { |
|
1819 char *str = malloc(256); |
|
1820 UcxBuffer *buf = ucx_buffer_new(str, 256, UCX_BUFFER_AUTOEXTEND); |
|
1821 xml2str_i(node, buf, 0); |
|
1822 char *space = buf->space; |
|
1823 ucx_buffer_free(buf); |
|
1824 return space; |
|
1825 } |
|
1826 |
|
1827 static void printnode(FILE *out, UcxMap *nsmap, DavXmlNode *node) { |
|
1828 while(node) { |
|
1829 if(node->type == DAV_XML_ELEMENT) { |
|
1830 char *prefix = ucx_map_cstr_get(nsmap, node->namespace); |
|
1831 char *freethis = NULL; |
|
1832 char *tagend = node->children ? ">" : " />"; |
|
1833 if(!prefix) { |
|
1834 sstr_t newpre = ucx_sprintf("x%d", (int)nsmap->count); |
|
1835 ucx_map_cstr_put(nsmap, node->namespace, newpre.ptr); |
|
1836 freethis = newpre.ptr; |
|
1837 prefix = newpre.ptr; |
|
1838 fprintf( |
|
1839 out, |
|
1840 "<%s:%s xmlns:%s=\"%s\"%s", |
|
1841 prefix, |
|
1842 node->name, |
|
1843 prefix, |
|
1844 node->namespace, |
|
1845 tagend); |
|
1846 } else { |
|
1847 fprintf(out, "<%s:%s%s", prefix, node->name, tagend); |
|
1848 } |
|
1849 |
|
1850 if(node->children) { |
|
1851 printnode(out, nsmap, node->children); |
|
1852 fprintf(out, "</%s:%s>", prefix, node->name); |
|
1853 } |
|
1854 if(freethis) { |
|
1855 free(freethis); |
|
1856 } |
|
1857 } else if(node->type == DAV_XML_TEXT) { |
|
1858 fwrite(node->content, 1, node->contentlength, out); |
|
1859 } |
|
1860 |
|
1861 node = node->next; |
|
1862 } |
|
1863 } |
|
1864 |
|
1865 void printxmldoc(FILE *out, char *root, char *rootns, DavXmlNode *content) { |
|
1866 UcxMap *nsmap = ucx_map_new(16); |
|
1867 |
|
1868 ucx_map_cstr_put(nsmap, rootns, "x0"); |
|
1869 fprintf(out, "%s", "<?xml version=\"1.0\"?>\n"); |
|
1870 fprintf(out, "<x0:%s xmlns:x0=\"%s\">", root, rootns); |
|
1871 |
|
1872 printnode(out, nsmap, content); |
|
1873 |
|
1874 fprintf(out, "</x0:%s>\n", root); |
|
1875 } |
|
1876 |
1774 |
1877 |
1775 /* ---------- config commands ---------- */ |
1878 /* ---------- config commands ---------- */ |
1776 |
1879 |
1777 int cmd_add_repository(CmdArgs *args) { |
1880 int cmd_add_repository(CmdArgs *args) { |
1778 printf("Each repository must have an unique name.\n"); |
1881 printf("Each repository must have an unique name.\n"); |