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>
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>
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-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
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"
# 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
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-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-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-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-05-16 05:55:19 +04:00
bool is_clean_exit ( int code , int status ) ;
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 ) ;
2010-06-22 01:27:18 +04:00
int getttyname_malloc ( char * * r ) ;
int getmachineid_malloc ( char * * r ) ;
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-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 ) ;
Systemd is causing mislabeled devices to be created and then attempting to read them.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 07/28/2010 05:57 AM, Kay Sievers wrote:
> On Wed, Jul 28, 2010 at 11:43, Lennart Poettering
> <lennart@poettering.net> wrote:
>> On Mon, 26.07.10 16:42, Daniel J Walsh (dwalsh@redhat.com) wrote:
>>> tcontext=system_u:object_r:device_t:s0 tclass=chr_file
>>> type=1400 audit(1280174589.476:7): avc: denied { read } for pid=1
>>> comm="systemd" name="autofs" dev=devtmpfs ino=9482
>>> scontext=system_u:system_r:init_t:s0
>>> tcontext=system_u:object_r:device_t:s0 tclass=chr_file
>>> type=1400 audit(1280174589.476:8): avc: denied { read } for pid=1
>>> comm="systemd" name="autofs" dev=devtmpfs ino=9482
>>> scontext=system_u:system_r:init_t:s0
>>> tcontext=system_u:object_r:device_t:s0 tclass=chr_file
>>>
>>> Lennart, we talked about this earlier. I think this is caused by the
>>> modprobe calls to create /dev/autofs. Since udev is not created at the
>>> point that init loads the kernel modules, the devices get created with
>>> the wrong label. Once udev starts the labels get fixed.
>>>
>>> I can allow init_t to read device_t chr_files.
>>
>> Hmm, I think a cleaner fix would be to make systemd relabel this device
>> properly before accessing it? Given that this is only one device this
>> should not be a problem for us to maintain, I think? How would the
>> fixing of the label work? Would we have to spawn restorecon for this, or
>> can we actually do this in C without too much work?
>
> I guess we can just do what udev is doing, and call setfilecon(), with
> a context of an earlier matchpathcon().
>
> Kay
> _______________________________________________
> systemd-devel mailing list
> systemd-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Here is the updated patch with a fix for the labeling of /dev/autofs
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAkxQMyoACgkQrlYvE4MpobNviACfWgxsjW2xzz1qznFex8RVAQHf
gIEAmwRmRcLvGqYtwQaZ3WKIg8wmrwNk
=pC2e
2010-07-28 17:39:54 +04:00
int label_init ( void ) ;
int label_fix ( const char * path ) ;
void label_finish ( void ) ;
int label_socket_set ( const char * label ) ;
void label_socket_clear ( void ) ;
int label_fifofile_set ( const char * label , const char * path ) ;
void label_file_clear ( void ) ;
void label_free ( const char * label ) ;
int label_get_socket_label_from_exe ( const char * exe , char * * label ) ;
2009-11-18 02:42:52 +03:00
# endif