#include #include "auto_qmail.h" #include "readwrite.h" #include "str.h" #include "stralloc.h" #include "substdio.h" #include "subfd.h" #define SQLSERVER "/control/sqlserver" /* let's alloc our strallocs */ stralloc DB_HOST = { 0 }; stralloc DB_USER = { 0 }; stralloc DB_PASS = { 0 }; stralloc DB_NAME = { 0 }; stralloc DB_SOCK = { 0 }; stralloc DB_PORT = { 0 }; static char inbuf[64]; MYSQL dbh, *mysql; MYSQL_RES *result; /* read the config file and decide which server the database is on, what */ /* username and password we need to connect to it and which database to use */ /* return -1 if a bad error occurred, 0 if everything was OK or 1 if not */ int init_mysql() { int i, error, file, match; substdio ss; stralloc filename = { 0 }; stralloc buf = { 0 }; if (mysql) return 1; mysql = mysql_init(&dbh); if (! mysql) return -1; /* get the filename of the sqlserver control file */ i = str_len(SQLSERVER) + str_len(auto_qmail) + 1; if (! stralloc_ready(&filename, i)) return -1; if (! stralloc_cats(&filename, auto_qmail)) return -1; if (! stralloc_cats(&filename, SQLSERVER)) return -1; if (! stralloc_0(&filename)) return -1; /* try to open the file - much code robbed from control.c*/ file = open_read(filename.s); if (file == -1) { substdio_puts(subfderr, "warning: could not open sqlserver file "); substdio_puts(subfderr, filename.s); substdio_putsflush(subfderr, "\n"); return 0; } substdio_fdbuf(&ss, read, file, inbuf, sizeof(inbuf)); i = 0; while (getln(&ss, &buf, &match, '\n') != -1) { if (! match && ! buf.len) break; buf.len--; if (! stralloc_0(&buf)) break; /* we consider only lines starting with the letters s,l,p or d */ switch (buf.s[0]) { case 's': if (buf.s[1] == 'e') error = getconfig(&buf, "server", &DB_HOST); else error = getconfig(&buf, "socket", &DB_SOCK); break; case 'l': error = getconfig(&buf, "login", &DB_USER); break; case 'p': if (buf.s[1] == 'a') error = getconfig(&buf, "password", &DB_PASS); else error = getconfig(&buf, "port", &DB_PORT); break; case 'd': error = getconfig(&buf, "db", &DB_NAME); break; default: continue; } if (error == -1) { i = -1; continue; } else i += error; if (! match) break; } close(file); if (i == -1) substdio_putsflush(subfderr, "warning: there were errors reading sqlserver file\n"); else if (i > 0) { substdio_putsflush(subfderr, "warning: bogus lines in sqlserver file\n"); i = 0; } return i; } /* read lines in the config file and grok entries of the form "x=y" or "x y" */ /* got is the line in the file, expected is the parmeter we're checking for */ /* and store is a stralloc to put the result into if it was found */ int getconfig(stralloc *got, char *expected, stralloc *store) { char *value, *x; x = got->s + str_len(expected); value = x + 1; /* we got a meaningful value */ if (! stralloc_starts(&got, expected) && (*x == ' ' || *x == '=') && str_len(value) > 0) { if (! stralloc_ready(store, str_len(value))) return -1; if (! stralloc_cats(store, value)) return -1; if (! stralloc_0(store)) return -1; return 0; } /* oh dear, the line we got didn't contain what we expected it to */ substdio_puts(subfderr, "error reading sqlserver file: expected '"); substdio_puts(subfderr, expected); substdio_puts(subfderr, "' but got '"); substdio_puts(subfderr, got); substdio_putsflush(subfderr, "'\n"); /* of course, we might have been expecting the wrong thing... */ return 1; }