== AsteriskSource/ManagerInterface == {{{ static struct action { char *action; int authority; int (*func)(struct mansession *s, struct message *m); } actions[] = { { "Ping", 0, action_ping }, { "Logoff", 0, action_logoff }, { "Hangup", EVENT_FLAG_CALL, action_hangup }, { "Status", EVENT_FLAG_CALL, action_status }, { "Redirect", EVENT_FLAG_CALL, action_redirect }, { "Originate", EVENT_FLAG_CALL, action_originate }, }; }}} * int init_manager(void) * cfg = ast_load("manager.conf"); * val = ast_variable_retrieve(cfg, "general", "enabled"); * val = ast_variable_retrieve(cfg, "general", "portno") * ba.sin_family = AF_INET; * ba.sin_port = htons(portno); * memset(&ba.sin_addr, 0, sizeof(ba.sin_addr)); * val = ast_variable_retrieve(cfg, "general", "bindaddr") * if (asock < 0) { * asock = socket(AF_INET, SOCK_STREAM, 0); * setsockopt(asock, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x)); * bind(asock, &ba, sizeof(ba) * listen(asock, 2) * pthread_create(&t, NULL, accept_thread, NULL); * } * ast_destroy(cfg); * return 0; * static void *accept_thread(void *ignore) * for (;;) { * as = accept(asock, &sin, &sinlen); * s = malloc(sizeof(struct mansession)); * s->fd = as; * pthread_create(&t, NULL, session_do, s) * static void *session_do(void *data) * ast_cli(s->fd, "Asterisk Call Manager/1.0\r\n"); * for (;;) { * res = get_input(s, m.headers[m.hdrcount]); * process_message(s, &m) * } * if (s->authenticated) { * } else { * } * destroy_session(s); * return NULL; * static int process_message(struct mansession *s, struct message *m) * strncpy(action, get_header(m, "Action"), sizeof(action)); * if (!s->authenticated) { * if (!strcasecmp(action, "Login")) { * if (authenticate(s, m)) { * send_error(s, "Authentication failed"); * return -1; * } else { * s->authenticated = 1; * send_ack(s, "Authentication accepted"); * } * } else * send_error(s, "Authentication Required"); * } else { * for (x=0;xwriteperm & actions[x].authority) == actions[x].authority) { * if (actions[x].func(s, m)) * return -1; * } else { * send_error(s, "Permission denied"); * } * break; * } * if (x >= sizeof(actions) / sizeof(actions[0])) * send_error(s, "Invalid/unknown command"); * } * return 0;