/* Proxies */ static void priv_ping() { int rc; enum priv_cmd cmd = PRIV_PING; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); log_debug("privsep", "monitor ready"); }
/* Proxy for ctl_cleanup */ void priv_ctl_cleanup(const char *ctlname) { int rc, len = strlen(ctlname); enum priv_cmd cmd = PRIV_DELETE_CTL_SOCKET; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, &len, sizeof(int)); must_write(PRIV_UNPRIVILEGED, ctlname, len); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); }
/* Proxy to set interface in promiscuous mode */ int priv_iface_promisc(const char *ifname) { int rc; enum priv_cmd cmd = PRIV_IFACE_PROMISC; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, ifname, IFNAMSIZ); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); return rc; }
int priv_snmp_socket(struct sockaddr_un *addr) { int rc; enum priv_cmd cmd = PRIV_SNMP_SOCKET; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, addr, sizeof(struct sockaddr_un)); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if (rc < 0) return rc; return receive_fd(PRIV_UNPRIVILEGED); }
int priv_iface_description(const char *name, const char *description) { int rc, len = strlen(description); enum priv_cmd cmd = PRIV_IFACE_DESCRIPTION; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, name, IFNAMSIZ); must_write(PRIV_UNPRIVILEGED, &len, sizeof(int)); must_write(PRIV_UNPRIVILEGED, description, len); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); return rc; }
int priv_iface_multicast(const char *name, u_int8_t *mac, int add) { int rc; enum priv_cmd cmd = PRIV_IFACE_MULTICAST; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, name, IFNAMSIZ); must_write(PRIV_UNPRIVILEGED, mac, ETHER_ADDR_LEN); must_write(PRIV_UNPRIVILEGED, &add, sizeof(int)); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); return rc; }
/* Proxy for gethostbyname */ char * priv_gethostbyname() { static char *buf = NULL; int rc; enum priv_cmd cmd = PRIV_GET_HOSTNAME; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if ((buf = (char*)realloc(buf, rc+1)) == NULL) fatal("privsep", NULL); must_read(PRIV_UNPRIVILEGED, buf, rc+1); return buf; }
/* Proxy for open */ int priv_open(char *file) { int len, rc; enum priv_cmd cmd = PRIV_OPEN; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); len = strlen(file); must_write(PRIV_UNPRIVILEGED, &len, sizeof(int)); must_write(PRIV_UNPRIVILEGED, file, len); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if (rc == -1) return rc; return receive_fd(PRIV_UNPRIVILEGED); }
int priv_iface_init(int index, char *iface) { int rc; char dev[IFNAMSIZ] = {}; enum priv_cmd cmd = PRIV_IFACE_INIT; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); must_write(PRIV_UNPRIVILEGED, &index, sizeof(int)); strlcpy(dev, iface, IFNAMSIZ); must_write(PRIV_UNPRIVILEGED, dev, IFNAMSIZ); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if (rc != 0) return -1; return receive_fd(PRIV_UNPRIVILEGED); }
/* Proxy to get permanent MAC address */ int priv_iface_mac(char *ifname, void *mac, size_t length) { int rc, len; enum priv_cmd cmd = PRIV_IFACE_MAC; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); len = strlen(ifname); must_write(PRIV_UNPRIVILEGED, &len, sizeof(int)); must_write(PRIV_UNPRIVILEGED, ifname, len); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if (rc != 0) return rc; must_read(PRIV_UNPRIVILEGED, mac, length); return rc; }
/* Proxy for ethtool ioctl (GSET only) */ int priv_ethtool(char *ifname, void *ethc, size_t length) { int rc, len; enum priv_cmd cmd = PRIV_ETHTOOL; must_write(PRIV_UNPRIVILEGED, &cmd, sizeof(enum priv_cmd)); len = strlen(ifname); must_write(PRIV_UNPRIVILEGED, &len, sizeof(int)); must_write(PRIV_UNPRIVILEGED, ifname, len); priv_wait(); must_read(PRIV_UNPRIVILEGED, &rc, sizeof(int)); if (rc != 0) return rc; must_read(PRIV_UNPRIVILEGED, ethc, length); return rc; }