Branch data Line data Source code
1 : : #include <unistd.h>
2 : : #include <fcntl.h>
3 : : #include <sys/utsname.h>
4 : : #include <string.h>
5 : :
6 : : #include "util.h"
7 : : #include "crtools.h"
8 : : #include "syscall.h"
9 : : #include "namespaces.h"
10 : : #include "sysctl.h"
11 : :
12 : : #include "protobuf.h"
13 : : #include "protobuf/utsns.pb-c.h"
14 : :
15 : 77 : int dump_uts_ns(int ns_pid, struct cr_fdset *fdset)
16 : : {
17 : : int ret;
18 : : struct utsname ubuf;
19 : 77 : UtsnsEntry ue = UTSNS_ENTRY__INIT;
20 : :
21 : 77 : ret = switch_ns(ns_pid, CLONE_NEWUTS, "uts", NULL);
22 [ + - ]: 77 : if (ret < 0)
23 : : return ret;
24 : :
25 : 77 : ret = uname(&ubuf);
26 [ - + ]: 77 : if (ret < 0) {
27 : 0 : pr_perror("Error calling uname");
28 : : return ret;
29 : : }
30 : :
31 : 77 : ue.nodename = ubuf.nodename;
32 : 77 : ue.domainname = ubuf.domainname;
33 : :
34 : 77 : return pb_write_one(fdset_fd(fdset, CR_FD_UTSNS), &ue, PB_UTSNS);
35 : : }
36 : :
37 : 218 : int prepare_utsns(int pid)
38 : : {
39 : : int fd, ret;
40 : : UtsnsEntry *ue;
41 : 218 : struct sysctl_req req[3] = {
42 : : { "kernel/hostname" },
43 : : { "kernel/domainname" },
44 : : { },
45 : : };
46 : :
47 : 218 : fd = open_image_ro(CR_FD_UTSNS, pid);
48 [ + - ]: 218 : if (fd < 0)
49 : : return -1;
50 : :
51 : 218 : ret = pb_read_one(fd, &ue, PB_UTSNS);
52 [ + - ]: 218 : if (ret < 0)
53 : : goto out;
54 : :
55 : 218 : req[0].arg = ue->nodename;
56 : 218 : req[0].type = CTL_STR(strlen(ue->nodename));
57 : 218 : req[1].arg = ue->domainname;
58 : 218 : req[1].type = CTL_STR(strlen(ue->domainname));
59 : :
60 : 218 : ret = sysctl_op(req, CTL_WRITE);
61 : 218 : utsns_entry__free_unpacked(ue, NULL);
62 : : out:
63 : 218 : close(fd);
64 : : return ret;
65 : : }
66 : :
67 : 0 : void show_utsns(int fd, struct cr_options *o)
68 : : {
69 : 0 : pb_show_vertical(fd, PB_UTSNS);
70 : 0 : }
|