update changelog
This commit is contained in:
parent
62a8611c08
commit
8a7b05a437
|
@ -1,3 +1,12 @@
|
|||
libkysdk-system (2.3.0.0-0k5.1) nile; urgency=medium
|
||||
|
||||
* BUG:无
|
||||
* 需求号:无
|
||||
* 其他改动说明:回退需求#26155,提供活跃用户的sdk接口的内容
|
||||
* 其他改动影响域:无
|
||||
|
||||
-- szm-min <shaozhimin@kylinos.cn> Thu, 29 Feb 2024 16:08:12 +0800
|
||||
|
||||
libkysdk-system (2.3.0.0-0k5.1) nile; urgency=medium
|
||||
|
||||
* BUG:无
|
||||
|
|
|
@ -9,9 +9,7 @@ libkysysinfo.so.1 libkysdk-sysinfo #MINVER#
|
|||
_ZN10KDK_SYSTEM21getSystemArchitectureB5cxx11Ev@Base 1.2.1
|
||||
_ZN10KDK_SYSTEM21getSystemSerialNumberB5cxx11Ev@Base 1.2.1
|
||||
_ZN10KDK_SYSTEM25getSystemActivationStatusEv@Base 1.2.1
|
||||
_callback@Base 2.3.0.0
|
||||
config_fetch@Base 2.2.3.5
|
||||
dbus_listener_thread@Base 2.3.0.0
|
||||
die@Base 2.2.3.5
|
||||
getCurrentVersion@Base 2.0.0.0
|
||||
getDefaultVersion@Base 2.0.0.0
|
||||
|
@ -52,8 +50,6 @@ libkysysinfo.so.1 libkysdk-sysinfo #MINVER#
|
|||
kdk_system_get_version_detaile@Base 2.0.0.0
|
||||
kdk_system_get_word@Base 2.2.3.5
|
||||
kdk_system_is_zyj@Base 1.2.1
|
||||
kdk_system_register_switch_user_handle@Base 2.3.0.0
|
||||
kdk_system_unregister_switch_user_handle@Base 2.3.0.0
|
||||
parseJsonText@Base 2.0.0.0
|
||||
readJsonFile@Base 2.0.0.0
|
||||
readReleaseFile@Base 2.0.0.0
|
||||
|
|
|
@ -0,0 +1,744 @@
|
|||
From: sunzhen <sunzhen1@kylinos.cn>
|
||||
Date: Tue, 5 Mar 2024 09:49:23 +0800
|
||||
Subject: update changelog
|
||||
|
||||
---
|
||||
src/systeminfo/libkysysinfo.c | 499 +++++++++++++++---------------------------
|
||||
src/systeminfo/libkysysinfo.h | 19 --
|
||||
2 files changed, 181 insertions(+), 337 deletions(-)
|
||||
|
||||
diff --git a/src/systeminfo/libkysysinfo.c b/src/systeminfo/libkysysinfo.c
|
||||
index 2e3548a..fe1baf6 100644
|
||||
--- a/src/systeminfo/libkysysinfo.c
|
||||
+++ b/src/systeminfo/libkysysinfo.c
|
||||
@@ -41,7 +41,6 @@
|
||||
#include "pci/pci.h"
|
||||
#include <locale.h>
|
||||
#include "sys/sysinfo.h"
|
||||
-#include <pthread.h>
|
||||
|
||||
#define SAFE_FREE(x) if (x) {free(x); x = NULL;}
|
||||
#define KYLIN_ACTIVATION_DBUS_ADDRESS "org.freedesktop.activation"
|
||||
@@ -534,15 +533,15 @@ char* kdk_system_get_kernelVersion()
|
||||
char *kdk_system_get_eUser()
|
||||
{
|
||||
char *e_user = NULL;
|
||||
+ char *active = NULL;
|
||||
|
||||
- DBusConnection *connection = NULL;
|
||||
+ DBusConnection *connection = NULL, *user_conn = NULL;
|
||||
DBusMessage *message = NULL, *reply = NULL;
|
||||
- DBusMessageIter iter;
|
||||
+ DBusError error;
|
||||
+ DBusMessageIter iter, args;
|
||||
|
||||
// 初始化DBus连接
|
||||
- DBusError error;
|
||||
dbus_error_init(&error);
|
||||
-
|
||||
connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
|
||||
if (connection == NULL)
|
||||
{
|
||||
@@ -571,7 +570,6 @@ char *kdk_system_get_eUser()
|
||||
|
||||
// 释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
// 解析回复消息
|
||||
if (!dbus_message_iter_init(reply, &iter) ||
|
||||
@@ -581,44 +579,47 @@ char *kdk_system_get_eUser()
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
// 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
-
|
||||
- int element_count = dbus_message_iter_get_element_count(&iter);
|
||||
- char **users = calloc(element_count + 1, sizeof(char *));
|
||||
- if (NULL == users)
|
||||
- goto out;
|
||||
|
||||
+ // 获取数组长度 获取的长度不对 弃用
|
||||
+ // int array_length;
|
||||
dbus_message_iter_recurse(&iter, &iter);
|
||||
+ // array_length = dbus_message_iter_get_array_len(&iter);
|
||||
+ // printf("%d\n", array_length);
|
||||
|
||||
- // 解析返回值
|
||||
- // 循环中过程中调用新的dbus接口会导致迭代器iter被清空,但是没细查原因
|
||||
- // 先用一个字符串数组存储所有用户的object path
|
||||
- for (int i = 0; i < element_count; i++)
|
||||
+ // 解析数组中的每个结构体元素
|
||||
+ while (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INVALID)
|
||||
{
|
||||
- char *path = NULL;
|
||||
-
|
||||
DBusMessageIter struct_iter;
|
||||
- dbus_message_iter_recurse(&iter, &struct_iter);
|
||||
- dbus_message_iter_next(&struct_iter);
|
||||
- dbus_message_iter_next(&struct_iter);
|
||||
- dbus_message_iter_get_basic(&struct_iter, &path);
|
||||
|
||||
- users[i] = strdup(path);
|
||||
+ dbus_uint32_t uid;
|
||||
+ char *name = NULL, *path = NULL;
|
||||
+ dbus_message_iter_recurse(&iter, &struct_iter);
|
||||
|
||||
- dbus_message_iter_next(&iter);
|
||||
- }
|
||||
+ // dbus_message_iter_get_basic(&struct_iter, &path); // 获取uid
|
||||
|
||||
- for (int i = 0; i < element_count; i++)
|
||||
- {
|
||||
+ dbus_message_iter_next(&struct_iter);
|
||||
+ // dbus_message_iter_get_basic(&struct_iter, &name); // 获取name
|
||||
+
|
||||
+ dbus_message_iter_next(&struct_iter);
|
||||
+ dbus_message_iter_get_basic(&struct_iter, &path); // 获取interface
|
||||
+
|
||||
+ // 获取EUser
|
||||
char *interface = "org.freedesktop.login1.User";
|
||||
char *state = "State";
|
||||
char *property = "Name";
|
||||
|
||||
+ user_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
|
||||
+ if (user_conn == NULL)
|
||||
+ {
|
||||
+ fprintf(stderr, "DBus connection error: %s\n", error.message);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ // 创建DBus方法调用消息
|
||||
message = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- users[i],
|
||||
+ path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"Get");
|
||||
if (message == NULL)
|
||||
@@ -627,8 +628,19 @@ char *kdk_system_get_eUser()
|
||||
goto out;
|
||||
}
|
||||
|
||||
- dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
|
||||
+ //添加入参
|
||||
+ dbus_message_iter_init_append(message, &args);
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &state))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ // 发送DBus消息并等待回复
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error);
|
||||
if (reply == NULL)
|
||||
{
|
||||
@@ -636,27 +648,26 @@ char *kdk_system_get_eUser()
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ //释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
- if (!dbus_message_iter_init(reply, &iter) ||
|
||||
- dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
|
||||
+ // 解析回复消息
|
||||
+ if (!dbus_message_iter_init(reply, &args) ||
|
||||
+ dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT)
|
||||
{
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
+ // 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
-
|
||||
- char *active = NULL;
|
||||
- dbus_message_iter_recurse(&iter, &iter);
|
||||
- dbus_message_iter_get_basic(&iter, &active);
|
||||
|
||||
- if (0 == strcmp(active, "active"))
|
||||
+ DBusMessageIter sub;
|
||||
+ dbus_message_iter_recurse(&args, &sub);
|
||||
+ dbus_message_iter_get_basic(&sub, &active);
|
||||
+ if(0 == strcmp(active, "active"))
|
||||
{
|
||||
message = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- users[i],
|
||||
+ path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"Get");
|
||||
if (message == NULL)
|
||||
@@ -665,8 +676,19 @@ char *kdk_system_get_eUser()
|
||||
goto out;
|
||||
}
|
||||
|
||||
- dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID);
|
||||
+ // 添加入参
|
||||
+ dbus_message_iter_init_append(message, &args);
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &property))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
+ // 发送DBus消息并等待回复
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error);
|
||||
if (reply == NULL)
|
||||
{
|
||||
@@ -674,55 +696,62 @@ char *kdk_system_get_eUser()
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ // 释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
- if (!dbus_message_iter_init(reply, &iter) ||
|
||||
- dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
|
||||
+ // 解析回复消息
|
||||
+ if (!dbus_message_iter_init(reply, &args) ||
|
||||
+ dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT)
|
||||
{
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
+ // 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
|
||||
- dbus_message_iter_recurse(&iter, &iter);
|
||||
- dbus_message_iter_get_basic(&iter, &e_user);
|
||||
+ dbus_message_iter_recurse(&args, &sub);
|
||||
+ dbus_message_iter_get_basic(&sub, &e_user);
|
||||
+ }
|
||||
|
||||
+ dbus_connection_unref(user_conn);
|
||||
+ user_conn = NULL;
|
||||
+ if(e_user)
|
||||
break;
|
||||
- }
|
||||
+
|
||||
+ dbus_message_iter_next(&iter);
|
||||
}
|
||||
|
||||
- if (e_user)
|
||||
- e_user = strdup(e_user);
|
||||
+ int len = strlen(e_user);
|
||||
+ char *eUser = (char *)malloc(sizeof(char) * len + 1);
|
||||
+ memset(eUser, 0, len + 1);
|
||||
+ strcpy(eUser, e_user);
|
||||
+
|
||||
+ // 释放内存
|
||||
out:
|
||||
- if (users)
|
||||
- g_strfreev(users);
|
||||
- if (dbus_error_is_set(&error))
|
||||
- dbus_error_free(&error);
|
||||
- if (message)
|
||||
- dbus_message_unref(message);
|
||||
- if (reply)
|
||||
- dbus_message_unref(reply);
|
||||
- if (connection)
|
||||
+ dbus_error_free(&error);
|
||||
+ // if(message)
|
||||
+ // dbus_message_unref(message);
|
||||
+ // if(reply)
|
||||
+ // dbus_message_unref(reply);
|
||||
+ if(connection)
|
||||
dbus_connection_unref(connection);
|
||||
- return e_user;
|
||||
+ if(user_conn)
|
||||
+ dbus_connection_unref(user_conn);
|
||||
+ return eUser;
|
||||
}
|
||||
|
||||
char *kdk_system_get_eUser_login_time()
|
||||
{
|
||||
+ char *active = NULL;
|
||||
dbus_uint64_t time_stamp = 0;
|
||||
- char *login_time = NULL;
|
||||
|
||||
- DBusConnection *connection = NULL;
|
||||
+ DBusConnection *connection = NULL, *user_conn = NULL;
|
||||
DBusMessage *message = NULL, *reply = NULL;
|
||||
- DBusMessageIter iter;
|
||||
+ DBusError error;
|
||||
+ DBusMessageIter iter, args;
|
||||
|
||||
// 初始化DBus连接
|
||||
- DBusError error;
|
||||
dbus_error_init(&error);
|
||||
-
|
||||
connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
|
||||
if (connection == NULL)
|
||||
{
|
||||
@@ -751,7 +780,6 @@ char *kdk_system_get_eUser_login_time()
|
||||
|
||||
// 释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
// 解析回复消息
|
||||
if (!dbus_message_iter_init(reply, &iter) ||
|
||||
@@ -761,44 +789,47 @@ char *kdk_system_get_eUser_login_time()
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
// 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
-
|
||||
- int element_count = dbus_message_iter_get_element_count(&iter);
|
||||
- char **users = calloc(element_count + 1, sizeof(char *));
|
||||
- if (NULL == users)
|
||||
- goto out;
|
||||
|
||||
+ // 获取数组长度 获取的长度不对 弃用
|
||||
+ // int array_length;
|
||||
dbus_message_iter_recurse(&iter, &iter);
|
||||
+ // array_length = dbus_message_iter_get_array_len(&iter);
|
||||
+ // printf("%d\n", array_length);
|
||||
|
||||
- // 解析返回值
|
||||
- // 循环中过程中调用新的dbus接口会导致迭代器iter被清空,但是没细查原因
|
||||
- // 先用一个字符串数组存储所有用户的object path
|
||||
- for (int i = 0; i < element_count; i++)
|
||||
+ // 解析数组中的每个结构体元素
|
||||
+ while (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INVALID)
|
||||
{
|
||||
- char *path = NULL;
|
||||
-
|
||||
DBusMessageIter struct_iter;
|
||||
- dbus_message_iter_recurse(&iter, &struct_iter);
|
||||
- dbus_message_iter_next(&struct_iter);
|
||||
- dbus_message_iter_next(&struct_iter);
|
||||
- dbus_message_iter_get_basic(&struct_iter, &path);
|
||||
|
||||
- users[i] = strdup(path);
|
||||
+ dbus_uint32_t uid;
|
||||
+ char *name = NULL, *path = NULL;
|
||||
+ dbus_message_iter_recurse(&iter, &struct_iter);
|
||||
|
||||
- dbus_message_iter_next(&iter);
|
||||
- }
|
||||
+ // dbus_message_iter_get_basic(&struct_iter, &path); // 获取uid
|
||||
|
||||
- char *interface = "org.freedesktop.login1.User";
|
||||
- char *state = "State";
|
||||
- char *property = "Timestamp";
|
||||
+ dbus_message_iter_next(&struct_iter);
|
||||
+ // dbus_message_iter_get_basic(&struct_iter, &name); // 获取name
|
||||
|
||||
- for (int i = 0; i < element_count; i++)
|
||||
- {
|
||||
+ dbus_message_iter_next(&struct_iter);
|
||||
+ dbus_message_iter_get_basic(&struct_iter, &path); // 获取interface
|
||||
+
|
||||
+ // 获取EUser
|
||||
+ char *interface = "org.freedesktop.login1.User";
|
||||
+ char *state = "State";
|
||||
+ char *property = "Timestamp";
|
||||
+
|
||||
+ user_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
|
||||
+ if (user_conn == NULL)
|
||||
+ {
|
||||
+ fprintf(stderr, "DBus connection error: %s\n", error.message);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ // 创建DBus方法调用消息
|
||||
message = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- users[i],
|
||||
+ path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"Get");
|
||||
if (message == NULL)
|
||||
@@ -807,8 +838,19 @@ char *kdk_system_get_eUser_login_time()
|
||||
goto out;
|
||||
}
|
||||
|
||||
- dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
|
||||
+ //添加入参
|
||||
+ dbus_message_iter_init_append(message, &args);
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &state))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
+ // 发送DBus消息并等待回复
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error);
|
||||
if (reply == NULL)
|
||||
{
|
||||
@@ -816,27 +858,26 @@ char *kdk_system_get_eUser_login_time()
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ //释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
- if (!dbus_message_iter_init(reply, &iter) ||
|
||||
- dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
|
||||
+ // 解析回复消息
|
||||
+ if (!dbus_message_iter_init(reply, &args) ||
|
||||
+ dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT)
|
||||
{
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
+ // 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
-
|
||||
- char *active = NULL;
|
||||
- dbus_message_iter_recurse(&iter, &iter);
|
||||
- dbus_message_iter_get_basic(&iter, &active);
|
||||
|
||||
- if (0 == strcmp(active, "active"))
|
||||
+ DBusMessageIter sub;
|
||||
+ dbus_message_iter_recurse(&args, &sub);
|
||||
+ dbus_message_iter_get_basic(&sub, &active);
|
||||
+ if(0 == strcmp(active, "active"))
|
||||
{
|
||||
message = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- users[i],
|
||||
+ path,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"Get");
|
||||
if (message == NULL)
|
||||
@@ -845,8 +886,19 @@ char *kdk_system_get_eUser_login_time()
|
||||
goto out;
|
||||
}
|
||||
|
||||
- dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID);
|
||||
+ // 添加入参
|
||||
+ dbus_message_iter_init_append(message, &args);
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &interface))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &property))
|
||||
+ {
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
+ // 发送DBus消息并等待回复
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error);
|
||||
if (reply == NULL)
|
||||
{
|
||||
@@ -854,47 +906,48 @@ char *kdk_system_get_eUser_login_time()
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ // 释放message
|
||||
dbus_message_unref(message);
|
||||
- message = NULL;
|
||||
|
||||
- if (!dbus_message_iter_init(reply, &iter) ||
|
||||
- dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
|
||||
+ // 解析回复消息
|
||||
+ if (!dbus_message_iter_init(reply, &args) ||
|
||||
+ dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_VARIANT)
|
||||
{
|
||||
fprintf(stderr, "DBus reply parsing failed\n");
|
||||
goto out;
|
||||
}
|
||||
-
|
||||
+ // 释放reply
|
||||
dbus_message_unref(reply);
|
||||
- reply = NULL;
|
||||
|
||||
- dbus_message_iter_recurse(&iter, &iter);
|
||||
- dbus_message_iter_get_basic(&iter, &time_stamp);
|
||||
+ dbus_message_iter_recurse(&args, &sub);
|
||||
+ dbus_message_iter_get_basic(&sub, &time_stamp);
|
||||
+ }
|
||||
|
||||
+ dbus_connection_unref(user_conn);
|
||||
+ user_conn = NULL;
|
||||
+ if(0 < time_stamp)
|
||||
break;
|
||||
- }
|
||||
+ dbus_message_iter_next(&iter);
|
||||
}
|
||||
|
||||
- if (0 == time_stamp)
|
||||
- goto out;
|
||||
-
|
||||
time_t t1 = time_stamp / 1000000;
|
||||
struct tm *timeDate = localtime(&t1);
|
||||
|
||||
- login_time = calloc(32, sizeof(char));
|
||||
+ char *login_time = calloc(32, sizeof(char));
|
||||
sprintf(login_time, "%04d-%02d-%02d %02d:%02d:%02d", timeDate->tm_year + 1900, timeDate->tm_mon + 1,
|
||||
timeDate->tm_mday, timeDate->tm_hour, timeDate->tm_min, timeDate->tm_sec);
|
||||
|
||||
+ // 释放内存
|
||||
out:
|
||||
- if (users)
|
||||
- g_strfreev(users);
|
||||
- if (dbus_error_is_set(&error))
|
||||
- dbus_error_free(&error);
|
||||
- if (message)
|
||||
- dbus_message_unref(message);
|
||||
- if (reply)
|
||||
- dbus_message_unref(reply);
|
||||
- if (connection)
|
||||
+ dbus_error_free(&error);
|
||||
+ // if(message)
|
||||
+ // dbus_message_unref(message);
|
||||
+ // if(reply)
|
||||
+ // dbus_message_unref(reply);
|
||||
+ if(connection)
|
||||
dbus_connection_unref(connection);
|
||||
+ if(user_conn)
|
||||
+ dbus_connection_unref(user_conn);
|
||||
return login_time;
|
||||
}
|
||||
|
||||
@@ -2511,193 +2564,3 @@ kdk_loadavg kdk_system_get_loadavg()
|
||||
}
|
||||
return loadAvg;
|
||||
}
|
||||
-
|
||||
-static pthread_t thread = 0;
|
||||
-static volatile int running = 0;
|
||||
-static char *curr_user = NULL;
|
||||
-CallBack _callback = NULL;
|
||||
-
|
||||
-static void signal_handler(DBusConnection *connection, DBusMessage *message, void *user_data)
|
||||
-{
|
||||
- DBusError err;
|
||||
- dbus_error_init(&err);
|
||||
-
|
||||
- if (dbus_message_is_signal(message, "org.freedesktop.DBus.Properties", "PropertiesChanged"))
|
||||
- {
|
||||
- // const char *interface_name;
|
||||
- DBusMessageIter array_iter, dict_iter, struct_iter, value_iter;
|
||||
- // const char *property_name;
|
||||
- const char *session_id, *session_path;
|
||||
-
|
||||
- // 迭代到interfacename
|
||||
- DBusMessageIter iter;
|
||||
- dbus_message_iter_init(message, &iter);
|
||||
- // dbus_message_iter_get_basic(&iter, &interface_name);
|
||||
-
|
||||
- // 迭代到propertiename
|
||||
- dbus_message_iter_next(&iter);
|
||||
- dbus_message_iter_recurse(&iter, &array_iter);
|
||||
- dbus_message_iter_recurse(&array_iter, &dict_iter);
|
||||
- // dbus_message_iter_get_basic(&dict_iter, &property_name);
|
||||
-
|
||||
- // 迭代到propertievalue
|
||||
- dbus_message_iter_next(&dict_iter);
|
||||
- dbus_message_iter_recurse(&dict_iter, &struct_iter);
|
||||
- dbus_message_iter_recurse(&struct_iter, &value_iter);
|
||||
- dbus_message_iter_get_basic(&value_iter, &session_id);
|
||||
- dbus_message_iter_next(&value_iter);
|
||||
- dbus_message_iter_get_basic(&value_iter, &session_path);
|
||||
-
|
||||
- //切换tty会出发信号,切换到tty1 tty2等终端,但这些没有用户登录时,不相应
|
||||
- if (0 == strcmp("/", session_path))
|
||||
- {
|
||||
- free(curr_user);
|
||||
- curr_user = NULL;
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- // 创建DBus方法调用消息
|
||||
- DBusMessage *msg = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- session_path,
|
||||
- "org.freedesktop.DBus.Properties",
|
||||
- "Get");
|
||||
- char *interface = "org.freedesktop.login1.Session";
|
||||
- char *name = "Name";
|
||||
- dbus_message_append_args(msg, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
|
||||
-
|
||||
- // 发送消息并等待响应
|
||||
- DBusMessage *reply;
|
||||
- reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, &err);
|
||||
- if (dbus_error_is_set(&err))
|
||||
- {
|
||||
- printf("Error sending message: %s\n", err.message);
|
||||
- dbus_error_free(&err);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- // 处理响应
|
||||
- const char *response;
|
||||
- DBusMessageIter reply_iter;
|
||||
- dbus_message_iter_init(reply, &reply_iter);
|
||||
- // 移动到variant参数的内部
|
||||
- dbus_message_iter_recurse(&reply_iter, &reply_iter);
|
||||
- dbus_message_iter_get_basic(&reply_iter, &response);
|
||||
-
|
||||
- // 释放消息和连接
|
||||
- dbus_message_unref(msg);
|
||||
- dbus_message_unref(reply);
|
||||
-
|
||||
- if (0 != strcmp(response, "lightdm"))
|
||||
- {
|
||||
- // struct passwd *pwd = getpwnam(response);
|
||||
- _callback(curr_user, response, user_data);
|
||||
- free(curr_user);
|
||||
- curr_user = strdup(response);
|
||||
- }
|
||||
-
|
||||
- }
|
||||
-
|
||||
- return;
|
||||
-}
|
||||
-
|
||||
-void *dbus_listener_thread(void *data)
|
||||
-{
|
||||
- DBusConnection *connection;
|
||||
- DBusError error;
|
||||
-
|
||||
- // 初始化DBus错误结构
|
||||
- dbus_error_init(&error);
|
||||
-
|
||||
- // 建立与DBus系统总线的连接
|
||||
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
|
||||
- if (dbus_error_is_set(&error))
|
||||
- {
|
||||
- fprintf(stderr, "Connection Error (%s)\n", error.message);
|
||||
- dbus_error_free(&error);
|
||||
- pthread_exit(NULL);
|
||||
- }
|
||||
- if (connection == NULL)
|
||||
- {
|
||||
- fprintf(stderr, "Connection Null\n");
|
||||
- pthread_exit(NULL);
|
||||
- }
|
||||
-
|
||||
- // 设置消息处理函数
|
||||
- dbus_bus_add_match(connection,
|
||||
- "type='signal',path='/org/freedesktop/login1/seat/seat0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'",
|
||||
- &error);
|
||||
- dbus_connection_add_filter(connection, signal_handler, NULL, NULL);
|
||||
-
|
||||
- // 循环监听DBus消息
|
||||
- while (true)
|
||||
- {
|
||||
- if (running)
|
||||
- dbus_connection_read_write_dispatch(connection, 20);
|
||||
- else
|
||||
- {
|
||||
- dbus_connection_unref(connection);
|
||||
- pthread_exit(NULL);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return NULL;
|
||||
-}
|
||||
-
|
||||
-int kdk_system_register_switch_user_handle(CallBack call_back, void *user_data)
|
||||
-{
|
||||
- DBusConnection *connection;
|
||||
- DBusError err;
|
||||
-
|
||||
- // 初始化DBus错误结构
|
||||
- dbus_error_init(&err);
|
||||
-
|
||||
- // 建立与DBus系统总线的连接
|
||||
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
|
||||
- if (dbus_error_is_set(&err))
|
||||
- {
|
||||
- fprintf(stderr, "Connection Error (%s)\n", err.message);
|
||||
- dbus_error_free(&err);
|
||||
- return 1;
|
||||
- }
|
||||
- if (connection == NULL)
|
||||
- {
|
||||
- fprintf(stderr, "Connection Null\n");
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- DBusMessage *msg = dbus_message_new_method_call("org.freedesktop.login1",
|
||||
- "/org/freedesktop/login1",
|
||||
- "org.freedesktop.login1.Manager",
|
||||
- "GetSeat");
|
||||
- const char *arg = "seat1";
|
||||
- dbus_message_append_args(msg, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID);
|
||||
-
|
||||
- DBusMessage *reply;
|
||||
- reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, &err);
|
||||
- if (dbus_error_is_set(&err))
|
||||
- {
|
||||
- dbus_error_free(&err);
|
||||
- }
|
||||
- else
|
||||
- return -1;
|
||||
-
|
||||
- dbus_message_unref(msg);
|
||||
- dbus_connection_unref(connection);
|
||||
-
|
||||
- char *tmp = kdk_system_get_eUser();
|
||||
- curr_user = strdup(tmp);
|
||||
- running = 1;
|
||||
- _callback = call_back;
|
||||
- pthread_create(&thread, NULL, dbus_listener_thread, user_data);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-void kdk_system_unregister_switch_user_handle()
|
||||
-{
|
||||
- if (NULL != _callback)
|
||||
- {
|
||||
- running = 0;
|
||||
- _callback = NULL;
|
||||
- pthread_join(thread, NULL);
|
||||
- }
|
||||
-}
|
||||
diff --git a/src/systeminfo/libkysysinfo.h b/src/systeminfo/libkysysinfo.h
|
||||
index 5cef7e6..a0030bf 100644
|
||||
--- a/src/systeminfo/libkysysinfo.h
|
||||
+++ b/src/systeminfo/libkysysinfo.h
|
||||
@@ -337,25 +337,6 @@ extern unsigned int kdk_system_get_thread_nums();
|
||||
*/
|
||||
extern kdk_loadavg kdk_system_get_loadavg();
|
||||
|
||||
-/**
|
||||
- * @brief 用户监听事件的回调函数原型
|
||||
-*/
|
||||
-typedef void (*CallBack)(char *old_user, char *new_user, void *user_data);
|
||||
-
|
||||
-/**
|
||||
- * @brief 注册监听用户切换事件的回调函数
|
||||
- * @param call_back 指向回调函数的函数指针
|
||||
- * @param user_data 传递给回调函数的用户数据结构指针
|
||||
- *
|
||||
- * @return int 1 成功; 0 失败
|
||||
-*/
|
||||
-extern int kdk_system_register_switch_user_handle(CallBack call_back, void *user_data);
|
||||
-
|
||||
-/**
|
||||
- * @brief 注销监听用户切换事件的回调函数
|
||||
-*/
|
||||
-extern void kdk_system_unregister_switch_user_handle();
|
||||
-
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -19,3 +19,4 @@
|
|||
0019-26155-sdk.patch
|
||||
0020-.patch
|
||||
0021-update-changelog.patch
|
||||
0022-update-changelog.patch
|
||||
|
|
Loading…
Reference in New Issue