1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
/*! \file srUtils.h
* \brief General, small utilities that fit nowhere else.
*
* \author Rainer Gerhards <rgerhards@adiscon.com>
* \date 2003-09-09
* Coding begun.
*
* Copyright 2003-2007 Rainer Gerhards and Adiscon GmbH.
*
* This file is part of the rsyslog runtime library.
*
* The rsyslog runtime library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The rsyslog runtime library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the rsyslog runtime library. If not, see <http://www.gnu.org/licenses/>.
*
* A copy of the GPL can be found in the file "COPYING" in this distribution.
* A copy of the LGPL can be found in the file "COPYING.LESSER" in this distribution.
*/
#ifndef __SRUTILS_H_INCLUDED__
#define __SRUTILS_H_INCLUDED__ 1
/* syslog names */
#ifndef LOG_MAKEPRI
# define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri))
#endif
#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */
#define TABLE_NOPRI 0 /* Value to indicate no priority in f_pmask */
#define TABLE_ALLPRI 0xFF /* Value to indicate all priorities in f_pmask */
#define LOG_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) /* mark "facility" */
typedef struct syslogName_s {
char *c_name;
int c_val;
} syslogName_t;
extern syslogName_t syslogPriNames[];
extern syslogName_t syslogFacNames[];
/**
* A reimplementation of itoa(), as this is not available
* on all platforms. We used the chance to make an interface
* that fits us well, so it is no longer plain itoa().
*
* This method works with the US-ASCII alphabet. If you port this
* to e.g. EBCDIC, you need to make a small adjustment. Keep in mind,
* that on the wire it MUST be US-ASCII, so basically all you need
* to do is replace the constant '0' with 0x30 ;).
*
* \param pBuf Caller-provided buffer that will receive the
* generated ASCII string.
*
* \param iLenBuf Length of the caller-provided buffer.
*
* \param iToConv The integer to be converted.
*/
rsRetVal srUtilItoA(char *pBuf, int iLenBuf, number_t iToConv);
/**
* A method to duplicate a string for which the length is known.
* Len must be the length in characters WITHOUT the trailing
* '\0' byte.
* rgerhards, 2007-07-10
*/
unsigned char *srUtilStrDup(unsigned char *pOld, size_t len);
/**
* A method to create a directory and all its missing parents for
* a given file name. Please not that the rightmost element is
* considered to be a file name and thus NO directory is being created
* for it.
* added 2007-07-17 by rgerhards
*/
int makeFileParentDirs(uchar *szFile, size_t lenFile, mode_t mode, uid_t uid, gid_t gid, int bFailOnChown);
int execProg(uchar *program, int bWait, uchar *arg);
void skipWhiteSpace(uchar **pp);
rsRetVal genFileName(uchar **ppName, uchar *pDirName, size_t lenDirName, uchar *pFName,
size_t lenFName, long lNum, int lNumDigits);
int getNumberDigits(long lNum);
rsRetVal timeoutComp(struct timespec *pt, long iTimeout);
long timeoutVal(struct timespec *pt);
void mutexCancelCleanup(void *arg);
void srSleep(int iSeconds, int iuSeconds);
char *rs_strerror_r(int errnum, char *buf, size_t buflen);
int decodeSyslogName(uchar *name, syslogName_t *codetab);
int getSubString(uchar **ppSrc, char *pDst, size_t DstSize, char cSep);
rsRetVal getFileSize(uchar *pszName, off_t *pSize);
/* mutex operations */
/* some macros to cancel-safe lock a mutex (it will automatically be released
* when the thread is cancelled. This needs to be done as macros because
* pthread_cleanup_push sometimes is a macro that can not be used inside a function.
* It's a bit ugly, but works well... rgerhards, 2008-01-20
*/
#define DEFVARS_mutex_cancelsafeLock int iCancelStateSave
#define mutex_cancelsafe_lock(mut) \
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &iCancelStateSave); \
d_pthread_mutex_lock(mut); \
pthread_cleanup_push(mutexCancelCleanup, mut); \
pthread_setcancelstate(iCancelStateSave, NULL);
#define mutex_cancelsafe_unlock(mut) pthread_cleanup_pop(1)
/* some useful constants */
#define DEFVARS_mutexProtection\
int iCancelStateSave; \
int bLockedOpIsLocked=0
#define BEGIN_MTX_PROTECTED_OPERATIONS(mut, bMustLock) \
if(bMustLock == LOCK_MUTEX) { \
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &iCancelStateSave); \
d_pthread_mutex_lock(mut); \
assert(bLockedOpIsLocked == 0); \
bLockedOpIsLocked = 1; \
}
#define END_MTX_PROTECTED_OPERATIONS(mut) \
if(bLockedOpIsLocked) { \
d_pthread_mutex_unlock(mut); \
bLockedOpIsLocked = 0; \
pthread_setcancelstate(iCancelStateSave, NULL); \
}
/* The unconditional versions of the macro always lock the mutex. They are preferred in
* complex scenarios, where the simple ones might get mixed up by multiple calls.
*/
#define DEFVARS_mutexProtection_uncond\
int iCancelStateSave
#define BEGIN_MTX_PROTECTED_OPERATIONS_UNCOND(mut) \
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &iCancelStateSave); \
d_pthread_mutex_lock(mut);
#define END_MTX_PROTECTED_OPERATIONS_UNCOND(mut) \
d_pthread_mutex_unlock(mut); \
pthread_setcancelstate(iCancelStateSave, NULL);
#endif
|