📄 dhcp-libutil.h
字号:
/* $Header: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-libutil.h,v 1.29 2003/07/08 07:01:42 actmodern Exp $ * * Copyright 2002 Thamer Alharbash * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. The names of the authors may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * External interface header file: include this to use the * utility library. * */#ifndef DHCP_LIBUTIL_H#define DHCP_LIBUTIL_H/* types. *//* conf parser types. */typedef uint32_t command_code_t;typedef uint32_t arg_len_t;typedef uint32_t arg_type_t;typedef uint8_t arg_symbol_t;/* tokenizer types. */typedef uint8_t token_t;/* * * * * * * * * * * * Data structures. * * * * * * * * * * * *//* native data structures. */typedef struct node { struct node *next; void *data;} node_t;typedef struct { node_t *head; node_t *tail; node_t *seek; int len;} list_t;/* string buffer object. */typedef struct { size_t len; size_t capacity; char *buf;} stringbuffer_t;/* utility data structures. *//* rtt object. */typedef struct rtt { struct timeval timeout; time_t max_timeout; time_t start_time; time_t elapsed_time;} rtt_t;/* trigger object. */typedef struct { uint32_t time_set; uint32_t seconds; uint32_t id;} timer_trigger_t;/* timer object. */typedef struct { list_t *triggers; uint32_t current_id;} timer_keeper_t;/* parser object. */typedef struct { FILE *fp; int line_no; stringbuffer_t *data_buff; token_t peek_value; uint8_t peeked;} tokenizer_t;/* varfile object. */typedef struct { char *filename; tokenizer_t *tokenizer; stringbuffer_t *var_name; stringbuffer_t *var_val; uint8_t mode;} varfile_t;/* compiled directive. */typedef struct { command_code_t command_code; /* the command code. */ list_t *argument_types; /* type of argument: need this to free up arguments later. */ list_t *arguments; /* argument data. */} directive_t;/* command syntax object. */typedef struct { const command_code_t command_code; const char *command_name; const arg_len_t argument_len; const char ***argument_strings; const arg_type_t *argument_types; const arg_symbol_t **argument_symbols;} command_t;/* conf object. */typedef struct { char *filename; tokenizer_t *tokenizer; const command_t **commands; /* list of permissible commands. */ list_t *directives;} conf_t;/* prototypes. *//* in case strdup is not available. */# ifndef HAVE_STRDUPextern char *strdup(char *s);# endif /* HAVE_STRDUP *//* messaging. */extern void error_message(const char *func_name, const char *fmt, ...);extern void fatal_message(const char *func_name, const char *fmt, ...);extern void info_message(const char *fmt, ...);extern void warn_message(char *fmt, ...);extern void debug_message(const char *module_name, const char *func, const char *file, const char *fmt, ...);/* verbosity levels. */extern int get_verbosity_level(void);extern int set_verbosity_level(int verbosity_level_to_set);/* dynamic allocation wrappers. */extern void *xmalloc(size_t size);extern void *xcalloc(size_t size);extern void xfree(void *p);extern void *xrealloc(void *p, size_t size);/* signal/interrupt handlers. */extern int check_for_interrupts(void);extern void suspend_for_interrupts(void);extern void block_interrupts(void);extern void add_interrupt_handler(int sigtype, void (*sighandler) (int));extern void remove_interrupt(int sig);extern int peek_interrupt_type(void);extern int user_interrupt(void);/* alarm handlers. */extern int had_alarm(void);extern void set_alarm(uint32_t alarm_time);extern void remove_alarm(void);/* string routines -- XXX FIXME: we eventually want everything in * stringbuffer */extern char *splice_string(const char *s1, const char *s2);extern char *splice_many_strings(int num, char *s, ...);extern int string_matches(const char *s1, const char *s2);extern int hex_string_to_value(const char *string, unsigned char *dst);extern int is_string(const char *string, int len);extern char *xstrdup(const char *string);/* random number gen. */extern uint16_t get_random_uint16(void);extern uint32_t get_random_uint32(void);/* misc. */extern struct timeval timeval_diff(struct timeval begin, struct timeval end);extern const char *getprogname(void);extern ip_addr_t *string_ip_to_ip_addr(const char *string_ip);extern eth_addr_t *string_eth_addr_to_eth_addr(const char *eth_ip);extern char *eth_addr_to_string(eth_addr_t eth_addr);extern char *ip_addr_to_string(ip_addr_t ip_addr);extern void sleep_random(uint16_t max_sleep);extern void do_change_work_dir(const char *dir);/* type check routines */extern int is_seven_bit_clean(const char *data, int len);extern int is_signed_numeric(const char *string);extern int is_unsigned_numeric(const char *string);/* Replacement vsnprintf, snprintf that work the way we want them to. */extern int snprintf(char *str, size_t count, const char *fmt, ...);extern int vsnprintf(char *str, size_t count, const char *fmt, va_list arg);/* Linked List routines. */extern list_t *list_create(void);extern void list_add(list_t *list, void *data);extern void list_add_to_end(list_t *list, void *data);extern int list_remove_by_datum(list_t *list, void *data);extern void list_destroy(list_t *list, void (*purge_func) (void *d));extern void list_join(list_t *first_list, list_t *second_list);extern list_t *list_sort(list_t *list, int (*compare) (void *, void *));extern void *list_get_by_index(list_t *list, int index);extern void *list_first(list_t *list);extern void *list_second(list_t *list);extern void list_rewind(list_t *list);extern void *list_next(list_t *list);extern int list_get_len(list_t *list);extern list_t *list_copy(list_t *list, size_t data_size);/* stringbuffer. */extern stringbuffer_t *stringbuffer_create(void);extern void stringbuffer_destroy(stringbuffer_t *sb);extern void stringbuffer_clear(stringbuffer_t *sb);extern void stringbuffer_append_c(stringbuffer_t *sb, char c);extern void stringbuffer_append(stringbuffer_t *sb, const char *s);extern stringbuffer_t *stringbuffer_trim_whitespace(stringbuffer_t *sb);extern char *stringbuffer_get_last_occurance(stringbuffer_t *sb, char c);extern void stringbuffer_trim_newline(stringbuffer_t *sb);extern const char *stringbuffer_getstring(stringbuffer_t *sb);extern void stringbuffer_set(stringbuffer_t *dest, const char *s);extern void stringbuffer_copy(stringbuffer_t *dest, stringbuffer_t *src);extern void stringbuffer_replace_c(stringbuffer_t *sb, char c, char replace);extern void stringbuffer_replace(stringbuffer_t *sb, const char *string, const char *replace);extern void stringbuffer_align(stringbuffer_t *sb, int begin, int end);extern void stringbuffer_avprintf_align(stringbuffer_t *sb, int start, int end, const char *fmt, va_list ap);extern void stringbuffer_aprintf(stringbuffer_t *sb, const char *fmt, ...);extern void stringbuffer_aprintf_align(stringbuffer_t *sb, int start, int end, const char *fmt, ...);extern void stringbuffer_avprintf(stringbuffer_t *sb, const char *fmt, va_list ap);extern int stringbuffer_marknewlines(stringbuffer_t *sb);extern const char *stringbuffer_getnextline(stringbuffer_t *sb, const char *cptr);extern int stringbuffer_getlen(stringbuffer_t *sb);/* RTT mechanism. */extern rtt_t *rtt_create(time_t max_timeout);extern struct timeval rtt_get_timeout(rtt_t *rtt);extern void rtt_timeout(rtt_t *rtt);extern int rtt_can_retry(rtt_t *rtt);extern void rtt_destroy(rtt_t *rtt);/* interactive mode switch. */extern void set_interactive(uint8_t interactive_arg);/* timer object. */extern timer_keeper_t *create_timer(void);extern void destroy_timer(timer_keeper_t *timer);extern int timer_set_next(timer_keeper_t *timer);extern void timer_add_trigger(timer_keeper_t *timer, uint32_t time, uint32_t id);extern int timer_purge(timer_keeper_t);extern uint32_t timer_get_current_id(timer_keeper_t *timer);extern void reinitialize_timer(timer_keeper_t *timer);extern uint32_t timer_peek_next_timer(timer_keeper_t *timer);extern timer_keeper_t *timer_copy(timer_keeper_t *timer);/* var file. */extern varfile_t *create_varfile(const char *filename, uint8_t mode);extern void destroy_varfile(varfile_t *varfile);extern const char *varfile_get_name(varfile_t *varfile);extern const char *varfile_get_val(varfile_t *varfile);extern int varfile_get_lineno(varfile_t *varfile);extern const char *varfile_get_filename(varfile_t *varfile);extern int varfile_get_next_var(varfile_t *varfile);/* file routines. */extern FILE *file_open_or_create_safe(const char *filename, char *mode);extern FILE *file_create_and_truncate_safe(const char *filename, char *mode);extern int file_delete(char *fname);extern void file_move(char *fname, char *dest);extern int file_exists(const char *fname);extern void file_make_public_read(char *fname);extern int file_create_pid(char *name);extern int file_delete_pid(char *name);extern int file_get_pid(char *name, pid_t * pid);extern int file_permissions_are(const char *fname, mode_t mode);/* interrupt handling. */extern void add_interrupt_handler(int sigtype, void (*sighandler) (int));extern void block_interrupts(void);extern int check_for_interrupts(void);extern void suspend_for_interrupts(void);extern void remove_interrupt(int sig);extern RETSIGTYPE handle_hup(int i);extern RETSIGTYPE handle_shutdown(int i);extern int got_interrupt_type(void);/* configuration grammar parser */extern conf_t *conf_create(const command_t **commands, const char *filename);extern void conf_destroy(conf_t *conf);extern int conf_compile_directives(conf_t *conf);extern list_t *conf_get_directives(conf_t *conf);extern int conf_get_line_no(conf_t *conf);/* daemon routines. */extern void go_background(char *dir);extern void setup_interrupt_handlers(void);/* constants. *//* modes for varfiles. */#define VARFILE_VARNAMES_MODE 0 /* just names. */#define VARFILE_VARVAL_MODE 1 /* names and values. *//* return values for get_next_var */#define VARFILE_PARSE_ERROR -1 /* parse error. */#define VARFILE_EOF 0 /* end of file. */#define VARFILE_SUCCESS 1 /* success *//* stringbuffer chunk allocation size. */#define STRINGBUFFER_CHUNKSIZE 16/* Line length for messages before breaking into a new line. */#define MESSAGE_LINE_LENGTH 70/* timeout as per rfc2131 */#define MILLISECOND_TIMEOUT 4000#define MILLISECOND_RAND_TIMEOUT 1000#define RECOMMENDED_MAX_SECS_WAIT 64/* constant time values. */#define INFINITE_TIME 0xFFFFFFFF/* macros. *//* NELMS straight out of "The Practice of Programming" Pike and Kernighan. */#define NELMS(x) (sizeof(x)/sizeof(x[0]))/* log message macros. */#define INFO_MESSAGE(...) { info_message(__VA_ARGS__); }#define ERROR_MESSAGE(...) { error_message(__func__, __VA_ARGS__); }#define WARN_MESSAGE(...) { warn_message(__VA_ARGS__); }#define FATAL_MESSAGE(...) { fatal_message(__func__, __VA_ARGS__); }#define DEBUG_MESSAGE(...) { debug_message(MODULE_NAME, __func__, __FILE__, __VA_ARGS__); }/* time macros. */#define SECS_TO_MSECS(x) (x * 1000)#define MSECS_TO_SECS(x) (x / 1000)#define MSECS_TO_SECS_REM(x) (x % 1000)/* Verbosity levels. */enum verbosity { QUIET_VERBOSITY_LEVEL = 0, ERROR_VERBOSITY_LEVEL, NORMAL_VERBOSITY_LEVEL, WARNING_VERBOSITY_LEVEL, DEBUG_VERBOSITY_LEVEL, MAX_VERBOSITY_LEVEL};/* Syslog options. */#define LOG_OPT LOG_PID|LOG_NDELAY /* Options */#define LOG_FACILITY LOG_DAEMON /* Facility */#define ERROR_LEVEL LOG_ERR /* Error level */#define INFO_LEVEL LOG_INFO /* Normal level *//* interrupt types. */enum interrupt_types { INTERRUPT_NONE, INTERRUPT_ALARM, INTERRUPT_HUP, INTERRUPT_TERM };#endif /* DHCP_LIBUTIL_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -