1 #include "event.h"
2
event(const struct buddy * b,const struct bud_utrec * u,short write)3 void event(const struct buddy *b, const struct bud_utrec *u, short write){
4 char *status_msg=NULL, *wr_msg=NULL, *extra_cmd=NULL;
5
6 if(u->verified==B_LOGGED_IN || u->verified==B_LOGGED_OUT){
7 if(b->conf) {
8 status_msg=bud_expand_fmt(u, b->conf->status_msg);
9 if(b->conf->write_users && write != -1)
10 wr_msg=bud_expand_fmt(u, b->conf->buddy_msg);
11 extra_cmd=bud_expand_fmt(u, b->conf->eventcmd);
12 } else {
13 status_msg=bud_expand_fmt(u, g_config.status_msg);
14 if(write > 0) wr_msg=bud_expand_fmt(u, g_config.buddy_msg);
15 extra_cmd=bud_expand_fmt(u, g_config.eventcmd);
16 }
17 }
18
19 if(status_msg) {
20 fprintf(stdout, "%s", status_msg);
21 free(status_msg);
22 }
23 if(wr_msg) {
24 if(u->verified==B_LOGGED_IN)
25 wri_do_write(u->u->ut_user, u->u->ut_line, wr_msg);
26 free(wr_msg);
27 }
28 if(extra_cmd) {
29 if(u->verified==B_LOGGED_IN)
30 fork_and_exec(extra_cmd);
31 free(extra_cmd);
32 }
33 }
34
fork_and_exec(const char * command)35 pid_t fork_and_exec(const char *command){
36 int cmd_result;
37 pid_t child = fork();
38 switch(child){
39 case 0: // child
40 cmd_result = system(command);
41 if(cmd_result==-1) perror("fork_and_exec");
42 if(cmd_result!=0){
43 fprintf(stderr, "warning: system(%s) returned %d\n",
44 command, cmd_result);
45 }
46 exit(cmd_result);
47 break;
48 case -1:
49 perror("unable to fork in fork_and_exec");
50 break;
51 default: break;
52 }
53 return child;
54 }
55