/* application entry point for Pickup() */ static int pickup_exec(struct ast_channel *chan, const char *data) { char *tmp; char *exten; char *context; if (ast_strlen_zero(data)) { return pickup_by_group(chan) ? 0 : -1; } /* Parse extension (and context if there) */ tmp = ast_strdupa(data); while (!ast_strlen_zero(tmp) && (exten = strsep(&tmp, "&"))) { if ((context = strchr(exten, '@'))) *context++ = '\0'; if (!ast_strlen_zero(context) && !strcasecmp(context, PICKUPMARK)) { if (!pickup_by_mark(chan, exten)) { /* Pickup successful. Stop the dialplan this channel is a zombie. */ return -1; } } else { if (ast_strlen_zero(context)) { context = (char *) ast_channel_context(chan); } if (!pickup_by_exten(chan, exten, context)) { /* Pickup successful. Stop the dialplan this channel is a zombie. */ return -1; } } ast_log(LOG_NOTICE, "No target channel found for %s@%s.\n", exten, context); } /* Pickup failed. Keep going in the dialplan. */ return 0; }
/* Main application entry point */ static int pickup_exec(struct ast_channel *chan, void *data) { int res = 0; struct ast_module_user *u = NULL; char *tmp = ast_strdupa(data); char *exten = NULL, *context = NULL; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "Pickup requires an argument (extension)!\n"); return -1; } u = ast_module_user_add(chan); /* Parse extension (and context if there) */ while (!ast_strlen_zero(tmp) && (exten = strsep(&tmp, "&"))) { if ((context = strchr(exten, '@'))) *context++ = '\0'; if (context && !strcasecmp(context, PICKUPMARK)) { if (!pickup_by_mark(chan, exten)) break; } else { if (!pickup_by_exten(chan, exten, context ? context : chan->context)) break; } ast_log(LOG_NOTICE, "No target channel found for %s.\n", exten); } ast_module_user_remove(u); return res; }