mirror of
https://github.com/systemd/systemd.git
synced 2024-10-31 16:21:26 +03:00
manager: add manager_get_dump_string()
It's like manager_dump(), but returns a string. This allows us to reduce some duplicate code. Also, while we are at it, turn off stdio locking while we write to the memory FILE *f.
This commit is contained in:
parent
ad75b9e765
commit
713f6f901d
@ -1289,9 +1289,7 @@ static int method_unsubscribe(sd_bus_message *message, void *userdata, sd_bus_er
|
|||||||
|
|
||||||
static int method_dump(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_dump(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
_cleanup_free_ char *dump = NULL;
|
_cleanup_free_ char *dump = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
size_t size;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(message);
|
assert(message);
|
||||||
@ -1303,13 +1301,7 @@ static int method_dump(sd_bus_message *message, void *userdata, sd_bus_error *er
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
f = open_memstream(&dump, &size);
|
r = manager_get_dump_string(m, &dump);
|
||||||
if (!f)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
manager_dump(m, f, NULL);
|
|
||||||
|
|
||||||
r = fflush_and_check(f);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <linux/kd.h>
|
#include <linux/kd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <stdio_ext.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
@ -1731,6 +1732,35 @@ void manager_dump(Manager *m, FILE *f, const char *prefix) {
|
|||||||
manager_dump_jobs(m, f, prefix);
|
manager_dump_jobs(m, f, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int manager_get_dump_string(Manager *m, char **ret) {
|
||||||
|
_cleanup_free_ char *dump = NULL;
|
||||||
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
|
size_t size;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(m);
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
|
f = open_memstream(&dump, &size);
|
||||||
|
if (!f)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
__fsetlocking(f, FSETLOCKING_BYCALLER);
|
||||||
|
|
||||||
|
manager_dump(m, f, NULL);
|
||||||
|
|
||||||
|
r = fflush_and_check(f);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
f = safe_fclose(f);
|
||||||
|
|
||||||
|
*ret = dump;
|
||||||
|
dump = NULL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void manager_clear_jobs(Manager *m) {
|
void manager_clear_jobs(Manager *m) {
|
||||||
Job *j;
|
Job *j;
|
||||||
|
|
||||||
@ -2179,20 +2209,10 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
|
|||||||
|
|
||||||
case SIGUSR2: {
|
case SIGUSR2: {
|
||||||
_cleanup_free_ char *dump = NULL;
|
_cleanup_free_ char *dump = NULL;
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
f = open_memstream(&dump, &size);
|
r = manager_get_dump_string(m, &dump);
|
||||||
if (!f) {
|
|
||||||
log_warning_errno(errno, "Failed to allocate memory stream: %m");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
manager_dump(m, f, NULL);
|
|
||||||
|
|
||||||
r = fflush_and_check(f);
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_warning_errno(r, "Failed to write status stream: %m");
|
log_warning_errno(errno, "Failed to acquire manager dump: %m");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,6 +375,7 @@ int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error
|
|||||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
|
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
|
||||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
|
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
|
||||||
void manager_dump(Manager *s, FILE *f, const char *prefix);
|
void manager_dump(Manager *s, FILE *f, const char *prefix);
|
||||||
|
int manager_get_dump_string(Manager *m, char **ret);
|
||||||
|
|
||||||
void manager_clear_jobs(Manager *m);
|
void manager_clear_jobs(Manager *m);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user