static bool
verifyCap()
{
+ int retried = 0;
struct __user_cap_header_struct header;
- struct __user_cap_data_struct user;
- header.version = _LINUX_CAPABILITY_VERSION;
+ struct __user_cap_data_struct user[2];
+
+ header.version = _LINUX_CAPABILITY_VERSION_3;
header.pid = 0;
if (getuid()!=0) {
// perror( "prctl:" );
// return false;
// }
-
- if (capget(&header, &user)==-1) {
+
+retry:
+ if (capget(&header, user)==-1) {
+ if (!retried &&
+ header.version != _LINUX_CAPABILITY_VERSION_3) {
+ header.version = _LINUX_CAPABILITY_VERSION_1;
+ retried = 1;
+ goto retry;
+ }
perror("capget()");
return false;
}
- user.effective = 0;
- user.permitted = 0;
- user.inheritable = 0;
+ user[0].effective = user[1].effective = 0;
+ user[0].permitted = user[1].permitted = 0;
+ user[0].inheritable = user[1].inheritable = 0;
- if (capset(&header, &user)==-1) {
+ if (capset(&header, user)==-1) {
perror("capset()");
return false;
}
return buf;
}
+static char *
+getAPIConfig(char *buf)
+{
+ vc_vci_t v = vc_get_vci();
+ size_t l;
+
+ if (v==(vc_vci_t)-1) return 0;
+
+ l = utilvserver_fmt_xuint64(0, (unsigned int)v);
+ memcpy(buf, "0x0000000000000000", 19);
+ utilvserver_fmt_xuint64(buf+2+16-l, (unsigned int)v);
+
+ return buf;
+}
+
static inline char *
getCtxId(char *buf, const char *pid_str, xid_t (*get_id)(pid_t pid), const char *err_str)
{
"Versions:\n"
" Kernel: ");
WRITE_STR(1, uts.release);
+
WRITE_MSG(1, "\n"
" VS-API: ");
-
memset(buf, 0, 128);
if (getAPIVer(buf)) WRITE_STR(1, buf);
else WRITE_MSG(1, "???");
+
+ WRITE_MSG(1, "\n"
+ " VCI: ");
+ memset(buf, 0, 128);
+ if (getAPIConfig(buf)) WRITE_STR(1, buf);
+ else WRITE_MSG(1, "???");
WRITE_MSG(1, "\n"
" util-vserver: " PACKAGE_VERSION "; " __DATE__ ", " __TIME__"\n"