Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
steam
systemd
Commits
1f849790
Commit
1f849790
authored
Apr 24, 2013
by
Lennart Poettering
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bus: add monitoring facility to busctl
parent
2b3c81b0
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
250 additions
and
16 deletions
+250
-16
src/libsystemd-bus/busctl.c
src/libsystemd-bus/busctl.c
+250
-16
No files found.
src/libsystemd-bus/busctl.c
View file @
1f849790
...
...
@@ -19,33 +19,49 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include <getopt.h>
#include "strv.h"
#include "util.h"
#include "log.h"
#include "build.h"
#include "pager.h"
#include "sd-bus.h"
#include "bus-message.h"
#include "bus-internal.h"
int
main
(
int
argc
,
char
*
argv
[])
{
_cleanup_bus_unref_
sd_bus
*
bus
=
NULL
;
static
bool
arg_no_pager
=
false
;
static
char
*
arg_address
=
NULL
;
static
bool
arg_user
=
false
;
static
bool
arg_no_unique
=
false
;
static
char
**
arg_matches
=
NULL
;
static
void
pager_open_if_enabled
(
void
)
{
/* Cache result before we open the pager */
if
(
arg_no_pager
)
return
;
pager_open
(
false
);
}
static
int
list_bus_names
(
sd_bus
*
bus
,
char
**
argv
)
{
_cleanup_strv_free_
char
**
l
=
NULL
;
char
**
i
;
int
r
;
size_t
max_i
=
0
;
r
=
sd_bus_open_user
(
&
bus
);
if
(
r
<
0
)
{
log_error
(
"Failed to connect to bus: %s"
,
strerror
(
-
r
));
goto
fail
;
}
assert
(
bus
);
r
=
sd_bus_list_names
(
bus
,
&
l
);
if
(
r
<
0
)
{
log_error
(
"Failed to list names: %s"
,
strerror
(
-
r
));
goto
fail
;
return
r
;
}
pager_open_if_enabled
();
strv_sort
(
l
);
STRV_FOREACH
(
i
,
l
)
...
...
@@ -59,8 +75,8 @@ int main(int argc, char *argv[]) {
pid_t
pid
;
uid_t
uid
;
/*
if ((*i)[0] == ':')
*/
/*
continue;
*/
if
(
arg_no_unique
&&
(
*
i
)[
0
]
==
':'
)
continue
;
printf
(
"%-*s"
,
(
int
)
max_i
,
*
i
);
...
...
@@ -80,10 +96,8 @@ int main(int argc, char *argv[]) {
_cleanup_free_
char
*
u
=
NULL
;
u
=
uid_to_name
(
uid
);
if
(
!
u
)
{
log_oom
();
goto
fail
;
}
if
(
!
u
)
return
log_oom
();
if
(
strlen
(
u
)
>
16
)
u
[
16
]
=
0
;
...
...
@@ -99,8 +113,228 @@ int main(int argc, char *argv[]) {
printf
(
" -
\n
"
);
}
r
=
0
;
return
0
;
}
static
int
monitor
(
sd_bus
*
bus
,
char
*
argv
[])
{
char
**
i
;
int
r
;
STRV_FOREACH
(
i
,
argv
+
1
)
{
_cleanup_free_
char
*
m
=
NULL
;
if
(
!
service_name_is_valid
(
*
i
))
{
log_error
(
"Invalid service name '%s'"
,
*
i
);
return
-
EINVAL
;
}
m
=
strjoin
(
"sender='"
,
*
i
,
"'"
,
NULL
);
if
(
!
m
)
return
log_oom
();
r
=
sd_bus_add_match
(
bus
,
m
,
NULL
,
NULL
);
if
(
r
<
0
)
{
log_error
(
"Failed to add match: %s"
,
strerror
(
-
r
));
return
r
;
}
}
STRV_FOREACH
(
i
,
arg_matches
)
{
r
=
sd_bus_add_match
(
bus
,
*
i
,
NULL
,
NULL
);
if
(
r
<
0
)
{
log_error
(
"Failed to add match: %s"
,
strerror
(
-
r
));
return
r
;
}
}
for
(;;)
{
_cleanup_bus_message_unref_
sd_bus_message
*
m
=
NULL
;
r
=
sd_bus_process
(
bus
,
&
m
);
if
(
r
<
0
)
{
log_error
(
"Failed to process bus: %s"
,
strerror
(
-
r
));
return
r
;
}
if
(
m
)
{
bus_message_dump
(
m
);
continue
;
}
if
(
r
>
0
)
continue
;
r
=
sd_bus_wait
(
bus
,
(
uint64_t
)
-
1
);
if
(
r
<
0
)
{
log_error
(
"Failed to wait for bus: %s"
,
strerror
(
-
r
));
return
r
;
}
}
return
-
EINVAL
;
}
static
int
help
(
void
)
{
printf
(
"%s [OPTIONS...] {COMMAND} ...
\n\n
"
"Introspect the bus.
\n\n
"
" -h --help Show this help
\n
"
" --version Show package version
\n
"
" --system Connect to system bus
\n
"
" --user Connect to user bus
\n
"
" --address=ADDRESS Connect to bus specified by address
\n
"
" --no-unique Only show well-known names
\n
"
" --match=MATCH Only show matching messages
\n
"
" --no-pager Do not pipe output into a pager
\n\n
"
"Commands:
\n
"
" list List bus names
\n
"
" monitor [SERVICE...] Show bus traffic
\n
"
,
program_invocation_short_name
);
return
0
;
}
static
int
parse_argv
(
int
argc
,
char
*
argv
[])
{
enum
{
ARG_VERSION
=
0x100
,
ARG_NO_PAGER
,
ARG_SYSTEM
,
ARG_USER
,
ARG_ADDRESS
,
ARG_MATCH
,
ARG_NO_UNIQUE
};
static
const
struct
option
options
[]
=
{
{
"help"
,
no_argument
,
NULL
,
'h'
},
{
"version"
,
no_argument
,
NULL
,
ARG_VERSION
},
{
"no-pager"
,
no_argument
,
NULL
,
ARG_NO_PAGER
},
{
"system"
,
no_argument
,
NULL
,
ARG_SYSTEM
},
{
"user"
,
no_argument
,
NULL
,
ARG_USER
},
{
"address"
,
required_argument
,
NULL
,
ARG_ADDRESS
},
{
"no-unique"
,
no_argument
,
NULL
,
ARG_NO_UNIQUE
},
{
"match"
,
required_argument
,
NULL
,
ARG_MATCH
},
{
NULL
,
0
,
NULL
,
0
},
};
int
c
;
assert
(
argc
>=
0
);
assert
(
argv
);
while
((
c
=
getopt_long
(
argc
,
argv
,
"h"
,
options
,
NULL
))
>=
0
)
{
switch
(
c
)
{
case
'h'
:
return
help
();
case
ARG_VERSION
:
puts
(
PACKAGE_STRING
);
puts
(
SYSTEMD_FEATURES
);
return
0
;
case
ARG_NO_PAGER
:
arg_no_pager
=
true
;
break
;
case
ARG_USER
:
arg_user
=
true
;
break
;
case
ARG_SYSTEM
:
arg_user
=
false
;
break
;
case
ARG_ADDRESS
:
arg_address
=
optarg
;
break
;
case
ARG_NO_UNIQUE
:
arg_no_unique
=
true
;
break
;
case
ARG_MATCH
:
if
(
strv_extend
(
&
arg_matches
,
optarg
)
<
0
)
return
log_oom
();
break
;
case
'?'
:
return
-
EINVAL
;
default:
log_error
(
"Unknown option code %c"
,
c
);
return
-
EINVAL
;
}
}
return
1
;
}
static
int
busctl_main
(
sd_bus
*
bus
,
int
argc
,
char
*
argv
[])
{
assert
(
bus
);
if
(
optind
>=
argc
||
streq
(
argv
[
optind
],
"list"
))
return
list_bus_names
(
bus
,
argv
+
optind
);
if
(
streq
(
argv
[
optind
],
"monitor"
))
return
monitor
(
bus
,
argv
+
optind
);
if
(
streq
(
argv
[
optind
],
"help"
))
return
help
();
log_error
(
"Unknown command '%s'"
,
argv
[
optind
]);
return
-
EINVAL
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
_cleanup_bus_unref_
sd_bus
*
bus
=
NULL
;
int
r
;
log_parse_environment
();
log_open
();
r
=
parse_argv
(
argc
,
argv
);
if
(
r
<=
0
)
goto
finish
;
if
(
arg_address
)
{
r
=
sd_bus_new
(
&
bus
);
if
(
r
<
0
)
{
log_error
(
"Failed to allocate bus: %s"
,
strerror
(
-
r
));
goto
finish
;
}
r
=
sd_bus_set_address
(
bus
,
arg_address
);
if
(
r
<
0
)
{
log_error
(
"Failed to set address: %s"
,
strerror
(
-
r
));
goto
finish
;
}
r
=
sd_bus_set_bus_client
(
bus
,
true
);
if
(
r
<
0
)
{
log_error
(
"Failed to set bus client: %s"
,
strerror
(
-
r
));
goto
finish
;
}
r
=
sd_bus_start
(
bus
);
}
else
if
(
arg_user
)
r
=
sd_bus_open_user
(
&
bus
);
else
r
=
sd_bus_open_system
(
&
bus
);
if
(
r
<
0
)
{
log_error
(
"Failed to connect to bus: %s"
,
strerror
(
-
r
));
goto
finish
;
}
r
=
busctl_main
(
bus
,
argc
,
argv
);
finish:
pager_close
();
strv_free
(
arg_matches
);
fail:
return
r
<
0
?
EXIT_FAILURE
:
EXIT_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment