cmd.c
author Myhailo Danylenko <isbear@ukrpost.net>
Thu, 30 Jun 2011 16:10:03 +0300
changeset 29 5b0349cbc6a7
parent 24 592b7f42ba54
child 30 b60076874691
permissions -rw-r--r--
Remove api.h
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * cmd.c                -- Send shell command output as messages
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyrigth (C) 2009      Myhailo Danylenko <isbear@ukrpost.net>
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <stdlib.h>
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <glib.h>
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <unistd.h>
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <errno.h>
18
887d772326a0 Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    26
#include <string.h>
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
8
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    28
#include <mcabber/commands.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    29
#include <mcabber/logprint.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    30
#include <mcabber/utils.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    31
#include <mcabber/settings.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    32
#include <mcabber/hbuf.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    33
#include <mcabber/xmpp.h>
5771827a4976 Change mcabber headers naming convention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 7
diff changeset
    34
#include <mcabber/roster.h>
15
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    35
#include <mcabber/modules.h>
18
887d772326a0 Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    36
#include <mcabber/hooks.h>
15
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    37
16
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    38
#include "config.h"
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    39
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    40
void mcmd_init   (void);
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    41
void mcmd_uninit (void);
15
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    42
16
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    43
#define DESCRIPTION ( \
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    44
	"Sends output of command to buddy\n" \
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    45
	"Recognizes options cmd_shell, cmd_redirect_stderr, cmd_header and cmd_header_inline\n" \
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    46
	"Provides command /cmd" )
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    47
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    48
static module_info_t info_cmd_dev = {
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    49
	.branch          = "dev",
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    50
	.api             = 20,
16
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    51
	.version         = PROJECT_VERSION,
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    52
	.description     = DESCRIPTION,
15
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    53
	.requires        = NULL,
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    54
	.init            = mcmd_init,
891fc0779d50 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    55
	.uninit          = mcmd_uninit,
16
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    56
	.next            = NULL,
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    57
};
19d13d97b3a1 Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    58
21
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    59
module_info_t info_cmd = {
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    60
	.branch          = "0.10.1",
21
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    61
	.api             = 1,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    62
	.version         = PROJECT_VERSION,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    63
	.description     = DESCRIPTION,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    64
	.requires        = NULL,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    65
	.init            = mcmd_init,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    66
	.uninit          = mcmd_uninit,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    67
	.next            = &info_cmd_dev,
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    68
};
29491118c0dd Add info struct for stable
Myhailo Danylenko <isbear@ukrpost.net>
parents: 20
diff changeset
    69
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
typedef struct {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
	gchar      *jid;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
	GString    *input;
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    73
	gchar      *subject;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    74
	guint       seq;
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
	guint       source;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
	GIOChannel *channel;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
} cmd_cb_t;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
    79
#ifdef MCABBER_API_HAVE_CMD_ID
20
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
    80
static gpointer mcmd_cmid = NULL;
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
    81
#endif
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
    82
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    83
static GSList *cmd_channels = NULL;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    84
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    85
static gboolean is_room (const gchar *jid)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    86
{
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    87
	return roster_find (jid, jidsearch, ROSTER_TYPE_ROOM) ? TRUE : FALSE;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    88
}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    89
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    90
static gboolean cmd_send_msg (const gchar *to, const gchar *subject, const gchar *body)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    91
{
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    92
	gboolean room    = is_room (to);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    93
	gpointer xep184  = NULL;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    94
	gint     crypted;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    95
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    96
	xmpp_send_msg (to, body, room ? ROSTER_TYPE_ROOM : ROSTER_TYPE_USER, room ? NULL : subject, FALSE /* ? */, &crypted, LM_MESSAGE_SUB_TYPE_NOT_SET, &xep184);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    97
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
    98
	if (crypted == -1) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
    99
		scr_log_print (LPRINT_LOGNORM, "cmd: Encryption error. Message not sent.");
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   100
		return FALSE;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   101
	}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   102
6
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   103
	if (!room) {
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   104
		if (subject) {
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   105
			gchar *hbody = g_strdup_printf ("[%s]\n%s", subject, body);
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   106
			hk_message_out (to, NULL, 0, hbody, crypted, xep184);
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   107
			g_free (hbody);
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   108
		} else
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   109
			hk_message_out (to, NULL, 0, body, crypted, xep184);
8e64b6d3302e Fix outgoing message header displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 5
diff changeset
   110
	}
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   111
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   112
	return TRUE;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   113
}
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
static gboolean cmd_reader (GIOChannel *channel, GIOCondition condition, gpointer data)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
	cmd_cb_t *cb = (cmd_cb_t *) data;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   118
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
	if (condition & (G_IO_IN|G_IO_PRI)) {
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   120
		GIOStatus     chstat;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   121
		static gchar  buf[HBB_BLOCKSIZE];
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   122
		gsize         endpos;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   123
		GError       *error              = NULL;
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   125
		chstat = g_io_channel_read_chars (channel, buf, HBB_BLOCKSIZE, &endpos, &error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   126
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   127
		if (error) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   128
			scr_log_print (LPRINT_DEBUG, "cmd: Reading error: %s.", error -> message);
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   129
			g_clear_error (&error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   130
		}
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
		if (chstat == G_IO_STATUS_ERROR || chstat == G_IO_STATUS_EOF) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
			cb->source = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
			return FALSE; // XXX
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
		}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
		
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
		if (endpos) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
			GString *input = cb->input;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
			gsize    bread   = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
			gsize    written = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
			gchar   *utf8    = NULL;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   142
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   143
			g_string_append_len (input, buf, endpos);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   144
11
fafc922963f5 Use xmpp_is_online if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 8
diff changeset
   145
			if (!xmpp_is_online ()) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   146
				scr_log_print (LPRINT_LOGNORM, "cmd: Connection is not ready, delaying data");
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
				return TRUE;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
			}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
			// usual g_locale_to_utf8 seem to be unable to detect locale charset
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
			// maybe, proper solution will be to call setlocale on module loading,
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
			// but mcabber already does this, and I do not want to mess with it
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   153
			utf8 = g_convert (input->str, input->len, LocaleCharSet, "UTF-8", &bread, &written, &error);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   155
			if (error && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE && bread) {
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
				written = 0;
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   157
				g_clear_error (&error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   158
				utf8 = g_convert (input->str, bread, LocaleCharSet, "UTF-8", &bread, &written, &error);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
			}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
			
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
			if (written) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
				gsize sent = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
				while (sent < written) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
					gsize     len     = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
					gchar    *bbuf    = NULL;
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   167
					gchar    *subject = NULL;
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
					if (written - sent > HBB_BLOCKSIZE) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
						gchar *c = utf8 + sent + HBB_BLOCKSIZE;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
						c = g_utf8_find_prev_char (utf8 + sent, c);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
						if (!c) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   174
							scr_log_print (LPRINT_LOGNORM, "cmd: Cannot determine utf8 character end! End of data chunk will be discarded!");
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
							break;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
						}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
						len  = c - utf8 - sent;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
						bbuf = g_strndup (utf8 + sent, len);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
					}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   182
					cb -> seq += 1;
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   184
					if (cb -> subject)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   185
						subject = g_strdup_printf (cb -> subject, cb -> seq);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   187
					if (!cmd_send_msg (cb->jid, subject, len ? bbuf : (utf8 + sent)))
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   188
						scr_log_print (LPRINT_LOGNORM, "cmd: Encryption error. Message not sent.");
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   190
					if (subject)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   191
						g_free (subject);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   192
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   193
					if (!len)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
						break;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
					g_free (bbuf);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   198
					sent += len;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   199
				}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   200
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   201
				g_free (utf8);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
				g_string_erase (input, 0, bread);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
			} else {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   207
				scr_log_print (LPRINT_LOGNORM, "cmd: Character conversion error: %s", error->message);
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   208
				g_error_free (error);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
				cb->source = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
				return FALSE;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
			}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
		}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
	} else if (condition & (G_IO_ERR|G_IO_NVAL|G_IO_HUP)) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
		cb->source = 0;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   216
		return FALSE; // XXX
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   217
	}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
	return TRUE;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
static void cmd_destroy_data (gpointer data)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
	cmd_cb_t *cb = (cmd_cb_t *) data;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
	cmd_channels = g_slist_remove (cmd_channels, data);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   228
	if (cb->source)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   229
		g_source_remove (cb->source);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
	if (cb->channel)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
		g_io_channel_unref (cb->channel);
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   232
	if (cb -> subject)
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   233
		g_free (cb -> subject);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
	g_free (cb->jid);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
	g_free (cb);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
static void do_cmd (char *arg)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   239
{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   240
	int         fd[2];
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   241
	const char *jid = CURRENT_JID;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   242
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
	if (!*arg)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
		return;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
	
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
	if (!jid) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   247
		scr_log_print (LPRINT_LOGNORM, "Unsuitable buddy selected.");
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
		return;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
	}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
	
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   251
	if (pipe (fd)) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   252
		scr_log_print (LPRINT_LOGNORM, "Cannot create pipe: %s.", strerror (errno));
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
		return;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
	}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
	{
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   257
		GIOChannel *channel;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   258
		int         res     = fork ();
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
		if (!res) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
			
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
			close (fd[0]);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
			dup2 (fd[1], STDOUT_FILENO);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
			if (settings_opt_get_int ("cmd_redirect_stderr"))
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
				dup2 (fd[1], STDERR_FILENO);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   266
			else
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   267
				close (STDERR_FILENO);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   268
			close (STDIN_FILENO);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   269
			close (fd[1]);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
			{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   272
				const char *shell = settings_opt_get ("cmd_shell");
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   273
				if (!shell)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   274
					shell = getenv ("SHELL");
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   275
				if (!shell)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   276
					shell = "sh";
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   277
				execl (shell, shell, "-c", arg, NULL);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   278
			}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   279
		}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   280
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   281
		if (res == -1) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   282
			scr_log_print (LPRINT_NORMAL, "Cannot fork child: %s.", strerror (errno));
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   283
			close (fd[0]);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   284
			close (fd[1]);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   285
			return;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   286
		}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   287
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   288
		close (fd[1]);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   289
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   290
		{
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   291
			GError *error = NULL;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   292
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   293
			channel = g_io_channel_unix_new (fd[0]);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   294
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   295
			g_io_channel_set_encoding (channel, NULL, &error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   296
			if (error) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   297
				scr_log_print (LPRINT_DEBUG, "cmd: Cannot unset channel encoding: %s.", error -> message);
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   298
				g_clear_error (&error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   299
			}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   300
			g_io_channel_set_buffered (channel, FALSE);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   301
			g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, &error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   302
			if (error) {
17
e26e6692b0d5 Use new scr_* functions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   303
				scr_log_print (LPRINT_DEBUG, "cmd: Cannot set nonblocking flag on channel: %s.", error -> message);
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   304
				g_error_free (error);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   305
			}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   306
			g_io_channel_set_close_on_unref (channel, TRUE);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   307
		}
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   308
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   309
		{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   310
			cmd_cb_t *cb = g_new (cmd_cb_t, 1);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   311
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   312
			if (settings_opt_get_int ("cmd_header")) {
7
08aba7a38618 Add cmd_header_inline
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   313
				if (settings_opt_get_int ("cmd_header_inline") || is_room (jid)) {
5
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   314
					gchar *mesg = g_strdup_printf ("$ %s", arg);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   315
					gchar *utf  = to_utf8 (mesg);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   316
					g_free (mesg);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   317
					cmd_send_msg (jid, NULL, utf);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   318
					g_free (utf);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   319
					cb -> subject = NULL;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   320
				} else {
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   321
					gchar *header = g_strdup_printf ("[%%02d] $ %s", arg);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   322
					cb -> subject = to_utf8 (header);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   323
					g_free (header);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   324
				}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   325
			}
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   326
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   327
			cb -> jid     = g_strdup (jid);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   328
			cb -> input   = g_string_new (NULL);
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   329
			cb -> seq     = 0;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   330
			cb -> channel = channel;
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   331
			cb -> source  = g_io_add_watch_full (channel, 0, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
1b3263c96cbe Add cmd_header
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   332
			                                     cmd_reader, (gpointer) cb, cmd_destroy_data);
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   333
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   334
			cmd_channels = g_slist_append (cmd_channels, cb);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   335
		}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   336
	}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   337
}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   338
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   339
void mcmd_init (void)
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   340
{
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   341
#ifndef MCABBER_API_HAVE_CMD_ID
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   342
	cmd_add ("cmd", "", 0, 0, do_cmd, NULL);
20
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   343
#else
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   344
	mcmd_cmid = cmd_add ("cmd", "", 0, 0, do_cmd, NULL);
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   345
#endif
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   346
}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   347
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   348
void mcmd_uninit (void)
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   349
{
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   350
	GSList *sel;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   351
24
592b7f42ba54 Update versions
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   352
#ifndef MCABBER_API_HAVE_CMD_ID
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   353
	cmd_del ("cmd");
20
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   354
#else
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   355
	if (mcmd_cmid)
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   356
		cmd_del (mcmd_cmid);
d5748ae53a17 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 19
diff changeset
   357
#endif
0
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   358
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   359
	for (sel = cmd_channels; sel; sel = sel->next) {
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   360
		cmd_cb_t *cb = (cmd_cb_t *) sel->data;
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   361
		if (cb->source)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   362
			g_source_remove (cb->source);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   363
		if (cb->channel)
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   364
			g_io_channel_unref (cb->channel);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   365
		g_free (cb->jid);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   366
		g_free (cb);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   367
	}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   368
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   369
	g_slist_free (cmd_channels);
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   370
}
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   371
72ffcc3c584e Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   372
/* vim: se ts=4 sw=4: */