From 2a4fe269d2d4e7aaaef47dcafc4b348d19610feb Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 25 Nov 2006 13:31:51 -0500 Subject: [PATCH] Create a new file if the file doesn't exists. --- src/pwmd.c | 49 ++++++++++++++++++++++++++++++++++--------------- src/xml.c | 37 ++++++++++++++++++++++--------------- src/xml.h | 1 + 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/pwmd.c b/src/pwmd.c index 39085b79..495a4b14 100644 --- a/src/pwmd.c +++ b/src/pwmd.c @@ -172,6 +172,23 @@ char *skip_space(char *str) return str; } +static int parse_xml(struct client_s *cl) +{ + switch (open_xml(cl->xml, cl->len, &cl->doc, &cl->root, &cl->reader)) { + case 1: + send_to_client(cl->fd, "ERR XML parse error\n"); + return 1; + case 2: + send_to_client(cl->fd, "ERR XMLReaderWalker() failed\n"); + return 1; + default: + break; + } + + cl->state = STATE_OPEN; + return 0; +} + /* * The filename will be ~/.pwmd/filename.xml.gpg. */ @@ -185,8 +202,22 @@ int authenticate_client(struct client_s *cl, char *filename) snprintf(buf, sizeof(buf), "%s/%s.xml.gpg", root_dir, filename); if (access(buf, R_OK|W_OK) != 0) { - send_to_client(cl->fd, "ERR %s\n", strerror(errno)); - return 1; + + if (errno != ENOENT) { + send_to_client(cl->fd, "ERR %s\n", strerror(errno)); + return 1; + } + else { + cl->filename = strdup(buf); + + if ((cl->xml = new_document()) == NULL) { + send_to_client(cl->fd, "ERR malloc()\n"); + return 1; + } + + cl->len = strlen(cl->xml); + return parse_xml(cl); + } } if (!cl->filename) @@ -225,19 +256,7 @@ int authenticate_client(struct client_s *cl, char *filename) close(2); #endif - switch (open_xml(cl->xml, cl->len, &cl->doc, &cl->root, &cl->reader)) { - case 1: - send_to_client(cl->fd, "ERR XML parse error\n"); - return 1; - case 2: - send_to_client(cl->fd, "ERR XMLReaderWalker() failed\n"); - return 1; - default: - break; - } - - cl->state = STATE_OPEN; - return 0; + return parse_xml(cl); } int get_elements(struct client_s *cl) diff --git a/src/xml.c b/src/xml.c index a37b4a45..43a51227 100644 --- a/src/xml.c +++ b/src/xml.c @@ -74,25 +74,32 @@ int new_element(xmlDocPtr doc, xmlNodePtr n, xmlChar *name, return 0; } -void write_dtd(FILE *fp) +char *new_document() { - //xmlNewDtd(); - fprintf(fp, "%s", + const char *line = "\n" "\n" - "!ELEMENT account (name, username?, password?, smtp?, pop?, imap?)>\n" - "!ELEMENT name (#PCDATA)>\n" - "!ELEMENT username (#PCDATA)>\n" - "!ELEMENT password (#PCDATA)>\n" - "!ELEMENT smtp (host, port, ssl)>\n" - "!ELEMENT pop (host, port, ssl)>\n" - "!ELEMENT imap (host, port, ssl)>\n" - "!ELEMENT host (#PCDATA)>\n" - "!ELEMENT port (#PCDATA)>\n" - "!ELEMENT ssl (#PCDATA)>\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" "]>\n" - ); + "\n"; + int len = strlen(line); + char *buf; + + if ((buf = malloc(len + 1)) == NULL) + return NULL; + + strcpy(buf, line); + return buf; } int find_account(xmlTextReaderPtr reader, xmlChar *name) diff --git a/src/xml.h b/src/xml.h index d6e34c10..86c721a0 100644 --- a/src/xml.h +++ b/src/xml.h @@ -31,5 +31,6 @@ xmlNodePtr find_node(xmlNodePtr root, xmlChar *name); int open_xml(const char *data, int size, xmlDocPtr *doc, xmlNodePtr *root, xmlTextReaderPtr *reader); int new_account(xmlDocPtr doc, xmlChar *name); +char *new_document(void); #endif -- 2.11.4.GIT