meillo@0: /* MasqMail meillo@0: Copyright (C) 2000-2001 Oliver Kurth meillo@0: meillo@0: This program is free software; you can redistribute it and/or modify meillo@0: it under the terms of the GNU General Public License as published by meillo@0: the Free Software Foundation; either version 2 of the License, or meillo@0: (at your option) any later version. meillo@0: meillo@0: This program is distributed in the hope that it will be useful, meillo@0: but WITHOUT ANY WARRANTY; without even the implied warranty of meillo@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the meillo@0: GNU General Public License for more details. meillo@0: meillo@0: You should have received a copy of the GNU General Public License meillo@0: along with this program; if not, write to the Free Software meillo@0: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. meillo@0: */ meillo@0: meillo@0: #include "masqmail.h" meillo@0: meillo@0: #define MAX_VAR 50 meillo@0: meillo@0: GList *var_table_rcpt(GList *var_table, address *rcpt) meillo@0: { meillo@0: gchar *tmp_str; meillo@0: meillo@0: var_table = g_list_prepend(var_table, create_pair_string("rcpt_local", rcpt->local_part)); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("rcpt_domain", rcpt->domain)); meillo@0: meillo@0: tmp_str = g_strdup_printf("%s@%s", rcpt->local_part, rcpt->domain); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("rcpt", tmp_str)); meillo@0: g_free(tmp_str); meillo@0: meillo@0: return var_table; meillo@0: } meillo@0: meillo@0: GList *var_table_msg(GList *var_table, message *msg) meillo@0: { meillo@0: address *ret_path = msg->return_path; meillo@0: gchar *tmp_str; meillo@0: meillo@0: var_table = g_list_prepend(var_table, create_pair_string("uid", msg->uid)); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("received_host", meillo@0: msg->received_host ? msg->received_host : "")); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("ident", msg->ident ? msg->ident : "")); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("return_path_local", ret_path->local_part)); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("return_path_domain", ret_path->domain)); meillo@0: meillo@0: tmp_str = g_strdup_printf("%s@%s", ret_path->local_part, ret_path->domain); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("return_path", tmp_str)); meillo@0: g_free(tmp_str); meillo@0: meillo@0: return var_table; meillo@0: } meillo@0: meillo@0: GList *var_table_conf(GList *var_table) meillo@0: { meillo@0: var_table = g_list_prepend(var_table, create_pair_string("host_name", conf.host_name)); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("package", PACKAGE)); meillo@0: var_table = g_list_prepend(var_table, create_pair_string("version", VERSION)); meillo@0: meillo@0: return var_table; meillo@0: } meillo@0: meillo@0: gint expand(GList *var_list, gchar *format, gchar *result, gint result_len) meillo@0: { meillo@0: gchar *p = format, *q = result; meillo@0: gchar *vq; meillo@0: gint i = 0; meillo@0: gboolean escape = FALSE; meillo@0: meillo@0: while(*p && (i < (result_len -1))){ meillo@0: if((*p == '$') && !escape){ meillo@0: gchar *value; meillo@0: gchar var[MAX_VAR+1]; meillo@0: int j = 0; meillo@0: meillo@0: p++; /* skip '$' */ meillo@0: vq = var; meillo@0: meillo@0: if(*p == '{'){ meillo@0: /* ${var} style */ meillo@0: p++; /* skip '{' */ meillo@0: while(*p && (*p != '}') && (j < MAX_VAR)){ meillo@0: *(vq++) = *(p++); meillo@0: j++; meillo@0: } meillo@0: p++; meillo@0: }else{ meillo@0: /* $var style */ meillo@0: while(*p && (isalnum(*p) || (*p == '_') || (*p == '-')) && (j < MAX_VAR)){ meillo@0: *(vq++) = *(p++); meillo@0: j++; meillo@0: } meillo@0: } meillo@0: *vq = 0; meillo@0: meillo@0: if(j < MAX_VAR){ meillo@0: /* search var */ meillo@0: value = (gchar *)table_find(var_list, var); meillo@0: if(value){ meillo@0: gchar *vp = value; meillo@0: while(*vp && (i < (result_len -1))){ meillo@0: *(q++) = *(vp++); i++; meillo@0: } meillo@0: } meillo@0: } meillo@0: }else{ meillo@0: if((*p == '\\') && (!escape)){ meillo@0: escape = TRUE; meillo@0: }else{ meillo@0: *(q++) = *p; i++; meillo@0: escape = FALSE; meillo@0: } meillo@0: p++; meillo@0: } meillo@0: } meillo@0: *q = 0; meillo@0: meillo@0: if(i >= (result_len -1)) meillo@0: return -3; meillo@0: meillo@0: return i; meillo@0: } meillo@0: