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