+int parse_xrds_document(StrBuf *ReplyBuf) {
+ struct xrds xrds;
+
+ memset(&xrds, 0, sizeof (struct xrds));
+ XML_Parser xp = XML_ParserCreate(NULL);
+ if (xp) {
+ XML_SetUserData(xp, &xrds);
+ XML_SetElementHandler(xp, xrds_xml_start, xrds_xml_end);
+ XML_SetCharacterDataHandler(xp, xrds_xml_chardata);
+ XML_Parse(xp, ChrPtr(ReplyBuf), StrLength(ReplyBuf), 0);
+ XML_Parse(xp, "", 0, 1);
+ XML_ParserFree(xp);
+ }
+ else {
+ syslog(LOG_ALERT, "Cannot create XML parser");
+ }
+
+ return(0); /* FIXME return nonzero if something wonderful happened */
+}
+
+
+
+/*
+ * Callback function for perform_yadis_discovery()
+ * We're interested in the X-XRDS-Location: header.
+ */
+size_t yadis_headerfunction(void *ptr, size_t size, size_t nmemb, void *userdata) {
+ char hdr[1024];
+ StrBuf **x_xrds_location = (StrBuf **) userdata;
+
+ memcpy(hdr, ptr, (size*nmemb));
+ hdr[size*nmemb] = 0;
+
+ if (!strncasecmp(hdr, "X-XRDS-Location:", 16)) {
+ *x_xrds_location = NewStrBufPlain(&hdr[16], ((size*nmemb)-16));
+ StrBufTrim(*x_xrds_location);
+ }
+
+ return(size * nmemb);
+}
+
+
+
+/* Attempt to perform Yadis discovery as specified in Yadis 1.0 section 6.2.5.
+ * If successful, returns nonzero and calls parse_xrds_document() to act upon the received data.
+ * If Yadis fails, returns 0 and does nothing else.
+ */
+int perform_yadis_discovery(StrBuf *YadisURL) {
+ int docbytes = (-1);
+ StrBuf *ReplyBuf = NULL;
+ int return_value = 0;