Skip to content

Commit 150b203

Browse files
committed
Imported irc_command branch and used this addition for parsing IPC commands. (Implemented WALLOP and a very evil DIE.)
2 parents 13ebbdf + 981e035 commit 150b203

File tree

9 files changed

+1058
-783
lines changed

9 files changed

+1058
-783
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
-include Makefile.settings
1010

1111
# Program variables
12-
objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o
12+
objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o ipc.o irc.o irc_commands.o log.o nick.o query.o set.o storage.o storage_text.o unix.o url.o user.o util.o
1313
subdirs = protocols
1414

1515
# Expansion of variables

bitlbee.c

Lines changed: 14 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,13 @@
2828
#include "commands.h"
2929
#include "protocols/nogaim.h"
3030
#include "help.h"
31+
#include "ipc.h"
3132
#include <signal.h>
3233
#include <stdio.h>
3334
#include <errno.h>
3435

35-
struct bitlbee_child
36-
{
37-
pid_t pid;
38-
int ipc_fd;
39-
gint ipc_inpa;
40-
};
41-
42-
static GSList *child_list = NULL;
43-
4436
gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpointer data );
45-
37+
4638
int bitlbee_daemon_init()
4739
{
4840
#ifdef IPV6
@@ -231,9 +223,6 @@ gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condi
231223
}
232224
}
233225

234-
gboolean bitlbee_io_master_ipc_read( gpointer data, gint source, GaimInputCondition cond );
235-
gboolean bitlbee_io_child_ipc_read( gpointer data, gint source, GaimInputCondition cond );
236-
237226
gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpointer data )
238227
{
239228
size_t size = sizeof( struct sockaddr_in );
@@ -263,35 +252,38 @@ gboolean bitlbee_io_new_client( GIOChannel *source, GIOCondition condition, gpoi
263252
child = g_new0( struct bitlbee_child, 1 );
264253
child->pid = client_pid;
265254
child->ipc_fd = fds[0];
266-
child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, bitlbee_io_master_ipc_read, child );
255+
child->ipc_inpa = gaim_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child );
267256
child_list = g_slist_append( child_list, child );
268257

258+
log_message( LOGLVL_INFO, "Creating new subprocess with pid %d.", client_pid );
259+
260+
/* Close some things we don't need in the parent process. */
261+
close( new_socket );
269262
close( fds[1] );
270263
}
271264
else if( client_pid == 0 )
272265
{
266+
irc_t *irc;
267+
273268
/* Close the listening socket, we're a client. */
274269
close( global.listen_socket );
275270
g_source_remove( global.listen_watch_source_id );
276271

272+
/* Make the connection. */
273+
irc = irc_new( new_socket );
274+
277275
/* We can store the IPC fd there now. */
278276
global.listen_socket = fds[1];
279-
global.listen_watch_source_id = gaim_input_add( fds[1], GAIM_INPUT_READ, bitlbee_io_child_ipc_read, NULL );
277+
global.listen_watch_source_id = gaim_input_add( fds[1], GAIM_INPUT_READ, ipc_child_read, irc );
280278

281279
close( fds[0] );
282280
}
283281
}
284-
285-
if( client_pid == 0 )
282+
else
286283
{
287284
log_message( LOGLVL_INFO, "Creating new connection with fd %d.", new_socket );
288285
irc_new( new_socket );
289286
}
290-
else
291-
{
292-
/* We don't need this one, only the client does. */
293-
close( new_socket );
294-
}
295287

296288
return TRUE;
297289
}
@@ -305,60 +297,3 @@ void bitlbee_shutdown( gpointer data )
305297
/* We'll only reach this point when not running in inetd mode: */
306298
g_main_quit( global.loop );
307299
}
308-
309-
gboolean bitlbee_io_master_ipc_read( gpointer data, gint source, GaimInputCondition cond )
310-
{
311-
struct bitlbee_child *child = data;
312-
char buf[513], *eol;
313-
int size;
314-
315-
size = recv( child->ipc_fd, buf, sizeof( buf ) - 1, MSG_PEEK );
316-
317-
if( size < 0 || ( size < 0 && !sockerr_again() ) )
318-
goto error_abort;
319-
else
320-
buf[size] = 0;
321-
322-
eol = strstr( buf, "\r\n" );
323-
if( eol == NULL )
324-
goto error_abort;
325-
326-
size = recv( child->ipc_fd, buf, eol - buf + 2, 0 );
327-
buf[size] = 0;
328-
329-
if( strcmp( buf, "DIE\r\n" ) == 0 )
330-
{
331-
printf( "Bye...\n" );
332-
exit( 0 );
333-
}
334-
335-
return TRUE;
336-
337-
error_abort:
338-
{
339-
GSList *l;
340-
struct bitlbee_child *c;
341-
342-
for( l = child_list; l; l = l->next )
343-
{
344-
c = l->data;
345-
if( c->ipc_fd == source )
346-
{
347-
close( c->ipc_fd );
348-
gaim_input_remove( c->ipc_inpa );
349-
g_free( c );
350-
351-
child_list = g_slist_remove( child_list, l );
352-
353-
break;
354-
}
355-
}
356-
357-
return FALSE;
358-
}
359-
}
360-
361-
gboolean bitlbee_io_child_ipc_read( gpointer data, gint source, GaimInputCondition cond )
362-
{
363-
return TRUE;
364-
}

commands.c

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,6 @@
3131

3232
#include <string.h>
3333

34-
const command_t commands[] = {
35-
{ "help", 0, cmd_help },
36-
{ "identify", 1, cmd_identify },
37-
{ "register", 1, cmd_register },
38-
{ "drop", 1, cmd_drop },
39-
{ "account", 1, cmd_account },
40-
{ "add", 2, cmd_add },
41-
{ "info", 1, cmd_info },
42-
{ "rename", 2, cmd_rename },
43-
{ "remove", 1, cmd_remove },
44-
{ "block", 1, cmd_block },
45-
{ "allow", 1, cmd_allow },
46-
{ "save", 0, cmd_save },
47-
{ "set", 0, cmd_set },
48-
{ "yes", 0, cmd_yesno },
49-
{ "no", 0, cmd_yesno },
50-
{ "blist", 0, cmd_blist },
51-
{ "nick", 1, cmd_nick },
52-
{ "import_buddies", 1, cmd_import_buddies },
53-
{ "qlist", 0, cmd_qlist },
54-
{ NULL }
55-
};
56-
5734
int root_command_string( irc_t *irc, user_t *u, char *command, int flags )
5835
{
5936
char *cmd[IRC_MAX_ARGS];
@@ -113,7 +90,7 @@ int root_command( irc_t *irc, char *cmd[] )
11390
return( 1 );
11491
}
11592

116-
int cmd_help( irc_t *irc, char **cmd )
93+
static int cmd_help( irc_t *irc, char **cmd )
11794
{
11895
char param[80];
11996
int i;
@@ -142,7 +119,7 @@ int cmd_help( irc_t *irc, char **cmd )
142119
}
143120
}
144121

145-
int cmd_identify( irc_t *irc, char **cmd )
122+
static int cmd_identify( irc_t *irc, char **cmd )
146123
{
147124
storage_status_t status = storage_load( irc->nick, cmd[1], irc );
148125

@@ -165,7 +142,7 @@ int cmd_identify( irc_t *irc, char **cmd )
165142
return( 0 );
166143
}
167144

168-
int cmd_register( irc_t *irc, char **cmd )
145+
static int cmd_register( irc_t *irc, char **cmd )
169146
{
170147
if( global.conf->authmode == AUTHMODE_REGISTERED )
171148
{
@@ -192,7 +169,7 @@ int cmd_register( irc_t *irc, char **cmd )
192169
return( 0 );
193170
}
194171

195-
int cmd_drop( irc_t *irc, char **cmd )
172+
static int cmd_drop( irc_t *irc, char **cmd )
196173
{
197174
storage_status_t status;
198175

@@ -216,7 +193,7 @@ int cmd_drop( irc_t *irc, char **cmd )
216193
}
217194
}
218195

219-
int cmd_account( irc_t *irc, char **cmd )
196+
static int cmd_account( irc_t *irc, char **cmd )
220197
{
221198
account_t *a;
222199

@@ -376,7 +353,7 @@ int cmd_account( irc_t *irc, char **cmd )
376353
return( 1 );
377354
}
378355

379-
int cmd_add( irc_t *irc, char **cmd )
356+
static int cmd_add( irc_t *irc, char **cmd )
380357
{
381358
account_t *a;
382359

@@ -416,7 +393,7 @@ int cmd_add( irc_t *irc, char **cmd )
416393
return( 0 );
417394
}
418395

419-
int cmd_info( irc_t *irc, char **cmd )
396+
static int cmd_info( irc_t *irc, char **cmd )
420397
{
421398
struct gaim_connection *gc;
422399
account_t *a;
@@ -453,7 +430,7 @@ int cmd_info( irc_t *irc, char **cmd )
453430
return( 0 );
454431
}
455432

456-
int cmd_rename( irc_t *irc, char **cmd )
433+
static int cmd_rename( irc_t *irc, char **cmd )
457434
{
458435
user_t *u;
459436

@@ -494,7 +471,7 @@ int cmd_rename( irc_t *irc, char **cmd )
494471
return( 0 );
495472
}
496473

497-
int cmd_remove( irc_t *irc, char **cmd )
474+
static int cmd_remove( irc_t *irc, char **cmd )
498475
{
499476
user_t *u;
500477
char *s;
@@ -516,7 +493,7 @@ int cmd_remove( irc_t *irc, char **cmd )
516493
return( 0 );
517494
}
518495

519-
int cmd_block( irc_t *irc, char **cmd )
496+
static int cmd_block( irc_t *irc, char **cmd )
520497
{
521498
struct gaim_connection *gc;
522499
account_t *a;
@@ -557,7 +534,7 @@ int cmd_block( irc_t *irc, char **cmd )
557534
return( 0 );
558535
}
559536

560-
int cmd_allow( irc_t *irc, char **cmd )
537+
static int cmd_allow( irc_t *irc, char **cmd )
561538
{
562539
struct gaim_connection *gc;
563540
account_t *a;
@@ -599,7 +576,7 @@ int cmd_allow( irc_t *irc, char **cmd )
599576
return( 0 );
600577
}
601578

602-
int cmd_yesno( irc_t *irc, char **cmd )
579+
static int cmd_yesno( irc_t *irc, char **cmd )
603580
{
604581
query_t *q = NULL;
605582
int numq = 0;
@@ -639,7 +616,7 @@ int cmd_yesno( irc_t *irc, char **cmd )
639616
return( 1 );
640617
}
641618

642-
int cmd_set( irc_t *irc, char **cmd )
619+
static int cmd_set( irc_t *irc, char **cmd )
643620
{
644621
if( cmd[1] && cmd[2] )
645622
{
@@ -665,7 +642,7 @@ int cmd_set( irc_t *irc, char **cmd )
665642
return( 0 );
666643
}
667644

668-
int cmd_save( irc_t *irc, char **cmd )
645+
static int cmd_save( irc_t *irc, char **cmd )
669646
{
670647
if( storage_save( irc, TRUE ) == STORAGE_OK )
671648
irc_usermsg( irc, "Configuration saved" );
@@ -675,7 +652,7 @@ int cmd_save( irc_t *irc, char **cmd )
675652
return( 0 );
676653
}
677654

678-
int cmd_blist( irc_t *irc, char **cmd )
655+
static int cmd_blist( irc_t *irc, char **cmd )
679656
{
680657
int online = 0, away = 0, offline = 0;
681658
user_t *u;
@@ -721,7 +698,7 @@ int cmd_blist( irc_t *irc, char **cmd )
721698
return( 0 );
722699
}
723700

724-
int cmd_nick( irc_t *irc, char **cmd )
701+
static int cmd_nick( irc_t *irc, char **cmd )
725702
{
726703
account_t *a;
727704

@@ -757,7 +734,7 @@ int cmd_nick( irc_t *irc, char **cmd )
757734
return( 1 );
758735
}
759736

760-
int cmd_qlist( irc_t *irc, char **cmd )
737+
static int cmd_qlist( irc_t *irc, char **cmd )
761738
{
762739
query_t *q = irc->queries;
763740
int num;
@@ -779,7 +756,7 @@ int cmd_qlist( irc_t *irc, char **cmd )
779756
return( 0 );
780757
}
781758

782-
int cmd_import_buddies( irc_t *irc, char **cmd )
759+
static int cmd_import_buddies( irc_t *irc, char **cmd )
783760
{
784761
struct gaim_connection *gc;
785762
account_t *a;
@@ -831,3 +808,26 @@ int cmd_import_buddies( irc_t *irc, char **cmd )
831808

832809
return( 0 );
833810
}
811+
812+
const command_t commands[] = {
813+
{ "help", 0, cmd_help, 0 },
814+
{ "identify", 1, cmd_identify, 0 },
815+
{ "register", 1, cmd_register, 0 },
816+
{ "drop", 1, cmd_drop, 0 },
817+
{ "account", 1, cmd_account, 0 },
818+
{ "add", 2, cmd_add, 0 },
819+
{ "info", 1, cmd_info, 0 },
820+
{ "rename", 2, cmd_rename, 0 },
821+
{ "remove", 1, cmd_remove, 0 },
822+
{ "block", 1, cmd_block, 0 },
823+
{ "allow", 1, cmd_allow, 0 },
824+
{ "save", 0, cmd_save, 0 },
825+
{ "set", 0, cmd_set, 0 },
826+
{ "yes", 0, cmd_yesno, 0 },
827+
{ "no", 0, cmd_yesno, 0 },
828+
{ "blist", 0, cmd_blist, 0 },
829+
{ "nick", 1, cmd_nick, 0 },
830+
{ "import_buddies", 1, cmd_import_buddies, 0 },
831+
{ "qlist", 0, cmd_qlist, 0 },
832+
{ NULL }
833+
};

0 commit comments

Comments
 (0)