dav/main.c

changeset 338
c7f3fe4abdb2
parent 334
5f80c5d0e87f
child 346
3e20fd78e555
equal deleted inserted replaced
337:d7bda914d120 338:c7f3fe4abdb2
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");

mercurial