diff options
Diffstat (limited to 'libsm/notify.h')
| -rw-r--r-- | libsm/notify.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libsm/notify.h b/libsm/notify.h new file mode 100644 index 000000000000..a314e75a4bb2 --- /dev/null +++ b/libsm/notify.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021 Proofpoint, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + */ + +#ifndef LIBSM_NOTIFY_H +#define LIBSM_NOTIFY_H + +#if SM_NOTIFY_DEBUG +#define SM_DBG(p) fprintf p +#else +#define SM_DBG(p) +#endif + +/* microseconds */ +#define SM_MICROS 1000000L + +#define SM_MICROS2TVAL(tmo, tval, timeout) \ + do \ + { \ + if (tmo < 0) \ + tval = NULL; \ + else \ + { \ + timeout.tv_sec = (long) (tmo / SM_MICROS); \ + timeout.tv_usec = tmo % SM_MICROS; \ + tval = &timeout; \ + } \ + } while (0) + +#define MAX_NETSTR 1024 +#define NETSTRPRE 5 + +/* flow through code, be careful how to use! */ +#define RDNETSTR(rc, fd, SM_NOTIFY_EOF) \ + if ((rc) <= 0) \ + { \ + SM_DBG((stderr, "pid=%ld, select=%d, e=%d\n", (long)getpid(), (rc), save_errno)); \ + return -ETIMEDOUT; \ + } \ + \ + /* bogus... need to check again? */ \ + if (!FD_ISSET(fd, &readfds)) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, isset=false\n", (long)getpid(), fd)); \ + return -ETIMEDOUT; \ + } \ + r = read(fd, buf, NETSTRPRE); \ + if (0 == r) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read1=EOF, e=%d\n", (long)getpid(), fd, errno)); \ + SM_NOTIFY_EOF; \ + return r; \ + } \ + if (NETSTRPRE != r) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read1=%d, e=%d\n", (long)getpid(), fd, r, errno)); \ + return -1; /* ??? */ \ + } \ + \ + if (sm_io_sscanf(buf, "%4u:", &len) != 1) \ + { \ + SM_DBG((stderr, "pid=%ld, scanf, e=%d\n", (long)getpid(), errno)); \ + return -EINVAL; /* ??? */ \ + } \ + if (len >= MAX_NETSTR) \ + { \ + SM_DBG((stderr, "pid=%ld, 1: len=%d\n", (long)getpid(), len)); \ + return -E2BIG; /* ??? */ \ + } \ + if (len >= buflen - 1) \ + { \ + SM_DBG((stderr, "pid=%ld, 2: len=%d\n", (long)getpid(), len)); \ + return -E2BIG; /* ??? */ \ + } \ + if (len <= 0) \ + { \ + SM_DBG((stderr, "pid=%ld, 3: len=%d\n", (long)getpid(), len)); \ + return -EINVAL; /* ??? */ \ + } \ + r = read(fd, buf, len + 1); \ + save_errno = errno; \ + SM_DBG((stderr, "pid=%ld, fd=%d, read=%d, len=%d, e=%d\n", (long)getpid(), fd, r, len+1, save_errno)); \ + if (r == 0) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read2=%d, e=%d\n", (long)getpid(), fd, r, save_errno)); \ + return -1; /* ??? */ \ + } \ + if (r < 0) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read3=%d, e=%d\n", (long)getpid(), fd, r, save_errno)); \ + return -save_errno; \ + } \ + if (len + 1 != r) \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read4=%d, len=%d\n", (long)getpid(), fd, r, len)); \ + return -1; /* ??? */ \ + } \ + if (buf[len] != ',') \ + { \ + SM_DBG((stderr, "pid=%ld, fd=%d, read5=%d, f=%d\n", (long)getpid(), fd, r, buf[len])); \ + return -EINVAL; /* ??? */ \ + } \ + buf[len] = '\0'; \ + return r + +#endif /* ! LIBSM_MSG_H */ |
