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