mcabber/mcabber/utils.c
author Mikael Berthe <mikael@lilotux.net>
Sun, 06 Jul 2014 10:20:30 +0200
changeset 2135 361603828d9e
parent 2134 fc7a758ebbde
child 2168 87244845fd9c
permissions -rw-r--r--
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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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: 1572
diff changeset
    39
#include <glib/gprintf.h>
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
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: 1572
diff changeset
    60
//  jidtodisp(jid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    61
// Strips the resource part from the jid
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    62
// The caller should g_free the result after use.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    63
char *jidtodisp(const char *fjid)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    64
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    65
  char *ptr;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    66
  char *alias;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
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: 1572
diff changeset
    74
  alias = g_strdup(fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    75
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    76
  if ((ptr = strchr(alias, JID_RESOURCE_SEPARATOR)) != NULL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    77
    *ptr = 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    78
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    79
  return alias;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
    80
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
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: 1572
diff changeset
   110
char *compose_jid(const char *username, const char *servername,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   111
                  const char *resource)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   112
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   113
  char *fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   114
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   115
  if (!strchr(username, JID_DOMAIN_SEPARATOR)) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   116
    fjid = g_strdup_printf("%s%c%s%c%s", username,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   117
                           JID_DOMAIN_SEPARATOR, servername,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   118
                           JID_RESOURCE_SEPARATOR, resource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   119
  } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   120
    fjid = g_strdup_printf("%s%c%s", username,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   121
                           JID_RESOURCE_SEPARATOR, resource);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   122
  }
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   123
  return fjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   124
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   125
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   126
gboolean jid_equal(const char *jid1, const char *jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   127
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   128
  char *a,*b;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   129
  int ret;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   130
  if (!jid1 && !jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   131
    return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   132
  if (!jid1 || !jid2)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   133
    return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   134
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   135
  a = jidtodisp(jid1);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   136
  b = jidtodisp(jid2);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   137
  ret = strcasecmp(a, b);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   138
  g_free(a);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   139
  g_free(b);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   140
  return (ret == 0) ? TRUE : FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   141
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
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: 1572
diff changeset
   158
void fingerprint_to_hex(const unsigned char *fpr, char hex[49])
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   159
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   160
  int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   161
  char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   162
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   163
  for (p = hex, i = 0; i < 15; i++, p+=3)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   164
    g_sprintf(p, "%02X:", fpr[i]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   165
  g_sprintf(p, "%02X", fpr[i]);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   166
  hex[48] = '\0';
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   167
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   168
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   169
gboolean hex_to_fingerprint(const char *hex, char fpr[16])
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   170
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   171
  int i;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   172
  char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   173
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   174
  if (strlen(hex) != 47)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   175
    return FALSE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   176
  for (i = 0, p = (char*)hex; *p && *(p+1); i++, p += 3)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   177
    fpr[i] = (char) g_ascii_strtoull (p, NULL, 16);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   178
  return TRUE;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
diff changeset
   179
}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1572
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
{
1572
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;
1572
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') {
1572
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;
1572
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... */