· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Asterisk Source/Manager Interface

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.headersm.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;x0);x++) {
      • if ((s->writeperm & actionsx.authority) == actionsx.authority) {
        • if (actionsx.func(s, m))
          • return -1;
      • } else {
        • send_error(s, "Permission denied");
      • }
      • break;
    • }
    • if (x >= sizeof(actions) / sizeof(actions0))
      • send_error(s, "Invalid/unknown command");
  • }
  • return 0;

ID
Password
Join
Deprive a mirror of its silver and even the Czar won't see his face.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-06-29 08:45:04
Processing time 0.0072 sec