summaryrefslogtreecommitdiffstats
path: root/runtime/srUtils.h
blob: 288e9dd7e7227ae78902ff2411de58d7fe63a3be (plain)
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
/*! \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);

/* 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 MUTEX_ALREADY_LOCKED	0
#define LOCK_MUTEX		1
#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 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