summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/libyrmcds/socket.c
blob: 6d30ee16c9c9ca8b5247667ed2adf7b9a2445d9e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// (C) 2013 Cybozu et al.

#include "yrmcds.h"

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>

yrmcds_error yrmcds_shutdown(yrmcds* c) {
    if( c == NULL )
        return YRMCDS_BAD_ARGUMENT;
    if( shutdown(c->sock, SHUT_RD) == -1 ) {
        return YRMCDS_SYSTEM_ERROR;
    }
    return YRMCDS_OK;
}

int yrmcds_fileno(yrmcds* c) {
    return c->sock;
}

yrmcds_error yrmcds_set_timeout(yrmcds* c, int timeout) {
    if( c == NULL || timeout < 0 )
        return YRMCDS_BAD_ARGUMENT;

    struct timeval tv;
    tv.tv_sec = timeout;
    tv.tv_usec = 0;

    if( setsockopt(c->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1 )
        return YRMCDS_SYSTEM_ERROR;
    if( setsockopt(c->sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) == -1 )
        return YRMCDS_SYSTEM_ERROR;
    return YRMCDS_OK;
}