2012-05-16 05:36:42 +04:00
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd .
Copyright 2012 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 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
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <errno.h>
# include <assert.h>
# include <string.h>
# include <unistd.h>
# include <getopt.h>
# include "hashmap.h"
# include "util.h"
# include "path-util.h"
# include "log.h"
# include "pager.h"
# include "build.h"
static bool arg_no_pager = false ;
2012-05-21 04:01:52 +04:00
static int arg_diff = - 1 ;
2012-05-16 05:36:42 +04:00
2012-05-21 04:01:52 +04:00
static enum {
2012-05-16 20:53:46 +04:00
SHOW_MASKED = 1 < < 0 ,
2012-05-16 20:57:57 +04:00
SHOW_EQUIVALENT = 1 < < 1 ,
SHOW_REDIRECTED = 1 < < 2 ,
2012-05-17 00:49:30 +04:00
SHOW_OVERRIDDEN = 1 < < 3 ,
2012-05-16 20:53:46 +04:00
SHOW_UNCHANGED = 1 < < 4 ,
SHOW_DEFAULTS =
2012-05-17 00:49:30 +04:00
( SHOW_MASKED | SHOW_EQUIVALENT | SHOW_REDIRECTED | SHOW_OVERRIDDEN )
2012-05-21 04:01:52 +04:00
} arg_flags = 0 ;
2012-05-16 20:53:46 +04:00
2012-05-16 05:36:42 +04:00
static int equivalent ( const char * a , const char * b ) {
char * x , * y ;
int r ;
x = canonicalize_file_name ( a ) ;
if ( ! x )
return - errno ;
y = canonicalize_file_name ( b ) ;
if ( ! y ) {
free ( x ) ;
return - errno ;
}
r = path_equal ( x , y ) ;
free ( x ) ;
free ( y ) ;
return r ;
}
2012-05-21 04:01:52 +04:00
static int notify_override_masked ( const char * top , const char * bottom ) {
if ( ! ( arg_flags & SHOW_MASKED ) )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 0 ;
2012-05-16 20:57:57 +04:00
printf ( ANSI_HIGHLIGHT_RED_ON " [MASKED] " ANSI_HIGHLIGHT_OFF " %s → %s \n " , top , bottom ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 1 ;
}
2012-05-21 04:01:52 +04:00
static int notify_override_equivalent ( const char * top , const char * bottom ) {
if ( ! ( arg_flags & SHOW_EQUIVALENT ) )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 0 ;
printf ( ANSI_HIGHLIGHT_GREEN_ON " [EQUIVALENT] " ANSI_HIGHLIGHT_OFF " %s → %s \n " , top , bottom ) ;
return 1 ;
}
2012-05-21 04:01:52 +04:00
static int notify_override_redirected ( const char * top , const char * bottom ) {
if ( ! ( arg_flags & SHOW_REDIRECTED ) )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 0 ;
2012-05-16 20:57:57 +04:00
printf ( ANSI_HIGHLIGHT_ON " [REDIRECTED] " ANSI_HIGHLIGHT_OFF " %s → %s \n " , top , bottom ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 1 ;
}
2012-05-17 00:49:30 +04:00
static int notify_override_overridden ( const char * top , const char * bottom ) {
if ( ! ( arg_flags & SHOW_OVERRIDDEN ) )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 0 ;
2012-05-17 00:49:30 +04:00
printf ( ANSI_HIGHLIGHT_ON " [OVERRIDDEN] " ANSI_HIGHLIGHT_OFF " %s → %s \n " , top , bottom ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 1 ;
}
2012-05-21 04:01:52 +04:00
static int notify_override_unchanged ( const char * f ) {
if ( ! ( arg_flags & SHOW_UNCHANGED ) )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 0 ;
2012-05-21 04:02:31 +04:00
printf ( " [UNCHANGED] %s \n " , f ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return 1 ;
}
2012-05-21 04:01:52 +04:00
static int found_override ( const char * top , const char * bottom ) {
2012-05-16 05:36:42 +04:00
char * dest ;
int k ;
pid_t pid ;
assert ( top ) ;
assert ( bottom ) ;
if ( null_or_empty_path ( top ) > 0 ) {
2012-05-21 04:01:52 +04:00
notify_override_masked ( top , bottom ) ;
2012-05-16 05:36:42 +04:00
goto finish ;
}
k = readlink_malloc ( top , & dest ) ;
if ( k > = 0 ) {
if ( equivalent ( dest , bottom ) > 0 )
2012-05-21 04:01:52 +04:00
notify_override_equivalent ( top , bottom ) ;
2012-05-16 05:36:42 +04:00
else
2012-05-21 04:01:52 +04:00
notify_override_redirected ( top , bottom ) ;
2012-05-16 05:36:42 +04:00
free ( dest ) ;
goto finish ;
}
2012-05-17 00:49:30 +04:00
notify_override_overridden ( top , bottom ) ;
2012-05-21 04:01:52 +04:00
if ( ! arg_diff )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
goto finish ;
2012-05-16 05:36:42 +04:00
putchar ( ' \n ' ) ;
fflush ( stdout ) ;
pid = fork ( ) ;
if ( pid < 0 ) {
log_error ( " Failed to fork off diff: %m " ) ;
return - errno ;
} else if ( pid = = 0 ) {
execlp ( " diff " , " diff " , " -us " , " -- " , bottom , top , NULL ) ;
log_error ( " Failed to execute diff: %m " ) ;
_exit ( 1 ) ;
}
wait_for_terminate ( pid , NULL ) ;
putchar ( ' \n ' ) ;
finish :
return 0 ;
}
static int enumerate_dir ( Hashmap * top , Hashmap * bottom , const char * path ) {
DIR * d ;
int r = 0 ;
assert ( top ) ;
assert ( bottom ) ;
assert ( path ) ;
d = opendir ( path ) ;
if ( ! d ) {
if ( errno = = ENOENT )
return 0 ;
log_error ( " Failed to enumerate %s: %m " , path ) ;
return - errno ;
}
for ( ; ; ) {
2012-09-20 00:21:09 +04:00
struct dirent * de ;
union dirent_storage buf ;
2012-05-16 05:36:42 +04:00
int k ;
char * p ;
2012-09-20 00:21:09 +04:00
k = readdir_r ( d , & buf . de , & de ) ;
2012-05-16 05:36:42 +04:00
if ( k ! = 0 ) {
r = - k ;
goto finish ;
}
if ( ! de )
break ;
if ( ! dirent_is_file ( de ) )
continue ;
2012-07-13 15:41:01 +04:00
p = strjoin ( path , " / " , de - > d_name , NULL ) ;
2012-05-16 05:36:42 +04:00
if ( ! p ) {
r = - ENOMEM ;
goto finish ;
}
path_kill_slashes ( p ) ;
k = hashmap_put ( top , path_get_file_name ( p ) , p ) ;
if ( k > = 0 ) {
p = strdup ( p ) ;
if ( ! p ) {
r = - ENOMEM ;
goto finish ;
}
} else if ( k ! = - EEXIST ) {
free ( p ) ;
r = k ;
goto finish ;
}
free ( hashmap_remove ( bottom , path_get_file_name ( p ) ) ) ;
k = hashmap_put ( bottom , path_get_file_name ( p ) , p ) ;
if ( k < 0 ) {
free ( p ) ;
r = k ;
goto finish ;
}
}
finish :
closedir ( d ) ;
return r ;
}
2012-05-21 04:01:52 +04:00
static int process_suffix ( const char * prefixes , const char * suffix ) {
2012-05-16 05:36:42 +04:00
const char * p ;
char * f ;
2012-05-16 16:22:45 +04:00
Hashmap * top , * bottom = NULL ;
2012-05-16 05:36:42 +04:00
int r = 0 , k ;
Iterator i ;
int n_found = 0 ;
assert ( prefixes ) ;
assert ( suffix ) ;
top = hashmap_new ( string_hash_func , string_compare_func ) ;
if ( ! top ) {
r = - ENOMEM ;
goto finish ;
}
bottom = hashmap_new ( string_hash_func , string_compare_func ) ;
if ( ! bottom ) {
r = - ENOMEM ;
goto finish ;
}
NULSTR_FOREACH ( p , prefixes ) {
char * t ;
2012-07-13 15:41:01 +04:00
t = strjoin ( p , " / " , suffix , NULL ) ;
2012-05-16 05:36:42 +04:00
if ( ! t ) {
r = - ENOMEM ;
goto finish ;
}
k = enumerate_dir ( top , bottom , t ) ;
if ( k < 0 )
r = k ;
log_debug ( " Looking at %s " , t ) ;
free ( t ) ;
}
HASHMAP_FOREACH ( f , top , i ) {
char * o ;
o = hashmap_get ( bottom , path_get_file_name ( f ) ) ;
assert ( o ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
if ( path_equal ( o , f ) ) {
2012-05-21 04:01:52 +04:00
notify_override_unchanged ( f ) ;
2012-05-16 05:36:42 +04:00
continue ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
}
2012-05-16 05:36:42 +04:00
2012-05-21 04:01:52 +04:00
k = found_override ( f , o ) ;
2012-05-16 05:36:42 +04:00
if ( k < 0 )
r = k ;
n_found + + ;
}
finish :
if ( top )
hashmap_free_free ( top ) ;
if ( bottom )
hashmap_free_free ( bottom ) ;
return r < 0 ? r : n_found ;
}
2012-05-21 04:01:52 +04:00
static int process_suffix_chop ( const char * prefixes , const char * suffix ) {
2012-05-16 05:36:42 +04:00
const char * p ;
assert ( prefixes ) ;
assert ( suffix ) ;
if ( ! path_is_absolute ( suffix ) )
2012-05-21 04:01:52 +04:00
return process_suffix ( prefixes , suffix ) ;
2012-05-16 05:36:42 +04:00
/* Strip prefix from the suffix */
NULSTR_FOREACH ( p , prefixes ) {
if ( startswith ( suffix , p ) ) {
suffix + = strlen ( p ) ; ;
suffix + = strspn ( suffix , " / " ) ;
2012-05-21 04:01:52 +04:00
return process_suffix ( prefixes , suffix ) ;
2012-05-16 05:36:42 +04:00
}
}
log_error ( " Invalid suffix specification %s. " , suffix ) ;
return - EINVAL ;
}
static void help ( void ) {
printf ( " %s [OPTIONS...] [SUFFIX...] \n \n "
" Find overridden configuration files. \n \n "
" -h --help Show this help \n "
" --version Show package version \n "
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
" --no-pager Do not pipe output into a pager \n "
2012-05-17 00:49:30 +04:00
" --diff[=1|0] Show a diff when overridden files differ \n "
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
" -t --type=LIST... Only display a selected set of override types \n " ,
2012-05-16 05:36:42 +04:00
program_invocation_short_name ) ;
}
2012-05-21 04:01:52 +04:00
static int parse_flags ( const char * flag_str , int flags ) {
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
char * w , * state ;
size_t l ;
FOREACH_WORD ( w , l , flag_str , state ) {
2012-05-21 04:02:40 +04:00
if ( strncmp ( " masked " , w , l ) = = 0 )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
flags | = SHOW_MASKED ;
2012-05-21 04:02:40 +04:00
else if ( strncmp ( " equivalent " , w , l ) = = 0 )
2012-05-16 20:57:57 +04:00
flags | = SHOW_EQUIVALENT ;
2012-05-21 04:02:40 +04:00
else if ( strncmp ( " redirected " , w , l ) = = 0 )
2012-05-16 20:57:57 +04:00
flags | = SHOW_REDIRECTED ;
2012-05-17 00:49:30 +04:00
else if ( strncmp ( " overridden " , w , l ) = = 0 )
flags | = SHOW_OVERRIDDEN ;
2012-05-21 04:02:40 +04:00
else if ( strncmp ( " unchanged " , w , l ) = = 0 )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
flags | = SHOW_UNCHANGED ;
2012-05-21 04:02:40 +04:00
else if ( strncmp ( " default " , w , l ) = = 0 )
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
flags | = SHOW_DEFAULTS ;
2012-05-21 04:01:52 +04:00
else
return - EINVAL ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
}
return flags ;
}
2012-05-21 04:01:52 +04:00
static int parse_argv ( int argc , char * argv [ ] ) {
2012-05-16 05:36:42 +04:00
enum {
ARG_NO_PAGER = 0x100 ,
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
ARG_DIFF ,
2012-05-16 05:36:42 +04:00
ARG_VERSION
} ;
static const struct option options [ ] = {
{ " help " , no_argument , NULL , ' h ' } ,
{ " version " , no_argument , NULL , ARG_VERSION } ,
{ " no-pager " , no_argument , NULL , ARG_NO_PAGER } ,
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
{ " diff " , optional_argument , NULL , ARG_DIFF } ,
{ " type " , required_argument , NULL , ' t ' } ,
2012-05-16 05:36:42 +04:00
{ NULL , 0 , NULL , 0 }
} ;
int c ;
assert ( argc > = 1 ) ;
assert ( argv ) ;
while ( ( c = getopt_long ( argc , argv , " h " , options , NULL ) ) > = 0 ) {
switch ( c ) {
case ' h ' :
help ( ) ;
return 0 ;
case ARG_VERSION :
puts ( PACKAGE_STRING ) ;
puts ( DISTRIBUTION ) ;
puts ( SYSTEMD_FEATURES ) ;
return 0 ;
case ARG_NO_PAGER :
arg_no_pager = true ;
break ;
case ' ? ' :
return - EINVAL ;
2012-05-21 04:01:52 +04:00
case ' t ' : {
int f ;
f = parse_flags ( optarg , arg_flags ) ;
if ( f < 0 ) {
log_error ( " Failed to parse flags field. " ) ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
return - EINVAL ;
2012-05-21 04:01:52 +04:00
}
arg_flags = f ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
break ;
2012-05-21 04:01:52 +04:00
}
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
case ARG_DIFF :
2012-05-21 04:01:52 +04:00
if ( ! optarg )
arg_diff = 1 ;
else {
int b ;
b = parse_boolean ( optarg ) ;
if ( b < 0 ) {
log_error ( " Failed to parse diff boolean. " ) ;
return - EINVAL ;
} else if ( b )
arg_diff = 1 ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
else
2012-05-21 04:01:52 +04:00
arg_diff = 0 ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
}
break ;
2012-05-16 05:36:42 +04:00
default :
log_error ( " Unknown option code %c " , c ) ;
return - EINVAL ;
}
}
return 1 ;
}
int main ( int argc , char * argv [ ] ) {
const char prefixes [ ] =
" /etc \0 "
" /run \0 "
" /usr/local/lib \0 "
" /usr/local/share \0 "
" /usr/lib \0 "
" /usr/share \0 "
# ifdef HAVE_SPLIT_USR
" /lib \0 "
# endif
;
const char suffixes [ ] =
" sysctl.d \0 "
" tmpfiles.d \0 "
" modules-load.d \0 "
2012-05-16 05:39:41 +04:00
" binfmt.d \0 "
2012-05-16 05:36:42 +04:00
" systemd/system \0 "
" systemd/user \0 "
2012-06-27 16:34:24 +04:00
" systemd/system-preset \0 "
" systemd/user-preset \0 "
2012-05-16 05:36:42 +04:00
" udev/rules.d \0 "
" modprobe.d \0 " ;
int r = 0 , k ;
int n_found = 0 ;
log_parse_environment ( ) ;
log_open ( ) ;
2012-05-21 04:01:52 +04:00
r = parse_argv ( argc , argv ) ;
2012-05-16 05:36:42 +04:00
if ( r < = 0 )
goto finish ;
2012-05-21 04:01:52 +04:00
if ( arg_flags = = 0 )
arg_flags = SHOW_DEFAULTS ;
if ( arg_diff < 0 )
2012-05-17 00:49:30 +04:00
arg_diff = ! ! ( arg_flags & SHOW_OVERRIDDEN ) ;
2012-05-21 04:01:52 +04:00
else if ( arg_diff )
2012-05-17 00:49:30 +04:00
arg_flags | = SHOW_OVERRIDDEN ;
delta: Support filtering what type of deltas to show
Not everyone is interested in every kind of deltas (and some might
even be interested knowing which files do not have overrides), so this
here is an implementation of a --type=LIST... option for
systemd-delta, that makes it possible to filter what subset of deltas
we want.
The available modifiers are masked, equivalent, redirected, overriden,
and unchanged - they should be self explanatory, and the man page
explains them in a little more detail anyway.
As a side effect, in case of overriden files, the diff output was made
optional.
By default, everything is shown (with a diff, if appropriate) except
for completely unchanged files.
Signed-off-by: Gergely Nagy <algernon@balabit.hu>
2012-05-16 20:11:27 +04:00
2012-05-16 05:36:42 +04:00
if ( ! arg_no_pager )
pager_open ( ) ;
if ( optind < argc ) {
int i ;
for ( i = optind ; i < argc ; i + + ) {
2012-05-21 04:01:52 +04:00
k = process_suffix_chop ( prefixes , argv [ i ] ) ;
2012-05-16 05:36:42 +04:00
if ( k < 0 )
r = k ;
else
n_found + = k ;
}
} else {
const char * n ;
NULSTR_FOREACH ( n , suffixes ) {
2012-05-21 04:01:52 +04:00
k = process_suffix ( prefixes , n ) ;
2012-05-16 05:36:42 +04:00
if ( k < 0 )
r = k ;
else
n_found + = k ;
}
}
if ( r > = 0 )
2012-05-17 00:49:30 +04:00
printf ( " \n %i overridden configuration files found. \n " , n_found ) ;
2012-05-16 05:36:42 +04:00
finish :
pager_close ( ) ;
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
}