by Anonymous » 05 Mar 2025, 10:30
Ich habe mit dem ACPI NetLink unter Linux experimentiert. Hauptsächlich abonniere ich die ACPI_MC_Group , um ACPI -Ereignisbenachrichtigungen unter Verwendung von LIBNL und einigen von ACPID2 definierten Datenträgern zu erhalten. Während die Felder von Device_Class und bus_id ziemlich selbstverständlich sind, kann ich nirgendwo finden, was die Felder Event_type und event_data entsprechen (d. H. Es gibt kein Enum, der die ganzzahligen Werte ihrer semantischen Bedeutung zuordnen würde). Nach meinen Tests konnte ich am meisten herausfinden, dass Event_type 128 auf dem AC_ADAPTER (un) das Ladegerät mit Event_Data 0 entspricht, was den Unplug und 1 bedeutet, aber das ist es, aber das ist ...
Code: Select all
#include
#include
#include
#include "acpi_genetlink.h"
#include
#include
#include
static int acpi_handler(struct nl_msg* msg, void *data) {
struct nlmsghdr *msghdr = nlmsg_hdr(msg);
struct nlattr *attrs[ACPI_GENL_ATTR_MAX + 1];
genlmsg_parse(msghdr, 0, attrs, ACPI_GENL_ATTR_MAX, NULL);
struct acpi_genl_event *event = nla_data(attrs[ACPI_GENL_ATTR_MAX]);
printf("NOTIFICATION:\n");
printf("\tdevice class: %s\n"
"\tbus id: %s\n"
"\tevent type: %u\n"
"\tevent data: %u\n"
, event->device_class, event->bus_id, event->type, event->data);
return NL_OK;
}
int main (void) {
struct nl_sock *sock = nl_socket_alloc();
genl_connect(sock);
nl_socket_disable_seq_check(sock);
int acpi_mc_group = genl_ctrl_resolve_grp(sock, ACPI_EVENT_FAMILY_NAME, ACPI_EVENT_MCAST_GROUP_NAME);
nl_socket_add_membership(sock, acpi_mc_group);
nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, acpi_handler, NULL);
while (1) {
nl_recvmsgs_default(sock);
}
nl_close(sock);
nl_socket_free(sock);
}
mit acpi_genetlink.h wird schamlos aus ACPID2 :
kopiert.
Code: Select all
#ifndef __ACPI_GENETLINK_H__
#define __ACPI_GENETLINK_H__ 1
#include
struct acpi_genl_event {
char device_class[20];
char bus_id[15];
__u32 type;
__u32 data;
};
/* attributes of acpi_genl_family */
enum {
ACPI_GENL_ATTR_UNSPEC,
ACPI_GENL_ATTR_EVENT, /* ACPI event info needed by user space */
__ACPI_GENL_ATTR_MAX,
};
#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
/* commands supported by the acpi_genl_family */
enum {
ACPI_GENL_CMD_UNSPEC,
ACPI_GENL_CMD_EVENT, /* kernel->user notifications for ACPI events */
__ACPI_GENL_CMD_MAX,
};
#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
#define GENL_MAX_FAM_OPS 256
#define GENL_MAX_FAM_GRPS 256
#define ACPI_EVENT_FAMILY_NAME "acpi_event"
#define ACPI_EVENT_MCAST_GROUP_NAME "acpi_mc_group"
#endif
Ich habe mit dem ACPI NetLink unter Linux experimentiert. Hauptsächlich abonniere ich die ACPI_MC_Group , um ACPI -Ereignisbenachrichtigungen unter Verwendung von LIBNL und einigen von ACPID2 definierten Datenträgern zu erhalten. Während die Felder von Device_Class und bus_id ziemlich selbstverständlich sind, kann ich nirgendwo finden, was die Felder Event_type und event_data entsprechen (d. H. Es gibt kein Enum, der die ganzzahligen Werte ihrer semantischen Bedeutung zuordnen würde). Nach meinen Tests konnte ich am meisten herausfinden, dass Event_type 128 auf dem AC_ADAPTER (un) das Ladegerät mit Event_Data 0 entspricht, was den Unplug und 1 bedeutet, aber das ist es, aber das ist ...[code]#include
#include
#include
#include "acpi_genetlink.h"
#include
#include
#include
static int acpi_handler(struct nl_msg* msg, void *data) {
struct nlmsghdr *msghdr = nlmsg_hdr(msg);
struct nlattr *attrs[ACPI_GENL_ATTR_MAX + 1];
genlmsg_parse(msghdr, 0, attrs, ACPI_GENL_ATTR_MAX, NULL);
struct acpi_genl_event *event = nla_data(attrs[ACPI_GENL_ATTR_MAX]);
printf("NOTIFICATION:\n");
printf("\tdevice class: %s\n"
"\tbus id: %s\n"
"\tevent type: %u\n"
"\tevent data: %u\n"
, event->device_class, event->bus_id, event->type, event->data);
return NL_OK;
}
int main (void) {
struct nl_sock *sock = nl_socket_alloc();
genl_connect(sock);
nl_socket_disable_seq_check(sock);
int acpi_mc_group = genl_ctrl_resolve_grp(sock, ACPI_EVENT_FAMILY_NAME, ACPI_EVENT_MCAST_GROUP_NAME);
nl_socket_add_membership(sock, acpi_mc_group);
nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, acpi_handler, NULL);
while (1) {
nl_recvmsgs_default(sock);
}
nl_close(sock);
nl_socket_free(sock);
}
[/code]
mit acpi_genetlink.h wird schamlos aus ACPID2 :
kopiert.[code]#ifndef __ACPI_GENETLINK_H__
#define __ACPI_GENETLINK_H__ 1
#include
struct acpi_genl_event {
char device_class[20];
char bus_id[15];
__u32 type;
__u32 data;
};
/* attributes of acpi_genl_family */
enum {
ACPI_GENL_ATTR_UNSPEC,
ACPI_GENL_ATTR_EVENT, /* ACPI event info needed by user space */
__ACPI_GENL_ATTR_MAX,
};
#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
/* commands supported by the acpi_genl_family */
enum {
ACPI_GENL_CMD_UNSPEC,
ACPI_GENL_CMD_EVENT, /* kernel->user notifications for ACPI events */
__ACPI_GENL_CMD_MAX,
};
#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
#define GENL_MAX_FAM_OPS 256
#define GENL_MAX_FAM_GRPS 256
#define ACPI_EVENT_FAMILY_NAME "acpi_event"
#define ACPI_EVENT_MCAST_GROUP_NAME "acpi_mc_group"
#endif
[/code]