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

View File

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

View File

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

View File

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

View File

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