1/*	$NetBSD: dsn_mask.c,v 1.2 2017/02/14 01:16:45 christos Exp $	*/
2
3/*++
4/* NAME
5/*	dsn_mask 3
6/* SUMMARY
7/*	DSN embedding in SMTP
8/* SYNOPSIS
9/*	#include <dsn_mask.h>
10/*
11/*	int	dsn_notify_mask(str)
12/*	const char *str;
13/*
14/*	const char *dsn_notify_str(mask)
15/*	int	mask;
16/*
17/*	int	dsn_ret_code(str)
18/*	const char *str;
19/*
20/*	const char *dsn_ret_str(code)
21/*	int	mask;
22/* DESCRIPTION
23/*	dsn_ret_code() converts the parameters of a MAIL FROM ..
24/*	RET option to internal form.
25/*
26/*	dsn_ret_str() converts internal form to the representation
27/*	used in the MAIL FROM .. RET command. The result is in
28/*	stable and static memory.
29/*
30/*	dsn_notify_mask() converts the parameters of a RCPT TO ..
31/*	NOTIFY option to internal form.
32/*
33/*	dsn_notify_str() converts internal form to the representation
34/*	used in the RCPT TO .. NOTIFY command. The result is in
35/*	volatile memory and is clobbered whenever str_name_mask()
36/*	is called.
37/*
38/*	Arguments:
39/* .IP str
40/*	Information received with the MAIL FROM or RCPT TO command.
41/* .IP mask
42/*	Internal representation.
43/* DIAGNOSTICS
44/*	dsn_ret_code() and dsn_notify_mask() return 0 when the string
45/*	specifies an invalid request.
46/*
47/*	dsn_ret_str() and dsn_notify_str() abort on failure.
48/* LICENSE
49/* .ad
50/* .fi
51/*	The Secure Mailer license must be distributed with this software.
52/* AUTHOR(S)
53/*	Wietse Venema
54/*	IBM T.J. Watson Research
55/*	P.O. Box 704
56/*	Yorktown Heights, NY 10598, USA
57/*--*/
58
59
60/* System library. */
61
62#include <sys_defs.h>
63
64/* Utility library. */
65
66#include <name_code.h>
67#include <name_mask.h>
68#include <msg.h>
69
70/* Global library. */
71
72#include <dsn_mask.h>
73
74/* Application-specific. */
75
76static const NAME_MASK dsn_notify_table[] = {
77    "NEVER", DSN_NOTIFY_NEVER,
78    "SUCCESS", DSN_NOTIFY_SUCCESS,
79    "FAILURE", DSN_NOTIFY_FAILURE,
80    "DELAY", DSN_NOTIFY_DELAY,
81    0, 0,
82};
83
84static const NAME_CODE dsn_ret_table[] = {
85    "FULL", DSN_RET_FULL,
86    "HDRS", DSN_RET_HDRS,
87    0, 0,
88};
89
90/* dsn_ret_code - string to mask */
91
92int     dsn_ret_code(const char *str)
93{
94    return (name_code(dsn_ret_table, NAME_CODE_FLAG_NONE, str));
95}
96
97/* dsn_ret_str - mask to string */
98
99const char *dsn_ret_str(int code)
100{
101    const char *cp;
102
103    if ((cp = str_name_code(dsn_ret_table, code)) == 0)
104	msg_panic("dsn_ret_str: unknown code %d", code);
105    return (cp);
106}
107
108/* dsn_notify_mask - string to mask */
109
110int     dsn_notify_mask(const char *str)
111{
112    int     mask = name_mask_opt("DSN NOTIFY command", dsn_notify_table,
113				 str, NAME_MASK_ANY_CASE | NAME_MASK_RETURN);
114
115    return (DSN_NOTIFY_OK(mask) ? mask : 0);
116}
117
118/* dsn_notify_str - mask to string */
119
120const char *dsn_notify_str(int mask)
121{
122    return (str_name_mask_opt((VSTRING *) 0, "DSN NOTIFY command",
123			      dsn_notify_table, mask,
124			      NAME_MASK_FATAL | NAME_MASK_COMMA));
125}
126