forked from I2P_Developers/i2p.i2p
Add session to callbacks too
This commit is contained in:
@@ -109,7 +109,7 @@ extern void sam_naming_lookup(sam_sess_t *session, const char *name);
|
|||||||
extern bool sam_read_buffer(sam_sess_t *session);
|
extern bool sam_read_buffer(sam_sess_t *session);
|
||||||
extern const char *sam_strerror(samerr_t code);
|
extern const char *sam_strerror(samerr_t code);
|
||||||
/* SAM controls - callbacks */
|
/* SAM controls - callbacks */
|
||||||
extern void (*sam_diedback)();
|
extern void (*sam_diedback)(sam_sess_t *session);
|
||||||
extern void (*sam_logback)(char *str);
|
extern void (*sam_logback)(char *str);
|
||||||
extern void (*sam_namingback)(char *name, sam_pubkey_t pubkey,
|
extern void (*sam_namingback)(char *name, sam_pubkey_t pubkey,
|
||||||
samerr_t result);
|
samerr_t result);
|
||||||
@@ -121,10 +121,14 @@ extern sam_sid_t sam_stream_connect(sam_sess_t *session,
|
|||||||
extern samerr_t sam_stream_send(sam_sess_t *session, sam_sid_t stream_id,
|
extern samerr_t sam_stream_send(sam_sess_t *session, sam_sid_t stream_id,
|
||||||
const void *data, size_t size);
|
const void *data, size_t size);
|
||||||
/* Stream commands - callbacks */
|
/* Stream commands - callbacks */
|
||||||
extern void (*sam_closeback)(sam_sid_t stream_id, samerr_t reason);
|
extern void (*sam_closeback)(const sam_sess_t *session, sam_sid_t stream_id,
|
||||||
extern void (*sam_connectback)(sam_sid_t stream_id, sam_pubkey_t dest);
|
samerr_t reason);
|
||||||
extern void (*sam_databack)(sam_sid_t stream_id, void *data, size_t size);
|
extern void (*sam_connectback)(const sam_sess_t *session,
|
||||||
extern void (*sam_statusback)(sam_sid_t stream_id, samerr_t result);
|
sam_sid_t stream_id, sam_pubkey_t dest);
|
||||||
|
extern void (*sam_databack)(const sam_sess_t *session, sam_sid_t stream_id,
|
||||||
|
void *data, size_t size);
|
||||||
|
extern void (*sam_statusback)(const sam_sess_t *session,
|
||||||
|
sam_sid_t stream_id, samerr_t result);
|
||||||
|
|
||||||
/* Stream send queue (experimental) */
|
/* Stream send queue (experimental) */
|
||||||
extern void sam_sendq_add(sam_sess_t *session, sam_sid_t stream_id,
|
extern void sam_sendq_add(sam_sess_t *session, sam_sid_t stream_id,
|
||||||
@@ -137,7 +141,8 @@ extern samerr_t sam_dgram_send(sam_sess_t *session, const sam_pubkey_t dest,
|
|||||||
const void *data, size_t size);
|
const void *data, size_t size);
|
||||||
|
|
||||||
/* Datagram commands - callbacks */
|
/* Datagram commands - callbacks */
|
||||||
extern void (*sam_dgramback)(sam_pubkey_t dest, void *data, size_t size);
|
extern void (*sam_dgramback)(const sam_sess_t *session, sam_pubkey_t dest,
|
||||||
|
void *data, size_t size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -36,7 +36,7 @@ static void sam_log(const char *format, ...);
|
|||||||
static void sam_parse(sam_sess_t *session, char *s);
|
static void sam_parse(sam_sess_t *session, char *s);
|
||||||
static ssize_t sam_read1(sam_sess_t *session, char *buf, size_t n);
|
static ssize_t sam_read1(sam_sess_t *session, char *buf, size_t n);
|
||||||
static ssize_t sam_read2(sam_sess_t *session, void *buf, size_t n);
|
static ssize_t sam_read2(sam_sess_t *session, void *buf, size_t n);
|
||||||
static bool sam_readable(const sam_sess_t *session);
|
static bool sam_readable(sam_sess_t *session);
|
||||||
static sam_sendq_t *sam_sendq_create();
|
static sam_sendq_t *sam_sendq_create();
|
||||||
static samerr_t sam_session_create(sam_sess_t *session,
|
static samerr_t sam_session_create(sam_sess_t *session,
|
||||||
const char *destname, sam_conn_t style,
|
const char *destname, sam_conn_t style,
|
||||||
@@ -56,22 +56,27 @@ static ssize_t sam_write(sam_sess_t *session, const void *buf, size_t n);
|
|||||||
* Note: if you add a new callback be sure to check for non-NULL in sam_connect
|
* Note: if you add a new callback be sure to check for non-NULL in sam_connect
|
||||||
*/
|
*/
|
||||||
/* a peer closed the connection */
|
/* a peer closed the connection */
|
||||||
void (*sam_closeback)(sam_sid_t stream_id, samerr_t reason) = NULL;
|
void (*sam_closeback)(const sam_sess_t *session, sam_sid_t stream_id,
|
||||||
|
samerr_t reason) = NULL;
|
||||||
/* a peer connected to us */
|
/* a peer connected to us */
|
||||||
void (*sam_connectback)(sam_sid_t stream_id, sam_pubkey_t dest) = NULL;
|
void (*sam_connectback)(const sam_sess_t *session, sam_sid_t stream_id,
|
||||||
|
sam_pubkey_t dest) = NULL;
|
||||||
/* a peer sent some stream data (`data' MUST be freed) */
|
/* a peer sent some stream data (`data' MUST be freed) */
|
||||||
void (*sam_databack)(sam_sid_t stream_id, void *data, size_t size) = NULL;
|
void (*sam_databack)(const sam_sess_t *session, sam_sid_t stream_id, void *data,
|
||||||
|
size_t size) = NULL;
|
||||||
/* a peer sent some datagram data (`data' MUST be freed) */
|
/* a peer sent some datagram data (`data' MUST be freed) */
|
||||||
void (*sam_dgramback)(sam_pubkey_t dest, void *data, size_t size) = NULL;
|
void (*sam_dgramback)(const sam_sess_t *session, sam_pubkey_t dest, void *data,
|
||||||
|
size_t size) = NULL;
|
||||||
/* we lost the connection to the SAM host */
|
/* we lost the connection to the SAM host */
|
||||||
void (*sam_diedback)() = NULL;
|
void (*sam_diedback)(sam_sess_t *session) = NULL;
|
||||||
/* logging callback */
|
/* logging callback */
|
||||||
void (*sam_logback)(char *str) = NULL;
|
void (*sam_logback)(char *str) = NULL;
|
||||||
/* naming lookup reply - `pubkey' will be NULL if `result' isn't SAM_OK */
|
/* naming lookup reply - `pubkey' will be NULL if `result' isn't SAM_OK */
|
||||||
void (*sam_namingback)(char *name, sam_pubkey_t pubkey,
|
void (*sam_namingback)(char *name, sam_pubkey_t pubkey,
|
||||||
samerr_t result) = NULL;
|
samerr_t result) = NULL;
|
||||||
/* our connection to a peer has completed */
|
/* our connection to a peer has completed */
|
||||||
void (*sam_statusback)(sam_sid_t stream_id, samerr_t result) = NULL;
|
void (*sam_statusback)(const sam_sess_t *session, sam_sid_t stream_id,
|
||||||
|
samerr_t result) = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Closes the connection to the SAM host
|
* Closes the connection to the SAM host
|
||||||
@@ -309,7 +314,7 @@ static void sam_parse(sam_sess_t *session, char *s)
|
|||||||
if (sam_read2(session, data, size) != -1) {
|
if (sam_read2(session, data, size) != -1) {
|
||||||
p = data + size;
|
p = data + size;
|
||||||
*p = '\0'; /* see above NUL note */
|
*p = '\0'; /* see above NUL note */
|
||||||
sam_dgramback(dest, data, size); /* `data' must be freed */
|
sam_dgramback(session, dest, data, size); /* `data' must be freed */
|
||||||
} else
|
} else
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
@@ -382,17 +387,17 @@ static void sam_parse(sam_sess_t *session, char *s)
|
|||||||
assert(p != NULL);
|
assert(p != NULL);
|
||||||
p++;
|
p++;
|
||||||
if (strncmp(p, "OK", strlen("OK")) == 0)
|
if (strncmp(p, "OK", strlen("OK")) == 0)
|
||||||
sam_closeback(stream_id, SAM_OK);
|
sam_closeback(session, stream_id, SAM_OK);
|
||||||
else if (strncmp(p, "CANT_REACH_PEER", strlen("CANT_REACH_PEER")) == 0)
|
else if (strncmp(p, "CANT_REACH_PEER", strlen("CANT_REACH_PEER")) == 0)
|
||||||
sam_closeback(stream_id, SAM_CANT_REACH_PEER);
|
sam_closeback(session, stream_id, SAM_CANT_REACH_PEER);
|
||||||
else if (strncmp(p, "I2P_ERROR", strlen("I2P_ERROR")) == 0)
|
else if (strncmp(p, "I2P_ERROR", strlen("I2P_ERROR")) == 0)
|
||||||
sam_closeback(stream_id, SAM_I2P_ERROR);
|
sam_closeback(session, stream_id, SAM_I2P_ERROR);
|
||||||
else if (strncmp(p, "PEER_NOT_FOUND", strlen("PEER_NOT_FOUND")) == 0)
|
else if (strncmp(p, "PEER_NOT_FOUND", strlen("PEER_NOT_FOUND")) == 0)
|
||||||
sam_closeback(stream_id, SAM_PEER_NOT_FOUND);
|
sam_closeback(session, stream_id, SAM_PEER_NOT_FOUND);
|
||||||
else if (strncmp(p, "TIMEOUT", strlen("TIMEOUT")) == 0)
|
else if (strncmp(p, "TIMEOUT", strlen("TIMEOUT")) == 0)
|
||||||
sam_closeback(stream_id, SAM_TIMEOUT);
|
sam_closeback(session, stream_id, SAM_TIMEOUT);
|
||||||
else
|
else
|
||||||
sam_closeback(stream_id, SAM_UNKNOWN);
|
sam_closeback(session, stream_id, SAM_UNKNOWN);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -411,7 +416,7 @@ static void sam_parse(sam_sess_t *session, char *s)
|
|||||||
p = strstr(s, "N="); /* DESTINATION= */
|
p = strstr(s, "N="); /* DESTINATION= */
|
||||||
p += 2;
|
p += 2;
|
||||||
strlcpy(dest, p, sizeof dest);
|
strlcpy(dest, p, sizeof dest);
|
||||||
sam_connectback(stream_id, dest);
|
sam_connectback(session, stream_id, dest);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -443,7 +448,8 @@ static void sam_parse(sam_sess_t *session, char *s)
|
|||||||
if (sam_read2(session, data, size) != -1) {
|
if (sam_read2(session, data, size) != -1) {
|
||||||
p = data + size;
|
p = data + size;
|
||||||
*p = '\0'; /* see above NUL note */
|
*p = '\0'; /* see above NUL note */
|
||||||
sam_databack(stream_id, data, size); /* `data' must be freed */
|
sam_databack(session, stream_id, data, size);
|
||||||
|
/* ^^^ `data' must be freed ^^^*/
|
||||||
} else
|
} else
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
@@ -464,21 +470,21 @@ static void sam_parse(sam_sess_t *session, char *s)
|
|||||||
assert(stream_id != 0);
|
assert(stream_id != 0);
|
||||||
if (strncmp(s, SAM_STREAM_STATUS_REPLY_OK,
|
if (strncmp(s, SAM_STREAM_STATUS_REPLY_OK,
|
||||||
strlen(SAM_STREAM_STATUS_REPLY_OK)) == 0)
|
strlen(SAM_STREAM_STATUS_REPLY_OK)) == 0)
|
||||||
sam_statusback(stream_id, SAM_OK);
|
sam_statusback(session, stream_id, SAM_OK);
|
||||||
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_CRP,
|
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_CRP,
|
||||||
strlen(SAM_STREAM_STATUS_REPLY_CRP)) == 0)
|
strlen(SAM_STREAM_STATUS_REPLY_CRP)) == 0)
|
||||||
sam_statusback(stream_id, SAM_CANT_REACH_PEER);
|
sam_statusback(session, stream_id, SAM_CANT_REACH_PEER);
|
||||||
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_I2E,
|
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_I2E,
|
||||||
strlen(SAM_STREAM_STATUS_REPLY_I2E)) == 0)
|
strlen(SAM_STREAM_STATUS_REPLY_I2E)) == 0)
|
||||||
sam_statusback(stream_id, SAM_I2P_ERROR);
|
sam_statusback(session, stream_id, SAM_I2P_ERROR);
|
||||||
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_IK,
|
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_IK,
|
||||||
strlen(SAM_STREAM_STATUS_REPLY_IK)) == 0)
|
strlen(SAM_STREAM_STATUS_REPLY_IK)) == 0)
|
||||||
sam_statusback(stream_id, SAM_INVALID_KEY);
|
sam_statusback(session, stream_id, SAM_INVALID_KEY);
|
||||||
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_TO,
|
else if (strncmp(s, SAM_STREAM_STATUS_REPLY_TO,
|
||||||
strlen(SAM_STREAM_STATUS_REPLY_TO)) == 0)
|
strlen(SAM_STREAM_STATUS_REPLY_TO)) == 0)
|
||||||
sam_statusback(stream_id, SAM_TIMEOUT);
|
sam_statusback(session, stream_id, SAM_TIMEOUT);
|
||||||
else
|
else
|
||||||
sam_statusback(stream_id, SAM_UNKNOWN);
|
sam_statusback(session, stream_id, SAM_UNKNOWN);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -533,7 +539,7 @@ static ssize_t sam_read1(sam_sess_t *session, char *buf, size_t n)
|
|||||||
sam_read1 error return */
|
sam_read1 error return */
|
||||||
if (!session->connected) {
|
if (!session->connected) {
|
||||||
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(n > 0);
|
assert(n > 0);
|
||||||
@@ -552,13 +558,13 @@ static ssize_t sam_read1(sam_sess_t *session, char *buf, size_t n)
|
|||||||
SAMLOG("recv() failed: %s", strerror(errno));
|
SAMLOG("recv() failed: %s", strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
sam_close(session);
|
sam_close(session);
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (nread == 0) { /* EOF */
|
} else if (nread == 0) { /* EOF */
|
||||||
SAMLOGS("Connection closed by the SAM host");
|
SAMLOGS("Connection closed by the SAM host");
|
||||||
sam_close(session);
|
sam_close(session);
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(nread == 1);
|
assert(nread == 1);
|
||||||
@@ -598,7 +604,7 @@ static ssize_t sam_read2(sam_sess_t *session, void *buf, size_t n)
|
|||||||
|
|
||||||
if (!session->connected) {
|
if (!session->connected) {
|
||||||
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(n > 0);
|
assert(n > 0);
|
||||||
@@ -617,13 +623,13 @@ static ssize_t sam_read2(sam_sess_t *session, void *buf, size_t n)
|
|||||||
SAMLOG("recv() failed: %s", strerror(errno));
|
SAMLOG("recv() failed: %s", strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
sam_close(session);
|
sam_close(session);
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (nread == 0) { /* EOF */
|
} else if (nread == 0) { /* EOF */
|
||||||
SAMLOGS("Connection closed by the SAM host");
|
SAMLOGS("Connection closed by the SAM host");
|
||||||
sam_close(session);
|
sam_close(session);
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
nleft -= nread;
|
nleft -= nread;
|
||||||
@@ -641,7 +647,7 @@ static ssize_t sam_read2(sam_sess_t *session, void *buf, size_t n)
|
|||||||
*
|
*
|
||||||
* Returns: true if data is waiting, false otherwise
|
* Returns: true if data is waiting, false otherwise
|
||||||
*/
|
*/
|
||||||
static bool sam_readable(const sam_sess_t *session)
|
static bool sam_readable(sam_sess_t *session)
|
||||||
{
|
{
|
||||||
fd_set rset; /* set of readable descriptors */
|
fd_set rset; /* set of readable descriptors */
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
@@ -649,7 +655,7 @@ static bool sam_readable(const sam_sess_t *session)
|
|||||||
|
|
||||||
if (!session->connected) {
|
if (!session->connected) {
|
||||||
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
SAMLOGS("Cannot read from SAM because the SAM connection is closed");
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* it seems like there should be a better way to do this (i.e. not select)*/
|
/* it seems like there should be a better way to do this (i.e. not select)*/
|
||||||
@@ -1272,7 +1278,7 @@ static ssize_t sam_write(sam_sess_t *session, const void *buf, size_t n)
|
|||||||
|
|
||||||
if (!session->connected) {
|
if (!session->connected) {
|
||||||
SAMLOGS("Cannot write to SAM because the SAM connection is closed");
|
SAMLOGS("Cannot write to SAM because the SAM connection is closed");
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#if SAM_WIRETAP
|
#if SAM_WIRETAP
|
||||||
@@ -1300,7 +1306,7 @@ static ssize_t sam_write(sam_sess_t *session, const void *buf, size_t n)
|
|||||||
SAMLOG("send() failed: %s", strerror(errno));
|
SAMLOG("send() failed: %s", strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
sam_close(session);
|
sam_close(session);
|
||||||
sam_diedback();
|
sam_diedback(session);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user