int lxc_monitor_open(const char *lxcpath) { struct sockaddr_un addr; int fd,ret; int retry,backoff_ms[] = {10, 50, 100}; if (lxc_monitor_sock_name(lxcpath, &addr) < 0) return -1; fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd < 0) { ERROR("socket : %s", strerror(errno)); return -1; } for (retry = 0; retry < sizeof(backoff_ms)/sizeof(backoff_ms[0]); retry++) { ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); if (ret == 0 || errno != ECONNREFUSED) break; ERROR("connect : backing off %d", backoff_ms[retry]); usleep(backoff_ms[retry] * 1000); } if (ret < 0) { ERROR("connect : %s", strerror(errno)); goto err1; } return fd; err1: close(fd); return ret; }
static int lxc_monitord_sock_delete(struct lxc_monitor *mon) { struct sockaddr_un addr; if (lxc_monitor_sock_name(mon->lxcpath, &addr) < 0) return -1; if (addr.sun_path[0]) unlink(addr.sun_path); return 0; }
static int lxc_monitord_sock_create(struct lxc_monitor *mon) { struct sockaddr_un addr; int fd; if (lxc_monitor_sock_name(mon->lxcpath, &addr) < 0) return -1; fd = lxc_af_unix_open(addr.sun_path, SOCK_STREAM, O_TRUNC); if (fd < 0) { ERROR("failed to open unix socket : %s", strerror(errno)); return -1; } mon->listenfd = fd; return 0; }
int lxc_monitor_open(const char *lxcpath) { struct sockaddr_un addr; int fd,ret; int retry,backoff_ms[] = {10, 50, 100}; size_t len; if (lxc_monitor_sock_name(lxcpath, &addr) < 0) return -1; process_lock(); fd = socket(PF_UNIX, SOCK_STREAM, 0); process_unlock(); if (fd < 0) { ERROR("socket : %s", strerror(errno)); return -1; } len = strlen(&addr.sun_path[1]) + 1; if (len >= sizeof(addr.sun_path) - 1) { ret = -1; errno = ENAMETOOLONG; goto err1; } for (retry = 0; retry < sizeof(backoff_ms)/sizeof(backoff_ms[0]); retry++) { ret = connect(fd, (struct sockaddr *)&addr, offsetof(struct sockaddr_un, sun_path) + len); if (ret == 0 || errno != ECONNREFUSED) break; ERROR("connect : backing off %d", backoff_ms[retry]); usleep(backoff_ms[retry] * 1000); } if (ret < 0) { ERROR("connect : %s", strerror(errno)); goto err1; } return fd; err1: process_lock(); close(fd); process_unlock(); return ret; }