annotate mcabber/mcabber/utils.c @ 2135:361603828d9e

Set the trace log file permissions again when we write to it If the log file is recreated (e.g. log rotation) the new file will have correct permissions.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 06 Jul 2014 10:20:30 +0200
parents fc7a758ebbde
children 87244845fd9c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
1 /*
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
2 * utils.c -- Various utility functions
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
3 *
2134
fc7a758ebbde Remove deprecated options comments, update headers
Mikael Berthe <mikael@lilotux.net>
parents: 2133
diff changeset
4 * Copyright (C) 2005-2014 Mikael Berthe <mikael@lilotux.net>
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
5 * Some of the ut_* functions are derived from Cabber debug/log code.
1361
0562106d20c1 Update some copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
6 * from_iso8601() comes from the Pidgin (libpurple) project.
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
7 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
8 * This program is free software; you can redistribute it and/or modify
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
9 * it under the terms of the GNU General Public License as published by
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or (at
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
11 * your option) any later version.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
12 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
13 * This program is distributed in the hope that it will be useful, but
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
16 * General Public License for more details.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
17 *
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
18 * You should have received a copy of the GNU General Public License
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
19 * along with this program; if not, write to the Free Software
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
21 * USA
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
22 */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
23
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
24 #include <config.h>
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
25
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
26 #include <stdio.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
27 #include <stdlib.h>
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
28 #include <string.h>
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
29 #include <stdarg.h>
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
30 #include <errno.h>
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
31
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
32 #ifdef HAVE_LIBIDN
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
33 #include <idna.h>
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
34 #include <stringprep.h>
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
35 static char idnprep[1024];
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
36 #endif
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
37
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
38 #include <glib.h>
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
39 #include <glib/gprintf.h>
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
40
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
41 /* For Cygwin (thanks go to Yitzchak Scott-Thoennes) */
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
42 #ifdef __CYGWIN__
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
43 # define timezonevar
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
44 extern long timezone;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
45 #endif
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
46 #include <time.h>
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
47 #include <unistd.h>
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
48 #include <sys/types.h>
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
49 #include <sys/stat.h>
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
50 #include <ctype.h>
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
51
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 952
diff changeset
52 #include "utils.h"
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
53 #include "logprint.h"
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
54 #include "settings.h"
1897
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
55 #include "main.h"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
56
76
a8f8492abd44 [/trunk] Changeset 90 by mikael
mikael
parents: 24
diff changeset
57 static int DebugEnabled;
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
58 static char *FName;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
59
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
60 // jidtodisp(jid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
61 // Strips the resource part from the jid
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
62 // The caller should g_free the result after use.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
63 char *jidtodisp(const char *fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
64 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
65 char *ptr;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
66 char *alias;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
67
1910
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
68 if (!fjid) {
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
69 scr_LogPrint(LPRINT_LOGNORM, "** jidtodisp: NULL JID, "
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
70 "this is probably a bug, please report!");
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
71 return NULL;
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
72 }
3695266e16c7 Fix error presence packet handling.
Mikael Berthe <mikael@lilotux.net>
parents: 1897
diff changeset
73
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
74 alias = g_strdup(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
75
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
76 if ((ptr = strchr(alias, JID_RESOURCE_SEPARATOR)) != NULL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
77 *ptr = 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
78 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
79 return alias;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
80 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
81
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
82 // The caller must free the string after use.
1611
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
83 char *jid_get_username(const char *fjid)
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
84 {
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
85 char *ptr;
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
86 char *username;
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
87
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
88 username = g_strdup(fjid);
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
89 if ((ptr = strchr(username, JID_DOMAIN_SEPARATOR)) != NULL) {
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
90 *ptr = 0;
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
91 }
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
92 return username;
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
93 }
f9bf561e54d0 Use the username for authentication, added jid_get_username() to utils.c
franky
parents: 1599
diff changeset
94
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
95 // The caller must free the string after use.
2103
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
96 char *get_servername(const char *username, const char *servername)
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
97 {
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
98 char *ptr;
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
99 char *server;
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
100
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
101 if ((ptr = strchr(username, JID_DOMAIN_SEPARATOR)) != NULL) {
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
102 server = g_strdup(ptr+1);
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
103 return server;
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
104 }
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
105
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
106 return g_strdup(servername);
2103
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
107 }
1210a22726d3 We can determine if the server supports carbons. By means of XEP-0030: Service
Roeland Jago Douma <roeland@famdouma.nl>
parents: 2050
diff changeset
108
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
109 // The caller must free the string after use.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
110 char *compose_jid(const char *username, const char *servername,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
111 const char *resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
112 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
113 char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
114
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
115 if (!strchr(username, JID_DOMAIN_SEPARATOR)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
116 fjid = g_strdup_printf("%s%c%s%c%s", username,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
117 JID_DOMAIN_SEPARATOR, servername,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
118 JID_RESOURCE_SEPARATOR, resource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
119 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
120 fjid = g_strdup_printf("%s%c%s", username,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
121 JID_RESOURCE_SEPARATOR, resource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
122 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
123 return fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
124 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
125
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
126 gboolean jid_equal(const char *jid1, const char *jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
127 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
128 char *a,*b;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
129 int ret;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
130 if (!jid1 && !jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
131 return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
132 if (!jid1 || !jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
133 return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
134
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
135 a = jidtodisp(jid1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
136 b = jidtodisp(jid2);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
137 ret = strcasecmp(a, b);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
138 g_free(a);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
139 g_free(b);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
140 return (ret == 0) ? TRUE : FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
141 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
142
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
143 // expand_filename(filename)
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
144 // Expand "~/" with the $HOME env. variable in a file name.
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
145 // The caller must free the string after use.
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
146 char *expand_filename(const char *fname)
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
147 {
1222
75aee46d3aee Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
148 if (!fname)
75aee46d3aee Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
149 return NULL;
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
150 if (!strncmp(fname, "~/", 2)) {
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
151 char *homedir = getenv("HOME");
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
152 if (homedir)
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
153 return g_strdup_printf("%s%s", homedir, fname+1);
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
154 }
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
155 return g_strdup(fname);
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
156 }
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
157
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
158 void fingerprint_to_hex(const unsigned char *fpr, char hex[49])
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
159 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
160 int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
161 char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
162
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
163 for (p = hex, i = 0; i < 15; i++, p+=3)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
164 g_sprintf(p, "%02X:", fpr[i]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
165 g_sprintf(p, "%02X", fpr[i]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
166 hex[48] = '\0';
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
167 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
168
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
169 gboolean hex_to_fingerprint(const char *hex, char fpr[16])
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
170 {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
171 int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
172 char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
173
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
174 if (strlen(hex) != 47)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
175 return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
176 for (i = 0, p = (char*)hex; *p && *(p+1); i++, p += 3)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
177 fpr[i] = (char) g_ascii_strtoull (p, NULL, 16);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
178 return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
179 }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1568
diff changeset
180
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
181 static gboolean tracelog_create(void)
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
182 {
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
183 FILE *fp;
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
184 struct stat buf;
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
185 int err;
1897
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
186 char *v;
77
32f54ad6d729 [/trunk] Changeset 91 by mikael
mikael
parents: 76
diff changeset
187
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
188 fp = fopen(FName, "a");
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
189 if (!fp) {
2135
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
190 scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file: %s",
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
191 strerror(errno));
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
192 return FALSE;
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
193 }
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
194
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
195 err = fstat(fileno(fp), &buf);
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
196 if (err || buf.st_uid != geteuid()) {
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
197 fclose(fp);
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
198 if (err)
2135
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
199 scr_LogPrint(LPRINT_NORMAL, "ERROR: cannot stat the tracelog file: %s",
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
200 strerror(errno));
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
201 else
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
202 scr_LogPrint(LPRINT_NORMAL, "ERROR: tracelog file does not belong to you!");
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
203 return FALSE;
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
204 }
2135
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
205
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
206 if (fchmod(fileno(fp), S_IRUSR|S_IWUSR)) {
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
207 scr_LogPrint(LPRINT_NORMAL, "WARNING: Cannot set tracelog file permissions: %s",
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
208 strerror(errno));
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
209 }
428
4470868f90e5 Check the tracelog file actually belongs to the user (if logging enabled)
Mikael Berthe <mikael@lilotux.net>
parents: 419
diff changeset
210
1897
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
211 v = mcabber_version();
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
212 fprintf(fp, "New trace log started. MCabber version %s\n"
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
213 "----------------------\n", v);
efd7c4c34ff2 Display mcabber version when starting a trace log
Mikael Berthe <mikael@lilotux.net>
parents: 1859
diff changeset
214 g_free(v);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
215 fclose(fp);
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
216 return TRUE;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
217 }
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
218
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
219 // The caller must free the string after use.
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
220 static gchar *tracelog_level_guard(const gchar *key, const gchar *new_value)
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
221 {
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
222 int new_level = 0;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
223 if (new_value)
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
224 new_level = atoi(new_value);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
225 if (DebugEnabled < 1 && new_level > 0 && FName && !tracelog_create())
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
226 DebugEnabled = 0;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
227 else
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
228 DebugEnabled = new_level;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
229 return g_strdup(new_value);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
230 }
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
231
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
232 // The caller must free the string after use.
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
233 static gchar *tracelog_file_guard(const gchar *key, const gchar *new_value)
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
234 {
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
235 gchar *new_fname = NULL;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
236
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
237 if (new_value)
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
238 new_fname = expand_filename(new_value);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
239
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
240 if (g_strcmp0(FName, new_fname)) {
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
241 g_free(FName);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
242 FName = new_fname;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
243 if (DebugEnabled > 0 && !tracelog_create()) {
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
244 g_free(FName);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
245 FName = NULL;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
246 }
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
247 } else
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
248 g_free(new_fname);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
249
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
250 return g_strdup(new_value);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
251 }
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
252
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
253 // ut_init_debug()
2111
9023a6f2bf6c Misc. style updates
Mikael Berthe <mikael@lilotux.net>
parents: 2103
diff changeset
254 // Install option guards before initial config file parsing.
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
255 void ut_init_debug(void)
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
256 {
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
257 DebugEnabled = 0;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
258 FName = NULL;
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
259 settings_set_guard("tracelog_level", tracelog_level_guard);
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
260 settings_set_guard("tracelog_file", tracelog_file_guard);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
261 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
262
1780
e4378fbab5d7 Major API cleanup - bump API to 4
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
263 void ut_write_log(unsigned int flag, const char *data)
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
264 {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
265 if (!DebugEnabled || !FName) return;
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
266
1617
9ca672ee884f Fix previous commit :)
Mikael Berthe <mikael@lilotux.net>
parents: 1611
diff changeset
267 if (((DebugEnabled >= 2) && (flag & (LPRINT_LOG|LPRINT_DEBUG))) ||
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
268 ((DebugEnabled == 1) && (flag & LPRINT_LOG))) {
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
269 FILE *fp = fopen(FName, "a+");
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
270 if (!fp) {
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
271 scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot open tracelog file: %s.",
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
272 strerror(errno));
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
273 return;
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
274 }
2135
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
275
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
276 // Check file permissions again (it could be a new file)
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
277 fchmod(fileno(fp), S_IRUSR|S_IWUSR);
361603828d9e Set the trace log file permissions again when we write to it
Mikael Berthe <mikael@lilotux.net>
parents: 2134
diff changeset
278
1531
9f92c0edde1c Display a warning when writing to the tracelog file fails
Mikael Berthe <mikael@lilotux.net>
parents: 1460
diff changeset
279 if (fputs(data, fp) == EOF)
1674
f02e7076ccec Use option guards for tracelog
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
280 scr_LogPrint(LPRINT_NORMAL, "ERROR: Cannot write to tracelog file.");
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
281 fclose(fp);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
282 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
283 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
284
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
285 // checkset_perm(name, setmode)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
286 // Check the permissions of the "name" file/dir
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
287 // If setmode is true, correct the permissions if they are wrong
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
288 // Return values: -1 == bad file/dir, 0 == success, 1 == cannot correct
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
289 int checkset_perm(const char *name, unsigned int setmode)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
290 {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
291 int fd;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
292 struct stat buf;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
293
816
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
294 #ifdef __CYGWIN__
1460
af54d33facd0 Fix two comments
Mikael Berthe <mikael@lilotux.net>
parents: 1459
diff changeset
295 // Permission checking isn't efficient on Cygwin
816
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
296 return 0;
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
297 #endif
a6628f0aabc1 Skip file permission checks on Cygwin
Mikael Berthe <mikael@lilotux.net>
parents: 803
diff changeset
298
1459
d76eff4ed71d Use stat() to check permissions in checkset_perm() (Dave Holland)
Mikael Berthe <mikael@lilotux.net>
parents: 1458
diff changeset
299 fd = stat(name, &buf);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
300 if (fd == -1) return -1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
301
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
302 if (buf.st_uid != geteuid()) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
303 scr_LogPrint(LPRINT_LOGNORM, "Wrong file owner [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
304 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
305 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
306
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
307 if (buf.st_mode & (S_IRGRP | S_IWGRP | S_IXGRP) ||
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
308 buf.st_mode & (S_IROTH | S_IWOTH | S_IXOTH)) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
309 if (setmode) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
310 mode_t newmode = 0;
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
311 scr_LogPrint(LPRINT_LOGNORM, "Bad permissions [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
312 if (S_ISDIR(buf.st_mode))
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
313 newmode |= S_IXUSR;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
314 newmode |= S_IRUSR | S_IWUSR;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
315 if (chmod(name, newmode)) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
316 scr_LogPrint(LPRINT_LOGNORM, "WARNING: Failed to correct permissions!");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
317 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
318 }
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
319 scr_LogPrint(LPRINT_LOGNORM, "Permissions have been corrected");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
320 } else {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
321 scr_LogPrint(LPRINT_LOGNORM, "WARNING: Bad permissions [%s]", name);
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
322 return 1;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
323 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
324 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
325
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
326 return 0;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
327 }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
328
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
329 const char *ut_get_tmpdir(void)
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
330 {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
331 static const char *tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
332 const char *tmpvars[] = { "MCABBERTMPDIR", "TMP", "TMPDIR", "TEMP" };
735
2f027806cd48 Some code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 727
diff changeset
333 unsigned int i;
524
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
334
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
335 if (tmpdir)
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
336 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
337
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
338 for (i = 0; i < (sizeof(tmpvars) / sizeof(const char *)); i++) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
339 tmpdir = getenv(tmpvars[i]);
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
340 if (tmpdir && tmpdir[0] && tmpdir[0] == '/' && tmpdir[1]) {
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
341 // Looks ok.
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
342 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
343 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
344 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
345
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
346 // Default temporary directory
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
347 tmpdir = "/tmp";
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
348 return tmpdir;
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
349 }
05c0e55c4bb1 Pass message body to external command
Mikael Berthe <mikael@lilotux.net>
parents: 463
diff changeset
350
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
351 // to_iso8601(dststr, timestamp)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
352 // Convert timestamp to iso8601 format, and store it in dststr.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
353 // NOTE: dststr should be at last 19 chars long.
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
354 // Return should be 0
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
355 int to_iso8601(char *dststr, time_t timestamp)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
356 {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
357 struct tm *tm_time;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
358 int ret;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
359
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
360 tm_time = gmtime(&timestamp);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
361
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
362 ret = snprintf(dststr, 19, "%.4d%02d%02dT%02d:%02d:%02dZ",
1458
17e95be6c39b time_t fix from the MirBSD port (Thorsten Glaser)
Mikael Berthe <mikael@lilotux.net>
parents: 1452
diff changeset
363 (int)(1900+tm_time->tm_year), tm_time->tm_mon+1, tm_time->tm_mday,
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
364 tm_time->tm_hour, tm_time->tm_min, tm_time->tm_sec);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
365
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
366 return ((ret == -1) ? -1 : 0);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
367 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
368
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
369 // from_iso8601(timestamp, utc)
1361
0562106d20c1 Update some copyrights
Mikael Berthe <mikael@lilotux.net>
parents: 1292
diff changeset
370 // This function came from the Pidgin project, gaim_str_to_time().
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
371 // (Actually date may not be pure iso-8601)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
372 // Thanks, guys!
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
373 // ** Modified by somian 10 Apr 2006 with advice from ysth.
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
374 time_t from_iso8601(const char *timestamp, int utc)
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
375 {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
376 struct tm t;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
377 time_t retval = 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
378 char buf[32];
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
379 char *c;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
380 int tzoff = 0;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
381 int hms_succ = 0;
1458
17e95be6c39b time_t fix from the MirBSD port (Thorsten Glaser)
Mikael Berthe <mikael@lilotux.net>
parents: 1452
diff changeset
382 int tmpyear;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
383
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
384 time(&retval);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
385 localtime_r(&retval, &t);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
386
463
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
387 /* Reset time to midnight (00:00:00) */
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
388 t.tm_hour = t.tm_min = t.tm_sec = 0;
339e85418b49 from_iso8601(): set time to 00:00:00 if not specified
Mikael Berthe <mikael@lilotux.net>
parents: 456
diff changeset
389
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
390 snprintf(buf, sizeof(buf), "%s", timestamp);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
391 c = buf;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
392
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
393 /* 4 digit year */
1458
17e95be6c39b time_t fix from the MirBSD port (Thorsten Glaser)
Mikael Berthe <mikael@lilotux.net>
parents: 1452
diff changeset
394 if (!sscanf(c, "%04d", &tmpyear)) return 0;
17e95be6c39b time_t fix from the MirBSD port (Thorsten Glaser)
Mikael Berthe <mikael@lilotux.net>
parents: 1452
diff changeset
395 t.tm_year = tmpyear;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
396 c+=4;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
397 if (*c == '-')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
398 c++;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
399
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
400 t.tm_year -= 1900;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
401
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
402 /* 2 digit month */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
403 if (!sscanf(c, "%02d", &t.tm_mon)) return 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
404 c+=2;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
405 if (*c == '-')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
406 c++;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
407
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
408 t.tm_mon -= 1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
409
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
410 /* 2 digit day */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
411 if (!sscanf(c, "%02d", &t.tm_mday)) return 0;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
412 c+=2;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
413 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
414 c++; /* skip the "T" */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
415
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
416 /* 2 digit hour */
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
417 if (sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
418 {
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
419 hms_succ = 1;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
420 c += 8;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
421 }
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
422 else if (sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3)
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
423 {
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
424 hms_succ = 1;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
425 c += 6;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
426 }
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
427
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
428 if (hms_succ) {
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
429 int tzhrs, tzmins;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
430
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
431 if (*c == '.') /* dealing with precision we don't care about */
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
432 c += 4;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
433
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
434 if ((*c == '+' || *c == '-') &&
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
435 sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
436 tzoff = tzhrs*60*60 + tzmins*60;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
437 if (*c == '+')
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
438 tzoff *= -1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
439 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
440
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
441 if (tzoff || utc) {
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
442 #ifdef HAVE_TM_GMTOFF
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
443 tzoff += t.tm_gmtoff;
802
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
444 #else
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
445 # ifdef HAVE_TIMEZONE
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
446 tzset(); /* making sure */
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
447 tzoff -= timezone;
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
448 # endif
dd860da62002 Enable use on systems that do not have tm_gmtoff including Cygwin
Soren Andersen <somian@pobox.com>
parents: 735
diff changeset
449 #endif
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
450 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
451 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
452 }
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
453
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
454 t.tm_isdst = -1;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
455
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
456 retval = mktime(&t);
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
457
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
458 retval += tzoff;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
459
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
460 return retval;
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 138
diff changeset
461 }
419
2f9852610cf4 Small code review
Mikael Berthe <mikael@lilotux.net>
parents: 393
diff changeset
462
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
463 /**
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
464 * Derived from libjabber/jid.c, because the libjabber version is not
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
465 * really convenient for our usage.
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
466 *
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
467 * Check if the full JID is valid
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
468 * Return 0 if it is valid, non zero otherwise
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
469 */
1292
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1241
diff changeset
470 int check_jid_syntax(const char *fjid)
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
471 {
1292
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1241
diff changeset
472 const char *str;
382ec54b584e Muc nick coloring functionality
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1241
diff changeset
473 const char *domain, *resource;
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
474 int domlen;
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
475 #ifdef HAVE_LIBIDN
1641
c3c7d6d0348f Remove (probably) unnecessary check
Mikael Berthe <mikael@lilotux.net>
parents: 1640
diff changeset
476 char *idnpp;
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
477 int r;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
478 #endif
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
479
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 979
diff changeset
480 if (!fjid) return 1;
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
481
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 979
diff changeset
482 domain = strchr(fjid, JID_DOMAIN_SEPARATOR);
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
483
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
484 /* the username is optional */
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
485 if (!domain) {
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 979
diff changeset
486 domain = fjid;
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
487 } else {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
488 /* node identifiers may not be longer than 1023 bytes */
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 979
diff changeset
489 if ((domain == fjid) || (domain-fjid > 1023))
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
490 return 1;
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
491 domain++;
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
492
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
493 #ifdef HAVE_LIBIDN
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
494 idnpp = idnprep;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
495 str = fjid;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
496 while (*str != JID_DOMAIN_SEPARATOR)
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
497 *idnpp++ = *str++;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
498 *idnpp = 0;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
499
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
500 r = stringprep(idnprep, 1023, 0, stringprep_xmpp_nodeprep);
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
501 if (r != STRINGPREP_OK || !idnprep[0])
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
502 return 1;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
503 /* the username looks okay */
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
504 #else
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
505 /* check for low and invalid ascii characters in the username */
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 979
diff changeset
506 for (str = fjid; *str != JID_DOMAIN_SEPARATOR; str++) {
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 952
diff changeset
507 if (*str <= ' ' || *str == ':' || *str == JID_DOMAIN_SEPARATOR ||
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
508 *str == '<' || *str == '>' || *str == '\'' ||
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
509 *str == '"' || *str == '&') {
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
510 return 1;
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
511 }
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
512 }
456
471c9ccde028 Make username optional in check_jid_syntax()
Mikael Berthe <mikael@lilotux.net>
parents: 452
diff changeset
513 /* the username is okay as far as we can tell without LIBIDN */
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
514 #endif
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
515 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
516
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 952
diff changeset
517 resource = strchr(domain, JID_RESOURCE_SEPARATOR);
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
518
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
519 /* the resource is optional */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
520 if (resource) {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
521 domlen = resource - domain;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
522 resource++;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
523 /* resources may not be longer than 1023 bytes */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
524 if ((*resource == '\0') || strlen(resource) > 1023)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
525 return 1;
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
526 #ifdef HAVE_LIBIDN
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
527 strncpy(idnprep, resource, sizeof(idnprep));
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
528 r = stringprep(idnprep, 1023, 0, stringprep_xmpp_resourceprep);
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
529 if (r != STRINGPREP_OK || !idnprep[0])
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
530 return 1;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
531 #endif
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
532 } else {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
533 domlen = strlen(domain);
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
534 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
535
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
536 /* there must be a domain identifier */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
537 if (domlen == 0) return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
538
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
539 /* and it must not be longer than 1023 bytes */
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
540 if (domlen > 1023) return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
541
1859
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
542 /* /.+/ is not a valid domain name pattern */
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
543 for (str = domain; *str && *str != JID_RESOURCE_SEPARATOR; str++)
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
544 if (*str != '.') break;
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
545 if (!*str || *str == JID_RESOURCE_SEPARATOR)
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
546 return 1; /* domain contains only dots */
a20701a2840c "." is not a valid Jabber domain name
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
547
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
548 #ifdef HAVE_LIBIDN
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
549 idnpp = idnprep;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
550 str = domain;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
551 while (*str != '\0' && *str != JID_RESOURCE_SEPARATOR)
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
552 *idnpp++ = *str++;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
553 *idnpp = 0;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
554
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
555 r = stringprep_nameprep(idnprep, 1023);
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
556 if (r != STRINGPREP_OK || !idnprep[0])
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
557 return 1;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
558
1641
c3c7d6d0348f Remove (probably) unnecessary check
Mikael Berthe <mikael@lilotux.net>
parents: 1640
diff changeset
559 if (idna_to_ascii_8z(idnprep, &idnpp, IDNA_USE_STD3_ASCII_RULES) !=
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
560 IDNA_SUCCESS)
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
561 return 1;
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
562 else
1641
c3c7d6d0348f Remove (probably) unnecessary check
Mikael Berthe <mikael@lilotux.net>
parents: 1640
diff changeset
563 free(idnpp);
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
564 #else
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
565 /* make sure the hostname is valid characters */
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 952
diff changeset
566 for (str = domain; *str != '\0' && *str != JID_RESOURCE_SEPARATOR; str++) {
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
567 if (!(isalnum(*str) || *str == '.' || *str == '-' || *str == '_'))
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
568 return 1;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
569 }
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
570 #endif
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
571
1639
d9913c1b35e7 Add support for libidn
Mikael Berthe <mikael@lilotux.net>
parents: 1617
diff changeset
572 /* it's okay as far as we can tell */
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
573 return 0;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
574 }
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
575
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
576
1106
8e12137fab20 Cosmetics and cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1058
diff changeset
577 inline void mc_strtolower(char *str)
452
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
578 {
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
579 if (!str) return;
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
580 for ( ; *str; str++)
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
581 *str = tolower(*str);
dfd9c62b3a39 Jabber Id syntax checks
Mikael Berthe <mikael@lilotux.net>
parents: 428
diff changeset
582 }
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
583
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
584 // strip_arg_special_chars(string)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
585 // Remove quotes and backslashes before an escaped quote
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
586 // Only quotes need a backslash
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
587 // Ex.: ["a b"] -> [a b]; [a\"b] -> [a"b]
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
588 void strip_arg_special_chars(char *s)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
589 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
590 int instring = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
591 int escape = FALSE;
2133
69d00a118c0c Fix ANSI C-incompatible change
Mikael Berthe <mikael@lilotux.net>
parents: 2119
diff changeset
592 char *p, *t;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
593
979
ea939ff047d8 Improve /buffer search_*
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
594 if (!s) return;
ea939ff047d8 Improve /buffer search_*
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
595
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
596 for (p = s; *p; p++) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
597 if (*p == '"') {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
598 if (!escape) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
599 instring = !instring;
2119
3b26f3a58cb9 Fix command line issue reported by Minos
Mikael Berthe <mikael@lilotux.net>
parents: 2111
diff changeset
600 //memmove(p, p+1, strlen(p));
2133
69d00a118c0c Fix ANSI C-incompatible change
Mikael Berthe <mikael@lilotux.net>
parents: 2119
diff changeset
601 for (t=p; *t; t++)
2119
3b26f3a58cb9 Fix command line issue reported by Minos
Mikael Berthe <mikael@lilotux.net>
parents: 2111
diff changeset
602 *t = *(t+1);
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
603 p--;
1452
83e275dca409 Fix escaping bug in strip_arg_special_chars()
Mikael Berthe <mikael@lilotux.net>
parents: 1440
diff changeset
604 } else
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
605 escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
606 } else if (*p == '\\') {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
607 if (!escape) {
2119
3b26f3a58cb9 Fix command line issue reported by Minos
Mikael Berthe <mikael@lilotux.net>
parents: 2111
diff changeset
608 //memmove(p, p+1, strlen(p));
2133
69d00a118c0c Fix ANSI C-incompatible change
Mikael Berthe <mikael@lilotux.net>
parents: 2119
diff changeset
609 for (t=p; *t; t++)
2119
3b26f3a58cb9 Fix command line issue reported by Minos
Mikael Berthe <mikael@lilotux.net>
parents: 2111
diff changeset
610 *t = *(t+1);
1452
83e275dca409 Fix escaping bug in strip_arg_special_chars()
Mikael Berthe <mikael@lilotux.net>
parents: 1440
diff changeset
611 p--;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
612 }
1452
83e275dca409 Fix escaping bug in strip_arg_special_chars()
Mikael Berthe <mikael@lilotux.net>
parents: 1440
diff changeset
613 escape = !escape;
83e275dca409 Fix escaping bug in strip_arg_special_chars()
Mikael Berthe <mikael@lilotux.net>
parents: 1440
diff changeset
614 } else
83e275dca409 Fix escaping bug in strip_arg_special_chars()
Mikael Berthe <mikael@lilotux.net>
parents: 1440
diff changeset
615 escape = FALSE;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
616 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
617 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
618
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
619 // split_arg(arg, n, preservelast)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
620 // Split the string arg into a maximum of n pieces, taking care of
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
621 // double quotes.
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
622 // Return a null-terminated array of strings. This array should be freed
1167
9726c78a91f3 Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents: 1122
diff changeset
623 // by the caller after use, for example with free_arg_lst().
559
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
624 // If dontstriplast is true, the Nth argument isn't stripped (i.e. no
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
625 // processing of quote chars)
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
626 char **split_arg(const char *arg, unsigned int n, int dontstriplast)
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
627 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
628 char **arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
629 const char *p, *start, *end;
735
2f027806cd48 Some code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 727
diff changeset
630 unsigned int i = 0;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
631 int instring = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
632 int escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
633
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
634 arglst = g_new0(char*, n+1);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
635
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
636 if (!arg || !n) return arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
637
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
638 // Skip leading space
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
639 for (start = arg; *start && *start == ' '; start++) ;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
640 // End of string pointer
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
641 for (end = start; *end; end++) ;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
642 // Skip trailing space
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
643 while (end > start+1 && *(end-1) == ' ')
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
644 end--;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
645
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
646 for (p = start; p < end; p++) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
647 if (*p == '"' && !escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
648 instring = !instring;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
649 if (*p == '\\' && !escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
650 escape = TRUE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
651 else if (escape)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
652 escape = FALSE;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
653 if (*p == ' ' && !instring && i+1 < n) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
654 // end of parameter
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
655 *(arglst+i) = g_strndup(start, p-start);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
656 strip_arg_special_chars(*(arglst+i));
556
c4fee1a2c478 Fix bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 554
diff changeset
657 for (start = p+1; *start && *start == ' '; start++) ;
1367
cd0d63024923 Fix up split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 1361
diff changeset
658 p = start-1;
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
659 i++;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
660 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
661 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
662
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
663 if (start < end) {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
664 *(arglst+i) = g_strndup(start, end-start);
559
4eb579399613 Fix a small bug in split_arg()
Mikael Berthe <mikael@lilotux.net>
parents: 556
diff changeset
665 if (!dontstriplast || i+1 < n)
554
2424bbf0a6db Some more work on do_room()
Mikael Berthe <mikael@lilotux.net>
parents: 553
diff changeset
666 strip_arg_special_chars(*(arglst+i));
551
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
667 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
668
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
669 return arglst;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
670 }
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
671
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
672 // free_arg_lst(arglst)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
673 // Free an array allocated by split_arg()
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
674 void free_arg_lst(char **arglst)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
675 {
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
676 char **arg_elt;
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
677
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
678 for (arg_elt = arglst; *arg_elt; arg_elt++)
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
679 g_free(*arg_elt);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
680 g_free(arglst);
c71699efa5cc Add split_arg() / free_arg_lst()
Mikael Berthe <mikael@lilotux.net>
parents: 524
diff changeset
681 }
576
8b3db0b555a1 Add Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 559
diff changeset
682
655
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
683 // replace_nl_with_dots(bufstr)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
684 // Replace '\n' with "(...)" (or with a NUL if the string is too short)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
685 void replace_nl_with_dots(char *bufstr)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
686 {
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
687 char *p = strchr(bufstr, '\n');
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
688 if (p) {
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
689 if (strlen(p) >= 5)
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
690 strcpy(p, "(...)");
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
691 else
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
692 *p = 0;
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
693 }
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
694 }
de6837908702 Use "(...)" when cutting a multi-line status message in the log window
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
695
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
696 // ut_expand_tabs(text)
1122
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
697 // Expand tabs and filter out some bad chars in string text.
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
698 // If there is no tab and no bad chars in the string, a pointer to text
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
699 // is returned (be careful _not_ to free the pointer in this case).
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
700 // If there are some tabs or bad chars, a new string with expanded chars
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
701 // and no bad chars is returned; this is up to the caller to free this
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
702 // string after use.
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
703 char *ut_expand_tabs(const char *text)
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
704 {
1568
e89787ee40f7 Fix tab expansion when using say_to -f
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1531
diff changeset
705 char *xtext, *linestart;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
706 char *p, *q;
1122
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
707 guint n = 0, bc = 0;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
708
2049
0ba755e5dc48 ut_expand_tabs: Check the argument is not null
Mikael Berthe <mikael@lilotux.net>
parents: 1910
diff changeset
709 if (!text)
0ba755e5dc48 ut_expand_tabs: Check the argument is not null
Mikael Berthe <mikael@lilotux.net>
parents: 1910
diff changeset
710 return NULL;
0ba755e5dc48 ut_expand_tabs: Check the argument is not null
Mikael Berthe <mikael@lilotux.net>
parents: 1910
diff changeset
711
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
712 xtext = (char*)text;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
713 for (p=xtext; *p; p++)
1122
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
714 if (*p == '\t')
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
715 n++;
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
716 else if (*p == '\x0d')
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
717 bc++;
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
718 // XXX Are there other special chars we should filter out?
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
719
1122
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
720 if (!n && !bc)
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
721 return (char*)text;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
722
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
723 xtext = g_new(char, strlen(text) + 1 + 8*n);
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
724 p = (char*)text;
1568
e89787ee40f7 Fix tab expansion when using say_to -f
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1531
diff changeset
725 q = linestart = xtext;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
726 do {
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
727 if (*p == '\t') {
1568
e89787ee40f7 Fix tab expansion when using say_to -f
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1531
diff changeset
728 do { *q++ = ' '; } while ((q-linestart)%8);
1122
648fe6f715a6 Filter out ^M (0x0d) characters in incoming messages
Mikael Berthe <mikael@lilotux.net>
parents: 1106
diff changeset
729 } else if (*p != '\x0d') {
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
730 *q++ = *p;
1568
e89787ee40f7 Fix tab expansion when using say_to -f
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1531
diff changeset
731 if (*p =='\n')
e89787ee40f7 Fix tab expansion when using say_to -f
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1531
diff changeset
732 linestart = q;
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
733 }
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
734 } while (*p++);
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
735
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
736 return xtext;
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
737 }
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
738
2050
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
739 // ut_unescape_tabs_cr(text)
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
740 // Expand CR or TAB character sequences (\n, \t) in string text.
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
741 // If there is no CR/TAB in text, then the original pointer is returned
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
742 // (be careful _not_ to free the pointer in this case).
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
743 // If there are some unescaped sequences, a new string with those chars
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
744 // replaced with real newline/tab characters is allocated; in this case
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
745 // this is up to the caller to free this string after use.
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
746 char *ut_unescape_tabs_cr(const char *text)
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
747 {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
748 char *xtext, *linestart;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
749 char *p, *q;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
750
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
751 if (!text)
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
752 return NULL;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
753
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
754 p = g_strstr_len(text, -1, "\\n");
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
755 if (!p) {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
756 p = g_strstr_len(text, -1, "\\t");
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
757 if (!p)
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
758 return (char*)text;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
759 }
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
760
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
761 xtext = g_new(char, strlen(text) + 1);
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
762 p = (char*)text;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
763 q = linestart = xtext;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
764 do {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
765 if (*p == '\\') {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
766 if (*(p+1) == '\\' && (*(p+2) == 'n' || *(p+2) == 't')) {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
767 // This is an escaped CR sequence
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
768 *q++ = '\\';
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
769 *q++ = 'n';
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
770 p += 2;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
771 continue;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
772 }
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
773 if (*(p+1) == 'n' || *(p+1) == 't') {
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
774 // This is a CR sequence
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
775 p++;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
776 *q++ = (*p == 'n' ? '\n' : '\t');
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
777 continue;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
778 }
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
779 }
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
780 *q++ = *p;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
781 } while (*p++);
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
782
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
783 return xtext;
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
784 }
998feaa54ef0 Add ut_unescape_tabs_cr()
Mikael Berthe <mikael@lilotux.net>
parents: 2049
diff changeset
785
727
1c3620668857 Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
786
803
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
787 /* Cygwin's newlib does not have strcasestr() */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
788 /* The author of the code before the endif is
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
789 * Jeffrey Stedfast <fejj@ximian.com>
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
790 * and this code is reusable in compliance with the GPL v2. -- somian */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
791
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
792 #if !defined(HAVE_STRCASESTR)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
793
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
794 # define lowercase(c) (isupper ((int) (c)) ? tolower ((int) (c)) : (int) (c))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
795 # define bm_index(c, icase) ((icase) ? lowercase (c) : (int) (c))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
796 # define bm_equal(c1, c2, icase) ((icase) ? lowercase (c1) == lowercase (c2) : (c1) == (c2))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
797
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
798 /* FIXME: this is just a guess... should really do some performace tests to get an accurate measure */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
799 # define bm_optimal(hlen, nlen) (((hlen) ? (hlen) > 20 : 1) && (nlen) > 10 ? 1 : 0)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
800
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
801 static unsigned char *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
802 __boyer_moore (const unsigned char *haystack, size_t haystacklen,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
803 const unsigned char *needle, size_t needlelen, int icase)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
804 {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
805 register unsigned char *hc_ptr, *nc_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
806 unsigned char *he_ptr, *ne_ptr, *h_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
807 size_t skiptable[256], n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
808 register int i;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
809
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
810 #ifdef BOYER_MOORE_CHECKS
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
811 /* we don't need to do these checks since memmem/strstr/etc do it already */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
812 /* if the haystack is shorter than the needle then we can't possibly match */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
813 if (haystacklen < needlelen)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
814 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
815
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
816 /* instant match if the pattern buffer is 0-length */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
817 if (needlelen == 0)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
818 return (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
819 #endif /* BOYER_MOORE_CHECKS */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
820
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
821 /* set a pointer at the end of each string */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
822 ne_ptr = (unsigned char *) needle + needlelen - 1;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
823 he_ptr = (unsigned char *) haystack + haystacklen - 1;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
824
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
825 /* create our skip table */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
826 for (i = 0; i < 256; i++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
827 skiptable[i] = needlelen;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
828 for (nc_ptr = (unsigned char *) needle; nc_ptr < ne_ptr; nc_ptr++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
829 skiptable[bm_index (*nc_ptr, icase)] = (size_t) (ne_ptr - nc_ptr);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
830
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
831 h_ptr = (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
832 while (haystacklen >= needlelen) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
833 hc_ptr = h_ptr + needlelen - 1; /* set the haystack compare pointer */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
834 nc_ptr = ne_ptr; /* set the needle compare pointer */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
835
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
836 /* work our way backwards till they don't match */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
837 for (i = 0; nc_ptr > (unsigned char *) needle; nc_ptr--, hc_ptr--, i++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
838 if (!bm_equal (*nc_ptr, *hc_ptr, icase))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
839 break;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
840
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
841 if (!bm_equal (*nc_ptr, *hc_ptr, icase)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
842 n = skiptable[bm_index (*hc_ptr, icase)];
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
843 if (n == needlelen && i)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
844 if (bm_equal (*ne_ptr, ((unsigned char *) needle)[0], icase))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
845 n--;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
846 h_ptr += n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
847 haystacklen -= n;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
848 } else
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
849 return (unsigned char *) h_ptr;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
850 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
851
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
852 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
853 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
854
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
855 /*
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
856 * strcasestr:
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
857 * @haystack: string to search
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
858 * @needle: substring to search for
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
859 *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
860 * Finds the first occurence of the substring @needle within the
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
861 * string @haystack ignoring case.
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
862 *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
863 * Returns a pointer to the beginning of the substring match within
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
864 * @haystack, or NULL if the substring is not found.
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
865 **/
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
866 char *
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
867 strcasestr (const char *haystack, const char *needle)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
868 {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
869 register unsigned char *h, *n, *hc, *nc;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
870 size_t needlelen;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
871
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
872 needlelen = strlen (needle);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
873
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
874 if (needlelen == 0) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
875 return (char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
876 } else if (bm_optimal (0, needlelen)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
877 return (char *) __boyer_moore ((const unsigned char *) haystack,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
878 strlen (haystack),
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
879 (const unsigned char *) needle,
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
880 needlelen, 1);
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
881 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
882
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
883 h = (unsigned char *) haystack;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
884 n = (unsigned char *) needle;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
885
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
886 while (*(h + needlelen - 1)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
887 if (lowercase (*h) == lowercase (*n)) {
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
888 for (hc = h + 1, nc = n + 1; *hc && *nc; hc++, nc++)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
889 if (lowercase (*hc) != lowercase (*nc))
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
890 break;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
891
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
892 if (!*nc)
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
893 return (char *) h;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
894 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
895 h++;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
896 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
897 return NULL;
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
898 }
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
899 #endif /* !HAVE_STRCASESTR */
8f8d8f8157a2 Take care of the strcasestr lacking (Cygwin)
Soren Andersen <somian@pobox.com>
parents: 802
diff changeset
900
1203
c96fef31ff96 Expand startswith()
Mikael Berthe <mikael@lilotux.net>
parents: 1192
diff changeset
901 // startswith(str, word, ignore_case)
1192
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
902 // Returns TRUE if string str starts with word.
1203
c96fef31ff96 Expand startswith()
Mikael Berthe <mikael@lilotux.net>
parents: 1192
diff changeset
903 int startswith(const char *str, const char *word, guint ignore_case)
1192
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
904 {
1203
c96fef31ff96 Expand startswith()
Mikael Berthe <mikael@lilotux.net>
parents: 1192
diff changeset
905 if (ignore_case && !strncasecmp(str, word, strlen(word)))
c96fef31ff96 Expand startswith()
Mikael Berthe <mikael@lilotux.net>
parents: 1192
diff changeset
906 return TRUE;
c96fef31ff96 Expand startswith()
Mikael Berthe <mikael@lilotux.net>
parents: 1192
diff changeset
907 else if (!ignore_case && !strncmp(str, word, strlen(word)))
1192
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
908 return TRUE;
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
909 return FALSE;
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
910 }
7b8765c10abb New command: /source
Mikael Berthe <mikael@lilotux.net>
parents: 1167
diff changeset
911
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1780
diff changeset
912 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */