make struct ipc_info opaque. const-ify the ipcparse functions where possible.
This commit is contained in:
parent
b17c229aaa
commit
5d233f86c4
|
@ -169,7 +169,6 @@ client_new_sock( const char * path )
|
||||||
con->ipc = ipc_newcon( gl_tree );
|
con->ipc = ipc_newcon( gl_tree );
|
||||||
if( NULL == con->ipc )
|
if( NULL == con->ipc )
|
||||||
{
|
{
|
||||||
mallocmsg( sizeof *con->ipc );
|
|
||||||
close( fd );
|
close( fd );
|
||||||
free( con );
|
free( con );
|
||||||
}
|
}
|
||||||
|
@ -292,7 +291,6 @@ client_new_cmd( char * const * cmd )
|
||||||
con->ipc = ipc_newcon( gl_tree );
|
con->ipc = ipc_newcon( gl_tree );
|
||||||
if( NULL == con->ipc )
|
if( NULL == con->ipc )
|
||||||
{
|
{
|
||||||
mallocmsg( sizeof *con->ipc );
|
|
||||||
bufferevent_free( con->evin );
|
bufferevent_free( con->evin );
|
||||||
bufferevent_free( con->evout );
|
bufferevent_free( con->evout );
|
||||||
free( con );
|
free( con );
|
||||||
|
@ -762,7 +760,7 @@ flushreqs( struct con * con )
|
||||||
benc_val_t pk, * val;
|
benc_val_t pk, * val;
|
||||||
struct stritem * jj;
|
struct stritem * jj;
|
||||||
|
|
||||||
if( !HASVERS( con->ipc ) )
|
if( !ipc_hasvers( con->ipc ) )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,7 +244,6 @@ newclient( int fd, short event UNUSED, void * arg )
|
||||||
client->ipc = ipc_newcon( gl_tree );
|
client->ipc = ipc_newcon( gl_tree );
|
||||||
if( NULL == client->ipc )
|
if( NULL == client->ipc )
|
||||||
{
|
{
|
||||||
mallocmsg( sizeof *client->ipc );
|
|
||||||
close( clfd );
|
close( clfd );
|
||||||
free( client );
|
free( client );
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -241,7 +241,7 @@ cli_io_received( GSource * source UNUSED, void * data, size_t len,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( HASVERS( con->ipc ) && 0 == cli->msgid )
|
if( ipc_hasvers( con->ipc ) && 0 == cli->msgid )
|
||||||
{
|
{
|
||||||
client_sendmsg( con );
|
client_sendmsg( con );
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,18 @@
|
||||||
#define MSGNAME( id ) ( gl_msgs[(id)].name )
|
#define MSGNAME( id ) ( gl_msgs[(id)].name )
|
||||||
#define DICTPAYLOAD( info ) ( 2 > (info)->vers )
|
#define DICTPAYLOAD( info ) ( 2 > (info)->vers )
|
||||||
|
|
||||||
|
struct ipc_info
|
||||||
|
{
|
||||||
|
struct ipc_funcs * funcs;
|
||||||
|
int vers;
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
ipc_hasvers( const struct ipc_info * inf )
|
||||||
|
{
|
||||||
|
return inf && ( inf->vers > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
struct msg
|
struct msg
|
||||||
{
|
{
|
||||||
const char * name;
|
const char * name;
|
||||||
|
@ -218,16 +230,16 @@ ipc_freecon( struct ipc_info * info )
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ipc_havemsg( struct ipc_info * info, enum ipc_msg id )
|
ipc_havemsg( const struct ipc_info * info, enum ipc_msg id )
|
||||||
{
|
{
|
||||||
assert( MSGVALID( id ) );
|
assert( MSGVALID( id ) );
|
||||||
assert( HASVERS( info ) );
|
assert( ipc_hasvers( info ) );
|
||||||
|
|
||||||
return gl_msgs[id].minvers <= info->vers;
|
return gl_msgs[id].minvers <= info->vers;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr_benc *
|
tr_benc *
|
||||||
ipc_initval( struct ipc_info * info, enum ipc_msg id, int64_t tag,
|
ipc_initval( const struct ipc_info * info, enum ipc_msg id, int64_t tag,
|
||||||
tr_benc * pk, int type )
|
tr_benc * pk, int type )
|
||||||
{
|
{
|
||||||
tr_benc * ret;
|
tr_benc * ret;
|
||||||
|
@ -291,7 +303,7 @@ ipc_mkval( const tr_benc * pk, size_t * setmeSize )
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
uint8_t *
|
||||||
ipc_mkempty( struct ipc_info * info, size_t * len, enum ipc_msg id,
|
ipc_mkempty( const struct ipc_info * info, size_t * len, enum ipc_msg id,
|
||||||
int64_t tag )
|
int64_t tag )
|
||||||
{
|
{
|
||||||
tr_benc pk;
|
tr_benc pk;
|
||||||
|
@ -307,8 +319,8 @@ ipc_mkempty( struct ipc_info * info, size_t * len, enum ipc_msg id,
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
uint8_t *
|
||||||
ipc_mkint( struct ipc_info * info, size_t * len, enum ipc_msg id, int64_t tag,
|
ipc_mkint( const struct ipc_info * info, size_t * len, enum ipc_msg id,
|
||||||
int64_t num )
|
int64_t tag, int64_t num )
|
||||||
{
|
{
|
||||||
tr_benc pk, * val;
|
tr_benc pk, * val;
|
||||||
uint8_t * ret;
|
uint8_t * ret;
|
||||||
|
@ -325,8 +337,8 @@ ipc_mkint( struct ipc_info * info, size_t * len, enum ipc_msg id, int64_t tag,
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
uint8_t *
|
||||||
ipc_mkstr( struct ipc_info * info, size_t * len, enum ipc_msg id, int64_t tag,
|
ipc_mkstr( const struct ipc_info * info, size_t * len, enum ipc_msg id,
|
||||||
const char * str )
|
int64_t tag, const char * str )
|
||||||
{
|
{
|
||||||
tr_benc pk, * val;
|
tr_benc pk, * val;
|
||||||
uint8_t * ret;
|
uint8_t * ret;
|
||||||
|
@ -373,7 +385,7 @@ ipc_mkvers( size_t * len, const char * label )
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
uint8_t *
|
||||||
ipc_mkgetinfo( struct ipc_info * info, size_t * len, enum ipc_msg id,
|
ipc_mkgetinfo( const struct ipc_info * info, size_t * len, enum ipc_msg id,
|
||||||
int64_t tag, int types, const int * ids )
|
int64_t tag, int types, const int * ids )
|
||||||
{
|
{
|
||||||
tr_benc pk, * top, * idlist, * typelist;
|
tr_benc pk, * top, * idlist, * typelist;
|
||||||
|
@ -895,7 +907,7 @@ msglookup( const char * name )
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gotmsg( struct ipc_info * info, tr_benc * name, tr_benc * val,
|
gotmsg( const struct ipc_info * info, tr_benc * name, tr_benc * val,
|
||||||
tr_benc * tagval, void * arg )
|
tr_benc * tagval, void * arg )
|
||||||
{
|
{
|
||||||
const struct msg * msg;
|
const struct msg * msg;
|
||||||
|
@ -940,12 +952,12 @@ gotmsg( struct ipc_info * info, tr_benc * name, tr_benc * val,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
handlemsgs( struct ipc_info * info, tr_benc * pay, void * arg )
|
handlemsgs( const struct ipc_info * info, tr_benc * pay, void * arg )
|
||||||
{
|
{
|
||||||
tr_benc * name, * val, * tag;
|
tr_benc * name, * val, * tag;
|
||||||
int ii;
|
int ii;
|
||||||
|
|
||||||
assert( HASVERS( info ) );
|
assert( ipc_hasvers( info ) );
|
||||||
|
|
||||||
if( DICTPAYLOAD( info ) )
|
if( DICTPAYLOAD( info ) )
|
||||||
{
|
{
|
||||||
|
@ -1018,7 +1030,7 @@ ipc_parse( struct ipc_info * info, const uint8_t * buf, ssize_t total, void * ar
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if( 0 > ( HASVERS( info ) ? handlemsgs( info, &benc, arg ) :
|
if( 0 > ( ipc_hasvers( info ) ? handlemsgs( info, &benc, arg ) :
|
||||||
handlevers( info, &benc ) ) )
|
handlevers( info, &benc ) ) )
|
||||||
{
|
{
|
||||||
SAFEBENCFREE( &benc );
|
SAFEBENCFREE( &benc );
|
||||||
|
@ -1031,7 +1043,7 @@ ipc_parse( struct ipc_info * info, const uint8_t * buf, ssize_t total, void * ar
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ipc_msg
|
enum ipc_msg
|
||||||
ipc_msgid( struct ipc_info * info, const char * name )
|
ipc_msgid( const struct ipc_info * info, const char * name )
|
||||||
{
|
{
|
||||||
const struct msg * msg = msglookup( name );
|
const struct msg * msg = msglookup( name );
|
||||||
|
|
||||||
|
@ -1041,7 +1053,7 @@ ipc_msgid( struct ipc_info * info, const char * name )
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ipc_ishandled( struct ipc_info * info, enum ipc_msg id )
|
ipc_ishandled( const struct ipc_info * info, enum ipc_msg id )
|
||||||
{
|
{
|
||||||
assert( MSGVALID( id ) );
|
assert( MSGVALID( id ) );
|
||||||
|
|
||||||
|
@ -1049,7 +1061,7 @@ ipc_ishandled( struct ipc_info * info, enum ipc_msg id )
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ipc_havetags( struct ipc_info * info )
|
ipc_havetags( const struct ipc_info * info )
|
||||||
{
|
{
|
||||||
return !DICTPAYLOAD( info );
|
return !DICTPAYLOAD( info );
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,53 +126,55 @@ struct tr_info;
|
||||||
struct tr_benc;
|
struct tr_benc;
|
||||||
struct tr_stat;
|
struct tr_stat;
|
||||||
|
|
||||||
struct ipc_info
|
|
||||||
{
|
|
||||||
struct ipc_funcs * funcs;
|
|
||||||
int vers;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define HASVERS( info ) ( 0 < (info)->vers )
|
#define TORRENT_ID_VALID( id ) ( ( 0 < (id) ) && ( (id) < INT_MAX ) )
|
||||||
#define TORRENT_ID_VALID( id ) ( 0 < (id) && INT_MAX > (id) )
|
|
||||||
|
|
||||||
typedef void ( *trd_msgfunc )( enum ipc_msg, struct tr_benc *, int64_t, void * );
|
typedef void ( *trd_msgfunc )( enum ipc_msg msg_id,
|
||||||
|
struct tr_benc * benc,
|
||||||
|
int64_t tag,
|
||||||
|
void * arg );
|
||||||
|
|
||||||
/* any of these functions that can fail may set errno for any of the
|
/* any of these functions that can fail may set errno for any of the
|
||||||
errors set by malloc() or calloc() */
|
errors set by malloc() or calloc() */
|
||||||
|
|
||||||
/* setup */
|
/* setup */
|
||||||
struct ipc_funcs * ipc_initmsgs ( void );
|
struct ipc_funcs * ipc_initmsgs ( void );
|
||||||
void ipc_addmsg ( struct ipc_funcs *, enum ipc_msg, trd_msgfunc );
|
void ipc_addmsg ( struct ipc_funcs *, enum ipc_msg,
|
||||||
|
trd_msgfunc );
|
||||||
void ipc_setdefmsg( struct ipc_funcs *, trd_msgfunc );
|
void ipc_setdefmsg( struct ipc_funcs *, trd_msgfunc );
|
||||||
void ipc_freemsgs ( struct ipc_funcs * );
|
void ipc_freemsgs ( struct ipc_funcs * );
|
||||||
struct ipc_info * ipc_newcon ( struct ipc_funcs * );
|
struct ipc_info * ipc_newcon ( struct ipc_funcs * );
|
||||||
void ipc_freecon ( struct ipc_info * );
|
void ipc_freecon ( struct ipc_info * );
|
||||||
|
int ipc_hasvers ( const struct ipc_info * );
|
||||||
|
|
||||||
/* message creation */
|
/* message creation */
|
||||||
/* sets errno to EPERM if requested message not supported by protocol vers */
|
/* sets errno to EPERM if requested message not supported by protocol vers */
|
||||||
struct tr_benc * ipc_initval ( struct ipc_info *, enum ipc_msg, int64_t,
|
struct tr_benc * ipc_initval ( const struct ipc_info *, enum ipc_msg,
|
||||||
struct tr_benc *, int );
|
int64_t tag, struct tr_benc *, int );
|
||||||
uint8_t * ipc_mkval ( const struct tr_benc *, size_t * );
|
uint8_t * ipc_mkval ( const struct tr_benc *, size_t * );
|
||||||
uint8_t * ipc_mkempty ( struct ipc_info *, size_t *, enum ipc_msg,
|
uint8_t * ipc_mkempty ( const struct ipc_info *, size_t *, enum ipc_msg,
|
||||||
int64_t );
|
int64_t );
|
||||||
uint8_t * ipc_mkint ( struct ipc_info *, size_t *, enum ipc_msg, int64_t,
|
uint8_t * ipc_mkint ( const struct ipc_info *, size_t *, enum ipc_msg,
|
||||||
int64_t );
|
int64_t tag, int64_t val );
|
||||||
uint8_t * ipc_mkstr ( struct ipc_info *, size_t *, enum ipc_msg, int64_t,
|
uint8_t * ipc_mkstr ( const struct ipc_info *, size_t *, enum ipc_msg,
|
||||||
const char * );
|
int64_t tag, const char * val );
|
||||||
uint8_t * ipc_mkvers ( size_t *, const char * );
|
uint8_t * ipc_mkvers ( size_t *, const char * );
|
||||||
uint8_t * ipc_mkgetinfo( struct ipc_info *, size_t *, enum ipc_msg, int64_t,
|
uint8_t * ipc_mkgetinfo( const struct ipc_info *, size_t *, enum ipc_msg,
|
||||||
int, const int * );
|
int64_t, int, const int * );
|
||||||
int ipc_addinfo ( struct tr_benc *, int, const struct tr_info *, int );
|
int ipc_addinfo ( struct tr_benc *, int,
|
||||||
int ipc_addstat ( struct tr_benc *, int, const struct tr_stat *, int );
|
const struct tr_info *, int );
|
||||||
|
int ipc_addstat ( struct tr_benc *, int,
|
||||||
|
const struct tr_stat *, int );
|
||||||
|
|
||||||
/* sets errno to EINVAL on parse error or
|
/* sets errno to EINVAL on parse error or
|
||||||
EPERM for unsupported protocol version */
|
EPERM for unsupported protocol version */
|
||||||
ssize_t ipc_parse ( struct ipc_info *, const uint8_t *, ssize_t, void * );
|
ssize_t ipc_parse ( struct ipc_info *, const uint8_t *,
|
||||||
|
ssize_t, void * );
|
||||||
|
|
||||||
/* misc info functions, these will always succeed */
|
/* misc info functions, these will always succeed */
|
||||||
enum ipc_msg ipc_msgid ( struct ipc_info *, const char * );
|
enum ipc_msg ipc_msgid ( const struct ipc_info *, const char * );
|
||||||
int ipc_ishandled( struct ipc_info *, enum ipc_msg );
|
int ipc_ishandled( const struct ipc_info *, enum ipc_msg );
|
||||||
int ipc_havetags ( struct ipc_info * );
|
int ipc_havetags ( const struct ipc_info * );
|
||||||
int ipc_infotypes( enum ipc_msg, const struct tr_benc * );
|
int ipc_infotypes( enum ipc_msg, const struct tr_benc * );
|
||||||
const char * ipc_infoname ( enum ipc_msg, int );
|
const char * ipc_infoname ( enum ipc_msg, int );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue