Segfault, добавляя ARGS к сообщению DBUSLinux

Ответить
Anonymous
 Segfault, добавляя ARGS к сообщению DBUS

Сообщение Anonymous »

Я пытаюсь выучить программирование 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, &param)) {
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)
Может ли кто -нибудь намекнуть меня, что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/797 ... us-message
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»