Annotation of ircnowd/src/tool/tool.c, Revision 1.1.1.1
1.1 tomglok 1: /*
2: * ngIRCd -- The Next Generation IRC Daemon
3: * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors.
4: *
5: * This program is free software; you can redistribute it and/or modify
6: * it under the terms of the GNU General Public License as published by
7: * the Free Software Foundation; either version 2 of the License, or
8: * (at your option) any later version.
9: * Please read the file COPYING, README and AUTHORS for more information.
10: */
11:
12: #include "portab.h"
13:
14: /**
15: * @file
16: * Tool functions
17: */
18:
19: #include <assert.h>
20: #include <ctype.h>
21: #include <stdio.h>
22: #include <stdlib.h>
23: #include <string.h>
24: #include <sys/time.h>
25:
26: #include <netinet/in.h>
27:
28: #ifdef SYSLOG
29: #define SYSLOG_NAMES 1
30: #include <syslog.h>
31: #endif
32:
33: #include "tool.h"
34:
35:
36: /**
37: * Removes all leading and trailing whitespaces of a string.
38: * @param String The string to remove whitespaces from.
39: */
40: GLOBAL void
41: ngt_TrimStr(char *String)
42: {
43: char *start, *end;
44:
45: assert(String != NULL);
46:
47: start = String;
48:
49: /* Remove whitespaces at the beginning of the string ... */
50: while (*start == ' ' || *start == '\t' ||
51: *start == '\n' || *start == '\r')
52: start++;
53:
54: if (!*start) {
55: *String = '\0';
56: return;
57: }
58:
59: /* ... and at the end: */
60: end = strchr(start, '\0');
61: end--;
62: while ((*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r')
63: && end >= start)
64: end--;
65:
66: /* New trailing NULL byte */
67: *(++end) = '\0';
68:
69: memmove(String, start, (size_t)(end - start)+1);
70: } /* ngt_TrimStr */
71:
72:
73: /**
74: * Convert a string to uppercase letters.
75: */
76: GLOBAL char *
77: ngt_UpperStr(char *String)
78: {
79: char *ptr;
80:
81: assert(String != NULL);
82:
83: ptr = String;
84: while(*ptr) {
85: *ptr = (char)toupper(*ptr);
86: ptr++;
87: }
88: return String;
89: } /* ngt_UpperStr */
90:
91:
92: /**
93: * Convert a string to lowercase letters.
94: */
95: GLOBAL char *
96: ngt_LowerStr(char *String)
97: {
98: char *ptr;
99:
100: assert(String != NULL);
101:
102: ptr = String;
103: while(*ptr) {
104: *ptr = (char)tolower(*ptr);
105: ptr++;
106: }
107: return String;
108: } /* ngt_LowerStr */
109:
110:
111: GLOBAL void
112: ngt_TrimLastChr( char *String, const char Chr)
113: {
114: /* If last character in the string matches Chr, remove it.
115: * Empty strings are handled correctly. */
116:
117: size_t len;
118:
119: assert(String != NULL);
120:
121: len = strlen(String);
122: if(len == 0)
123: return;
124:
125: len--;
126:
127: if(String[len] == Chr)
128: String[len] = '\0';
129: } /* ngt_TrimLastChr */
130:
131:
132: /**
133: * Fill a String with random chars
134: */
135: GLOBAL char *
136: ngt_RandomStr(char *String, const size_t len)
137: {
138: static const char chars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"#$&'()*+,-./:;<=>?@[\\]^_`";
139: struct timeval t;
140: size_t i;
141:
142: assert(String != NULL);
143:
144: gettimeofday(&t, NULL);
145: #ifndef HAVE_ARC4RANDOM
146: srand((unsigned)(t.tv_usec * t.tv_sec));
147:
148: for (i = 0; i < len; ++i) {
149: String[i] = chars[rand() % (sizeof(chars) - 1)];
150: }
151: #else
152: for (i = 0; i < len; ++i)
153: String[i] = chars[arc4random() % (sizeof(chars) - 1)];
154: #endif
155: String[len] = '\0';
156:
157: return String;
158: } /* ngt_RandomStr */
159:
160:
161: #ifdef SYSLOG
162:
163:
164: #ifndef INTERNAL_MARK
165:
166: #ifndef _code
167: typedef struct _code {
168: char *c_name;
169: int c_val;
170: } CODE;
171: #endif
172:
173: CODE facilitynames[] = {
174: #ifdef LOG_AUTH
175: { "auth", LOG_AUTH },
176: #endif
177: #ifdef LOG_AUTHPRIV
178: { "authpriv", LOG_AUTHPRIV },
179: #endif
180: #ifdef LOG_CRON
181: { "cron", LOG_CRON },
182: #endif
183: #ifdef LOG_DAEMON
184: { "daemon", LOG_DAEMON },
185: #endif
186: #ifdef LOG_FTP
187: { "ftp", LOG_FTP },
188: #endif
189: #ifdef LOG_LPR
190: { "lpr", LOG_LPR },
191: #endif
192: #ifdef LOG_MAIL
193: { "mail", LOG_MAIL },
194: #endif
195: #ifdef LOG_NEWS
196: { "news", LOG_NEWS },
197: #endif
198: #ifdef LOG_UUCP
199: { "uucp", LOG_UUCP },
200: #endif
201: #ifdef LOG_USER
202: { "user", LOG_USER },
203: #endif
204: #ifdef LOG_LOCAL7
205: { "local0", LOG_LOCAL0 },
206: { "local1", LOG_LOCAL1 },
207: { "local2", LOG_LOCAL2 },
208: { "local3", LOG_LOCAL3 },
209: { "local4", LOG_LOCAL4 },
210: { "local5", LOG_LOCAL5 },
211: { "local6", LOG_LOCAL6 },
212: { "local7", LOG_LOCAL7 },
213: #endif
214: { 0, -1 }
215: };
216:
217: #endif
218:
219:
220: GLOBAL const char*
221: ngt_SyslogFacilityName(int Facility)
222: {
223: int i = 0;
224: while(facilitynames[i].c_name) {
225: if (facilitynames[i].c_val == Facility)
226: return facilitynames[i].c_name;
227: i++;
228: }
229: return "unknown";
230: }
231:
232:
233: GLOBAL int
234: ngt_SyslogFacilityID(char *Name, int DefaultFacility)
235: {
236: int i = 0;
237: while(facilitynames[i].c_name) {
238: if (strcasecmp(facilitynames[i].c_name, Name) == 0)
239: return facilitynames[i].c_val;
240: i++;
241: }
242: return DefaultFacility;
243: }
244:
245:
246: #endif
247:
248:
249: /* -eof- */
CVSweb