xref: /freebsd/contrib/sendmail/libsm/notify.h (revision d39bd2c1388b520fcba9abed1932acacead60fba)
1*d39bd2c1SGregory Neil Shapiro /*
2*d39bd2c1SGregory Neil Shapiro  * Copyright (c) 2021 Proofpoint, Inc. and its suppliers.
3*d39bd2c1SGregory Neil Shapiro  *      All rights reserved.
4*d39bd2c1SGregory Neil Shapiro  *
5*d39bd2c1SGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
6*d39bd2c1SGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
7*d39bd2c1SGregory Neil Shapiro  * the sendmail distribution.
8*d39bd2c1SGregory Neil Shapiro  */
9*d39bd2c1SGregory Neil Shapiro 
10*d39bd2c1SGregory Neil Shapiro #ifndef LIBSM_NOTIFY_H
11*d39bd2c1SGregory Neil Shapiro #define LIBSM_NOTIFY_H
12*d39bd2c1SGregory Neil Shapiro 
13*d39bd2c1SGregory Neil Shapiro #if SM_NOTIFY_DEBUG
14*d39bd2c1SGregory Neil Shapiro #define SM_DBG(p)	fprintf p
15*d39bd2c1SGregory Neil Shapiro #else
16*d39bd2c1SGregory Neil Shapiro #define SM_DBG(p)
17*d39bd2c1SGregory Neil Shapiro #endif
18*d39bd2c1SGregory Neil Shapiro 
19*d39bd2c1SGregory Neil Shapiro /* microseconds */
20*d39bd2c1SGregory Neil Shapiro #define SM_MICROS 1000000L
21*d39bd2c1SGregory Neil Shapiro 
22*d39bd2c1SGregory Neil Shapiro #define SM_MICROS2TVAL(tmo, tval, timeout) \
23*d39bd2c1SGregory Neil Shapiro 	do	\
24*d39bd2c1SGregory Neil Shapiro 	{	\
25*d39bd2c1SGregory Neil Shapiro 		if (tmo < 0)	\
26*d39bd2c1SGregory Neil Shapiro 			tval = NULL;	\
27*d39bd2c1SGregory Neil Shapiro 		else	\
28*d39bd2c1SGregory Neil Shapiro 		{	\
29*d39bd2c1SGregory Neil Shapiro 			timeout.tv_sec = (long) (tmo / SM_MICROS);	\
30*d39bd2c1SGregory Neil Shapiro 			timeout.tv_usec = tmo % SM_MICROS;	\
31*d39bd2c1SGregory Neil Shapiro 			tval = &timeout;	\
32*d39bd2c1SGregory Neil Shapiro 		}	\
33*d39bd2c1SGregory Neil Shapiro 	} while (0)
34*d39bd2c1SGregory Neil Shapiro 
35*d39bd2c1SGregory Neil Shapiro #define MAX_NETSTR 1024
36*d39bd2c1SGregory Neil Shapiro #define NETSTRPRE 5
37*d39bd2c1SGregory Neil Shapiro 
38*d39bd2c1SGregory Neil Shapiro /* flow through code, be careful how to use! */
39*d39bd2c1SGregory Neil Shapiro #define RDNETSTR(rc, fd, SM_NOTIFY_EOF)	\
40*d39bd2c1SGregory Neil Shapiro 	if ((rc) <= 0)	\
41*d39bd2c1SGregory Neil Shapiro 	{	\
42*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, select=%d, e=%d\n", (long)getpid(), (rc), save_errno)); \
43*d39bd2c1SGregory Neil Shapiro 		return -ETIMEDOUT;	\
44*d39bd2c1SGregory Neil Shapiro 	}	\
45*d39bd2c1SGregory Neil Shapiro 	\
46*d39bd2c1SGregory Neil Shapiro 	/* bogus... need to check again? */	\
47*d39bd2c1SGregory Neil Shapiro 	if (!FD_ISSET(fd, &readfds))	\
48*d39bd2c1SGregory Neil Shapiro 	{	\
49*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, isset=false\n", (long)getpid(), fd)); \
50*d39bd2c1SGregory Neil Shapiro 		return -ETIMEDOUT;	\
51*d39bd2c1SGregory Neil Shapiro 	}	\
52*d39bd2c1SGregory Neil Shapiro 	r = read(fd, buf, NETSTRPRE);	\
53*d39bd2c1SGregory Neil Shapiro 	if (0 == r)	\
54*d39bd2c1SGregory Neil Shapiro 	{	\
55*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read1=EOF, e=%d\n", (long)getpid(), fd, errno));	\
56*d39bd2c1SGregory Neil Shapiro 		SM_NOTIFY_EOF;	\
57*d39bd2c1SGregory Neil Shapiro 		return r;	\
58*d39bd2c1SGregory Neil Shapiro 	}	\
59*d39bd2c1SGregory Neil Shapiro 	if (NETSTRPRE != r)	\
60*d39bd2c1SGregory Neil Shapiro 	{	\
61*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read1=%d, e=%d\n", (long)getpid(), fd, r, errno));	\
62*d39bd2c1SGregory Neil Shapiro 		return -1;	/* ??? */	\
63*d39bd2c1SGregory Neil Shapiro 	}	\
64*d39bd2c1SGregory Neil Shapiro 	\
65*d39bd2c1SGregory Neil Shapiro 	if (sm_io_sscanf(buf, "%4u:", &len) != 1)	\
66*d39bd2c1SGregory Neil Shapiro 	{	\
67*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, scanf, e=%d\n", (long)getpid(), errno));	\
68*d39bd2c1SGregory Neil Shapiro 		return -EINVAL;	/* ??? */	\
69*d39bd2c1SGregory Neil Shapiro 	}	\
70*d39bd2c1SGregory Neil Shapiro 	if (len >= MAX_NETSTR)	\
71*d39bd2c1SGregory Neil Shapiro 	{	\
72*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, 1: len=%d\n", (long)getpid(), len));	\
73*d39bd2c1SGregory Neil Shapiro 		return -E2BIG;	/* ??? */	\
74*d39bd2c1SGregory Neil Shapiro 	}	\
75*d39bd2c1SGregory Neil Shapiro 	if (len >= buflen - 1)	\
76*d39bd2c1SGregory Neil Shapiro 	{	\
77*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, 2: len=%d\n", (long)getpid(), len));	\
78*d39bd2c1SGregory Neil Shapiro 		return -E2BIG;	/* ??? */	\
79*d39bd2c1SGregory Neil Shapiro 	}	\
80*d39bd2c1SGregory Neil Shapiro 	if (len <= 0)	\
81*d39bd2c1SGregory Neil Shapiro 	{	\
82*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, 3: len=%d\n", (long)getpid(), len));	\
83*d39bd2c1SGregory Neil Shapiro 		return -EINVAL;	/* ??? */	\
84*d39bd2c1SGregory Neil Shapiro 	}	\
85*d39bd2c1SGregory Neil Shapiro 	r = read(fd, buf, len + 1);	\
86*d39bd2c1SGregory Neil Shapiro 	save_errno = errno;	\
87*d39bd2c1SGregory Neil Shapiro 	SM_DBG((stderr, "pid=%ld, fd=%d, read=%d, len=%d, e=%d\n", (long)getpid(), fd, r, len+1, save_errno));	\
88*d39bd2c1SGregory Neil Shapiro 	if (r == 0)	\
89*d39bd2c1SGregory Neil Shapiro 	{	\
90*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read2=%d, e=%d\n", (long)getpid(), fd, r, save_errno));	\
91*d39bd2c1SGregory Neil Shapiro 		return -1;	/* ??? */	\
92*d39bd2c1SGregory Neil Shapiro 	}	\
93*d39bd2c1SGregory Neil Shapiro 	if (r < 0)	\
94*d39bd2c1SGregory Neil Shapiro 	{	\
95*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read3=%d, e=%d\n", (long)getpid(), fd, r, save_errno));	\
96*d39bd2c1SGregory Neil Shapiro 		return -save_errno;	\
97*d39bd2c1SGregory Neil Shapiro 	}	\
98*d39bd2c1SGregory Neil Shapiro 	if (len + 1 != r)	\
99*d39bd2c1SGregory Neil Shapiro 	{	\
100*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read4=%d, len=%d\n", (long)getpid(), fd, r, len));	\
101*d39bd2c1SGregory Neil Shapiro 		return -1;	/* ??? */	\
102*d39bd2c1SGregory Neil Shapiro 	}	\
103*d39bd2c1SGregory Neil Shapiro 	if (buf[len] != ',')	\
104*d39bd2c1SGregory Neil Shapiro 	{	\
105*d39bd2c1SGregory Neil Shapiro 		SM_DBG((stderr, "pid=%ld, fd=%d, read5=%d, f=%d\n", (long)getpid(), fd, r, buf[len]));	\
106*d39bd2c1SGregory Neil Shapiro 		return -EINVAL;	/* ??? */	\
107*d39bd2c1SGregory Neil Shapiro 	}	\
108*d39bd2c1SGregory Neil Shapiro 	buf[len] = '\0';	\
109*d39bd2c1SGregory Neil Shapiro 	return r
110*d39bd2c1SGregory Neil Shapiro 
111*d39bd2c1SGregory Neil Shapiro #endif /* ! LIBSM_MSG_H */
112