author | Mikael Berthe <mikael@lilotux.net> |
Sun, 11 Oct 2015 17:19:15 +0200 | |
changeset 2198 | 1591518a33b9 |
parent 2164 | 038c4d601011 |
child 2268 | f5402d705f67 |
permissions | -rw-r--r-- |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
1 |
/* |
2079
8da280d34b48
Rename FIFO module file name
Mikael Berthe <mikael@lilotux.net>
parents:
2019
diff
changeset
|
2 |
* fifo_internal.c -- Read commands from a named pipe |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
3 |
* |
1599 | 4 |
* Copyright (C) 2008,2009 Mikael Berthe <mikael@lilotux.net> |
2019
33483d3324cf
s/Copyrigth/Copyright/ and so on
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1940
diff
changeset
|
5 |
* Copyright (C) 2009 Myhailo Danylenko <isbear@ukrpost.net> |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
6 |
* |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
7 |
* This program is free software; you can redistribute it and/or modify |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
8 |
* it under the terms of the GNU General Public License as published by |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
9 |
* the Free Software Foundation; either version 2 of the License, or (at |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
10 |
* your option) any later version. |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
11 |
* |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
12 |
* This program is distributed in the hope that it will be useful, but |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
13 |
* WITHOUT ANY WARRANTY; without even the implied warranty of |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
15 |
* General Public License for more details. |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
16 |
* |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
18 |
* along with this program; if not, write to the Free Software |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
19 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
20 |
* USA |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
21 |
*/ |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
22 |
|
1598 | 23 |
#include <stdlib.h> |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
24 |
#include <glib.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
25 |
#include <sys/types.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
26 |
#include <sys/stat.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
27 |
#include <fcntl.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
28 |
#include <unistd.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
29 |
#include <errno.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
30 |
#include <fcntl.h> |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
31 |
|
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
32 |
#include "commands.h" |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
33 |
#include "logprint.h" |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
34 |
#include "utils.h" |
1427
a8eb9aba2ed2
Add option 'fifo_hide_commands'
Mikael Berthe <mikael@lilotux.net>
parents:
1426
diff
changeset
|
35 |
#include "settings.h" |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
36 |
#include "main.h" |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
37 |
|
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
38 |
static char *fifo_name = NULL; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
39 |
static GIOChannel *fifo_channel = NULL; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
40 |
|
1576
8c0237c8c186
Export the FIFO pipe name as an environment variable (Lukas Kuklinek)
Mikael Berthe <mikael@lilotux.net>
parents:
1526
diff
changeset
|
41 |
static const char *FIFO_ENV_NAME = "MCABBER_FIFO"; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
42 |
|
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
43 |
static gboolean attach_fifo(const char *name); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
44 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
45 |
static guint fifo_callback(GIOChannel *channel, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
46 |
GIOCondition condition, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
47 |
gpointer data) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
48 |
{ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
49 |
if (condition & (G_IO_IN|G_IO_PRI)) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
50 |
GIOStatus chstat; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
51 |
gchar *buf; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
52 |
gsize endpos; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
53 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
54 |
chstat = g_io_channel_read_line(channel, &buf, NULL, &endpos, NULL); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
55 |
if (chstat == G_IO_STATUS_ERROR || chstat == G_IO_STATUS_EOF) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
56 |
if (!attach_fifo(fifo_name)) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
57 |
scr_LogPrint(LPRINT_LOGNORM, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
58 |
"Reopening fifo failed! Fifo will not work from now!"); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
59 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
60 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
61 |
if (buf) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
62 |
guint logflag; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
63 |
guint fifo_ignore = settings_opt_get_int("fifo_ignore"); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
64 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
65 |
if (endpos) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
66 |
buf[endpos] = '\0'; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
67 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
68 |
if (settings_opt_get_int("fifo_hide_commands")) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
69 |
logflag = LPRINT_LOG; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
70 |
else |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
71 |
logflag = LPRINT_LOGNORM; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
72 |
scr_LogPrint(logflag, "%s FIFO command: %s", |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
73 |
(fifo_ignore ? "Ignoring" : "Executing"), buf); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
74 |
if (!fifo_ignore) { |
2164 | 75 |
process_command(buf, TRUE); |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
76 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
77 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
78 |
g_free(buf); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
79 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
80 |
} else if (condition & (G_IO_ERR|G_IO_NVAL|G_IO_HUP)) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
81 |
if (!attach_fifo(fifo_name)) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
82 |
scr_LogPrint(LPRINT_LOGNORM, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
83 |
"Reopening fifo failed! Fifo will not work from now!"); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
84 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
85 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
86 |
return TRUE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
87 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
88 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
89 |
static void fifo_destroy_callback(gpointer data) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
90 |
{ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
91 |
GIOChannel *channel = (GIOChannel *)data; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
92 |
g_io_channel_unref(channel); |
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
93 |
channel = NULL; |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
94 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
95 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
96 |
static gboolean check_fifo(const char *name) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
97 |
{ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
98 |
struct stat finfo; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
99 |
if (stat(name, &finfo) == -1) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
100 |
/* some unknown error */ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
101 |
if (errno != ENOENT) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
102 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
103 |
/* fifo not yet exists */ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
104 |
if (mkfifo(name, S_IRUSR|S_IWUSR) != -1) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
105 |
return check_fifo(name); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
106 |
else |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
107 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
108 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
109 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
110 |
/* file exists */ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
111 |
if (S_ISFIFO(finfo.st_mode)) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
112 |
return TRUE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
113 |
else |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
114 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
115 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
116 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
117 |
static gboolean attach_fifo(const char *name) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
118 |
{ |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
119 |
GSource *source; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
120 |
int fd = open (name, O_RDONLY|O_NONBLOCK); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
121 |
if (fd == -1) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
122 |
return FALSE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
123 |
|
1912 | 124 |
if (fifo_channel) |
125 |
g_io_channel_unref(fifo_channel); |
|
126 |
||
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
127 |
fifo_channel = g_io_channel_unix_new(fd); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
128 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
129 |
g_io_channel_set_flags(fifo_channel, G_IO_FLAG_NONBLOCK, NULL); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
130 |
g_io_channel_set_encoding(fifo_channel, NULL, NULL); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
131 |
g_io_channel_set_close_on_unref(fifo_channel, TRUE); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
132 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
133 |
source = g_io_create_watch(fifo_channel, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
134 |
G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
135 |
g_source_set_callback(source, (GSourceFunc)fifo_callback, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
136 |
(gpointer)fifo_channel, |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
137 |
(GDestroyNotify)fifo_destroy_callback); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
138 |
g_source_attach(source, main_context); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
139 |
|
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
140 |
return TRUE; |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
141 |
} |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
142 |
|
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
143 |
void fifo_deinit(void) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
144 |
{ |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
145 |
unsetenv(FIFO_ENV_NAME); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
146 |
|
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
147 |
if (fifo_channel) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
148 |
g_source_remove_by_user_data(fifo_channel); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
149 |
/* channel itself should be destroyed by destruction callback */ |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
150 |
/* destroy open fifo */ |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
151 |
if (fifo_name) { |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
152 |
/* well, that may create fifo, and then unlink, |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
153 |
* but at least we will not destroy non-fifo data */ |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
154 |
if (check_fifo(fifo_name)) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
155 |
unlink(fifo_name); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
156 |
g_free(fifo_name); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
157 |
fifo_name = NULL; |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
158 |
} |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
159 |
} |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
160 |
|
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
161 |
// fifo_init_internal(path) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
162 |
// If path is NULL, reopen existing fifo, else open anew. |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
163 |
static int fifo_init_internal(const char *fifo_path) |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
164 |
{ |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
165 |
if (fifo_path) { |
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
166 |
fifo_deinit(); |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
167 |
fifo_name = expand_filename(fifo_path); |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
168 |
|
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
169 |
if (!check_fifo(fifo_name)) { |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
170 |
scr_LogPrint(LPRINT_LOGNORM, "WARNING: Cannot create the FIFO. " |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
171 |
"%s already exists and is not a pipe", fifo_name); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
172 |
g_free(fifo_name); |
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
173 |
fifo_name = NULL; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
174 |
return -1; |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
175 |
} |
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
176 |
} else if (fifo_name) |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
177 |
g_source_remove_by_user_data(fifo_channel); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
178 |
else |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
179 |
return -1; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
180 |
|
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
181 |
if (!attach_fifo(fifo_name)) { |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
182 |
scr_LogPrint(LPRINT_LOGNORM, "Error: Cannot open fifo"); |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
183 |
return -1; |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
184 |
} |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
185 |
|
1576
8c0237c8c186
Export the FIFO pipe name as an environment variable (Lukas Kuklinek)
Mikael Berthe <mikael@lilotux.net>
parents:
1526
diff
changeset
|
186 |
setenv(FIFO_ENV_NAME, fifo_name, 1); |
8c0237c8c186
Export the FIFO pipe name as an environment variable (Lukas Kuklinek)
Mikael Berthe <mikael@lilotux.net>
parents:
1526
diff
changeset
|
187 |
|
1654
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
188 |
scr_LogPrint(LPRINT_LOGNORM, "FIFO initialized (%s)", fifo_path); |
fca9a4c17432
Improve UI latency and CPU usage
Myhailo Danylenko <isbear@ukrpost.net>
parents:
1599
diff
changeset
|
189 |
return 1; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
190 |
} |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
191 |
|
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
192 |
static gchar *fifo_guard(const gchar *key, const gchar *new_value) |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
193 |
{ |
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
194 |
if (new_value) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
195 |
fifo_init_internal(new_value); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
196 |
else |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
197 |
fifo_deinit(); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
198 |
return g_strdup(new_value); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
199 |
} |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
200 |
|
1940
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
201 |
// Returns 1 in case of success, -1 on error |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
202 |
int fifo_init(void) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
203 |
{ |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
204 |
const char *path = settings_opt_get("fifo_name"); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
205 |
static gboolean guard_installed = FALSE; |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
206 |
if (!guard_installed) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
207 |
if (!(guard_installed = settings_set_guard("fifo_name", fifo_guard))) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
208 |
scr_LogPrint(LPRINT_DEBUG, "fifo: BUG: Cannot install option guard!"); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
209 |
if (path) |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
210 |
return fifo_init_internal(path); |
7eadf86039e6
Use guard for the fifo system (Myhailo Danylenko)
Mikael Berthe <mikael@lilotux.net>
parents:
1912
diff
changeset
|
211 |
return 1; |
1426
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
212 |
} |
a64778f5f26b
Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents:
diff
changeset
|
213 |
|
1811 | 214 |
/* vim: set expandtab cindent cinoptions=>2\:2(0 sw=2 ts=2: For Vim users... */ |