|
@@ -841,6 +841,33 @@ qio_channel_socket_set_cork(QIOChannel *ioc,
|
|
socket_set_cork(sioc->fd, v);
|
|
socket_set_cork(sioc->fd, v);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+qio_channel_socket_get_peerpid(QIOChannel *ioc,
|
|
|
|
+ unsigned int *pid,
|
|
|
|
+ Error **errp)
|
|
|
|
+{
|
|
|
|
+#ifdef CONFIG_LINUX
|
|
|
|
+ QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc);
|
|
|
|
+ Error *err = NULL;
|
|
|
|
+ socklen_t len = sizeof(struct ucred);
|
|
|
|
+
|
|
|
|
+ struct ucred cred;
|
|
|
|
+ if (getsockopt(sioc->fd,
|
|
|
|
+ SOL_SOCKET, SO_PEERCRED,
|
|
|
|
+ &cred, &len) == -1) {
|
|
|
|
+ error_setg_errno(&err, errno, "Unable to get peer credentials");
|
|
|
|
+ error_propagate(errp, err);
|
|
|
|
+ *pid = -1;
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ *pid = (unsigned int)cred.pid;
|
|
|
|
+ return 0;
|
|
|
|
+#else
|
|
|
|
+ error_setg(errp, "Unsupported feature");
|
|
|
|
+ *pid = -1;
|
|
|
|
+ return -1;
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
|
|
static int
|
|
static int
|
|
qio_channel_socket_close(QIOChannel *ioc,
|
|
qio_channel_socket_close(QIOChannel *ioc,
|
|
@@ -938,6 +965,7 @@ static void qio_channel_socket_class_init(ObjectClass *klass,
|
|
#ifdef QEMU_MSG_ZEROCOPY
|
|
#ifdef QEMU_MSG_ZEROCOPY
|
|
ioc_klass->io_flush = qio_channel_socket_flush;
|
|
ioc_klass->io_flush = qio_channel_socket_flush;
|
|
#endif
|
|
#endif
|
|
|
|
+ ioc_klass->io_peerpid = qio_channel_socket_get_peerpid;
|
|
}
|
|
}
|
|
|
|
|
|
static const TypeInfo qio_channel_socket_info = {
|
|
static const TypeInfo qio_channel_socket_info = {
|