2001-12-11 22:53:04 +01:00
|
|
|
/*
|
|
|
|
* ngIRCd -- The Next Generation IRC Daemon
|
2010-09-24 16:29:55 +02:00
|
|
|
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
2001-12-11 22:53:04 +01:00
|
|
|
*
|
2002-12-12 13:24:18 +01:00
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
* Please read the file COPYING, README and AUTHORS for more information.
|
2001-12-11 22:53:04 +01:00
|
|
|
*/
|
|
|
|
|
2002-03-12 15:37:51 +01:00
|
|
|
#include "portab.h"
|
2001-12-11 22:53:04 +01:00
|
|
|
|
2010-12-27 17:14:14 +01:00
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* Tool functions
|
|
|
|
*/
|
|
|
|
|
2002-03-12 15:37:51 +01:00
|
|
|
#include "imp.h"
|
2001-12-11 22:53:04 +01:00
|
|
|
#include <assert.h>
|
2002-03-22 01:17:27 +01:00
|
|
|
#include <ctype.h>
|
2001-12-11 22:53:04 +01:00
|
|
|
#include <stdio.h>
|
2012-08-02 13:53:46 +02:00
|
|
|
#include <stdlib.h>
|
2001-12-11 22:53:04 +01:00
|
|
|
#include <string.h>
|
2012-08-02 13:53:46 +02:00
|
|
|
#include <sys/time.h>
|
2001-12-11 22:53:04 +01:00
|
|
|
|
2007-11-23 17:26:03 +01:00
|
|
|
#include <netinet/in.h>
|
|
|
|
|
2010-09-24 16:29:55 +02:00
|
|
|
#ifdef SYSLOG
|
|
|
|
#define SYSLOG_NAMES 1
|
|
|
|
#include <syslog.h>
|
|
|
|
#endif
|
|
|
|
|
2002-03-12 15:37:51 +01:00
|
|
|
#include "exp.h"
|
2001-12-12 18:20:33 +01:00
|
|
|
#include "tool.h"
|
2001-12-11 22:53:04 +01:00
|
|
|
|
|
|
|
|
2006-03-22 09:05:10 +01:00
|
|
|
/**
|
|
|
|
* Removes all leading and trailing whitespaces of a string.
|
|
|
|
* @param String The string to remove whitespaces from.
|
|
|
|
*/
|
2005-03-19 19:43:48 +01:00
|
|
|
GLOBAL void
|
2006-03-22 09:05:10 +01:00
|
|
|
ngt_TrimStr(char *String)
|
2001-12-11 22:53:04 +01:00
|
|
|
{
|
2006-03-22 09:05:10 +01:00
|
|
|
char *start, *end;
|
2001-12-11 22:53:04 +01:00
|
|
|
|
2006-03-22 09:05:10 +01:00
|
|
|
assert(String != NULL);
|
2001-12-11 22:53:04 +01:00
|
|
|
|
|
|
|
start = String;
|
|
|
|
|
2006-03-22 09:05:10 +01:00
|
|
|
/* Remove whitespaces at the beginning of the string ... */
|
2006-04-09 14:53:07 +02:00
|
|
|
while (*start == ' ' || *start == '\t' ||
|
|
|
|
*start == '\n' || *start == '\r')
|
2006-03-22 09:05:10 +01:00
|
|
|
start++;
|
|
|
|
|
2006-03-25 00:25:38 +01:00
|
|
|
if (!*start) {
|
2006-04-09 14:53:07 +02:00
|
|
|
*String = '\0';
|
2006-03-25 00:25:38 +01:00
|
|
|
return;
|
|
|
|
}
|
2006-04-09 14:53:07 +02:00
|
|
|
|
2006-03-22 09:05:10 +01:00
|
|
|
/* ... and at the end: */
|
|
|
|
end = strchr(start, '\0');
|
2006-03-25 00:25:38 +01:00
|
|
|
end--;
|
2006-03-22 09:05:10 +01:00
|
|
|
while ((*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')
|
2006-04-09 14:53:07 +02:00
|
|
|
&& end >= start)
|
2006-03-22 09:05:10 +01:00
|
|
|
end--;
|
|
|
|
|
|
|
|
/* New trailing NULL byte */
|
|
|
|
*(++end) = '\0';
|
|
|
|
|
2006-03-25 00:25:38 +01:00
|
|
|
memmove(String, start, (size_t)(end - start)+1);
|
2001-12-29 04:05:34 +01:00
|
|
|
} /* ngt_TrimStr */
|
2001-12-11 22:53:04 +01:00
|
|
|
|
|
|
|
|
2008-08-17 13:49:32 +02:00
|
|
|
/**
|
|
|
|
* Convert a string to uppercase letters.
|
|
|
|
*/
|
2005-03-19 19:43:48 +01:00
|
|
|
GLOBAL char *
|
2008-08-17 13:49:32 +02:00
|
|
|
ngt_UpperStr(char *String)
|
2002-03-22 01:17:27 +01:00
|
|
|
{
|
2008-08-17 13:49:32 +02:00
|
|
|
char *ptr;
|
|
|
|
|
|
|
|
assert(String != NULL);
|
|
|
|
|
|
|
|
ptr = String;
|
|
|
|
while(*ptr) {
|
|
|
|
*ptr = toupper(*ptr);
|
|
|
|
ptr++;
|
|
|
|
}
|
|
|
|
return String;
|
|
|
|
} /* ngt_UpperStr */
|
|
|
|
|
2002-03-22 01:17:27 +01:00
|
|
|
|
2008-08-17 13:49:32 +02:00
|
|
|
/**
|
|
|
|
* Convert a string to lowercase letters.
|
|
|
|
*/
|
|
|
|
GLOBAL char *
|
|
|
|
ngt_LowerStr(char *String)
|
|
|
|
{
|
2005-03-19 19:43:48 +01:00
|
|
|
char *ptr;
|
2002-03-22 01:17:27 +01:00
|
|
|
|
2008-08-17 13:49:32 +02:00
|
|
|
assert(String != NULL);
|
2002-03-22 01:17:27 +01:00
|
|
|
|
|
|
|
ptr = String;
|
2008-08-17 13:49:32 +02:00
|
|
|
while(*ptr) {
|
|
|
|
*ptr = tolower(*ptr);
|
2002-03-22 01:17:27 +01:00
|
|
|
ptr++;
|
|
|
|
}
|
|
|
|
return String;
|
|
|
|
} /* ngt_LowerStr */
|
|
|
|
|
|
|
|
|
2005-03-19 19:43:48 +01:00
|
|
|
GLOBAL void
|
|
|
|
ngt_TrimLastChr( char *String, const char Chr)
|
2005-01-25 17:16:48 +01:00
|
|
|
{
|
|
|
|
/* If last character in the string matches Chr, remove it.
|
|
|
|
* Empty strings are handled correctly. */
|
|
|
|
|
2009-09-11 22:52:12 +02:00
|
|
|
size_t len;
|
2005-01-25 17:16:48 +01:00
|
|
|
|
2009-09-11 22:52:12 +02:00
|
|
|
assert(String != NULL);
|
2005-01-25 17:16:48 +01:00
|
|
|
|
2009-09-11 22:52:12 +02:00
|
|
|
len = strlen(String);
|
|
|
|
if(len == 0)
|
|
|
|
return;
|
2005-01-25 17:16:48 +01:00
|
|
|
|
|
|
|
len--;
|
|
|
|
|
2009-09-11 22:52:12 +02:00
|
|
|
if(String[len] == Chr)
|
|
|
|
String[len] = '\0';
|
2005-01-25 17:16:48 +01:00
|
|
|
} /* ngt_TrimLastChr */
|
|
|
|
|
2009-09-11 22:52:12 +02:00
|
|
|
|
2012-08-02 13:53:46 +02:00
|
|
|
/**
|
|
|
|
* Fill a String with random chars
|
|
|
|
*/
|
|
|
|
GLOBAL char *
|
|
|
|
ngt_RandomStr( char *String, const size_t len)
|
|
|
|
{
|
|
|
|
assert(String != NULL);
|
|
|
|
|
|
|
|
static const char chars[] =
|
|
|
|
"0123456789ABCDEFGHIJKLMNO"
|
|
|
|
"PQRSTUVWXYZabcdefghijklmn"
|
|
|
|
"opqrstuvwxyz!\"#$&'()*+,-"
|
|
|
|
"./:;<=>?@[\\]^_`";
|
|
|
|
|
|
|
|
struct timeval t;
|
|
|
|
gettimeofday(&t, NULL);
|
2012-08-18 12:34:11 +02:00
|
|
|
srand((unsigned)(t.tv_usec * t.tv_sec));
|
2012-08-02 13:53:46 +02:00
|
|
|
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
|
|
|
String[i] = chars[rand() % (sizeof(chars) - 1)];
|
|
|
|
}
|
|
|
|
|
|
|
|
String[len] = '\0';
|
|
|
|
|
|
|
|
return String;
|
|
|
|
} /* ngt_RandomStr */
|
|
|
|
|
|
|
|
|
2010-09-24 16:29:55 +02:00
|
|
|
#ifdef SYSLOG
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef INTERNAL_MARK
|
|
|
|
|
|
|
|
#ifndef _code
|
|
|
|
typedef struct _code {
|
|
|
|
char *c_name;
|
|
|
|
int c_val;
|
|
|
|
} CODE;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
CODE facilitynames[] = {
|
|
|
|
#ifdef LOG_AUTH
|
|
|
|
{ "auth", LOG_AUTH },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_AUTHPRIV
|
|
|
|
{ "authpriv", LOG_AUTHPRIV },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_CRON
|
|
|
|
{ "cron", LOG_CRON },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_DAEMON
|
|
|
|
{ "daemon", LOG_DAEMON },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_FTP
|
|
|
|
{ "ftp", LOG_FTP },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_LPR
|
|
|
|
{ "lpr", LOG_LPR },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_MAIL
|
|
|
|
{ "mail", LOG_MAIL },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_NEWS
|
|
|
|
{ "news", LOG_NEWS },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_UUCP
|
|
|
|
{ "uucp", LOG_UUCP },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_USER
|
|
|
|
{ "user", LOG_USER },
|
|
|
|
#endif
|
|
|
|
#ifdef LOG_LOCAL7
|
|
|
|
{ "local0", LOG_LOCAL0 },
|
|
|
|
{ "local1", LOG_LOCAL1 },
|
|
|
|
{ "local2", LOG_LOCAL2 },
|
|
|
|
{ "local3", LOG_LOCAL3 },
|
|
|
|
{ "local4", LOG_LOCAL4 },
|
|
|
|
{ "local5", LOG_LOCAL5 },
|
|
|
|
{ "local6", LOG_LOCAL6 },
|
|
|
|
{ "local7", LOG_LOCAL7 },
|
|
|
|
#endif
|
|
|
|
{ 0, -1 }
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2010-10-24 21:48:32 +02:00
|
|
|
GLOBAL const char*
|
|
|
|
ngt_SyslogFacilityName(int Facility)
|
2010-09-24 16:29:55 +02:00
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
while(facilitynames[i].c_name) {
|
|
|
|
if (facilitynames[i].c_val == Facility)
|
|
|
|
return facilitynames[i].c_name;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
return "unknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL int
|
|
|
|
ngt_SyslogFacilityID(char *Name, int DefaultFacility)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
while(facilitynames[i].c_name) {
|
|
|
|
if (strcasecmp(facilitynames[i].c_name, Name) == 0)
|
|
|
|
return facilitynames[i].c_val;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
return DefaultFacility;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2001-12-11 22:53:04 +01:00
|
|
|
/* -eof- */
|