ffi-nats-core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ffi-nats-core.gemspec +8 -0
- data/lib/ffi/nats/core/version.rb +1 -1
- data/vendor/cnats/CMakeLists.txt +137 -0
- data/vendor/cnats/adapters/libevent.h +220 -0
- data/vendor/cnats/adapters/libuv.h +472 -0
- data/vendor/cnats/examples/CMakeLists.txt +56 -0
- data/vendor/cnats/examples/asynctimeout.c +83 -0
- data/vendor/cnats/examples/examples.h +322 -0
- data/vendor/cnats/examples/libevent-pub.c +136 -0
- data/vendor/cnats/examples/libevent-sub.c +104 -0
- data/vendor/cnats/examples/libuv-pub.c +120 -0
- data/vendor/cnats/examples/libuv-sub.c +114 -0
- data/vendor/cnats/examples/publisher.c +62 -0
- data/vendor/cnats/examples/queuegroup.c +132 -0
- data/vendor/cnats/examples/replier.c +149 -0
- data/vendor/cnats/examples/requestor.c +75 -0
- data/vendor/cnats/examples/subscriber.c +133 -0
- data/vendor/cnats/src/CMakeLists.txt +31 -0
- data/vendor/cnats/src/asynccb.c +66 -0
- data/vendor/cnats/src/asynccb.h +42 -0
- data/vendor/cnats/src/buf.c +246 -0
- data/vendor/cnats/src/buf.h +116 -0
- data/vendor/cnats/src/comsock.c +474 -0
- data/vendor/cnats/src/comsock.h +81 -0
- data/vendor/cnats/src/conn.c +2725 -0
- data/vendor/cnats/src/conn.h +75 -0
- data/vendor/cnats/src/err.h +31 -0
- data/vendor/cnats/src/gc.h +27 -0
- data/vendor/cnats/src/hash.c +725 -0
- data/vendor/cnats/src/hash.h +141 -0
- data/vendor/cnats/src/include/n-unix.h +56 -0
- data/vendor/cnats/src/include/n-win.h +59 -0
- data/vendor/cnats/src/mem.h +20 -0
- data/vendor/cnats/src/msg.c +155 -0
- data/vendor/cnats/src/msg.h +43 -0
- data/vendor/cnats/src/nats.c +1734 -0
- data/vendor/cnats/src/nats.h +2024 -0
- data/vendor/cnats/src/natsp.h +518 -0
- data/vendor/cnats/src/natstime.c +79 -0
- data/vendor/cnats/src/natstime.h +27 -0
- data/vendor/cnats/src/nuid.c +265 -0
- data/vendor/cnats/src/nuid.h +21 -0
- data/vendor/cnats/src/opts.c +1030 -0
- data/vendor/cnats/src/opts.h +19 -0
- data/vendor/cnats/src/parser.c +869 -0
- data/vendor/cnats/src/parser.h +87 -0
- data/vendor/cnats/src/pub.c +293 -0
- data/vendor/cnats/src/srvpool.c +380 -0
- data/vendor/cnats/src/srvpool.h +71 -0
- data/vendor/cnats/src/stats.c +54 -0
- data/vendor/cnats/src/stats.h +21 -0
- data/vendor/cnats/src/status.c +60 -0
- data/vendor/cnats/src/status.h +95 -0
- data/vendor/cnats/src/sub.c +956 -0
- data/vendor/cnats/src/sub.h +34 -0
- data/vendor/cnats/src/timer.c +86 -0
- data/vendor/cnats/src/timer.h +57 -0
- data/vendor/cnats/src/unix/cond.c +103 -0
- data/vendor/cnats/src/unix/mutex.c +107 -0
- data/vendor/cnats/src/unix/sock.c +105 -0
- data/vendor/cnats/src/unix/thread.c +162 -0
- data/vendor/cnats/src/url.c +134 -0
- data/vendor/cnats/src/url.h +24 -0
- data/vendor/cnats/src/util.c +823 -0
- data/vendor/cnats/src/util.h +75 -0
- data/vendor/cnats/src/version.h +29 -0
- data/vendor/cnats/src/version.h.in +29 -0
- data/vendor/cnats/src/win/cond.c +86 -0
- data/vendor/cnats/src/win/mutex.c +54 -0
- data/vendor/cnats/src/win/sock.c +158 -0
- data/vendor/cnats/src/win/strings.c +108 -0
- data/vendor/cnats/src/win/thread.c +180 -0
- data/vendor/cnats/test/CMakeLists.txt +35 -0
- data/vendor/cnats/test/certs/ca.pem +38 -0
- data/vendor/cnats/test/certs/client-cert.pem +30 -0
- data/vendor/cnats/test/certs/client-key.pem +51 -0
- data/vendor/cnats/test/certs/server-cert.pem +31 -0
- data/vendor/cnats/test/certs/server-key.pem +51 -0
- data/vendor/cnats/test/dylib/CMakeLists.txt +10 -0
- data/vendor/cnats/test/dylib/nonats.c +13 -0
- data/vendor/cnats/test/list.txt +125 -0
- data/vendor/cnats/test/test.c +11655 -0
- data/vendor/cnats/test/tls.conf +15 -0
- data/vendor/cnats/test/tlsverify.conf +19 -0
- metadata +83 -1
@@ -0,0 +1,34 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef SUB_H_
|
4
|
+
#define SUB_H_
|
5
|
+
|
6
|
+
#include "natsp.h"
|
7
|
+
|
8
|
+
#ifdef DEV_MODE
|
9
|
+
// For type safety...
|
10
|
+
|
11
|
+
void natsSub_Lock(natsSubscription *sub);
|
12
|
+
void natsSub_Unlock(natsSubscription *sub);
|
13
|
+
|
14
|
+
#else
|
15
|
+
|
16
|
+
#define natsSub_Lock(s) natsMutex_Lock((s)->mu)
|
17
|
+
#define natsSub_Unlock(s) natsMutex_Unlock((s)->mu)
|
18
|
+
|
19
|
+
#endif // DEV_MODE
|
20
|
+
|
21
|
+
void
|
22
|
+
natsSub_retain(natsSubscription *sub);
|
23
|
+
|
24
|
+
void
|
25
|
+
natsSub_release(natsSubscription *sub);
|
26
|
+
|
27
|
+
natsStatus
|
28
|
+
natsSub_create(natsSubscription **newSub, natsConnection *nc, const char *subj,
|
29
|
+
const char *queueGroup, int64_t timeout, natsMsgHandler cb, void *cbClosure);
|
30
|
+
|
31
|
+
void
|
32
|
+
natsSub_close(natsSubscription *sub, bool connectionClosed);
|
33
|
+
|
34
|
+
#endif /* SUB_H_ */
|
@@ -0,0 +1,86 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "natsp.h"
|
4
|
+
#include "mem.h"
|
5
|
+
#include "util.h"
|
6
|
+
|
7
|
+
static void
|
8
|
+
_freeTimer(natsTimer *t)
|
9
|
+
{
|
10
|
+
if (t == NULL)
|
11
|
+
return;
|
12
|
+
|
13
|
+
natsMutex_Destroy(t->mu);
|
14
|
+
NATS_FREE(t);
|
15
|
+
}
|
16
|
+
|
17
|
+
void
|
18
|
+
natsTimer_Release(natsTimer *t)
|
19
|
+
{
|
20
|
+
int refs = 0;
|
21
|
+
|
22
|
+
natsMutex_Lock(t->mu);
|
23
|
+
|
24
|
+
refs = --(t->refs);
|
25
|
+
|
26
|
+
natsMutex_Unlock(t->mu);
|
27
|
+
|
28
|
+
if (refs == 0)
|
29
|
+
_freeTimer(t);
|
30
|
+
}
|
31
|
+
|
32
|
+
natsStatus
|
33
|
+
natsTimer_Create(natsTimer **timer, natsTimerCb timerCb, natsTimerStopCb stopCb,
|
34
|
+
int64_t interval, void* closure)
|
35
|
+
{
|
36
|
+
natsStatus s = NATS_OK;
|
37
|
+
natsTimer *t = (natsTimer*) NATS_CALLOC(1, sizeof(natsTimer));
|
38
|
+
|
39
|
+
if (t == NULL)
|
40
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
41
|
+
|
42
|
+
t->refs = 1;
|
43
|
+
t->cb = timerCb;
|
44
|
+
t->stopCb = stopCb;
|
45
|
+
t->closure = closure;
|
46
|
+
|
47
|
+
s = natsMutex_Create(&(t->mu));
|
48
|
+
if (s == NATS_OK)
|
49
|
+
{
|
50
|
+
// Doing so, so that nats_resetTimer() does not try to remove the timer
|
51
|
+
// from the list (since it is new it would not be there!).
|
52
|
+
t->stopped = true;
|
53
|
+
|
54
|
+
nats_resetTimer(t, interval);
|
55
|
+
|
56
|
+
*timer = t;
|
57
|
+
}
|
58
|
+
else
|
59
|
+
_freeTimer(t);
|
60
|
+
|
61
|
+
return NATS_UPDATE_ERR_STACK(s);
|
62
|
+
}
|
63
|
+
|
64
|
+
void
|
65
|
+
natsTimer_Stop(natsTimer *timer)
|
66
|
+
{
|
67
|
+
// Proxy for this call:
|
68
|
+
nats_stopTimer(timer);
|
69
|
+
}
|
70
|
+
|
71
|
+
void
|
72
|
+
natsTimer_Reset(natsTimer *timer, int64_t interval)
|
73
|
+
{
|
74
|
+
// Proxy for this call:
|
75
|
+
nats_resetTimer(timer, interval);
|
76
|
+
}
|
77
|
+
|
78
|
+
void
|
79
|
+
natsTimer_Destroy(natsTimer *timer)
|
80
|
+
{
|
81
|
+
if (timer == NULL)
|
82
|
+
return;
|
83
|
+
|
84
|
+
nats_stopTimer(timer);
|
85
|
+
natsTimer_Release(timer);
|
86
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef TIMER_H_
|
4
|
+
#define TIMER_H_
|
5
|
+
|
6
|
+
#include <stdint.h>
|
7
|
+
|
8
|
+
//#include "natsp.h"
|
9
|
+
#include "status.h"
|
10
|
+
|
11
|
+
struct __natsTimer;
|
12
|
+
|
13
|
+
// Callback signature for timer
|
14
|
+
typedef void (*natsTimerCb)(struct __natsTimer *timer, void* closure);
|
15
|
+
|
16
|
+
// Callback invoked when the timer has been stopped and guaranteed
|
17
|
+
// not to be in the timer callback.
|
18
|
+
typedef void (*natsTimerStopCb)(struct __natsTimer *timer, void* closure);
|
19
|
+
|
20
|
+
typedef struct __natsTimer
|
21
|
+
{
|
22
|
+
struct __natsTimer *prev;
|
23
|
+
struct __natsTimer *next;
|
24
|
+
|
25
|
+
natsMutex *mu;
|
26
|
+
int refs;
|
27
|
+
|
28
|
+
natsTimerCb cb;
|
29
|
+
natsTimerStopCb stopCb;
|
30
|
+
void* closure;
|
31
|
+
|
32
|
+
int64_t interval;
|
33
|
+
int64_t absoluteTime;
|
34
|
+
|
35
|
+
bool stopped;
|
36
|
+
bool inCallback;
|
37
|
+
|
38
|
+
} natsTimer;
|
39
|
+
|
40
|
+
natsStatus
|
41
|
+
natsTimer_Create(natsTimer **timer, natsTimerCb timerCb, natsTimerStopCb stopCb,
|
42
|
+
int64_t interval, void* closure);
|
43
|
+
|
44
|
+
void
|
45
|
+
natsTimer_Stop(natsTimer *timer);
|
46
|
+
|
47
|
+
void
|
48
|
+
natsTimer_Reset(natsTimer *timer, int64_t interval);
|
49
|
+
|
50
|
+
void
|
51
|
+
natsTimer_Release(natsTimer *t);
|
52
|
+
|
53
|
+
void
|
54
|
+
natsTimer_Destroy(natsTimer *timer);
|
55
|
+
|
56
|
+
|
57
|
+
#endif /* TIMER_H_ */
|
@@ -0,0 +1,103 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "../natsp.h"
|
4
|
+
|
5
|
+
#include <errno.h>
|
6
|
+
|
7
|
+
#include "../util.h"
|
8
|
+
#include "../mem.h"
|
9
|
+
|
10
|
+
natsStatus
|
11
|
+
natsCondition_Create(natsCondition **cond)
|
12
|
+
{
|
13
|
+
natsCondition *c = (natsCondition*) NATS_CALLOC(1, sizeof(natsCondition));
|
14
|
+
natsStatus s = NATS_OK;
|
15
|
+
|
16
|
+
if (c == NULL)
|
17
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
18
|
+
|
19
|
+
if (pthread_cond_init(c, NULL) != 0)
|
20
|
+
s = nats_setError(NATS_SYS_ERROR, "pthread_cond_init error: %d", errno);
|
21
|
+
|
22
|
+
if (s == NATS_OK)
|
23
|
+
*cond = c;
|
24
|
+
else
|
25
|
+
NATS_FREE(c);
|
26
|
+
|
27
|
+
return s;
|
28
|
+
}
|
29
|
+
|
30
|
+
void
|
31
|
+
natsCondition_Wait(natsCondition *cond, natsMutex *mutex)
|
32
|
+
{
|
33
|
+
if (pthread_cond_wait(cond, mutex) != 0)
|
34
|
+
abort();
|
35
|
+
}
|
36
|
+
|
37
|
+
static natsStatus
|
38
|
+
_timedWait(natsCondition *cond, natsMutex *mutex, bool isAbsolute, int64_t timeout)
|
39
|
+
{
|
40
|
+
int r;
|
41
|
+
struct timespec ts;
|
42
|
+
int64_t target;
|
43
|
+
|
44
|
+
if (timeout <= 0)
|
45
|
+
return NATS_TIMEOUT;
|
46
|
+
|
47
|
+
target = (isAbsolute ? timeout : (nats_Now() + timeout));
|
48
|
+
|
49
|
+
ts.tv_sec = target / 1000;
|
50
|
+
ts.tv_nsec = (target % 1000) * 1000000;
|
51
|
+
|
52
|
+
if (ts.tv_nsec >= 1000000000L)
|
53
|
+
{
|
54
|
+
ts.tv_sec++;
|
55
|
+
ts.tv_nsec -= 1000000000L;
|
56
|
+
}
|
57
|
+
|
58
|
+
r = pthread_cond_timedwait(cond, mutex, &ts);
|
59
|
+
|
60
|
+
if (r == 0)
|
61
|
+
return NATS_OK;
|
62
|
+
|
63
|
+
if (r == ETIMEDOUT)
|
64
|
+
return NATS_TIMEOUT;
|
65
|
+
|
66
|
+
return nats_setError(NATS_SYS_ERROR, "pthread_cond_timedwait error: %d", errno);
|
67
|
+
}
|
68
|
+
|
69
|
+
natsStatus
|
70
|
+
natsCondition_TimedWait(natsCondition *cond, natsMutex *mutex, int64_t timeout)
|
71
|
+
{
|
72
|
+
return _timedWait(cond, mutex, false, timeout);
|
73
|
+
}
|
74
|
+
|
75
|
+
natsStatus
|
76
|
+
natsCondition_AbsoluteTimedWait(natsCondition *cond, natsMutex *mutex, int64_t absoluteTime)
|
77
|
+
{
|
78
|
+
return _timedWait(cond, mutex, true, absoluteTime);
|
79
|
+
}
|
80
|
+
|
81
|
+
void
|
82
|
+
natsCondition_Signal(natsCondition *cond)
|
83
|
+
{
|
84
|
+
if (pthread_cond_signal(cond) != 0)
|
85
|
+
abort();
|
86
|
+
}
|
87
|
+
|
88
|
+
void
|
89
|
+
natsCondition_Broadcast(natsCondition *cond)
|
90
|
+
{
|
91
|
+
if (pthread_cond_broadcast(cond) != 0)
|
92
|
+
abort();
|
93
|
+
}
|
94
|
+
|
95
|
+
void
|
96
|
+
natsCondition_Destroy(natsCondition *cond)
|
97
|
+
{
|
98
|
+
if (cond == NULL)
|
99
|
+
return;
|
100
|
+
|
101
|
+
pthread_cond_destroy(cond);
|
102
|
+
NATS_FREE(cond);
|
103
|
+
}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "../natsp.h"
|
4
|
+
#include "../mem.h"
|
5
|
+
|
6
|
+
natsStatus
|
7
|
+
natsMutex_Create(natsMutex **newMutex)
|
8
|
+
{
|
9
|
+
natsStatus s = NATS_OK;
|
10
|
+
pthread_mutexattr_t attr;
|
11
|
+
natsMutex *m = NATS_CALLOC(1, sizeof(natsMutex));
|
12
|
+
bool noAttrDestroy = false;
|
13
|
+
|
14
|
+
if (m == NULL)
|
15
|
+
s = nats_setDefaultError(NATS_NO_MEMORY);
|
16
|
+
|
17
|
+
if ((s == NATS_OK)
|
18
|
+
&& (pthread_mutexattr_init(&attr) != 0)
|
19
|
+
&& (noAttrDestroy = true))
|
20
|
+
{
|
21
|
+
s = nats_setError(NATS_SYS_ERROR, "pthread_mutexattr_init error: %d",
|
22
|
+
errno);
|
23
|
+
}
|
24
|
+
|
25
|
+
if ((s == NATS_OK)
|
26
|
+
&& (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0))
|
27
|
+
{
|
28
|
+
s = nats_setError(NATS_SYS_ERROR, "pthread_mutexattr_settype error: %d",
|
29
|
+
errno);
|
30
|
+
}
|
31
|
+
|
32
|
+
if ((s == NATS_OK)
|
33
|
+
&& (pthread_mutex_init(m, &attr) != 0))
|
34
|
+
{
|
35
|
+
s = nats_setError(NATS_SYS_ERROR, "pthread_mutex_init error: %d",
|
36
|
+
errno);
|
37
|
+
}
|
38
|
+
|
39
|
+
if (!noAttrDestroy)
|
40
|
+
pthread_mutexattr_destroy(&attr);
|
41
|
+
|
42
|
+
if (s == NATS_OK)
|
43
|
+
*newMutex = m;
|
44
|
+
else
|
45
|
+
NATS_FREE(m);
|
46
|
+
|
47
|
+
return s;
|
48
|
+
}
|
49
|
+
|
50
|
+
bool
|
51
|
+
natsMutex_TryLock(natsMutex *m)
|
52
|
+
{
|
53
|
+
if (pthread_mutex_trylock(m) == 0)
|
54
|
+
return true;
|
55
|
+
|
56
|
+
return false;
|
57
|
+
}
|
58
|
+
|
59
|
+
void
|
60
|
+
natsMutex_Lock(natsMutex *m)
|
61
|
+
{
|
62
|
+
// The "rep" instruction used for spinning is not supported on ARM.
|
63
|
+
#ifndef __arm__
|
64
|
+
if (gLockSpinCount > 0)
|
65
|
+
{
|
66
|
+
int64_t attempts = 0;
|
67
|
+
|
68
|
+
while (pthread_mutex_trylock(m) != 0)
|
69
|
+
{
|
70
|
+
if (++attempts <= gLockSpinCount)
|
71
|
+
{
|
72
|
+
__asm__ __volatile__ ("rep; nop");
|
73
|
+
}
|
74
|
+
else
|
75
|
+
{
|
76
|
+
if (pthread_mutex_lock(m))
|
77
|
+
abort();
|
78
|
+
|
79
|
+
break;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
else
|
84
|
+
#endif
|
85
|
+
{
|
86
|
+
if (pthread_mutex_lock(m))
|
87
|
+
abort();
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
void
|
93
|
+
natsMutex_Unlock(natsMutex *m)
|
94
|
+
{
|
95
|
+
if (pthread_mutex_unlock(m))
|
96
|
+
abort();
|
97
|
+
}
|
98
|
+
|
99
|
+
void
|
100
|
+
natsMutex_Destroy(natsMutex *m)
|
101
|
+
{
|
102
|
+
if (m == NULL)
|
103
|
+
return;
|
104
|
+
|
105
|
+
pthread_mutex_destroy(m);
|
106
|
+
NATS_FREE(m);
|
107
|
+
}
|
@@ -0,0 +1,105 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "../natsp.h"
|
4
|
+
#include "../mem.h"
|
5
|
+
#include "../comsock.h"
|
6
|
+
|
7
|
+
void
|
8
|
+
natsSys_Init(void)
|
9
|
+
{
|
10
|
+
// Would do anything that needs to be initialized when
|
11
|
+
// the libary loads, specific to unix.
|
12
|
+
}
|
13
|
+
|
14
|
+
natsStatus
|
15
|
+
natsSock_Init(natsSockCtx *ctx)
|
16
|
+
{
|
17
|
+
memset(ctx, 0, sizeof(natsSockCtx));
|
18
|
+
|
19
|
+
ctx->fd = NATS_SOCK_INVALID;
|
20
|
+
|
21
|
+
|
22
|
+
return natsSock_CreateFDSet(&ctx->fdSet);
|
23
|
+
}
|
24
|
+
|
25
|
+
void
|
26
|
+
natsSock_Clear(natsSockCtx *ctx)
|
27
|
+
{
|
28
|
+
natsSock_DestroyFDSet(ctx->fdSet);
|
29
|
+
}
|
30
|
+
|
31
|
+
natsStatus
|
32
|
+
natsSock_WaitReady(int waitMode, natsSockCtx *ctx)
|
33
|
+
{
|
34
|
+
struct timeval *timeout = NULL;
|
35
|
+
int res;
|
36
|
+
fd_set *fdSet = ctx->fdSet;
|
37
|
+
natsSock sock = ctx->fd;
|
38
|
+
natsDeadline *deadline = &(ctx->deadline);
|
39
|
+
|
40
|
+
FD_ZERO(fdSet);
|
41
|
+
FD_SET(sock, fdSet);
|
42
|
+
|
43
|
+
if (deadline != NULL)
|
44
|
+
timeout = natsDeadline_GetTimeout(deadline);
|
45
|
+
|
46
|
+
switch (waitMode)
|
47
|
+
{
|
48
|
+
case WAIT_FOR_READ: res = select((int) (sock + 1), fdSet, NULL, NULL, timeout); break;
|
49
|
+
case WAIT_FOR_WRITE: res = select((int) (sock + 1), NULL, fdSet, NULL, timeout); break;
|
50
|
+
case WAIT_FOR_CONNECT: res = select((int) (sock + 1), NULL, fdSet, NULL, timeout); break;
|
51
|
+
default: abort();
|
52
|
+
}
|
53
|
+
|
54
|
+
if (res == NATS_SOCK_ERROR)
|
55
|
+
return nats_setError(NATS_IO_ERROR, "select error: %d", res);
|
56
|
+
|
57
|
+
if ((res == 0) || !FD_ISSET(sock, fdSet))
|
58
|
+
return nats_setDefaultError(NATS_TIMEOUT);
|
59
|
+
|
60
|
+
return NATS_OK;
|
61
|
+
}
|
62
|
+
|
63
|
+
natsStatus
|
64
|
+
natsSock_SetBlocking(natsSock fd, bool blocking)
|
65
|
+
{
|
66
|
+
int flags;
|
67
|
+
|
68
|
+
if ((flags = fcntl(fd, F_GETFL)) == -1)
|
69
|
+
return nats_setError(NATS_SYS_ERROR, "fcntl error: %d", errno);
|
70
|
+
|
71
|
+
if (blocking)
|
72
|
+
flags &= ~O_NONBLOCK;
|
73
|
+
else
|
74
|
+
flags |= O_NONBLOCK;
|
75
|
+
|
76
|
+
if (fcntl(fd, F_SETFL, flags) == -1)
|
77
|
+
return nats_setError(NATS_SYS_ERROR, "fcntl error: %d", errno);
|
78
|
+
|
79
|
+
return NATS_OK;
|
80
|
+
}
|
81
|
+
|
82
|
+
bool
|
83
|
+
natsSock_IsConnected(natsSock fd)
|
84
|
+
{
|
85
|
+
int res;
|
86
|
+
int error = 0;
|
87
|
+
socklen_t errorLen = (socklen_t) sizeof(int);
|
88
|
+
|
89
|
+
res = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &errorLen);
|
90
|
+
if ((res == NATS_SOCK_ERROR) || (error != 0))
|
91
|
+
return false;
|
92
|
+
|
93
|
+
return true;
|
94
|
+
}
|
95
|
+
|
96
|
+
natsStatus
|
97
|
+
natsSock_Flush(natsSock fd)
|
98
|
+
{
|
99
|
+
if (fsync(fd) != 0)
|
100
|
+
return nats_setError(NATS_IO_ERROR,
|
101
|
+
"Error flushing socket. Error: %d",
|
102
|
+
NATS_SOCK_GET_ERROR);
|
103
|
+
|
104
|
+
return NATS_OK;
|
105
|
+
}
|