/* Public domain */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_BOUNDED_ATTRIBUTE #define BOUNDED_ATTRIBUTE(t, a, b) __attribute__((__bounded__ (t,a,b))) #else #define BOUNDED_ATTRIBUTE(t, a, b) #endif #ifdef HAVE_FORMAT_ATTRIBUTE #define FORMAT_ATTRIBUTE(t, a, b) __attribute__((__format__ (t,a,b))) #else #define FORMAT_ATTRIBUTE(t, a, b) #endif #ifdef HAVE_NONNULL_ATTRIBUTE #define NONNULL_ATTRIBUTE(a) __attribute__((__nonnull__ (a))) #else #define NONNULL_ATTRIBUTE(a) #endif #ifdef HAVE_PACKED_ATTRIBUTE #define PACKED_ATTRIBUTE __attribute__((__packed__)) #else #define PACKED_ATTRIBUTE #endif #include "../queue.h" #include "../sockunion.h" #include "../strlcpy.h" #include "../strlcat.h" #include "table.h" #define Malloc(len) MBD_Malloc(len) #define Free(p) if ((p) != NULL) free(p) #ifdef DEBUG #define Debug MBD_Debug #else #define Debug(arg...) ((void)0) #endif #ifdef HAVE_SETPROCTITLE #define Setproctitle setproctitle #else #define Setproctitle(arg...) ((void)0) #endif #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) typedef socklen_t my_socklen_t; #else typedef int my_socklen_t; #endif extern char *mbdHost, *mbdPort; extern FILE *mbdLog; void MBD_Debug(const char *, ...); void *MBD_Malloc(size_t); void MBD_Fatal(const char *, ...); void MBD_SetError(const char *, ...); char *MBD_GetError(void); #if 0 void MBD_EnterServerProc(const char *); void MBD_ExitServerProc(int); #endif #ifdef HAVE_FLOCK #define LockFile(fd) flock((fd),LOCK_EX) #define UnlockFile(fd) flock((fd),LOCK_UN) #else #define LockFile(fd) (void)(0) #define UnlockFile(fd) (void)(0) #endif #define Unlink(path) do { \ if (unlink(path) == -1) \ syslog(LOG_ERR, "unlink %s: %s", path, strerror(errno)); \ } while(0) static __inline__ int Write(int fd, const void *data, size_t len) { size_t nwrote; ssize_t rv; for (nwrote = 0; nwrote < len; ) { rv = write(fd, data+nwrote, len-nwrote); if (rv == -1) { if (errno == EINTR) { continue; } else { MBD_SetError("Write error: %s", strerror(errno)); return (-1); } } else if (rv == 0) { MBD_SetError("EOF"); return (-1); } nwrote += rv; } return (0); } static __inline__ int Read(int fd, void *data, size_t len) { size_t nread; ssize_t rv; for (nread = 0; nread< len; ) { rv = read(fd, data+nread, len-nread); if (rv == -1) { if (errno == EINTR) { continue; } else { MBD_SetError("Read error: %s", strerror(errno)); return (-1); } } else if (rv == 0) { MBD_SetError("EOF"); return (-1); } nread += rv; } return (0); }