#include #include #include #include #include #include #include #include #include "pg.h" #include "atomicio.h" int send_cmd(char dest, int type, uint8_t arg, uint8_t *data, int data_len) { struct conn *c; struct route *r; int fd = -1, len; r = route_find(dest); if (r) fd = r->proc.fd[1]; else { c = listener_conn_find_orig(dest); if (c) fd = c->fd; else { log_warn("send_cmd %d: no route to go to dest %c", type, dest); return -1; } } len = msg_send(fd, type, dest, arg, data_len, data); return len; } int intab(int *tab, int val, int len) { int n; for (n=0; n sizeof(buf)) { log_warn("readbuf: len too big %d", len); return -1; } if ((outlen = atomicio(read, fd, buf, len)) < 0) { log_warn("readbuf: atomicio read error"); return -1; } if (outlen != len) log_warn("readbuf: invalid atomicio read size %d, should be %d", outlen, len); *out = buf; return outlen; } int writebuf(uint8_t *buf, int fd, int len) { int writelen; if ((writelen = atomicio(vwrite, fd, buf, len)) < 0) { log_warn("writebuf: atomicio write error"); return -1; } if (writelen < len) log_warn("writebuf: incomplete write, %d on %d", writelen, len); return writelen; } int readwrite(int ifd, int ofd, int len) { char buf[BUFMAX]; int red, wrote; red = atomicio(read, ifd, buf, len); if (red < 0) { log_warn("readwrite: atomicio read error"); return -1; } if (red != len) log_warn("readbuf: invalid atomicio read size %d, should be %d", red, len); if ((wrote = atomicio(vwrite, ofd, buf, red)) < red) { log_warn("readwrite: atomicio write error"); return -1; } return wrote; }