make struct ipc_info opaque. const-ify the ipcparse functions where possible.

This commit is contained in:
Charles Kerr 2008-02-27 16:47:58 +00:00
parent b17c229aaa
commit 5d233f86c4
5 changed files with 57 additions and 46 deletions

View File

@ -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;
} }

View File

@ -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;

View File

@ -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 );
} }

View File

@ -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,8 +1030,8 @@ 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 );
return -1; return -1;
@ -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 );
} }

View File

@ -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 );