Я пытаюсь выучить программирование DBU из руководства BLE Linux. Поскольку большая часть примера кода в руководстве написана на Python, я пытаюсь подражать те же примеры в C и Libdbus. Это мой маленький список, где я пытаюсь запросить свое имя хоста. < /P>
#include
#include
#include
#define BLUEZ_OBJ_PATH "/org/bluez/hci0"
#define FREE_DESKTOP_HOSTNAME "/org/freedesktop/hostname1"
// What is my main aim here?
// Lets atleast configure bunch of bluetooth features that would help in future developments.
void handleError(DBusError *err, char *message){
// Check before that wether the error is set or not.
// Might remove it later, because of this unnnc func call. Dont need this fuckting branching. Fuck readability.
if(dbus_error_is_set(err)){
fprintf(stderr, "%s : %s\n", message, err->message);
dbus_error_free(err);
}
}
int main(int argc, char*argv[]){
// A basic template
DBusMessage *msg; // You send your message to dbus through it.
DBusMessageIter iter; // Its iterator.
DBusConnection *conn; // Pointer returned when a success
DBusError err; // error updated here.
DBusPendingCall *pending;
int ret; // Will carry status of some func return.
int arg_type; // Current arg type
char *dumper; // For recieving string data.
dbus_error_init(&err); // Inititalise error
char Parameter[] = "Hostname";
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
handleError(&err, "Connection error!!");
if(conn == NULL){
fprintf(stderr, "Error while connecting to bus daemon\n");
exit(1);
}
msg = dbus_message_new_method_call("org.freedesktop.hostname1", "/org/freedesktop/hostname1", "org.freedesktop.DBus.Properties", "Get");
if(msg == NULL){
fprintf(stderr, "Error: errDBM--01\n");
}
dbus_message_iter_init_append(msg, &iter);
if(!(dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,Parameter))){
fprintf(stderr, "While appending a message\n");
exit(1);
}
if(!dbus_connection_send_with_reply(conn,msg,&pending,-1)){
fprintf(stderr, "Error: No memory!!\n");
}
dbus_message_unref(msg);
// Will block until we get reply
dbus_pending_call_block(pending); // Pending call
if(pending == NULL){
fprintf(stderr, "Recieved null reply\n");
exit(1);
}
msg = dbus_pending_call_steal_reply(pending);
if(msg == NULL){
fprintf(stderr, "Recieved null msg\n");
exit(1);
}
dbus_pending_call_unref(pending);
if (!dbus_message_iter_init(msg, &iter)){
fprintf(stderr, "Message has no arguments!\n");
exit(1);
}
int atype = dbus_message_iter_get_arg_type(&iter);
if (atype != DBUS_TYPE_VARIANT) {
fprintf(stderr, "Unexpected reply: expected VARIANT, got %c\n", atype);
dbus_message_unref(msg);
return 1;
}
DBusMessageIter sub; // Its iterator.
dbus_message_iter_recurse(&iter, &sub);
if(dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING){
char *hio;
dbus_message_iter_get_basic(&sub, hio);
printf("recieved: %s\n");
}
}
< /code>
Но я застрял в добавлении ARGS к строке сообщения. Я следовал этому примеру: < /p>
msg = dbus_message_new_method_call("test.method.server", // target for the method call
"/test/method/Object", // object to call on
"test.method.Type", // interface to call on
"Method"); // method name
if (NULL == msg) {
fprintf(stderr, "Message Null\n");
exit(1);
}
// append arguments
dbus_message_iter_init_append(msg, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, ¶m)) {
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
< /code>
Из этой статьи. < /p>
Это мой дамп GDB: < /p>
Program received signal SIGSEGV, Segmentation fault.
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76
76 VPCMPEQ (%rdi), %ymm0, %ymm1
(gdb) bt
#0 __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76
#1 0x00007ffff7f75fe9 in _dbus_string_init_const (str=0x7fffffffd680, value=0x656d616e74736f48 ) at ../../dbus/dbus-string.c:203
#2 0x00007ffff7f67523 in _dbus_check_is_valid_utf8 (name=) at ../../dbus/dbus-marshal-validate.c:1280
#3 _dbus_check_is_valid_utf8 (name=) at ../../dbus/dbus-marshal-validate.c:1280
#4 dbus_message_iter_append_basic (iter=0x7fffffffd760, type=115, value=0x7fffffffd72f) at ../../dbus/dbus-message.c:2775
#5 0x00000000004013b1 in main (argc=1, argv=0x7fffffffd8f8) at main.c:59
(gdb)
Может ли кто -нибудь намекнуть меня, что я делаю не так?
Я пытаюсь выучить программирование DBU из руководства BLE Linux. Поскольку большая часть примера кода в руководстве написана на Python, я пытаюсь подражать те же примеры в C и Libdbus. Это мой маленький список, где я пытаюсь запросить свое имя хоста. < /P> [code]#include #include #include
// What is my main aim here? // Lets atleast configure bunch of bluetooth features that would help in future developments.
void handleError(DBusError *err, char *message){ // Check before that wether the error is set or not. // Might remove it later, because of this unnnc func call. Dont need this fuckting branching. Fuck readability. if(dbus_error_is_set(err)){ fprintf(stderr, "%s : %s\n", message, err->message); dbus_error_free(err); } }
int main(int argc, char*argv[]){
// A basic template DBusMessage *msg; // You send your message to dbus through it. DBusMessageIter iter; // Its iterator. DBusConnection *conn; // Pointer returned when a success DBusError err; // error updated here. DBusPendingCall *pending; int ret; // Will carry status of some func return. int arg_type; // Current arg type char *dumper; // For recieving string data.
} < /code> Но я застрял в добавлении ARGS к строке сообщения. Я следовал этому примеру: < /p> msg = dbus_message_new_method_call("test.method.server", // target for the method call "/test/method/Object", // object to call on "test.method.Type", // interface to call on "Method"); // method name if (NULL == msg) { fprintf(stderr, "Message Null\n"); exit(1); }
// append arguments dbus_message_iter_init_append(msg, &args); if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, ¶m)) { fprintf(stderr, "Out Of Memory!\n"); exit(1); } < /code> Из этой статьи. < /p> Это мой дамп GDB: < /p> Program received signal SIGSEGV, Segmentation fault. __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76 76 VPCMPEQ (%rdi), %ymm0, %ymm1 (gdb) bt #0 __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:76 #1 0x00007ffff7f75fe9 in _dbus_string_init_const (str=0x7fffffffd680, value=0x656d616e74736f48 ) at ../../dbus/dbus-string.c:203 #2 0x00007ffff7f67523 in _dbus_check_is_valid_utf8 (name=) at ../../dbus/dbus-marshal-validate.c:1280 #3 _dbus_check_is_valid_utf8 (name=) at ../../dbus/dbus-marshal-validate.c:1280 #4 dbus_message_iter_append_basic (iter=0x7fffffffd760, type=115, value=0x7fffffffd72f) at ../../dbus/dbus-message.c:2775 #5 0x00000000004013b1 in main (argc=1, argv=0x7fffffffd8f8) at main.c:59 (gdb) [/code] Может ли кто -нибудь намекнуть меня, что я делаю не так?