util.h revision 96ea25cbd9b94d48c57b6173eeda2b3fbe670a70
/*
Authors:
Simo Sorce <ssorce@redhat.com>
Copyright (C) 2009 Red Hat
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __SSSD_UTIL_H__
#define __SSSD_UTIL_H__
#include "config.h"
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <libintl.h>
#include <limits.h>
#include <locale.h>
#include <time.h>
#include <pcre.h>
#include <talloc.h>
#include <tevent.h>
#include <ldb.h>
#include <dhash.h>
#ifndef HAVE_ERRNO_T
#define HAVE_ERRNO_T
typedef int errno_t;
#endif
#define ENUM_INDICATOR "*"
extern const char *debug_prg_name;
extern int debug_level;
extern int debug_timestamps;
extern int debug_to_file;
extern const char *debug_log_file;
#define SSS_DEFAULT_DEBUG_LEVEL 0
#define SSS_UNRESOLVED_DEBUG_LEVEL -1
#define SSSDBG_TIMESTAMP_UNRESOLVED -1
#define SSSDBG_TIMESTAMP_DEFAULT 1
#define SSSD_DEBUG_OPTS \
_("Debug level"), NULL}, \
_("Send the debug output to files instead of stderr"), NULL }, \
_("Add debug timestamps"), NULL},
/** \def DEBUG(level, body)
\brief macro to generate debug messages
\param level the debug level, please respect the following guidelines:
- 1 is for critical errors users may find it difficult to understand but
are still quite clear
- 2-4 is for stuff developers are interested in in general, but
shouldn't fill the screen with useless low level verbose stuff
- 5-6 is for errors you may want to track, but only if you explicitly
looking for additional clues
- 7-10 is for informational stuff
\param body the debug message you want to send, should end with \n
*/
if (level <= debug_level) { \
if (debug_timestamps) { \
char stamp[25]; \
debug_fn("(%s) [%s] [%s] (%d): ", \
} else { \
debug_fn("[%s] [%s] (%d): ", \
} \
} \
} while(0);
#ifndef discard_const
#endif
#ifndef NULL
#define NULL 0
#endif
#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
#define EOK 0
#define SSSD_MAIN_OPTS SSSD_DEBUG_OPTS
#define FLAGS_NONE 0x0000
#define FLAGS_DAEMON 0x0001
#define FLAGS_INTERACTIVE 0x0002
#define FLAGS_PID_FILE 0x0004
#ifndef talloc_zfree
#define talloc_zfree(ptr) do { \
talloc_free(_tmp_ctx); \
} while(0)
#endif
#ifndef discard_const_p
#if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T)
#else
#endif
#endif
/* TODO: remove later
* These functions are available in the latest tevent and are the ones that
* should be used as tevent_req is rightfully opaque there */
#ifndef tevent_req_data
#define tevent_req_notify_callback(req) \
do { \
} \
} while(0)
/* noop */
#define tevent_loop_allow_nesting(x)
#endif
#define TEVENT_REQ_RETURN_ON_ERROR(req) do { \
enum tevent_req_state TRROEstate; \
\
if (TRROEstate == TEVENT_REQ_USER_ERROR) { \
return TRROEerr; \
} \
return EIO; \
} \
} while (0)
static inline void
{
if (counter) {
*counter += n;
}
}
} while(0)
} while(0)
} while(0)
} while(0)
#include "util/dlinklist.h"
/* From debug.c */
int open_debug_file(void);
int rotate_debug_files(void);
/* From sss_log.c */
#define SSS_LOG_EMERG 0 /* system is unusable */
/* from server.c */
struct main_context {
struct tevent_context *event_ctx;
struct confdb_ctx *confdb_ctx;
};
int die_if_parent_died(void);
const char *conf_entry,
struct main_context **main_ctx);
/* from signal.c */
#include <signal.h>
void CatchChild(void);
void CatchChildLeaveStatus(void);
/* from memory.c */
typedef int (void_destructor_fn_t)(void *);
struct mem_holder {
void *mem;
};
void *ptr,
int password_destructor(void *memctx);
/* from usertools.c */
struct sss_names_ctx {
char *re_pattern;
char *fq_fmt;
};
struct confdb_ctx *cdb,
struct sss_names_ctx **out);
struct sss_names_ctx *snctx,
/* from backup-file.c */
/* from check_and_open.c */
enum check_file_type {
};
/* check_file()
* file type. This function can be used to determine if a file is a
* symlink.
* Warning: use of this function implies a potential race condition
* Opening a file before or after checking it does NOT guarantee that
* it is still the same file. Additional checks should be performed
* on the caller_stat_buf to ensure that it has the same device and
* inode to minimize impact. Permission changes may have occurred,
* however.
*/
struct stat *caller_stat_buf);
/* check_fd()
* is of a certain file type. This function CANNOT detect symlinks,
* as the file is already open and symlinks have been traversed. This
* is the safer way to perform file checks and should be preferred
* over check_file for nearly all situations.
*/
struct stat *caller_stat_buf);
/* check_and_open_readonly()
* Utility function to open a file and verify that it has certain
* permissions and is of a certain file type. This function wraps
* check_fd(), and is considered race-condition safe.
*/
enum check_file_type type);
/* from util.c */
char **parse_args(const char *str);
unsigned long count,
hash_table_t **tbl);
unsigned long count,
hash_table_t **tbl,
unsigned int directory_bits,
unsigned int segment_bits,
unsigned long min_load_factor,
unsigned long max_load_factor,
void *delete_private_data);
/* Copy a NULL-terminated string list
* Returns NULL on out of memory error or invalid input
*/
/* Take two string lists (terminated on a NULL char*)
* and return up to three arrays of strings based on
* shared ownership.
*
* Pass NULL to any return type you don't care about
*/
char **string1,
char **string2,
char ***string1_only,
char ***string2_only,
char ***both_strings);
/* Sanitize an input string (e.g. a username) for use in
* Returns a newly-constructed string attached to mem_ctx
* It will fail only on an out of memory condition, where it
* will return ENOMEM.
*/
const char *input,
char **sanitized);
char *
#endif /* __SSSD_UTIL_H__ */