2010-08-17 05:33:07 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2009-11-18 02:42:52 +03:00
# 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>
2010-05-22 03:46:08 +04:00
# include <signal.h>
2010-07-04 18:44:58 +04:00
# include <sched.h>
2010-07-07 19:40:25 +04:00
# include <limits.h>
2010-10-08 04:31:36 +04:00
# include <sys/stat.h>
2010-10-19 00:38:41 +04:00
# include <dirent.h>
2009-11-18 02:42:52 +03:00
2010-06-23 21:46:29 +04:00
# include "macro.h"
2009-11-18 02:42:52 +03:00
typedef uint64_t usec_t ;
2010-07-01 02:26:44 +04:00
typedef struct dual_timestamp {
2010-05-24 03:45:54 +04:00
usec_t realtime ;
usec_t monotonic ;
2010-07-01 02:26:44 +04:00
} dual_timestamp ;
2010-05-24 03:45:54 +04:00
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-04-23 22:26:59 +04:00
# define USEC_PER_MINUTE (60ULL*USEC_PER_SEC)
# define USEC_PER_HOUR (60ULL*USEC_PER_MINUTE)
# define USEC_PER_DAY (24ULL*USEC_PER_HOUR)
# define USEC_PER_WEEK (7ULL*USEC_PER_DAY)
2010-08-25 05:13:44 +04:00
# define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC)
# define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC)
2010-04-23 22:26:59 +04:00
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-09-16 02:36:41 +04:00
# define QUOTES "\"\'"
# define COMMENTS "#;\n"
2010-01-26 09:02:51 +03:00
2010-04-10 06:38:49 +04:00
# define FORMAT_TIMESTAMP_MAX 64
2010-08-25 05:13:44 +04:00
# define FORMAT_TIMESTAMP_PRETTY_MAX 256
2010-05-24 03:45:54 +04:00
# define FORMAT_TIMESPAN_MAX 64
2010-04-10 06:38:49 +04:00
2010-07-05 04:40:39 +04:00
# define ANSI_HIGHLIGHT_ON "\x1B[1;31m"
2010-08-11 17:19:31 +04:00
# define ANSI_HIGHLIGHT_GREEN_ON "\x1B[1;32m"
2010-07-05 04:40:39 +04:00
# define ANSI_HIGHLIGHT_OFF "\x1B[0m"
2009-11-18 02:42:52 +03:00
usec_t now ( clockid_t clock ) ;
2010-07-01 02:26:44 +04:00
dual_timestamp * dual_timestamp_get ( dual_timestamp * ts ) ;
2010-05-24 03:45:54 +04:00
2010-09-21 06:14:38 +04:00
# define dual_timestamp_is_set(ts) ((ts)->realtime > 0)
2009-11-18 02:42:52 +03:00
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-10-07 15:24:39 +04:00
# define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
2009-11-18 02:42:52 +03:00
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-05-09 20:13:02 +04:00
bool startswith_no_case ( const char * s , const char * prefix ) ;
2009-11-18 02:42:52 +03:00
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 ) ;
2010-06-16 23:54:17 +04:00
void close_many ( const int fds [ ] , unsigned n_fd ) ;
2009-11-18 02:42:52 +03:00
2009-11-19 02:46:47 +03:00
int parse_boolean ( const char * v ) ;
2010-04-23 22:26:59 +04:00
int parse_usec ( const char * t , usec_t * usec ) ;
2010-06-18 00:50:35 +04:00
int parse_pid ( const char * s , pid_t * ret_pid ) ;
2009-11-19 02:46:47 +03:00
int safe_atou ( const char * s , unsigned * ret_u ) ;
int safe_atoi ( const char * s , int * ret_i ) ;
2010-07-07 19:40:25 +04:00
int safe_atollu ( const char * s , unsigned long long * ret_u ) ;
int safe_atolli ( const char * s , long long int * ret_i ) ;
# if __WORDSIZE == 32
static inline int safe_atolu ( const char * s , unsigned long * ret_u ) {
assert_cc ( sizeof ( unsigned long ) = = sizeof ( unsigned ) ) ;
return safe_atou ( s , ( unsigned * ) ret_u ) ;
}
static inline int safe_atoli ( const char * s , long int * ret_u ) {
assert_cc ( sizeof ( long int ) = = sizeof ( int ) ) ;
return safe_atoi ( s , ( int * ) ret_u ) ;
}
# else
static inline int safe_atolu ( const char * s , unsigned long * ret_u ) {
assert_cc ( sizeof ( unsigned long ) = = sizeof ( unsigned long long ) ) ;
return safe_atollu ( s , ( unsigned long long * ) ret_u ) ;
}
static inline int safe_atoli ( const char * s , long int * ret_u ) {
assert_cc ( sizeof ( long int ) = = sizeof ( long long int ) ) ;
return safe_atolli ( s , ( long long int * ) ret_u ) ;
}
# endif
2010-06-23 21:46:29 +04:00
static inline int safe_atou32 ( const char * s , uint32_t * ret_u ) {
assert_cc ( sizeof ( uint32_t ) = = sizeof ( unsigned ) ) ;
return safe_atou ( s , ( unsigned * ) ret_u ) ;
}
2010-07-07 19:40:25 +04:00
static inline int safe_atoi32 ( const char * s , int32_t * ret_i ) {
2010-06-23 21:46:29 +04:00
assert_cc ( sizeof ( int32_t ) = = sizeof ( int ) ) ;
2010-07-07 19:40:25 +04:00
return safe_atoi ( s , ( int * ) ret_i ) ;
2010-06-23 21:46:29 +04:00
}
2010-07-07 19:40:25 +04:00
static inline int safe_atou64 ( const char * s , uint64_t * ret_u ) {
assert_cc ( sizeof ( uint64_t ) = = sizeof ( unsigned long long ) ) ;
return safe_atollu ( s , ( unsigned long long * ) ret_u ) ;
}
2010-01-26 06:18:44 +03:00
2010-07-07 19:40:25 +04:00
static inline int safe_atoi64 ( const char * s , int64_t * ret_i ) {
assert_cc ( sizeof ( int64_t ) = = sizeof ( long long int ) ) ;
return safe_atolli ( s , ( long long int * ) ret_i ) ;
}
2010-01-26 06:18:44 +03:00
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-09-16 02:36:41 +04:00
int read_full_file ( const char * fn , char * * contents ) ;
2010-09-29 17:13:04 +04:00
int parse_env_file ( const char * fname , const char * separator , . . . ) _sentinel_ ;
2011-03-04 05:44:43 +03:00
int load_env_file ( const char * fname , char * * * l ) ;
2010-01-26 06:18:44 +03:00
2010-01-26 09:02:51 +03:00
char * strappend ( const char * s , const char * suffix ) ;
2010-07-08 06:09:59 +04:00
char * strnappend ( const char * s , const char * suffix , size_t length ) ;
char * replace_env ( const char * format , char * * env ) ;
char * * replace_env_argv ( char * * argv , char * * env ) ;
2010-01-26 09:02:51 +03:00
2010-01-26 23:39:06 +03:00
int readlink_malloc ( const char * p , char * * r ) ;
2010-06-16 03:56:00 +04:00
int readlink_and_make_absolute ( const char * p , char * * r ) ;
2010-01-26 23:39:06 +03:00
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 ) ;
2010-05-22 05:30:46 +04:00
2010-02-13 03:05:12 +03:00
char * * strv_path_make_absolute_cwd ( char * * l ) ;
2010-05-22 05:30:46 +04:00
char * * strv_path_canonicalize ( 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-06-22 01:27:18 +04:00
int safe_mkdir ( const char * path , mode_t mode , uid_t uid , gid_t gid ) ;
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-07-12 20:16:44 +04:00
int parent_of_path ( const char * path , char * * parent ) ;
2010-06-18 23:33:15 +04:00
int rmdir_parents ( const char * path , const char * stop ) ;
2010-04-08 05:22:25 +04:00
int get_process_name ( pid_t pid , char * * name ) ;
2010-07-05 05:06:02 +04:00
int get_process_cmdline ( pid_t pid , size_t max_length , char * * line ) ;
2010-04-08 05:22:25 +04:00
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 ) ;
2010-07-07 22:58:02 +04:00
char * cunescape_length ( const char * s , size_t length ) ;
char * xescape ( const char * s , const char * bad ) ;
char * bus_path_escape ( const char * s ) ;
char * bus_path_unescape ( const char * s ) ;
2010-01-29 03:48:57 +03:00
char * path_kill_slashes ( char * path ) ;
bool path_startswith ( const char * path , const char * prefix ) ;
2010-04-22 00:15:06 +04:00
bool path_equal ( const char * a , const char * b ) ;
2010-01-29 03:48:57 +03:00
char * ascii_strlower ( char * path ) ;
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-08-25 05:13:44 +04:00
char * format_timestamp_pretty ( char * buf , size_t l , usec_t t ) ;
2010-05-24 03:45:54 +04:00
char * format_timespan ( char * buf , size_t l , usec_t t ) ;
2010-04-10 06:38:49 +04:00
2010-05-15 19:25:08 +04:00
int make_stdio ( int fd ) ;
2010-10-27 07:45:57 +04:00
int make_null_stdio ( void ) ;
2010-05-15 19:25:08 +04:00
2010-06-16 07:05:36 +04:00
unsigned long long random_ull ( void ) ;
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 + + ) \
2010-07-01 02:29:17 +04:00
if ( name # # _table [ i ] & & \
streq ( name # # _table [ i ] , s ) ) \
2010-01-30 03:52:32 +03:00
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 ) ;
2010-05-18 05:40:19 +04:00
int acquire_terminal ( const char * name , bool fail , bool force , bool ignore_tiocstty_eperm ) ;
2010-04-13 04:06:27 +04:00
int release_terminal ( void ) ;
int flush_fd ( int fd ) ;
2010-05-22 03:46:08 +04:00
int ignore_signals ( int sig , . . . ) ;
int default_signals ( int sig , . . . ) ;
int sigaction_many ( const struct sigaction * sa , . . . ) ;
2010-04-13 04:36:19 +04:00
2010-04-17 01:24:39 +04:00
int close_pipe ( int p [ ] ) ;
2010-06-18 06:44:53 +04:00
ssize_t loop_read ( int fd , void * buf , size_t nbytes , bool do_poll ) ;
ssize_t loop_write ( int fd , const void * buf , size_t nbytes , bool do_poll ) ;
2010-04-17 01:24:39 +04:00
int path_is_mount_point ( const char * path ) ;
2010-05-16 20:13:58 +04:00
bool is_device_path ( const char * path ) ;
2010-05-24 07:25:33 +04:00
int dir_is_empty ( const char * path ) ;
2010-06-16 23:54:17 +04:00
void rename_process ( const char name [ 8 ] ) ;
2010-04-07 01:36:48 +04:00
2010-06-18 01:22:56 +04:00
void sigset_add_many ( sigset_t * ss , . . . ) ;
2010-06-18 04:28:35 +04:00
char * gethostname_malloc ( void ) ;
char * getlogname_malloc ( void ) ;
2011-02-17 18:29:04 +03:00
int getttyname_malloc ( int fd , char * * r ) ;
int getttyname_harder ( int fd , char * * r ) ;
int get_ctty_devnr ( dev_t * d ) ;
int get_ctty ( char * * r ) ;
2010-06-22 01:27:18 +04:00
int chmod_and_chown ( const char * path , mode_t mode , uid_t uid , gid_t gid ) ;
int rm_rf ( const char * path , bool only_dirs , bool delete_root ) ;
2010-06-18 04:28:35 +04:00
2010-07-04 18:44:58 +04:00
cpu_set_t * cpu_set_malloc ( unsigned * ncpus ) ;
2010-07-07 02:00:59 +04:00
void status_vprintf ( const char * format , va_list ap ) ;
2010-07-07 02:25:41 +04:00
void status_printf ( const char * format , . . . ) ;
void status_welcome ( void ) ;
2010-07-07 02:00:59 +04:00
2010-07-08 23:01:42 +04:00
int columns ( void ) ;
2010-07-08 23:34:51 +04:00
int running_in_chroot ( void ) ;
2010-07-20 22:33:19 +04:00
char * ellipsize ( const char * s , unsigned length , unsigned percent ) ;
2010-08-16 17:37:52 +04:00
int touch ( const char * path ) ;
2010-09-16 02:36:41 +04:00
char * unquote ( const char * s , const char * quotes ) ;
2011-01-05 18:06:35 +03:00
char * normalize_env_assignment ( const char * s ) ;
2010-08-20 04:46:15 +04:00
2010-09-15 16:48:59 +04:00
int wait_for_terminate ( pid_t pid , siginfo_t * status ) ;
2010-09-16 02:36:41 +04:00
int wait_for_terminate_and_warn ( const char * name , pid_t pid ) ;
2010-09-15 16:37:16 +04:00
2010-10-07 21:34:56 +04:00
_noreturn_ void freeze ( void ) ;
2010-10-08 04:31:36 +04:00
bool null_or_empty ( struct stat * st ) ;
2010-12-28 16:20:21 +03:00
DIR * xopendirat ( int dirfd , const char * name , int flags ) ;
2010-10-19 00:38:41 +04:00
2010-10-27 02:01:12 +04:00
void dual_timestamp_serialize ( FILE * f , const char * name , dual_timestamp * t ) ;
2010-10-28 05:16:03 +04:00
void dual_timestamp_deserialize ( const char * value , dual_timestamp * t ) ;
2010-10-27 02:01:12 +04:00
2010-11-08 07:02:45 +03:00
char * fstab_node_to_udev_node ( const char * p ) ;
2010-11-08 08:31:09 +03:00
void filter_environ ( const char * prefix ) ;
2011-02-14 20:56:51 +03:00
bool tty_is_vc ( const char * tty ) ;
2010-11-16 01:49:02 +03:00
const char * default_term_for_tty ( const char * tty ) ;
2011-02-21 23:48:59 +03:00
int detect_vm ( const char * * id ) ;
int detect_virtualization ( const char * * id ) ;
2011-02-13 17:46:05 +03:00
2011-02-15 02:30:11 +03:00
void execute_directory ( const char * directory , DIR * _d , char * argv [ ] ) ;
2011-03-04 01:55:30 +03:00
int kill_and_sigcont ( pid_t pid , int sig ) ;
2011-03-09 22:01:53 +03:00
bool nulstr_contains ( const char * nulstr , const char * needle ) ;
2010-11-08 07:02:45 +03:00
# define NULSTR_FOREACH(i, l) \
2010-08-20 04:26:05 +04:00
for ( ( i ) = ( l ) ; ( i ) & & * ( i ) ; ( i ) = strchr ( ( i ) , 0 ) + 1 )
2010-10-27 07:47:48 +04:00
# define NULSTR_FOREACH_PAIR(i, j, l) \
for ( ( i ) = ( l ) , ( j ) = strchr ( ( i ) , 0 ) + 1 ; ( i ) & & * ( i ) ; ( i ) = strchr ( ( j ) , 0 ) + 1 , ( j ) = * ( i ) ? strchr ( ( i ) , 0 ) + 1 : ( i ) )
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 ) ;
2010-07-01 02:29:17 +04:00
const char * ip_tos_to_string ( int i ) ;
int ip_tos_from_string ( const char * s ) ;
2010-07-10 06:49:37 +04:00
const char * signal_to_string ( int i ) ;
int signal_from_string ( const char * s ) ;
2010-10-22 18:11:50 +04:00
int signal_from_string_try_harder ( const char * s ) ;
2009-11-18 02:42:52 +03:00
# endif