- changed reactor interface to support passing user data on registration
- changed kernel i/f functions to return sockaddr This commit was SVN r388.
Этот коммит содержится в:
родитель
1efc0f4131
Коммит
deb6aa4f8d
@ -5,6 +5,8 @@
|
|||||||
#ifndef LAM_ARGV_H
|
#ifndef LAM_ARGV_H
|
||||||
#define LAM_ARGV_H
|
#define LAM_ARGV_H
|
||||||
|
|
||||||
|
#include "lam/types.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -145,7 +145,7 @@ static int lam_ifinit(void)
|
|||||||
* as a dotted decimal formatted string.
|
* as a dotted decimal formatted string.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int lam_ifnametoaddr(const char* if_name, char* if_addr, int length)
|
int lam_ifnametoaddr(const char* if_name, struct sockaddr* addr, int length)
|
||||||
{
|
{
|
||||||
lam_if_t* intf;
|
lam_if_t* intf;
|
||||||
int rc = lam_ifinit();
|
int rc = lam_ifinit();
|
||||||
@ -156,7 +156,7 @@ int lam_ifnametoaddr(const char* if_name, char* if_addr, int length)
|
|||||||
intf != (lam_if_t*)lam_list_get_end(&lam_if_list);
|
intf != (lam_if_t*)lam_list_get_end(&lam_if_list);
|
||||||
intf = (lam_if_t*)lam_list_get_next(intf)) {
|
intf = (lam_if_t*)lam_list_get_next(intf)) {
|
||||||
if(strcmp(intf->if_name, if_name) == 0) {
|
if(strcmp(intf->if_name, if_name) == 0) {
|
||||||
strncpy(if_addr, inet_ntoa(intf->if_addr.sin_addr), length);
|
memcpy(addr, &intf->if_addr, length);
|
||||||
return LAM_SUCCESS;
|
return LAM_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,7 +253,7 @@ int lam_ifnext(int if_index)
|
|||||||
* primary address assigned to the interface.
|
* primary address assigned to the interface.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int lam_ifindextoaddr(int if_index, char* if_addr, int length)
|
int lam_ifindextoaddr(int if_index, struct sockaddr* if_addr, int length)
|
||||||
{
|
{
|
||||||
lam_if_t* intf;
|
lam_if_t* intf;
|
||||||
int rc = lam_ifinit();
|
int rc = lam_ifinit();
|
||||||
@ -264,7 +264,7 @@ int lam_ifindextoaddr(int if_index, char* if_addr, int length)
|
|||||||
intf != (lam_if_t*)lam_list_get_end(&lam_if_list);
|
intf != (lam_if_t*)lam_list_get_end(&lam_if_list);
|
||||||
intf = (lam_if_t*)lam_list_get_next(intf)) {
|
intf = (lam_if_t*)lam_list_get_next(intf)) {
|
||||||
if(intf->if_index == if_index) {
|
if(intf->if_index == if_index) {
|
||||||
strncpy(if_addr, inet_ntoa(intf->if_addr.sin_addr), length);
|
memcpy(if_addr, &intf->if_addr, length);
|
||||||
return LAM_SUCCESS;
|
return LAM_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* @param if_addr (OUT) Interface address buffer
|
* @param if_addr (OUT) Interface address buffer
|
||||||
* @param size (IN) Interface address buffer size
|
* @param size (IN) Interface address buffer size
|
||||||
*/
|
*/
|
||||||
int lam_ifnametoaddr(const char* if_name, char* if_addr, int);
|
int lam_ifnametoaddr(const char* if_name, struct sockaddr*, int);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lookup an interface by address and return its name.
|
* Lookup an interface by address and return its name.
|
||||||
@ -67,7 +67,7 @@ int lam_ifindextoname(int if_index, char* if_name, int);
|
|||||||
* @param if_name (OUT) Interface address buffer
|
* @param if_name (OUT) Interface address buffer
|
||||||
* @param size (IN) Interface address buffer size
|
* @param size (IN) Interface address buffer size
|
||||||
*/
|
*/
|
||||||
int lam_ifindextoaddr(int if_index, char* if_addr, int);
|
int lam_ifindextoaddr(int if_index, struct sockaddr*, int);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ void lam_reactor_destroy(lam_reactor_t* r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool lam_reactor_insert(lam_reactor_t* r, int sd, lam_reactor_listener_t* listener, int flags)
|
bool lam_reactor_insert(lam_reactor_t* r, int sd, lam_reactor_listener_t* listener, void* user, int flags)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if(sd < 0 || sd > LAM_FD_SETSIZE) {
|
if(sd < 0 || sd > LAM_FD_SETSIZE) {
|
||||||
@ -123,14 +123,17 @@ bool lam_reactor_insert(lam_reactor_t* r, int sd, lam_reactor_listener_t* listen
|
|||||||
descriptor->rd_flags |= flags;
|
descriptor->rd_flags |= flags;
|
||||||
if(flags & LAM_NOTIFY_RECV) {
|
if(flags & LAM_NOTIFY_RECV) {
|
||||||
descriptor->rd_recv = listener;
|
descriptor->rd_recv = listener;
|
||||||
|
descriptor->rd_recv_user = user;
|
||||||
LAM_FD_SET(sd, &r->r_recv_set);
|
LAM_FD_SET(sd, &r->r_recv_set);
|
||||||
}
|
}
|
||||||
if(flags & LAM_NOTIFY_SEND) {
|
if(flags & LAM_NOTIFY_SEND) {
|
||||||
descriptor->rd_send = listener;
|
descriptor->rd_send = listener;
|
||||||
|
descriptor->rd_send_user = user;
|
||||||
LAM_FD_SET(sd, &r->r_send_set);
|
LAM_FD_SET(sd, &r->r_send_set);
|
||||||
}
|
}
|
||||||
if(flags & LAM_NOTIFY_EXCEPT) {
|
if(flags & LAM_NOTIFY_EXCEPT) {
|
||||||
descriptor->rd_except = listener;
|
descriptor->rd_except = listener;
|
||||||
|
descriptor->rd_except_user = user;
|
||||||
LAM_FD_SET(sd, &r->r_except_set);
|
LAM_FD_SET(sd, &r->r_except_set);
|
||||||
}
|
}
|
||||||
r->r_changes++;
|
r->r_changes++;
|
||||||
@ -139,7 +142,7 @@ bool lam_reactor_insert(lam_reactor_t* r, int sd, lam_reactor_listener_t* listen
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool lam_reactor_remove(lam_reactor_t* r, int sd, lam_reactor_listener_t* rl, int flags)
|
bool lam_reactor_remove(lam_reactor_t* r, int sd, int flags)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if(sd < 0 || sd > LAM_FD_SETSIZE) {
|
if(sd < 0 || sd > LAM_FD_SETSIZE) {
|
||||||
@ -190,15 +193,15 @@ void lam_reactor_dispatch(lam_reactor_t* r, int cnt, lam_fd_set_t* rset, lam_fd_
|
|||||||
int rd = descriptor->rd;
|
int rd = descriptor->rd;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
if(LAM_FD_ISSET(rd, rset) && descriptor->rd_flags & LAM_NOTIFY_RECV) {
|
if(LAM_FD_ISSET(rd, rset) && descriptor->rd_flags & LAM_NOTIFY_RECV) {
|
||||||
descriptor->rd_recv->rl_recv_handler(descriptor->rd_recv, rd);
|
descriptor->rd_recv->rl_recv_handler(rd, descriptor->rd_recv_user);
|
||||||
flags |= LAM_NOTIFY_RECV;
|
flags |= LAM_NOTIFY_RECV;
|
||||||
}
|
}
|
||||||
if(LAM_FD_ISSET(rd, sset) && descriptor->rd_flags & LAM_NOTIFY_SEND) {
|
if(LAM_FD_ISSET(rd, sset) && descriptor->rd_flags & LAM_NOTIFY_SEND) {
|
||||||
descriptor->rd_send->rl_send_handler(descriptor->rd_send, rd);
|
descriptor->rd_send->rl_send_handler(rd, descriptor->rd_send_user);
|
||||||
flags |= LAM_NOTIFY_SEND;
|
flags |= LAM_NOTIFY_SEND;
|
||||||
}
|
}
|
||||||
if(LAM_FD_ISSET(rd, eset) && descriptor->rd_flags & LAM_NOTIFY_EXCEPT) {
|
if(LAM_FD_ISSET(rd, eset) && descriptor->rd_flags & LAM_NOTIFY_EXCEPT) {
|
||||||
descriptor->rd_except->rl_except_handler(descriptor->rd_except, rd);
|
descriptor->rd_except->rl_except_handler(rd, descriptor->rd_except_user);
|
||||||
flags |= LAM_NOTIFY_EXCEPT;
|
flags |= LAM_NOTIFY_EXCEPT;
|
||||||
}
|
}
|
||||||
if(flags) cnt--;
|
if(flags) cnt--;
|
||||||
|
@ -26,15 +26,14 @@ extern lam_class_info_t lam_reactor_cls;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct lam_reactor_listener_t;
|
struct lam_reactor_listener_t;
|
||||||
typedef void (*rl_recv_handler_fn_t)(struct lam_reactor_listener_t *r, int sd);
|
typedef void (*rl_recv_handler_fn_t)(int sd, void* user);
|
||||||
typedef void (*rl_send_handler_fn_t)(struct lam_reactor_listener_t *r, int sd);
|
typedef void (*rl_send_handler_fn_t)(int sd, void* user);
|
||||||
typedef void (*rl_except_handler_fn_t)(struct lam_reactor_listener_t *r, int sd);
|
typedef void (*rl_except_handler_fn_t)(int sd, void* user);
|
||||||
|
|
||||||
struct lam_reactor_listener_t {
|
struct lam_reactor_listener_t {
|
||||||
rl_recv_handler_fn_t rl_recv_handler;
|
rl_recv_handler_fn_t rl_recv_handler;
|
||||||
rl_send_handler_fn_t rl_send_handler;
|
rl_send_handler_fn_t rl_send_handler;
|
||||||
rl_except_handler_fn_t rl_except_handler;
|
rl_except_handler_fn_t rl_except_handler;
|
||||||
void *rl_user_data;
|
|
||||||
};
|
};
|
||||||
typedef struct lam_reactor_listener_t lam_reactor_listener_t;
|
typedef struct lam_reactor_listener_t lam_reactor_listener_t;
|
||||||
|
|
||||||
@ -43,9 +42,12 @@ struct lam_reactor_descriptor_t {
|
|||||||
lam_list_item_t rd_base;
|
lam_list_item_t rd_base;
|
||||||
int rd;
|
int rd;
|
||||||
volatile int rd_flags;
|
volatile int rd_flags;
|
||||||
lam_reactor_listener_t *rd_recv;
|
lam_reactor_listener_t* rd_recv;
|
||||||
lam_reactor_listener_t *rd_send;
|
void* rd_recv_user;
|
||||||
lam_reactor_listener_t *rd_except;
|
lam_reactor_listener_t* rd_send;
|
||||||
|
void* rd_send_user;
|
||||||
|
lam_reactor_listener_t* rd_except;
|
||||||
|
void* rd_except_user;
|
||||||
};
|
};
|
||||||
typedef struct lam_reactor_descriptor_t lam_reactor_descriptor_t;
|
typedef struct lam_reactor_descriptor_t lam_reactor_descriptor_t;
|
||||||
|
|
||||||
@ -74,8 +76,8 @@ typedef struct lam_reactor_t lam_reactor_t;
|
|||||||
void lam_reactor_init(lam_reactor_t*);
|
void lam_reactor_init(lam_reactor_t*);
|
||||||
void lam_reactor_destroy(lam_reactor_t*);
|
void lam_reactor_destroy(lam_reactor_t*);
|
||||||
|
|
||||||
bool lam_reactor_insert(lam_reactor_t*, int sd, lam_reactor_listener_t*, int flags);
|
bool lam_reactor_insert(lam_reactor_t*, int sd, lam_reactor_listener_t*, void* user, int flags);
|
||||||
bool lam_reactor_remove(lam_reactor_t*, int sd, lam_reactor_listener_t*, int flags);
|
bool lam_reactor_remove(lam_reactor_t*, int sd, int flags);
|
||||||
void lam_reactor_poll(lam_reactor_t*);
|
void lam_reactor_poll(lam_reactor_t*);
|
||||||
void lam_reactor_run(lam_reactor_t*);
|
void lam_reactor_run(lam_reactor_t*);
|
||||||
void lam_reactor_dispatch(lam_reactor_t* r, int cnt, lam_fd_set_t* rset, lam_fd_set_t* sset, lam_fd_set_t* eset);
|
void lam_reactor_dispatch(lam_reactor_t* r, int cnt, lam_fd_set_t* rset, lam_fd_set_t* sset, lam_fd_set_t* eset);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user