1/*
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 *
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
7 */
8
9#include "monetdb_config.h"
10#include "dotmonetdb.h"
11#include <string.h>
12
13void
14parse_dotmonetdb(char **user, char **passwd, char **dbname, char **language, int *save_history, char **output, int *pagewidth)
15{
16 char *cfile;
17 FILE *config = NULL;
18 char buf[FILENAME_MAX];
19
20 if ((cfile = getenv("DOTMONETDBFILE")) == NULL) {
21 /* no environment variable: use a default */
22 if ((config = fopen(".monetdb", "r")) == NULL) {
23 if ((cfile = getenv("HOME")) != NULL) {
24 int len = snprintf(buf, sizeof(buf), "%s%c.monetdb", cfile, DIR_SEP);
25 if (len == -1 || len >= FILENAME_MAX) {
26 cfile = NULL;
27 } else {
28 config = fopen(buf, "r");
29 if (config)
30 cfile = strdup(buf);
31 else
32 cfile = NULL;
33 }
34 }
35 } else {
36 cfile = strdup(".monetdb");
37 }
38 } else if (*cfile == 0) {
39 /* empty environment variable: skip the file */
40 cfile = NULL;
41 } else if ((config = fopen(cfile, "r")) == NULL) {
42 fprintf(stderr, "failed to open file '%s': %s\n",
43 cfile, strerror(errno));
44 cfile = NULL;
45 } else {
46 cfile = strdup(cfile);
47 }
48
49 if (user)
50 *user = NULL;
51 if (passwd)
52 *passwd = NULL;
53 if (dbname)
54 *dbname = NULL;
55 if (language)
56 *language = NULL;
57 if (output)
58 *output = NULL;
59 if (save_history)
60 *save_history = 0;
61 if (pagewidth)
62 *pagewidth = 0;
63
64 if (config) {
65 int line = 0;
66 char *q;
67 while (fgets(buf, sizeof(buf), config) != NULL) {
68 line++;
69 q = strchr(buf, '\n');
70 if (q)
71 *q = 0;
72 if (buf[0] == '\0' || buf[0] == '#')
73 continue;
74 if ((q = strchr(buf, '=')) == NULL) {
75 fprintf(stderr, "%s:%d: syntax error: %s\n",
76 cfile, line, buf);
77 continue;
78 }
79 *q++ = '\0';
80 /* this basically sucks big time, as I can't easily set
81 * a default, hence I only do things I think are useful
82 * for now, needs a better solution */
83 if (strcmp(buf, "user") == 0) {
84 if (user)
85 *user = strdup(q);
86 q = NULL;
87 } else if (strcmp(buf, "password") == 0) {
88 if (passwd)
89 *passwd = strdup(q);
90 q = NULL;
91 } else if (strcmp(buf, "database") == 0) {
92 if (dbname)
93 *dbname = strdup(q);
94 q = NULL;
95 } else if (strcmp(buf, "language") == 0) {
96 /* make sure we don't set garbage */
97 if (strcmp(q, "sql") != 0 &&
98 strcmp(q, "mal") != 0) {
99 fprintf(stderr, "%s:%d: unsupported "
100 "language: %s\n",
101 cfile, line, q);
102 } else if (language)
103 *language = strdup(q);
104 q = NULL;
105 } else if (strcmp(buf, "save_history") == 0) {
106 if (strcmp(q, "true") == 0 ||
107 strcmp(q, "on") == 0) {
108 if (save_history)
109 *save_history = 1;
110 q = NULL;
111 } else if (strcmp(q, "false") == 0 ||
112 strcmp(q, "off") == 0) {
113 if (save_history)
114 *save_history = 0;
115 q = NULL;
116 }
117 } else if (strcmp(buf, "format") == 0) {
118 if (output)
119 *output = strdup(q);
120 q = NULL;
121 } else if (strcmp(buf, "width") == 0) {
122 if (pagewidth)
123 *pagewidth = atoi(q);
124 q = NULL;
125 }
126 if (q != NULL)
127 fprintf(stderr, "%s:%d: unknown property: %s\n",
128 cfile, line, buf);
129 }
130 }
131 if (cfile)
132 free(cfile);
133 if (config)
134 fclose(config);
135}
136