コード例 #1
0
ファイル: monitor.c プロジェクト: abstrakraft/lxc-android-lxc
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;
}
コード例 #2
0
ファイル: lxc_monitord.c プロジェクト: ArikaChen/lxc
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;
}
コード例 #3
0
ファイル: lxc_monitord.c プロジェクト: ArikaChen/lxc
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;
}
コード例 #4
0
ファイル: monitor.c プロジェクト: SethRobertson/lxc
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;
}