From 5d233f86c4e1ad7101269cb9e8eb47efee934ff9 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Wed, 27 Feb 2008 16:47:58 +0000 Subject: [PATCH] make struct ipc_info opaque. const-ify the ipcparse functions where possible. --- daemon/client.c | 4 +-- daemon/server.c | 1 - gtk/ipc.c | 2 +- libtransmission/ipcparse.c | 46 ++++++++++++++++++++++------------- libtransmission/ipcparse.h | 50 ++++++++++++++++++++------------------ 5 files changed, 57 insertions(+), 46 deletions(-) diff --git a/daemon/client.c b/daemon/client.c index 69bc504d2..bf1876c16 100644 --- a/daemon/client.c +++ b/daemon/client.c @@ -169,7 +169,6 @@ client_new_sock( const char * path ) con->ipc = ipc_newcon( gl_tree ); if( NULL == con->ipc ) { - mallocmsg( sizeof *con->ipc ); close( fd ); free( con ); } @@ -292,7 +291,6 @@ client_new_cmd( char * const * cmd ) con->ipc = ipc_newcon( gl_tree ); if( NULL == con->ipc ) { - mallocmsg( sizeof *con->ipc ); bufferevent_free( con->evin ); bufferevent_free( con->evout ); free( con ); @@ -762,7 +760,7 @@ flushreqs( struct con * con ) benc_val_t pk, * val; struct stritem * jj; - if( !HASVERS( con->ipc ) ) + if( !ipc_hasvers( con->ipc ) ) { return; } diff --git a/daemon/server.c b/daemon/server.c index d77dbd837..74b33cdef 100644 --- a/daemon/server.c +++ b/daemon/server.c @@ -244,7 +244,6 @@ newclient( int fd, short event UNUSED, void * arg ) client->ipc = ipc_newcon( gl_tree ); if( NULL == client->ipc ) { - mallocmsg( sizeof *client->ipc ); close( clfd ); free( client ); return; diff --git a/gtk/ipc.c b/gtk/ipc.c index 5ecaae4ae..1796eef8a 100644 --- a/gtk/ipc.c +++ b/gtk/ipc.c @@ -241,7 +241,7 @@ cli_io_received( GSource * source UNUSED, void * data, size_t len, return 0; } - if( HASVERS( con->ipc ) && 0 == cli->msgid ) + if( ipc_hasvers( con->ipc ) && 0 == cli->msgid ) { client_sendmsg( con ); } diff --git a/libtransmission/ipcparse.c b/libtransmission/ipcparse.c index f4ea7efa4..87f39a960 100644 --- a/libtransmission/ipcparse.c +++ b/libtransmission/ipcparse.c @@ -63,6 +63,18 @@ #define MSGNAME( id ) ( gl_msgs[(id)].name ) #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 { const char * name; @@ -218,16 +230,16 @@ ipc_freecon( struct ipc_info * info ) } 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( HASVERS( info ) ); + assert( ipc_hasvers( info ) ); return gl_msgs[id].minvers <= info->vers; } 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 * ret; @@ -291,7 +303,7 @@ ipc_mkval( const tr_benc * pk, size_t * setmeSize ) } 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 ) { tr_benc pk; @@ -307,8 +319,8 @@ ipc_mkempty( struct ipc_info * info, size_t * len, enum ipc_msg id, } uint8_t * -ipc_mkint( struct ipc_info * info, size_t * len, enum ipc_msg id, int64_t tag, - int64_t num ) +ipc_mkint( const struct ipc_info * info, size_t * len, enum ipc_msg id, + int64_t tag, int64_t num ) { tr_benc pk, * val; 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 * -ipc_mkstr( struct ipc_info * info, size_t * len, enum ipc_msg id, int64_t tag, - const char * str ) +ipc_mkstr( const struct ipc_info * info, size_t * len, enum ipc_msg id, + int64_t tag, const char * str ) { tr_benc pk, * val; uint8_t * ret; @@ -373,7 +385,7 @@ ipc_mkvers( size_t * len, const char * label ) } 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 ) { tr_benc pk, * top, * idlist, * typelist; @@ -895,7 +907,7 @@ msglookup( const char * name ) } 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 ) { const struct msg * msg; @@ -940,12 +952,12 @@ gotmsg( struct ipc_info * info, tr_benc * name, tr_benc * val, } 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; int ii; - assert( HASVERS( info ) ); + assert( ipc_hasvers( 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; } - if( 0 > ( HASVERS( info ) ? handlemsgs( info, &benc, arg ) : - handlevers( info, &benc ) ) ) + if( 0 > ( ipc_hasvers( info ) ? handlemsgs( info, &benc, arg ) : + handlevers( info, &benc ) ) ) { SAFEBENCFREE( &benc ); return -1; @@ -1031,7 +1043,7 @@ ipc_parse( struct ipc_info * info, const uint8_t * buf, ssize_t total, void * ar } 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 ); @@ -1041,7 +1053,7 @@ ipc_msgid( struct ipc_info * info, const char * name ) } 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 ) ); @@ -1049,7 +1061,7 @@ ipc_ishandled( struct ipc_info * info, enum ipc_msg id ) } int -ipc_havetags( struct ipc_info * info ) +ipc_havetags( const struct ipc_info * info ) { return !DICTPAYLOAD( info ); } diff --git a/libtransmission/ipcparse.h b/libtransmission/ipcparse.h index 00f0a4de6..5846eeb98 100644 --- a/libtransmission/ipcparse.h +++ b/libtransmission/ipcparse.h @@ -126,53 +126,55 @@ struct tr_info; struct tr_benc; 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) && INT_MAX > (id) ) +#define TORRENT_ID_VALID( id ) ( ( 0 < (id) ) && ( (id) < INT_MAX ) ) -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 errors set by malloc() or calloc() */ /* setup */ 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_freemsgs ( struct ipc_funcs * ); struct ipc_info * ipc_newcon ( struct ipc_funcs * ); void ipc_freecon ( struct ipc_info * ); +int ipc_hasvers ( const struct ipc_info * ); /* message creation */ /* 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 *, int ); +struct tr_benc * ipc_initval ( const struct ipc_info *, enum ipc_msg, + int64_t tag, struct tr_benc *, int ); 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 ); -uint8_t * ipc_mkint ( struct ipc_info *, size_t *, enum ipc_msg, int64_t, - int64_t ); -uint8_t * ipc_mkstr ( struct ipc_info *, size_t *, enum ipc_msg, int64_t, - const char * ); +uint8_t * ipc_mkint ( const struct ipc_info *, size_t *, enum ipc_msg, + int64_t tag, int64_t val ); +uint8_t * ipc_mkstr ( const struct ipc_info *, size_t *, enum ipc_msg, + int64_t tag, const char * val ); uint8_t * ipc_mkvers ( size_t *, const char * ); -uint8_t * ipc_mkgetinfo( struct ipc_info *, size_t *, enum ipc_msg, int64_t, - int, const int * ); -int ipc_addinfo ( struct tr_benc *, int, const struct tr_info *, int ); -int ipc_addstat ( struct tr_benc *, int, const struct tr_stat *, int ); +uint8_t * ipc_mkgetinfo( const struct ipc_info *, size_t *, enum ipc_msg, + int64_t, int, const int * ); +int ipc_addinfo ( struct tr_benc *, 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 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 */ -enum ipc_msg ipc_msgid ( struct ipc_info *, const char * ); -int ipc_ishandled( struct ipc_info *, enum ipc_msg ); -int ipc_havetags ( struct ipc_info * ); +enum ipc_msg ipc_msgid ( const struct ipc_info *, const char * ); +int ipc_ishandled( const struct ipc_info *, enum ipc_msg ); +int ipc_havetags ( const struct ipc_info * ); int ipc_infotypes( enum ipc_msg, const struct tr_benc * ); const char * ipc_infoname ( enum ipc_msg, int );