be read until either the current action finishes or get_input() obtains the session
lock.
*/
-void astman_send_error(struct mansession *s, struct message *m, char *error)
-{
- char *id = astman_get_header(m,"ActionID");
-
- astman_append(s, "Response: Error\r\n");
- if (!ast_strlen_zero(id))
- astman_append(s, "ActionID: %s\r\n", id);
- astman_append(s, "Message: %s\r\n\r\n", error);
-}
+/*! \brief send a response with an optional message,
+ * and terminate it with an empty line.
+ * m is used only to grab the 'ActionID' field.
+ *
+ * Use the explicit constant MSG_MOREDATA to remove the empty line.
+ * XXX MSG_MOREDATA should go to a header file.
+ */
+#define MSG_MOREDATA ((char *)astman_send_response)
void astman_send_response(struct mansession *s, struct message *m, char *resp, char *msg)
{
char *id = astman_get_header(m,"ActionID");
astman_append(s, "Response: %s\r\n", resp);
if (!ast_strlen_zero(id))
astman_append(s, "ActionID: %s\r\n", id);
- if (msg)
+ if (msg == MSG_MOREDATA)
+ return;
+ else if (msg)
astman_append(s, "Message: %s\r\n\r\n", msg);
else
astman_append(s, "\r\n");
}
+void astman_send_error(struct mansession *s, struct message *m, char *error)
+{
+ astman_send_response(s, m, "Error", error);
+}
+
void astman_send_ack(struct mansession *s, struct message *m, char *msg)
{
astman_send_response(s, m, "Success", msg);
}
+static void astman_start_ack(struct mansession *s, struct message *m)
+{
+ astman_send_response(s, m, "Success", MSG_MOREDATA);
+}
+
/*! Tells you if smallstr exists inside bigstr
which is delim by delim and uses no buf or stringsep
ast_instring("this|that|more","this",'|') == 1;
int lineno = 0;
char *category=NULL;
struct ast_variable *v;
- char idText[256] = "";
- char *id = astman_get_header(m, "ActionID");
-
- if (!ast_strlen_zero(id))
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
if (ast_strlen_zero(fn)) {
astman_send_error(s, m, "Filename not specified");
astman_send_error(s, m, "Config file not found");
return 0;
}
- astman_append(s, "Response: Success\r\n%s", idText);
+ astman_start_ack(s, m);
while ((category = ast_category_browse(cfg, category))) {
lineno = 0;
astman_append(s, "Category-%06d: %s\r\n", catcount, category);
char *sfn = astman_get_header(m, "SrcFilename");
char *dfn = astman_get_header(m, "DstFilename");
int res;
- char idText[256] = "";
- char *id = astman_get_header(m, "ActionID");
char *rld = astman_get_header(m, "Reload");
- if (!ast_strlen_zero(id))
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
-
if (ast_strlen_zero(sfn) || ast_strlen_zero(dfn)) {
astman_send_error(s, m, "Filename not specified");
return 0;
astman_send_error(s, m, "Save of config failed");
return 0;
}
- astman_append(s, "Response: Success\r\n%s\r\n", idText);
+ astman_send_ack(s, m, NULL);
if (!ast_strlen_zero(rld)) {
if (ast_true(rld))
rld = NULL;
static int action_listcommands(struct mansession *s, struct message *m)
{
struct manager_action *cur;
- char idText[256] = "";
char temp[BUFSIZ];
- char *id = astman_get_header(m,"ActionID");
- if (!ast_strlen_zero(id))
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
- astman_append(s, "Response: Success\r\n%s", idText);
+ astman_start_ack(s, m);
ast_mutex_lock(&actionlock);
for (cur = first_action; cur; cur = cur->next) { /* Walk the list of actions */
if ((s->writeperm & cur->authority) == cur->authority)
char *authtype = astman_get_header(m, "AuthType");
if (!strcasecmp(authtype, "MD5")) {
- char *id = astman_get_header(m,"ActionID");
if (ast_strlen_zero(s->challenge))
snprintf(s->challenge, sizeof(s->challenge), "%ld", ast_random());
ast_mutex_lock(&s->__lock);
- astman_append(s, "Response: Success\r\n");
- if (!ast_strlen_zero(id))
- astman_append(s, "ActionID: %s\r\n", id);
+ astman_start_ack(s, m);
astman_append(s, "Challenge: %s\r\n\r\n", s->challenge);
ast_mutex_unlock(&s->__lock);
} else {
struct ast_channel *c = NULL;
char *name = astman_get_header(m, "Channel");
char *varname = astman_get_header(m, "Variable");
- char *id = astman_get_header(m,"ActionID");
char *varval;
char workspace[1024];
if (c)
ast_channel_unlock(c);
- astman_append(s, "Response: Success\r\n"
- "Variable: %s\r\nValue: %s\r\n", varname, varval);
- if (!ast_strlen_zero(id))
- astman_append(s, "ActionID: %s\r\n",id);
- astman_append(s, "\r\n");
+ astman_start_ack(s, m);
+ astman_append(s, "Variable: %s\r\nValue: %s\r\n\r\n", varname, varval);
return 0;
}
/* Needs documentation... */
static int action_status(struct mansession *s, struct message *m)
{
- char *id = astman_get_header(m,"ActionID");
char *name = astman_get_header(m,"Channel");
- char idText[256] = "";
struct ast_channel *c;
char bridge[256];
struct timeval now = ast_tvnow();
long elapsed_seconds = 0;
int all = ast_strlen_zero(name); /* set if we want all channels */
+ char *id = astman_get_header(m,"ActionID");
+ char idText[256] = "";
- astman_send_ack(s, m, "Channel status will follow");
if (!ast_strlen_zero(id))
snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
+
+ astman_send_ack(s, m, "Channel status will follow");
if (all)
c = ast_channel_walk_locked(NULL);
else {
static int action_mailboxstatus(struct mansession *s, struct message *m)
{
char *mailbox = astman_get_header(m, "Mailbox");
- char *id = astman_get_header(m,"ActionID");
- char idText[256] = "";
int ret;
if (ast_strlen_zero(mailbox)) {
astman_send_error(s, m, "Mailbox not specified");
return 0;
}
- if (!ast_strlen_zero(id))
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
ret = ast_app_has_voicemail(mailbox, NULL);
- astman_append(s, "Response: Success\r\n"
- "%s"
- "Message: Mailbox Status\r\n"
- "Mailbox: %s\r\n"
- "Waiting: %d\r\n\r\n", idText, mailbox, ret);
+ astman_start_ack(s, m);
+ astman_append(s, "Message: Mailbox Status\r\n"
+ "Mailbox: %s\r\n"
+ "Waiting: %d\r\n\r\n", mailbox, ret);
return 0;
}
static int action_mailboxcount(struct mansession *s, struct message *m)
{
char *mailbox = astman_get_header(m, "Mailbox");
- char *id = astman_get_header(m,"ActionID");
- char idText[256] = "";
int newmsgs = 0, oldmsgs = 0;
if (ast_strlen_zero(mailbox)) {
astman_send_error(s, m, "Mailbox not specified");
return 0;
}
ast_app_inboxcount(mailbox, &newmsgs, &oldmsgs);
- if (!ast_strlen_zero(id)) {
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n",id);
- }
- astman_append(s, "Response: Success\r\n"
- "%s"
+ astman_start_ack(s, m);
+ astman_append(s,
"Message: Mailbox Message Count\r\n"
"Mailbox: %s\r\n"
"NewMessages: %d\r\n"
"OldMessages: %d\r\n"
"\r\n",
- idText,mailbox, newmsgs, oldmsgs);
+ mailbox, newmsgs, oldmsgs);
return 0;
}
{
char *exten = astman_get_header(m, "Exten");
char *context = astman_get_header(m, "Context");
- char *id = astman_get_header(m,"ActionID");
- char idText[256] = "";
char hint[256] = "";
int status;
if (ast_strlen_zero(exten)) {
context = "default";
status = ast_extension_state(NULL, context, exten);
ast_get_hint(hint, sizeof(hint) - 1, NULL, 0, NULL, context, exten);
- if (!ast_strlen_zero(id)) {
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
- }
- astman_append(s, "Response: Success\r\n"
- "%s"
- "Message: Extension Status\r\n"
- "Exten: %s\r\n"
- "Context: %s\r\n"
- "Hint: %s\r\n"
- "Status: %d\r\n\r\n",
- idText,exten, context, hint, status);
+ astman_start_ack(s, m);
+ astman_append(s, "Message: Extension Status\r\n"
+ "Exten: %s\r\n"
+ "Context: %s\r\n"
+ "Hint: %s\r\n"
+ "Status: %d\r\n\r\n",
+ exten, context, hint, status);
return 0;
}