masqmail

annotate src/tables.c @ 249:f9da5a7caeda

refactored the cmdline argument processing I replaced the nested switch statements with one single large else-if construct. Instead of char comparision now str(n)cmp(3) is used. Although this is slower it is much more readable and covers corner-cases which were uncovered before (e.g. -bdxxx). As always: Readability and simplicity matter, not performance.
author markus schnalke <meillo@marmaro.de>
date Thu, 04 Nov 2010 11:02:42 -0300
parents 3b344bf57162
children 41958685480d
rev   line source
meillo@0 1 /* MasqMail
meillo@0 2 Copyright (C) 1999-2001 Oliver Kurth
meillo@76 3 Copyright (C) 2008 markus schnalke <meillo@marmaro.de>
meillo@0 4
meillo@0 5 This program is free software; you can redistribute it and/or modify
meillo@0 6 it under the terms of the GNU General Public License as published by
meillo@0 7 the Free Software Foundation; either version 2 of the License, or
meillo@0 8 (at your option) any later version.
meillo@0 9
meillo@0 10 This program is distributed in the hope that it will be useful,
meillo@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
meillo@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
meillo@0 13 GNU General Public License for more details.
meillo@0 14
meillo@0 15 You should have received a copy of the GNU General Public License
meillo@0 16 along with this program; if not, write to the Free Software
meillo@0 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
meillo@0 18 */
meillo@0 19
meillo@15 20 #include <fnmatch.h>
meillo@15 21
meillo@0 22 #include "masqmail.h"
meillo@0 23
meillo@10 24 table_pair*
meillo@10 25 create_pair(gchar * key, gpointer value)
meillo@0 26 {
meillo@10 27 table_pair *pair;
meillo@0 28
meillo@10 29 pair = g_malloc(sizeof(table_pair));
meillo@10 30 pair->key = g_strdup(key);
meillo@10 31 pair->value = value;
meillo@10 32
meillo@10 33 return pair;
meillo@0 34 }
meillo@0 35
meillo@10 36 table_pair*
meillo@10 37 create_pair_string(gchar * key, gpointer value)
meillo@0 38 {
meillo@10 39 table_pair *pair;
meillo@0 40
meillo@10 41 pair = g_malloc(sizeof(table_pair));
meillo@10 42 pair->key = g_strdup(key);
meillo@10 43 pair->value = (gpointer) (g_strdup(value));
meillo@10 44
meillo@10 45 return pair;
meillo@0 46 }
meillo@0 47
meillo@10 48 table_pair*
meillo@10 49 parse_table_pair(gchar * line, char delim)
meillo@0 50 {
meillo@10 51 gchar buf[256];
meillo@10 52 gchar *p, *q;
meillo@10 53 table_pair *pair;
meillo@0 54
meillo@10 55 p = line;
meillo@10 56 q = buf;
meillo@15 57 while ((*p != '\0') && (*p != delim) && q < buf + 255)
meillo@10 58 *(q++) = *(p++);
meillo@15 59 *q = '\0';
meillo@0 60
meillo@10 61 pair = g_malloc(sizeof(table_pair));
meillo@10 62 pair->key = g_strdup(g_strstrip(buf));
meillo@0 63
meillo@10 64 if (*p) {
meillo@10 65 p++;
meillo@10 66 /* while(isspace(*p)) p++; */
meillo@10 67 pair->value = (gpointer *) (g_strdup(g_strstrip(p)));
meillo@10 68 } else
meillo@10 69 pair->value = (gpointer *) g_strdup("");
meillo@0 70
meillo@10 71 return pair;
meillo@0 72 }
meillo@0 73
meillo@10 74 gpointer*
meillo@10 75 table_find_func(GList * table_list, gchar * key, int (*cmp_func) (const char *, const char *))
meillo@0 76 {
meillo@10 77 GList *node;
meillo@0 78
meillo@10 79 foreach(table_list, node) {
meillo@10 80 table_pair *pair = (table_pair *) (node->data);
meillo@10 81 if (cmp_func(pair->key, key) == 0)
meillo@10 82 return pair->value;
meillo@10 83 }
meillo@10 84 return NULL;
meillo@0 85 }
meillo@0 86
meillo@10 87 gpointer*
meillo@10 88 table_find(GList * table_list, gchar * key)
meillo@0 89 {
meillo@10 90 return table_find_func(table_list, key, strcmp);
meillo@0 91 }
meillo@0 92
meillo@10 93 gpointer*
meillo@10 94 table_find_case(GList * table_list, gchar * key)
meillo@0 95 {
meillo@10 96 return table_find_func(table_list, key, strcasecmp);
meillo@0 97 }
meillo@0 98
meillo@10 99 static int
meillo@10 100 fnmatch0(const char *pattern, const char *string)
meillo@0 101 {
meillo@10 102 return fnmatch(pattern, string, 0);
meillo@0 103 }
meillo@0 104
meillo@10 105 gpointer*
meillo@10 106 table_find_fnmatch(GList * table_list, gchar * key)
meillo@0 107 {
meillo@10 108 return table_find_func(table_list, key, fnmatch0);
meillo@0 109 }
meillo@0 110
meillo@10 111 GList*
meillo@10 112 table_read(gchar * fname, gchar delim)
meillo@0 113 {
meillo@10 114 GList *list = NULL;
meillo@10 115 FILE *fptr;
meillo@0 116
meillo@10 117 if ((fptr = fopen(fname, "rt"))) {
meillo@10 118 gchar buf[256];
meillo@0 119
meillo@10 120 while (fgets(buf, 255, fptr)) {
meillo@10 121 if (buf[0] && (buf[0] != '#') && (buf[0] != '\n')) {
meillo@10 122 table_pair *pair;
meillo@10 123 g_strchomp(buf);
meillo@10 124 pair = parse_table_pair(buf, delim);
meillo@10 125 list = g_list_append(list, pair);
meillo@10 126 }
meillo@10 127 }
meillo@10 128 fclose(fptr);
meillo@238 129 if (!list)
meillo@238 130 logwrite(LOG_NOTICE, "table file %s contained no entries\n", fname);
meillo@10 131 return list;
meillo@10 132 }
meillo@238 133 logwrite(LOG_ALERT, "could not open table file %s: %s."
meillo@238 134 " Thus no aliasing will be done\n", fname, strerror(errno));
meillo@0 135
meillo@10 136 return NULL;
meillo@0 137 }
meillo@0 138
meillo@10 139 void
meillo@10 140 destroy_table(GList * table)
meillo@0 141 {
meillo@10 142 GList *node;
meillo@0 143
meillo@10 144 foreach(table, node) {
meillo@10 145 table_pair *p = (table_pair *) (node->data);
meillo@10 146 g_free(p->key);
meillo@10 147 g_free(p->value);
meillo@10 148 g_free(p);
meillo@10 149 }
meillo@10 150 g_list_free(table);
meillo@0 151 }