2009-11-18 02:42:52 +03:00
/*-*- Mode: C; c-basic-offset: 8 -*-*/
# ifndef fooutilhfoo
# define fooutilhfoo
2010-02-03 15:03:47 +03:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
systemd 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 systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
2009-11-18 02:42:52 +03:00
# include <inttypes.h>
# include <time.h>
# include <sys/time.h>
# include <stdbool.h>
2010-01-23 03:52:57 +03:00
# include <stdlib.h>
2010-04-13 04:06:27 +04:00
# include <stdio.h>
2009-11-18 02:42:52 +03:00
typedef uint64_t usec_t ;
2010-01-26 06:18:44 +03:00
# define MSEC_PER_SEC 1000ULL
# define USEC_PER_SEC 1000000ULL
# define USEC_PER_MSEC 1000ULL
# define NSEC_PER_SEC 1000000000ULL
# define NSEC_PER_MSEC 1000000ULL
2009-11-18 02:42:52 +03:00
# define NSEC_PER_USEC 1000ULL
2010-01-26 09:02:51 +03:00
/* What is interpreted as whitespace? */
2010-01-28 00:37:50 +03:00
# define WHITESPACE " \t\n\r"
2010-04-08 05:22:25 +04:00
# define NEWLINE "\n\r"
2010-01-26 09:02:51 +03:00
2010-04-10 06:38:49 +04:00
# define FORMAT_TIMESTAMP_MAX 64
2009-11-18 02:42:52 +03:00
usec_t now ( clockid_t clock ) ;
usec_t timespec_load ( const struct timespec * ts ) ;
struct timespec * timespec_store ( struct timespec * ts , usec_t u ) ;
usec_t timeval_load ( const struct timeval * tv ) ;
struct timeval * timeval_store ( struct timeval * tv , usec_t u ) ;
# define streq(a,b) (strcmp((a),(b)) == 0)
2010-04-10 06:38:14 +04:00
bool streq_ptr ( const char * a , const char * b ) ;
2009-11-18 02:42:52 +03:00
# define new(t, n) ((t*) malloc(sizeof(t)*(n)))
# define new0(t, n) ((t*) calloc((n), sizeof(t)))
# define malloc0(n) (calloc((n), 1))
static inline const char * yes_no ( bool b ) {
return b ? " yes " : " no " ;
}
static inline const char * strempty ( const char * s ) {
return s ? s : " " ;
}
static inline const char * strnull ( const char * s ) {
return s ? s : " (null) " ;
}
2009-11-19 02:47:41 +03:00
static inline const char * strna ( const char * s ) {
return s ? s : " n/a " ;
}
static inline bool is_path_absolute ( const char * p ) {
return * p = = ' / ' ;
}
2009-11-18 02:42:52 +03:00
bool endswith ( const char * s , const char * postfix ) ;
bool startswith ( const char * s , const char * prefix ) ;
2010-01-30 03:52:44 +03:00
bool first_word ( const char * s , const char * word ) ;
2010-01-19 04:56:37 +03:00
int close_nointr ( int fd ) ;
2010-01-28 03:53:15 +03:00
void close_nointr_nofail ( int fd ) ;
2009-11-18 02:42:52 +03:00
2009-11-19 02:46:47 +03:00
int parse_boolean ( const char * v ) ;
int safe_atou ( const char * s , unsigned * ret_u ) ;
int safe_atoi ( const char * s , int * ret_i ) ;
2010-01-26 06:18:44 +03:00
int safe_atolu ( const char * s , unsigned long * ret_u ) ;
int safe_atoli ( const char * s , long int * ret_i ) ;
int safe_atollu ( const char * s , unsigned long long * ret_u ) ;
int safe_atolli ( const char * s , long long int * ret_i ) ;
2010-02-13 03:05:12 +03:00
char * split ( const char * c , size_t * l , const char * separator , char * * state ) ;
2010-01-26 06:18:44 +03:00
char * split_quoted ( const char * c , size_t * l , char * * state ) ;
2009-11-19 04:50:21 +03:00
2010-01-26 06:18:44 +03:00
# define FOREACH_WORD(word, length, s, state) \
2010-02-14 03:07:36 +03:00
for ( ( state ) = NULL , ( word ) = split ( ( s ) , & ( length ) , WHITESPACE , & ( state ) ) ; ( word ) ; ( word ) = split ( ( s ) , & ( length ) , WHITESPACE , & ( state ) ) )
2010-02-13 03:05:12 +03:00
# define FOREACH_WORD_SEPARATOR(word, length, s, separator, state) \
2010-02-14 03:07:36 +03:00
for ( ( state ) = NULL , ( word ) = split ( ( s ) , & ( length ) , ( separator ) , & ( state ) ) ; ( word ) ; ( word ) = split ( ( s ) , & ( length ) , ( separator ) , & ( state ) ) )
2009-11-19 04:50:21 +03:00
2010-01-26 06:18:44 +03:00
# define FOREACH_WORD_QUOTED(word, length, s, state) \
2010-02-14 03:07:36 +03:00
for ( ( state ) = NULL , ( word ) = split_quoted ( ( s ) , & ( length ) , & ( state ) ) ; ( word ) ; ( word ) = split_quoted ( ( s ) , & ( length ) , & ( state ) ) )
2010-01-26 06:18:44 +03:00
2010-02-13 03:05:12 +03:00
char * * split_path_and_make_absolute ( const char * p ) ;
2010-02-12 04:00:49 +03:00
2010-01-26 06:18:44 +03:00
pid_t get_parent_of_pid ( pid_t pid , pid_t * ppid ) ;
int write_one_line_file ( const char * fn , const char * line ) ;
int read_one_line_file ( const char * fn , char * * line ) ;
2010-01-26 09:02:51 +03:00
char * strappend ( const char * s , const char * suffix ) ;
2010-01-26 23:39:06 +03:00
int readlink_malloc ( const char * p , char * * r ) ;
char * file_name_from_path ( const char * p ) ;
2010-01-27 02:15:56 +03:00
bool is_path ( const char * p ) ;
bool path_is_absolute ( const char * p ) ;
char * path_make_absolute ( const char * p , const char * prefix ) ;
2010-02-13 03:05:12 +03:00
char * path_make_absolute_cwd ( const char * p ) ;
char * * strv_path_make_absolute_cwd ( char * * l ) ;
2010-01-26 23:39:06 +03:00
2010-01-27 08:19:28 +03:00
int reset_all_signal_handlers ( void ) ;
2010-01-28 00:37:50 +03:00
char * strstrip ( char * s ) ;
2010-04-07 22:27:05 +04:00
char * delete_chars ( char * s , const char * bad ) ;
2010-04-08 05:22:25 +04:00
char * truncate_nl ( char * s ) ;
2010-04-07 22:27:05 +04:00
2010-01-28 00:37:50 +03:00
char * file_in_same_dir ( const char * path , const char * filename ) ;
2010-02-12 04:01:14 +03:00
int mkdir_parents ( const char * path , mode_t mode ) ;
2010-04-10 06:38:33 +04:00
int mkdir_p ( const char * path , mode_t mode ) ;
2010-01-28 00:37:50 +03:00
2010-04-08 05:22:25 +04:00
int get_process_name ( pid_t pid , char * * name ) ;
2010-01-28 08:45:04 +03:00
char hexchar ( int x ) ;
2010-01-29 03:48:57 +03:00
int unhexchar ( char c ) ;
char octchar ( int x ) ;
int unoctchar ( char c ) ;
2010-04-06 04:41:03 +04:00
char decchar ( int x ) ;
int undecchar ( char c ) ;
2010-01-29 03:48:57 +03:00
char * cescape ( const char * s ) ;
char * cunescape ( const char * s ) ;
char * path_kill_slashes ( char * path ) ;
bool path_startswith ( const char * path , const char * prefix ) ;
char * ascii_strlower ( char * path ) ;
char * xescape ( const char * s , const char * bad ) ;
2010-01-28 08:45:04 +03:00
2010-02-01 05:33:24 +03:00
char * bus_path_escape ( const char * s ) ;
char * bus_path_unescape ( const char * s ) ;
2010-02-14 03:07:01 +03:00
bool ignore_file ( const char * filename ) ;
2010-04-07 22:27:19 +04:00
bool chars_intersect ( const char * a , const char * b ) ;
2010-04-10 06:38:49 +04:00
char * format_timestamp ( char * buf , size_t l , usec_t t ) ;
2010-01-30 03:52:32 +03:00
# define DEFINE_STRING_TABLE_LOOKUP(name,type) \
const char * name # # _to_string ( type i ) { \
if ( i < 0 | | i > = ( type ) ELEMENTSOF ( name # # _table ) ) \
return NULL ; \
return name # # _table [ i ] ; \
} \
type name # # _from_string ( const char * s ) { \
type i ; \
2010-04-07 18:39:07 +04:00
unsigned u = 0 ; \
2010-01-30 03:52:32 +03:00
assert ( s ) ; \
for ( i = 0 ; i < ( type ) ELEMENTSOF ( name # # _table ) ; i + + ) \
if ( streq ( name # # _table [ i ] , s ) ) \
return i ; \
2010-04-07 01:37:20 +04:00
if ( safe_atou ( s , & u ) > = 0 & & \
u < ELEMENTSOF ( name # # _table ) ) \
return ( type ) u ; \
2010-01-30 03:52:32 +03:00
return ( type ) - 1 ; \
} \
struct __useless_struct_to_allow_trailing_semicolon__
2010-04-06 23:53:02 +04:00
int fd_nonblock ( int fd , bool nonblock ) ;
int fd_cloexec ( int fd , bool cloexec ) ;
2010-04-07 01:35:59 +04:00
int close_all_fds ( const int except [ ] , unsigned n_except ) ;
2010-04-10 19:41:34 +04:00
bool fstype_is_network ( const char * fstype ) ;
2010-04-11 01:36:43 +04:00
int chvt ( int vt ) ;
2010-04-13 04:06:27 +04:00
int read_one_char ( FILE * f , char * ret , bool * need_nl ) ;
int ask ( char * ret , const char * replies , const char * text , . . . ) ;
int reset_terminal ( int fd ) ;
int open_terminal ( const char * name , int mode ) ;
int acquire_terminal ( const char * name , bool fail , bool force ) ;
int release_terminal ( void ) ;
int flush_fd ( int fd ) ;
2010-04-13 04:36:19 +04:00
int ignore_signal ( int sig ) ;
2010-04-07 01:36:48 +04:00
extern char * __progname ;
2010-01-30 03:52:32 +03:00
const char * ioprio_class_to_string ( int i ) ;
int ioprio_class_from_string ( const char * s ) ;
const char * sigchld_code_to_string ( int i ) ;
int sigchld_code_from_string ( const char * s ) ;
const char * log_facility_to_string ( int i ) ;
int log_facility_from_string ( const char * s ) ;
const char * log_level_to_string ( int i ) ;
int log_level_from_string ( const char * s ) ;
const char * sched_policy_to_string ( int i ) ;
int sched_policy_from_string ( const char * s ) ;
const char * rlimit_to_string ( int i ) ;
int rlimit_from_string ( const char * s ) ;
2009-11-18 02:42:52 +03:00
# endif