mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-31 22:25:24 +00:00
postfix-2.0.16-20031204
This commit is contained in:
committed by
Viktor Dukhovni
parent
41308545c8
commit
a64a67e84b
1
postfix/.indent.pro
vendored
1
postfix/.indent.pro
vendored
@@ -112,6 +112,7 @@
|
|||||||
-TMYSQL
|
-TMYSQL
|
||||||
-TMYSQL_NAME
|
-TMYSQL_NAME
|
||||||
-TNAMADR_LIST
|
-TNAMADR_LIST
|
||||||
|
-TNAME_CODE
|
||||||
-TNAME_MASK
|
-TNAME_MASK
|
||||||
-TPEER_NAME
|
-TPEER_NAME
|
||||||
-TPGSQL_NAME
|
-TPGSQL_NAME
|
||||||
|
@@ -8804,6 +8804,14 @@ Apologies for any names omitted.
|
|||||||
is accepted (and thus, before a cleanup server connection
|
is accepted (and thus, before a cleanup server connection
|
||||||
is available). Files: smtpd/{smtpd,smtpd_state,smtpd_check}.c.
|
is available). Files: smtpd/{smtpd,smtpd_state,smtpd_check}.c.
|
||||||
|
|
||||||
|
20031204
|
||||||
|
|
||||||
|
Bugfix: conf/post-install didn't skip non-existent obsolete
|
||||||
|
files. Victor Duchovni.
|
||||||
|
|
||||||
|
Minor cleanups of the xclient error messages; xclient
|
||||||
|
command lookup tables. File: smtpd/smtpd.c.
|
||||||
|
|
||||||
Open problems:
|
Open problems:
|
||||||
|
|
||||||
High: when virtual aliasing is turned off after content
|
High: when virtual aliasing is turned off after content
|
||||||
|
@@ -425,9 +425,9 @@ test -n "$create" && {
|
|||||||
case $flags in *r*) recursive="-R";; *) recursive=;; esac
|
case $flags in *r*) recursive="-R";; *) recursive=;; esac
|
||||||
case $flags in *o*) obsolete_flag=1;; *) obsolete_flag=;; esac
|
case $flags in *o*) obsolete_flag=1;; *) obsolete_flag=;; esac
|
||||||
# Flag obsolete objects. XXX Solaris 2..9 does not have "test -e".
|
# Flag obsolete objects. XXX Solaris 2..9 does not have "test -e".
|
||||||
if [ -n "$obsolete_flag" -a -r $path ]
|
if [ -n "$obsolete_flag" ]
|
||||||
then
|
then
|
||||||
obsolete="$obsolete $path"
|
test -r $path && obsolete="$obsolete $path"
|
||||||
continue;
|
continue;
|
||||||
fi
|
fi
|
||||||
# Create missing directories with proper owner/group/mode settings.
|
# Create missing directories with proper owner/group/mode settings.
|
||||||
|
@@ -289,6 +289,10 @@ static void anvil_remote_expire(int unused_event, char *context)
|
|||||||
htable_delete(anvil_remote_map, anvil_remote->ident,
|
htable_delete(anvil_remote_map, anvil_remote->ident,
|
||||||
(void (*) (char *)) 0);
|
(void (*) (char *)) 0);
|
||||||
ANVIL_REMOTE_FREE(anvil_remote);
|
ANVIL_REMOTE_FREE(anvil_remote);
|
||||||
|
|
||||||
|
if (msg_verbose)
|
||||||
|
msg_info("%s: anvil_remote_map used=%d",
|
||||||
|
myname, anvil_remote_map->used);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* anvil_remote_lookup - dump address status */
|
/* anvil_remote_lookup - dump address status */
|
||||||
@@ -491,6 +495,10 @@ static void anvil_service_done(VSTREAM *client_stream, char *unused_service,
|
|||||||
} else if (msg_verbose)
|
} else if (msg_verbose)
|
||||||
msg_info("client socket not found for fd=%d",
|
msg_info("client socket not found for fd=%d",
|
||||||
vstream_fileno(client_stream));
|
vstream_fileno(client_stream));
|
||||||
|
|
||||||
|
if (msg_verbose)
|
||||||
|
msg_info("%s: anvil_local_map used=%d",
|
||||||
|
myname, anvil_local_map->used);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* anvil_service - perform service for client */
|
/* anvil_service - perform service for client */
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
* Patches change the patchlevel and the release date. Snapshots change the
|
* Patches change the patchlevel and the release date. Snapshots change the
|
||||||
* release date only, unless they include the same bugfix as a patch release.
|
* release date only, unless they include the same bugfix as a patch release.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20031203"
|
#define MAIL_RELEASE_DATE "20031204"
|
||||||
|
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE
|
#define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE
|
||||||
|
@@ -431,6 +431,7 @@
|
|||||||
#include <watchdog.h>
|
#include <watchdog.h>
|
||||||
#include <iostuff.h>
|
#include <iostuff.h>
|
||||||
#include <split_at.h>
|
#include <split_at.h>
|
||||||
|
#include <name_code.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
@@ -1758,6 +1759,18 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
char *arg_val;
|
char *arg_val;
|
||||||
int update_namaddr = 0;
|
int update_namaddr = 0;
|
||||||
int function;
|
int function;
|
||||||
|
int code;
|
||||||
|
static NAME_CODE xclient_functions[] = {
|
||||||
|
XCLIENT_OVERRIDE, FUNC_OVERRIDE,
|
||||||
|
XCLIENT_FORWARD, FUNC_FORWARD,
|
||||||
|
0, -1,
|
||||||
|
};
|
||||||
|
static NAME_CODE xclient_codes[] = {
|
||||||
|
"OK", SMTPD_PEER_CODE_OK,
|
||||||
|
"PERM", SMTPD_PEER_CODE_PERM,
|
||||||
|
"TEMP", SMTPD_PEER_CODE_TEMP,
|
||||||
|
0, -1,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity checks. The XCLIENT command does not override its own access
|
* Sanity checks. The XCLIENT command does not override its own access
|
||||||
@@ -1787,18 +1800,14 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
*/
|
*/
|
||||||
arg_val = argv[1].strval;
|
arg_val = argv[1].strval;
|
||||||
printable(arg_val, '?');
|
printable(arg_val, '?');
|
||||||
if (STREQ(arg_val, XCLIENT_OVERRIDE)) {
|
if ((function = name_code(xclient_functions, arg_val)) < 0) {
|
||||||
function = FUNC_OVERRIDE;
|
|
||||||
} else if (STREQ(arg_val, XCLIENT_FORWARD)) {
|
|
||||||
function = FUNC_FORWARD;
|
|
||||||
if (state->xclient.used == 0)
|
|
||||||
smtpd_xclient_preset(state);
|
|
||||||
} else { /* error */
|
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Bad %s function: %s",
|
smtpd_chat_reply(state, "501 Bad %s function: %s",
|
||||||
XCLIENT_CMD, arg_val);
|
XCLIENT_CMD, arg_val);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
if (function == FUNC_FORWARD && state->xclient.used == 0)
|
||||||
|
smtpd_xclient_preset(state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iterate over all NAME=VALUE attributes. An empty value means the
|
* Iterate over all NAME=VALUE attributes. An empty value means the
|
||||||
@@ -1844,8 +1853,8 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
if (*raw_value && !valid_hostaddr(cooked_value, DONT_GRIPE)) {
|
if (*raw_value && !valid_hostaddr(cooked_value, DONT_GRIPE)) {
|
||||||
if (!valid_hostname(cooked_value, DONT_GRIPE)) {
|
if (!valid_hostname(cooked_value, DONT_GRIPE)) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Bad hostname syntax: %s",
|
smtpd_chat_reply(state, "501 Bad %s syntax: %s",
|
||||||
cooked_value);
|
XCLIENT_NAME, raw_value);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
UPD_STR_ATTR(state, function, name, cooked_value);
|
UPD_STR_ATTR(state, function, name, cooked_value);
|
||||||
@@ -1864,8 +1873,8 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
if (*raw_value) {
|
if (*raw_value) {
|
||||||
if (!valid_hostaddr(cooked_value, DONT_GRIPE)) {
|
if (!valid_hostaddr(cooked_value, DONT_GRIPE)) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Bad address syntax: %s",
|
smtpd_chat_reply(state, "501 Bad %s syntax: %s",
|
||||||
cooked_value);
|
XCLIENT_ADDR, raw_value);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
UPD_STR_ATTR(state, function, addr, cooked_value);
|
UPD_STR_ATTR(state, function, addr, cooked_value);
|
||||||
@@ -1880,21 +1889,18 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
* the hostname lookup status is not OK.
|
* the hostname lookup status is not OK.
|
||||||
*/
|
*/
|
||||||
else if (STREQ(arg_val, XCLIENT_CODE)) {
|
else if (STREQ(arg_val, XCLIENT_CODE)) {
|
||||||
if (STREQ(cooked_value, "OK")) {
|
if (*raw_value) {
|
||||||
UPD_INT_ATTR(state, function, peer_code, SMTPD_PEER_CODE_OK);
|
if ((code = name_code(xclient_codes, cooked_value)) < 0) {
|
||||||
} else if (STREQ(cooked_value, "TEMP")) {
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
UPD_INT_ATTR(state, function, peer_code, SMTPD_PEER_CODE_TEMP);
|
smtpd_chat_reply(state, "501 Bad %s value: %s",
|
||||||
UPD_STR_ATTR(state, function, name, CLIENT_NAME_UNKNOWN);
|
XCLIENT_CODE, raw_value);
|
||||||
update_namaddr = 1;
|
return (-1);
|
||||||
} else if (STREQ(cooked_value, "PERM")) {
|
}
|
||||||
UPD_INT_ATTR(state, function, peer_code, SMTPD_PEER_CODE_PERM);
|
UPD_INT_ATTR(state, function, peer_code, code);
|
||||||
UPD_STR_ATTR(state, function, name, CLIENT_NAME_UNKNOWN);
|
if (code != SMTPD_PEER_CODE_OK) {
|
||||||
update_namaddr = 1;
|
UPD_STR_ATTR(state, function, name, CLIENT_NAME_UNKNOWN);
|
||||||
} else {
|
update_namaddr = 1;
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
}
|
||||||
smtpd_chat_reply(state, "501 Bad hostname status: %s",
|
|
||||||
cooked_value);
|
|
||||||
return (-1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1906,8 +1912,8 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
if (*raw_value) {
|
if (*raw_value) {
|
||||||
if (strlen(cooked_value) > VALID_HOSTNAME_LEN) {
|
if (strlen(cooked_value) > VALID_HOSTNAME_LEN) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Bad HELO syntax: %s",
|
smtpd_chat_reply(state, "501 Bad %s syntax: %s",
|
||||||
cooked_value);
|
XCLIENT_HELO, raw_value);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
neuter(cooked_value, "<>()\\\";:@", '?');
|
neuter(cooked_value, "<>()\\\";:@", '?');
|
||||||
@@ -1925,8 +1931,8 @@ static int xclient_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
if (*raw_value) {
|
if (*raw_value) {
|
||||||
if (*cooked_value == 0 || strlen(cooked_value) > 64) {
|
if (*cooked_value == 0 || strlen(cooked_value) > 64) {
|
||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "501 Bad protocol syntax: %s",
|
smtpd_chat_reply(state, "501 Bad %s syntax: %s",
|
||||||
cooked_value);
|
XCLIENT_PROTO, raw_value);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
neuter(cooked_value, "[]<>()\\\";:@", '?');
|
neuter(cooked_value, "[]<>()\\\";:@", '?');
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
/* smtpd_xclient_preset() takes the result from smtpd_xclient_init()
|
/* smtpd_xclient_preset() takes the result from smtpd_xclient_init()
|
||||||
/* and sets all fields to the same "unknown" value that regular
|
/* and sets all fields to the same "unknown" value that regular
|
||||||
/* client attributes would have.
|
/* client attributes would have.
|
||||||
*/
|
/*
|
||||||
/* smtpd_xclient_reset() restores the state from smtpd_xclient_init().
|
/* smtpd_xclient_reset() restores the state from smtpd_xclient_init().
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@@ -27,7 +27,7 @@ SRCS = alldig.c argv.c argv_split.c attr_print0.c attr_print64.c \
|
|||||||
username.c valid_hostname.c vbuf.c vbuf_print.c vstream.c \
|
username.c valid_hostname.c vbuf.c vbuf_print.c vstream.c \
|
||||||
vstream_popen.c vstring.c vstring_vstream.c watchdog.c writable.c \
|
vstream_popen.c vstring.c vstring_vstream.c watchdog.c writable.c \
|
||||||
write_buf.c write_wait.c auto_clnt.c attr_clnt.c attr_scan_plain.c \
|
write_buf.c write_wait.c auto_clnt.c attr_clnt.c attr_scan_plain.c \
|
||||||
attr_print_plain.c sane_connect.c neuter.c
|
attr_print_plain.c sane_connect.c neuter.c name_code.c
|
||||||
OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
||||||
attr_scan0.o attr_scan64.o base64_code.o basename.o binhash.o \
|
attr_scan0.o attr_scan64.o base64_code.o basename.o binhash.o \
|
||||||
chroot_uid.o clean_env.o close_on_exec.o concatenate.o ctable.o \
|
chroot_uid.o clean_env.o close_on_exec.o concatenate.o ctable.o \
|
||||||
@@ -56,7 +56,7 @@ OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
|||||||
username.o valid_hostname.o vbuf.o vbuf_print.o vstream.o \
|
username.o valid_hostname.o vbuf.o vbuf_print.o vstream.o \
|
||||||
vstream_popen.o vstring.o vstring_vstream.o watchdog.o writable.o \
|
vstream_popen.o vstring.o vstring_vstream.o watchdog.o writable.o \
|
||||||
write_buf.o write_wait.o auto_clnt.o attr_clnt.o attr_scan_plain.o \
|
write_buf.o write_wait.o auto_clnt.o attr_clnt.o attr_scan_plain.o \
|
||||||
attr_print_plain.o sane_connect.o $(STRCASE) neuter.o
|
attr_print_plain.o sane_connect.o $(STRCASE) neuter.o name_code.o
|
||||||
HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
||||||
connect.h ctable.h dict.h dict_db.h dict_dbm.h dict_env.h \
|
connect.h ctable.h dict.h dict_db.h dict_dbm.h dict_env.h \
|
||||||
dict_cidr.h dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
|
dict_cidr.h dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
|
||||||
@@ -75,7 +75,7 @@ HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
|||||||
split_at.h stat_as.h stringops.h sys_defs.h timed_connect.h \
|
split_at.h stat_as.h stringops.h sys_defs.h timed_connect.h \
|
||||||
timed_wait.h trigger.h username.h valid_hostname.h vbuf.h \
|
timed_wait.h trigger.h username.h valid_hostname.h vbuf.h \
|
||||||
vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h \
|
vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h \
|
||||||
auto_clnt.h attr_clnt.h sane_connect.h
|
auto_clnt.h attr_clnt.h sane_connect.h name_code.h
|
||||||
TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
|
TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
|
||||||
stream_test.c dup2_pass_on_exec.c
|
stream_test.c dup2_pass_on_exec.c
|
||||||
DEFS = -I. -D$(SYSTYPE)
|
DEFS = -I. -D$(SYSTYPE)
|
||||||
@@ -485,8 +485,6 @@ attr_print_plain.o: mymalloc.h
|
|||||||
attr_print_plain.o: vstream.h
|
attr_print_plain.o: vstream.h
|
||||||
attr_print_plain.o: vbuf.h
|
attr_print_plain.o: vbuf.h
|
||||||
attr_print_plain.o: htable.h
|
attr_print_plain.o: htable.h
|
||||||
attr_print_plain.o: base64_code.h
|
|
||||||
attr_print_plain.o: vstring.h
|
|
||||||
attr_print_plain.o: attr.h
|
attr_print_plain.o: attr.h
|
||||||
attr_scan0.o: attr_scan0.c
|
attr_scan0.o: attr_scan0.c
|
||||||
attr_scan0.o: sys_defs.h
|
attr_scan0.o: sys_defs.h
|
||||||
@@ -1028,6 +1026,9 @@ mystrtok.o: sys_defs.h
|
|||||||
mystrtok.o: stringops.h
|
mystrtok.o: stringops.h
|
||||||
mystrtok.o: vstring.h
|
mystrtok.o: vstring.h
|
||||||
mystrtok.o: vbuf.h
|
mystrtok.o: vbuf.h
|
||||||
|
name_code.o: name_code.c
|
||||||
|
name_code.o: sys_defs.h
|
||||||
|
name_code.o: name_code.h
|
||||||
name_mask.o: name_mask.c
|
name_mask.o: name_mask.c
|
||||||
name_mask.o: sys_defs.h
|
name_mask.o: sys_defs.h
|
||||||
name_mask.o: msg.h
|
name_mask.o: msg.h
|
||||||
|
@@ -88,7 +88,6 @@
|
|||||||
#include <mymalloc.h>
|
#include <mymalloc.h>
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
#include <htable.h>
|
#include <htable.h>
|
||||||
#include <base64_code.h>
|
|
||||||
#include <attr.h>
|
#include <attr.h>
|
||||||
|
|
||||||
#define STR(x) vstring_str(x)
|
#define STR(x) vstring_str(x)
|
||||||
|
82
postfix/src/util/name_code.c
Normal file
82
postfix/src/util/name_code.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/*++
|
||||||
|
/* NAME
|
||||||
|
/* name_code 3
|
||||||
|
/* SUMMARY
|
||||||
|
/* name to number table mapping
|
||||||
|
/* SYNOPSIS
|
||||||
|
/* #include <name_code.h>
|
||||||
|
/*
|
||||||
|
/* typedef struct {
|
||||||
|
/* .in +4
|
||||||
|
/* const char *name;
|
||||||
|
/* int code;
|
||||||
|
/* .in -4
|
||||||
|
/* } NAME_CODE;
|
||||||
|
/*
|
||||||
|
/* int name_code(table, name)
|
||||||
|
/* NAME_CODE *table;
|
||||||
|
/* const char *name;
|
||||||
|
/*
|
||||||
|
/* const char *str_name_code(table, code)
|
||||||
|
/* NAME_CODE *table;
|
||||||
|
/* int code;
|
||||||
|
/* DESCRIPTION
|
||||||
|
/* This module does simple name<->number mapping. The process
|
||||||
|
/* is controlled by a table of (name, code) values.
|
||||||
|
/* The table is terminated with a null pointer and a code that
|
||||||
|
/* corresponds to "name not found".
|
||||||
|
/*
|
||||||
|
/* name_code() looks up the code that corresponds with the name.
|
||||||
|
/* The lookup is case insensitive.
|
||||||
|
/*
|
||||||
|
/* str_name_code() translates a number to its equivalend string.
|
||||||
|
/* DIAGNOSTICS
|
||||||
|
/* When the search fails, the result is the "name not found" code
|
||||||
|
/* or the null pointer, respectively.
|
||||||
|
/* LICENSE
|
||||||
|
/* .ad
|
||||||
|
/* .fi
|
||||||
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
|
/* AUTHOR(S)
|
||||||
|
/* Wietse Venema
|
||||||
|
/* IBM T.J. Watson Research
|
||||||
|
/* P.O. Box 704
|
||||||
|
/* Yorktown Heights, NY 10598, USA
|
||||||
|
/*--*/
|
||||||
|
|
||||||
|
/* System library. */
|
||||||
|
|
||||||
|
#include <sys_defs.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef STRCASECMP_IN_STRINGS_H
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Utility library. */
|
||||||
|
|
||||||
|
#include <name_code.h>
|
||||||
|
|
||||||
|
/* name_code - look up code by name */
|
||||||
|
|
||||||
|
int name_code(NAME_CODE *table, const char *name)
|
||||||
|
{
|
||||||
|
NAME_CODE *np;
|
||||||
|
|
||||||
|
for (np = table; np->name; np++)
|
||||||
|
if (strcasecmp(name, np->name) == 0)
|
||||||
|
break;
|
||||||
|
return (np->code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* str_name_code - look up name by code */
|
||||||
|
|
||||||
|
const char *str_name_code(NAME_CODE *table, int code)
|
||||||
|
{
|
||||||
|
NAME_CODE *np;
|
||||||
|
|
||||||
|
for (np = table; np->name; np++)
|
||||||
|
if (code == np->code)
|
||||||
|
break;
|
||||||
|
return (np->name);
|
||||||
|
}
|
36
postfix/src/util/name_code.h
Normal file
36
postfix/src/util/name_code.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef _NAME_CODE_H_INCLUDED_
|
||||||
|
#define _NAME_CODE_H_INCLUDED_
|
||||||
|
|
||||||
|
/*++
|
||||||
|
/* NAME
|
||||||
|
/* name_mask 3h
|
||||||
|
/* SUMMARY
|
||||||
|
/* name to number table mapping
|
||||||
|
/* SYNOPSIS
|
||||||
|
/* #include <name_code.h>
|
||||||
|
/* DESCRIPTION
|
||||||
|
/* .nf
|
||||||
|
|
||||||
|
/*
|
||||||
|
* External interface.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
int code;
|
||||||
|
} NAME_CODE;
|
||||||
|
|
||||||
|
extern int name_code(NAME_CODE *, const char *);
|
||||||
|
extern const char *str_name_code(NAME_CODE *, int);
|
||||||
|
|
||||||
|
/* LICENSE
|
||||||
|
/* .ad
|
||||||
|
/* .fi
|
||||||
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
|
/* AUTHOR(S)
|
||||||
|
/* Wietse Venema
|
||||||
|
/* IBM T.J. Watson Research
|
||||||
|
/* P.O. Box 704
|
||||||
|
/* Yorktown Heights, NY 10598, USA
|
||||||
|
/*--*/
|
||||||
|
|
||||||
|
#endif
|
Reference in New Issue
Block a user