4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
18 #include <netinet/in.h>
22 #include "lpp_cmd.def"
27 #define BASIC_ERR_CHECK(expr,cond,fmt,last) \
29 fprintf(stderr, "%s(%d): %s %s: ", __FILE__, __LINE__, #expr, #cond); \
31 fprintf(stderr, "\n"); \
35 #define BASIC_ERRNO_CHECK(expr,cond,last) \
37 fprintf(stderr, "%s(%d): %s %s: %s\n", \
38 __FILE__, __LINE__, #expr, #cond, strerror(errno)); \
42 #define ERR_CHECK_RETURN(expr, cond, fmt, retval) \
43 BASIC_ERR_CHECK(expr, cond, fmt, return retval)
45 #define ERRNO_CHECK_RETURN(expr, cond, retval) \
46 BASIC_ERRNO_CHECK(expr, cond, return retval)
48 #define ERR_CHECK_RETURN_VOID(expr, cond, fmt) \
49 BASIC_ERR_CHECK(expr, cond, fmt, return)
51 #define ERRNO_CHECK_RETURN_VOID(expr, cond) \
52 BASIC_ERRNO_CHECK(expr, cond, return)
54 #define ERR_CHECK(expr, cond, fmt) \
55 BASIC_ERR_CHECK(expr, cond, fmt, (void) 0)
57 #define ERRNO_CHECK(expr, cond) \
58 BASIC_ERRNO_CHECK(expr, cond, (void) 0)
60 static void print_err(const char *fmt, ...)
65 vfprintf(stderr, fmt, args);
69 static void writel(int fd, uint32_t x)
72 ERRNO_CHECK(write(fd, &x, sizeof(x)), == -1);
75 static void writed(int fd, double dbl)
77 ERRNO_CHECK(write(fd, &dbl, sizeof(dbl)), == -1);
80 static void writes(int fd, const char *str)
82 size_t n = strlen(str);
84 ERRNO_CHECK(write(fd, str, n), == -1);
87 static uint32_t readl(int fd)
91 ERRNO_CHECK(read(fd, &res, sizeof(res)), == -1);
95 static double readd(int fd)
98 ERRNO_CHECK(read(fd, &res, sizeof(res)), == -1);
102 static char *reads(int fd)
104 size_t len = readl(fd);
105 char *res = malloc(sizeof(char) * (len + 1));
107 ERRNO_CHECK(read(fd, res, len), == -1);
112 static char *readbuf(int fd, size_t buflen, char *buf)
116 size_t n = buflen - 1;
117 size_t len = readl(fd);
118 size_t max_read = n < len ? n : len;
119 size_t rest = len - max_read;
121 if(buflen > 0 && buf != NULL) {
122 ERRNO_CHECK(read(fd, buf, max_read), == -1);
123 buf[max_read] = '\0';
126 /* eat up data that didnt fit into the string */
127 for(i = 0, n = rest / sizeof(dummy); i < n; ++i)
128 read(fd, dummy, sizeof(dummy));
130 if(rest % sizeof(dummy) > 0)
131 read(fd, dummy, rest % sizeof(dummy));
136 static int ack(int fd, size_t buflen, char *buf)
146 readbuf(fd, buflen, buf);
154 static void send_res(int fd, int ok, const char *fmt, ...)
161 vsnprintf(buf, sizeof(buf), fmt, args);
164 writel(fd, LPP_CMD_BAD);
169 writel(fd, LPP_CMD_OK);
172 static void send_ack(int fd)