예제 #1
0
파일: vr_master.c 프로젝트: vipshop/vire
void
master_deinit(void)
{
    vr_listen **vlisten;
    
    vr_eventloop_deinit(&master.vel);

    while (darray_n(&master.listens) > 0) {
        vlisten = darray_pop(&master.listens);
        vr_listen_destroy(*vlisten);
    }
    darray_deinit(&master.listens);
    
}
예제 #2
0
파일: vr_listen.c 프로젝트: qianyunlai/vire
vr_listen *
vr_listen_create(sds listen_str)
{
    rstatus_t status;
    vr_listen *vlisten;
    uint8_t *p, *name;
    uint32_t namelen;

    if (listen_str == NULL) {
        return NULL;
    }

    vlisten = vr_alloc(sizeof(struct vr_listen));
    if (vlisten == NULL) {
        return NULL;
    }

    vlisten->name = NULL;
    vlisten->port = 0;
    memset(&vlisten->info, 0, sizeof(vlisten->info));
    vlisten->sd = -1;
    
    if (listen_str == '/') {
        uint8_t *q, *start, *perm;
        uint32_t permlen;

        /* parse "socket_path permissions" from the end */
        p = listen_str + sdslen(listen_str) - 1;
        start = listen_str;
        q = vr_strrchr(p, start, ' ');
        if (q == NULL) {
            /* no permissions field, so use defaults */
            name = listen_str;
            namelen = sdslen(listen_str);
        } else {
            perm = q + 1;
            permlen = (uint32_t)(p - perm + 1);

            p = q - 1;
            name = start;
            namelen = (uint32_t)(p - start + 1);

            errno = 0;
            vlisten->perm = (mode_t)strtol((char *)perm, NULL, 8);
            if (errno || vlisten->perm > 0777) {
                log_error("config file has an invalid file permission in \"socket_path permission\" format string");
                vr_listen_destroy(vlisten);
                return NULL;
            }
        }
    } else {
        uint8_t *q, *start, *port;
        uint32_t portlen;

        /* parse "hostname:port" from the end */
        p = listen_str + sdslen(listen_str) - 1;
        start = listen_str;
        q = vr_strrchr(p, start, ':');
        if (q == NULL) {
            log_error("config file has an invalid \"hostname:port\" format string");
            vr_listen_destroy(vlisten);
            return NULL;
        }

        port = q + 1;
        portlen = (uint32_t)(p - port + 1);

        p = q - 1;

        name = start;
        namelen = (uint32_t)(p - start + 1);

        vlisten->port = vr_atoi(port, portlen);
        if (vlisten->port < 0 || !vr_valid_port(vlisten->port)) {
            log_error("config file has an invalid port in \"hostname:port\" format string");
            vr_listen_destroy(vlisten);
            return NULL;
        }
    }

    vlisten->name = sdsnewlen(name, namelen);
    if (vlisten->name == NULL) {
        log_error("create a sds string failed: out of memory.");
        vr_listen_destroy(vlisten);
        return NULL;
    }

    status = vr_resolve(vlisten->name, vlisten->port, &vlisten->info);
    if (status != VR_OK) {
        vr_listen_destroy(vlisten);
        return NULL;
    }

    return vlisten;
}