aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-05-25 09:27:29 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-05-25 09:27:29 +0000
commit827acf9e23d4b7819681b5da6778685b882587e7 (patch)
treeb451f576385bcba108fff406835c381a0b6fbd47
parentf5e8d9e76cd34e13b98dfd7b762d48dfc1b7bdc0 (diff)
downloadmailfromd-827acf9e23d4b7819681b5da6778685b882587e7.tar.gz
mailfromd-827acf9e23d4b7819681b5da6778685b882587e7.tar.bz2
Lots of critical bugfixes
git-svn-id: file:///svnroot/mailfromd/trunk@1474 7a8a7f39-df28-0410-adc6-e0d955640f24
-rw-r--r--ChangeLog15
-rw-r--r--src/Makefile.am2
-rw-r--r--src/bi_db.m48
-rw-r--r--src/bi_dns.m44
-rw-r--r--src/bi_sa.m48
-rw-r--r--src/drivers.c29
-rw-r--r--src/gram.y2
-rw-r--r--src/mtasim.c2
-rw-r--r--src/snarf.m42
9 files changed, 52 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 3753afdf..5e90621f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2007-05-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/snarf.m4 (MF_OPTVAL): Fix a leftover bug
+ * src/gram.y (on_cond): Reverse selector argument list.
+ * src/drivers.c (code_type_call): Provide placeholders for the
+ missing optinal arguments, so they can be safely accessed and
+ assigned.
+ * src/bi_dns.m4, src/bi_db.m4: Use MF_OPTVAL insted of MF_DEFINED.
+ * src/bi_sa.m4: Avoid splitting strings within NLS markers,
+ because M4 inserts line directives in between, which cause grief
+ for many compilers.
+ * src/Makefile.am (.m4.c): Fix the sed rule
+ * src/mtasim.c (recursive_rmdir): Do not complain when attempting
+ to delete a non-existing file.
+
2007-05-24 Sergey Poznyakoff <gray@gnu.org.ua>
* src/bi_gettext.m4: Built-in NLS support
diff --git a/src/Makefile.am b/src/Makefile.am
index 878d896b..c169cf63 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -148,7 +148,7 @@ M4=m4
.m4.c:
$(M4) --prefix -s -DSOURCE="$<" $(top_srcdir)/src/snarf.m4 $< > $@-t
- sed '1{/#line/d}' $@-t > $@
+ sed '1{/#line/d;}' $@-t > $@
rm $@-t
.def.h:
diff --git a/src/bi_db.m4 b/src/bi_db.m4
index 8ec821d2..246f19b9 100644
--- a/src/bi_db.m4
+++ b/src/bi_db.m4
@@ -71,7 +71,7 @@ MF_DEFUN(dbmap, NUMBER, STRING dbname, STRING key, OPTIONAL, NUMBER null)
{
dbmap_lookup(env, dbname, key, NULL,
LOOKUP_TEST_ONLY |
- (MF_DEFINED(null) ? LOOKUP_NULL_BYTE : 0));
+ (MF_OPTVAL(null) ? LOOKUP_NULL_BYTE : 0));
}
END
@@ -80,7 +80,7 @@ MF_DEFUN(dbget, STRING, STRING dbname, STRING key, OPTIONAL,
{
dbmap_lookup(env, dbname, key,
MF_OPTVAL(defval),
- (MF_DEFINED(null) ? LOOKUP_NULL_BYTE : 0));
+ (MF_OPTVAL(null) ? LOOKUP_NULL_BYTE : 0));
}
END
@@ -100,7 +100,7 @@ MF_DEFUN(dbput, VOID, STRING dbname, STRING keystr, STRING value,
memset(&key, 0, sizeof key);
MU_DATUM_PTR(key) = keystr;
MU_DATUM_SIZE(key) = strlen(keystr);
- if (MF_DEFINED(null))
+ if (MF_OPTVAL(null))
MU_DATUM_SIZE(key)++;
memset(&contents, 0, sizeof contents);
@@ -132,7 +132,7 @@ MF_DEFUN(dbdel, VOID, STRING dbname, STRING keystr, OPTIONAL, NUMBER null)
memset(&key, 0, sizeof key);
MU_DATUM_PTR(key) = keystr;
MU_DATUM_SIZE(key) = strlen(keystr);
- if (MF_DEFINED(null))
+ if (MF_OPTVAL(null))
MU_DATUM_SIZE(key)++;
rc = mu_dbm_delete(&db, key);
mu_dbm_close(&db);
diff --git a/src/bi_dns.m4 b/src/bi_dns.m4
index 7effbc03..1cec5140 100644
--- a/src/bi_dns.m4
+++ b/src/bi_dns.m4
@@ -42,7 +42,7 @@ MF_DEFUN(primitive_resolve, STRING, STRING string, OPTIONAL, STRING domain)
char *ipstr;
mf_status stat;
- if (MF_DEFINED(domain)) {
+ if (MF_OPTVAL(domain,"")[0]) {
stat = resolve_ipstr_domain(string, domain, &ipstr);
MF_ASSERT(stat == mf_success,
stat,
@@ -179,7 +179,7 @@ MF_DEFUN(getmx, STRING, STRING domain, OPTIONAL, NUMBER resolve)
mxbuf_t mxbuf;
mf_status mxstat;
- if (MF_DEFINED(resolve))
+ if (MF_OPTVAL(resolve))
mxstat = getmxip(domain, mxbuf);
else
mxstat = getmx(domain, mxbuf);
diff --git a/src/bi_sa.m4 b/src/bi_sa.m4
index 054df65e..4dd127d7 100644
--- a/src/bi_sa.m4
+++ b/src/bi_sa.m4
@@ -388,8 +388,8 @@ MF_DEFUN(sa, NUMBER, STRING urlstr, NUMBER prec)
spam_str, score_str, threshold_str) != 3) {
spamd_destroy(&ostr);
MF_THROW(mf_failure,
- _("spamd responded with bad Spam header "
- "'%s'"), buffer);
+ _("spamd responded with bad Spam header '%s'"),
+ buffer);
}
result = decode_boolean(spam_str);
@@ -435,8 +435,8 @@ MF_DEFUN(clamav, NUMBER, STRING urlstr)
if (sscanf(buffer, "PORT %hu\n", &port) != 1) {
spamd_destroy(&cstr);
MF_THROW(mf_failure,
- _("Bad response from clamav: expected `PORT'"
- " but found `%s'"), buffer);
+ _("Bad response from clamav: expected `PORT' but found `%s'"),
+ buffer);
}
if (!host)
diff --git a/src/drivers.c b/src/drivers.c
index b8332ba5..5a059f88 100644
--- a/src/drivers.c
+++ b/src/drivers.c
@@ -1523,22 +1523,39 @@ code_type_call(NODE *node, struct locus **old_locus)
struct literal *s;
struct function *func = node->v.call.func;
int i;
-
- for (p = node->v.call.args, i = 0; p; p = p->next, i++)
- code_node(p);
+
if (func->optcount) {
+ int j;
+
+ /* Count actual arguments */
+ for (p = node->v.call.args, i = 0; p; p = p->next, i++)
+ ;
+ /* Provide placeholders for the missing ones. This is
+ necessary in order to make assignments to optional
+ arguments possible. */
+ for (j = i; j < func->parmcount; j++) {
+ code_op(opcode_push);
+ code_immediate(0);
+ }
+
+ /* Pass actual arguments */
+ for (p = node->v.call.args; p; p = p->next)
+ code_node(p);
+
/* Pass the number of actual arguments in a hidden arg */
code_op(opcode_push);
code_immediate((void*)i);
- }
-
+ } else
+ for (p = node->v.call.args, i = 0; p; p = p->next, i++)
+ code_node(p);
+
MARK_LOCUS();
code_op(opcode_funcall);
s = literal_lookup(func->name);
code_immediate((void*)s->off);
code_immediate((void*)func->entry);
code_op(opcode_adjust);
- code_immediate((void*)(func->optcount ? (i + 1) : func->parmcount));
+ code_immediate((void*)(func->parmcount + (func->optcount ? 1 : 0)));
if (func->rettype != dtype_unspecified)
code_op(opcode_pushreg);
}
diff --git a/src/gram.y b/src/gram.y
index 282fc242..c57f8490 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -1807,7 +1807,7 @@ on_cond : on pollstmt do branches DONE
sel = alloc_node(node_type_builtin, &$1);
sel->v.builtin.builtin = bi;
- sel->v.builtin.args = head;
+ sel->v.builtin.args = reverse(head);
$$ = create_on_node(sel, $4.head);
}
diff --git a/src/mtasim.c b/src/mtasim.c
index b047007d..e9ca4148 100644
--- a/src/mtasim.c
+++ b/src/mtasim.c
@@ -502,7 +502,7 @@ recursive_rmdir (const char *name)
}
else if (S_ISDIR (st.st_mode))
rc = rmdir_r (ent->d_name);
- else if ((rc = unlink (ent->d_name)) != 0)
+ else if ((rc = unlink (ent->d_name)) != 0 && errno != ENOENT)
mu_error (_("cannot unlink %s: %s"), ent->d_name, mu_strerror (errno));
}
closedir (dir);
diff --git a/src/snarf.m4 b/src/snarf.m4
index 409d48c5..f85cc4bd 100644
--- a/src/snarf.m4
+++ b/src/snarf.m4
@@ -234,7 +234,7 @@ m4_define([<MF_DEFINED>],
*/
m4_define([<MF_OPTVAL>],
[<m4_ifdef([<__MF_ARGLIST__>],m4_dnl
-[<m4_ifelse([<$2>],,$1,(MF_DEFINED($1) ? $1 : $2))>],m4_dnl
+[<(MF_DEFINED($1) ? $1 : m4_ifelse([<$2>],,0,$2))>],m4_dnl
[<m4_errprint(m4___file__:m4___line__: [<MF_OPTVAL used out of functional context>])>])>])
/* __mf_check_end() -- signal error if the previous MF_DEFUN statement was

Return to:

Send suggestions and report system problems to the System administrator.