From: Eric W. <war...@us...> - 2001-10-15 19:52:47
|
Update of /cvsroot/gaim/gaim/src In directory usw-pr-cvs1:/tmp/cvs-serv5281/src Modified Files: aim.c core.h module.c perl.c Log Message: malsyned's patch for args in perl. Index: aim.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/aim.c,v retrieving revision 1.166 retrieving revision 1.167 diff -u -d -r1.166 -r1.167 --- aim.c 2001/10/14 05:52:36 1.166 +++ aim.c 2001/10/15 19:52:44 1.167 @@ -569,6 +569,7 @@ signal(SIGHUP, sighandler); signal(SIGINT, sighandler); signal(SIGTERM, sighandler); + signal(SIGQUIT, sighandler); signal(SIGPIPE, SIG_IGN); #endif Index: core.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/core.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- core.h 2001/10/14 11:36:36 1.8 +++ core.h 2001/10/15 19:52:44 1.9 @@ -169,7 +169,7 @@ #ifdef USE_PERL extern void perl_autoload(); extern void perl_end(); -extern int perl_event(char *, char *); +extern int perl_event(enum gaim_event, void *, void *, void *, void *); extern int perl_load_file(char *); extern void unload_perl_scripts(); extern void list_perl_scripts(); @@ -186,6 +186,7 @@ extern void remove_all_plugins(); #endif extern int plugin_event(enum gaim_event, void *, void *, void *, void *); +extern char *event_name(enum gaim_event); /* Functions in server.c */ extern void serv_got_update(struct gaim_connection *, char *, int, int, time_t, time_t, int, gushort); Index: module.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/module.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- module.c 2001/10/12 22:31:12 1.11 +++ module.c 2001/10/15 19:52:44 1.12 @@ -175,7 +175,7 @@ void gaim_plugin_unload(GModule *handle) { GList *pl = plugins; - struct gaim_plugin *p; + struct gaim_plugin *p = NULL; void (*gaim_plugin_remove)(); while (pl) { @@ -269,7 +269,7 @@ #endif /* GAIM_PLUGINS */ -static char *event_name(enum gaim_event event) +char *event_name(enum gaim_event event) { static char buf[128]; switch (event) { @@ -468,9 +468,6 @@ int plugin_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4) { -#ifdef USE_PERL - char buf[BUF_LONG]; -#endif #ifdef GAIM_PLUGINS GList *c = callbacks; struct gaim_callback *g; @@ -487,7 +484,7 @@ void (*four)(void *, void *, void *, void *, void *); g = (struct gaim_callback *)c->data; - if (g->event == event && g->function !=NULL) { + if (g->event == event && g->function != NULL) { switch (event) { /* no args */ @@ -553,81 +550,7 @@ } #endif /* GAIM_PLUGINS */ #ifdef USE_PERL - switch (event) { - case event_signon: - case event_signoff: - g_snprintf(buf, sizeof buf, "%lu", (unsigned long)arg1); - break; - case event_away: - g_snprintf(buf, sizeof buf, "%lu %s", (unsigned long)arg1, - ((struct gaim_connection *)arg1)->away ? - ((struct gaim_connection *)arg1)->away : ""); - break; - case event_im_recv: - g_snprintf(buf, sizeof buf, "%lu \"%s\" %s", (unsigned long)arg1, - *(char **)arg2 ? *(char **)arg2 : "(null)", - *(char **)arg3 ? *(char **)arg3 : "(null)"); - break; - case event_im_send: - g_snprintf(buf, sizeof buf, "%lu \"%s\" %s", (unsigned long)arg1, - (char *)arg2, *(char **)arg3 ? *(char **)arg3 : "(null)"); - break; - case event_buddy_signon: - case event_buddy_signoff: - case event_set_info: - case event_buddy_away: - case event_buddy_back: - case event_buddy_idle: - case event_buddy_unidle: - g_snprintf(buf, sizeof buf, "%lu \"%s\"", (unsigned long)arg1, (char *)arg2); - break; - case event_chat_invited: - g_snprintf(buf, sizeof buf, "%lu \"%s\" \"%s\" %s", (unsigned long)arg1, - (char *)arg2, (char *)arg3, arg4 ? (char *)arg4 : ""); - break; - case event_chat_join: - case event_chat_buddy_join: - case event_chat_buddy_leave: - g_snprintf(buf, sizeof buf, "%lu %d \"%s\"", (unsigned long)arg1, - (int)arg2, (char *)arg3); - break; - case event_chat_leave: - g_snprintf(buf, sizeof buf, "%lu %d", (unsigned long)arg1, (int)arg2); - break; - case event_chat_recv: - g_snprintf(buf, sizeof buf, "%lu %d \"%s\" %s", (unsigned long)arg1, - (int)arg2, (char *)arg3, (char *)arg4 ? (char *)arg4 : "(null)"); - break; - case event_chat_send_invite: - g_snprintf(buf, sizeof buf, "%lu %d \"%s\" %s", (unsigned long)arg1, - (int)arg2, (char *)arg3, *(char **)arg4 ? *(char **)arg4 : "(null)"); - break; - case event_chat_send: - g_snprintf(buf, sizeof buf, "%lu %d %s", (unsigned long)arg1, (int)arg2, - *(char **)arg3 ? *(char **)arg3 : "(null)"); - break; - case event_warned: - g_snprintf(buf, sizeof buf, "%lu \"%s\" %d", (unsigned long)arg1, - arg2 ? (char *)arg2 : "", (int)arg3); - break; - case event_quit: - buf[0] = 0; - break; - case event_new_conversation: - g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg1); - break; - case event_im_displayed_sent: - g_snprintf(buf, sizeof buf, "%lu \"%s\" %s", (unsigned long)arg1, - (char *)arg2, *(char **)arg3 ? *(char **)arg3 : "(null)"); - break; - case event_im_displayed_rcvd: - g_snprintf(buf, sizeof buf, "%lu \"%s\" %s", (unsigned long)arg1, - (char *)arg2, (char *)arg3 ? (char *)arg3 : "(null)"); - break; - default: - return 0; - } - return perl_event(event_name(event), buf); + return perl_event(event, arg1, arg2, arg3, arg4); #else return 0; #endif Index: perl.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/perl.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- perl.c 2001/10/12 06:59:25 1.60 +++ perl.c 2001/10/15 19:52:44 1.61 @@ -131,24 +131,28 @@ static SV *execute_perl(char *function, char *args) { static char *perl_cmd = NULL; + SV *i; if (perl_cmd) g_free(perl_cmd); - perl_cmd = g_malloc(strlen(function) + (strlen(args) * 2) + 2 + 10); - sprintf(perl_cmd, "&%s('%s')", function, escape_quotes(args)); + perl_cmd = g_malloc(strlen(function) + strlen(args) + 4); + sprintf(perl_cmd, "&%s(%s)", function, args); #ifndef HAVE_PERL_EVAL_PV - return (perl_eval_pv(perl_cmd, TRUE)); + i = (perl_eval_pv(perl_cmd, TRUE)); #else - return (Perl_eval_pv(perl_cmd, TRUE)); + i = (Perl_eval_pv(perl_cmd, TRUE)); #endif + return i; } int perl_load_file(char *script_name) { + char *name = g_strdup_printf("'%s'", escape_quotes(script_name)); SV *return_val; if (my_perl == NULL) perl_init(); - return_val = execute_perl("load_file", script_name); + return_val = execute_perl("load_file", name); + g_free(name); return SvNV (return_val); } @@ -643,20 +647,141 @@ XSRETURN(0); } -int perl_event(char *event, char *args) +int perl_event(enum gaim_event event, void *arg1, void *arg2, void *arg3, void *arg4) { + char *buf = NULL; GList *handler; struct _perl_event_handlers *data; SV *handler_return; + switch (event) { + case event_signon: + case event_signoff: + buf = g_strdup_printf("'%lu'", (unsigned long)arg1); + break; + case event_away: + buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, + ((struct gaim_connection *)arg1)->away ? + escape_quotes(((struct gaim_connection *)arg1)->away) : ""); + break; + case event_im_recv: + { + char *tmp = *(char **)arg2 ? g_strdup(escape_quotes(*(char **)arg2)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, + *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); + g_free(tmp); + } + break; + case event_im_send: + { + char *tmp = arg2 ? g_strdup(escape_quotes(arg2)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp, + *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); + g_free(tmp); + } + break; + case event_buddy_signon: + case event_buddy_signoff: + case event_set_info: + case event_buddy_away: + case event_buddy_back: + case event_buddy_idle: + case event_buddy_unidle: + buf = g_strdup_printf("'%lu','%s'", (unsigned long)arg1, escape_quotes(arg2)); + break; + case event_chat_invited: + { + char *tmp2, *tmp3, *tmp4; + tmp2 = g_strdup(escape_quotes(arg2)); + tmp3 = g_strdup(escape_quotes(arg3)); + tmp4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%s','%s','%s'", (unsigned long)arg1, tmp2, tmp3, tmp4); + g_free(tmp2); + g_free(tmp3); + g_free(tmp4); + } + break; + case event_chat_join: + case event_chat_buddy_join: + case event_chat_buddy_leave: + buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, + escape_quotes(arg3)); + break; + case event_chat_leave: + buf = g_strdup_printf("'%lu','%d'", (unsigned long)arg1, (int)arg2); + break; + case event_chat_recv: + { + char *t3, *t4; + t3 = g_strdup(escape_quotes(arg3)); + t4 = arg4 ? g_strdup(escape_quotes(arg4)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); + g_free(t3); + g_free(t4); + } + break; + case event_chat_send_invite: + { + char *t3, *t4; + t3 = g_strdup(escape_quotes(arg3)); + t4 = *(char **)arg4 ? g_strdup(escape_quotes(*(char **)arg4)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%d','%s','%s'", (unsigned long)arg1, (int)arg2, t3, t4); + g_free(t3); + g_free(t4); + } + break; + case event_chat_send: + buf = g_strdup_printf("'%lu','%d','%s'", (unsigned long)arg1, (int)arg2, + *(char **)arg3 ? escape_quotes(*(char **)arg3) : ""); + break; + case event_warned: + buf = g_strdup_printf("'%lu','%s','%d'", (unsigned long)arg1, + arg2 ? escape_quotes(arg2) : "", (int)arg3); + break; + case event_quit: + buf = g_malloc0(1); + break; + case event_new_conversation: + buf = g_strdup_printf("'%s'", escape_quotes(arg1)); + break; + case event_im_displayed_sent: + { + char *tmp2, *tmp3; + tmp2 = g_strdup(escape_quotes(arg2)); + tmp3 = *(char **)arg3 ? g_strdup(escape_quotes(*(char **)arg3)) : g_malloc0(1); + buf = g_strdup_printf("'%lu','%s','%s'", (unsigned long)arg1, tmp2, tmp3); + g_free(tmp2); + g_free(tmp3); + } + break; + case event_im_displayed_rcvd: + { + char *tmp2, *tmp3; + tmp2 = g_strdup(escape_quotes(arg2)); + tmp3 = arg3 ? g_strdup(escape_quotes(arg3)) : g_malloc0(1); + buf = g_strdup_printf("%lu \"%s\" %s", (unsigned long)arg1, tmp2, tmp3); + g_free(tmp2); + g_free(tmp3); + } + break; + default: + return 0; + } + for (handler = perl_event_handlers; handler != NULL; handler = handler->next) { data = handler->data; - if (!strcmp(event, data->event_type)) { - handler_return = execute_perl(data->handler_name, args); - if (SvIV(handler_return)) + if (!strcmp(event_name(event), data->event_type)) { + handler_return = execute_perl(data->handler_name, buf); + if (SvIV(handler_return)) { + if (buf) + g_free(buf); return SvIV(handler_return); + } } } + + if (buf) + g_free(buf); return 0; } |