gnokii: ошибка API? - PullRequest
       11

gnokii: ошибка API?

1 голос
/ 05 февраля 2011

У меня проблемы со следующим кодом:

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#include <gnokii.h>

#define CONFIG_FILE "config"

struct gn_statemachine  *state;

void terminate(void) {
    gn_lib_phone_close(state);
    gn_lib_phoneprofile_free(&state);
    gn_lib_library_free();
}


int main() {
    gn_data data;
    gn_error error;    
    gn_sms_folder_list folderlist;

    atexit(terminate);

    if((error = gn_lib_phoneprofile_load(CONFIG_FILE,&state)) 
       != GN_ERR_NONE)
    {
        fprintf(stderr,"%s\n",gn_error_print(error));
        exit(1);
    }

    memset(&folderlist,0,sizeof(gn_sms_folder_list));
    gn_data_clear(&data);
    data.sms_folder_list = &folderlist;

    error = gn_sm_functions(GN_OP_GetSMSFolders, &data, state);

    printf("ada %d sms dun\n",folderlist.number);

    return 0;
}

Я компилирую его с gcc -o main main.c -lgnokii, но когда он выполняется, при поиске файла конфигурации выдает ошибки:

# ./gnokiitest 
No phone_config section in the config file.
Either global or given phone section cannot be found.
Segmentation fault

потому что я включил файл конфигурации в одну папку основного вывода:

$ cat config 
[global]
  connection = bluetooth
  port = 24:22:AB:AB:C1:F8
  model = AT
  rfcomm_channel = 2

Что тогда не так?

1 Ответ

2 голосов
/ 05 февраля 2011

Для начала, следующие проблемы могут вызвать проблемы:

if((error = gn_lib_phoneprofile_load(CONFIG_FILE,&state))

state переменная здесь не инициализируется. Это приведет к передаче случайного указателя и, скорее всего, к segfault.

Далее, первый аргумент gn_lib_phoneprofile_load() - это не имя файла конфигурации, а раздел телефона в конфигурации, где указаны подробности подключения. Учитывая, что вы передаете config в качестве этого параметра вам нужно:

[phone_config]
connection = bluetooth
port = 24:22:AB:AB:C1:F8
model = AT
rfcomm_channel = 2

но помещается в стандартное расположение файла конфигурации gnokii. Чтобы использовать другое местоположение, используйте:

gn_lib_phoneprofile_load_from_file(CONFIG_FILE, NULL, &state);

Второй аргумент - имя телефонного раздела. Если NULL, то будет использоваться [global].

Дополнительно gn_lib_phoneprofile_load() просто читает файл конфигурации. Вам нужно запустить gn_lib_phone_open(), чтобы инициализировать соединение.

Наконец, подобный код уже написан, не нужно изобретать велосипед: http://git.savannah.gnu.org/cgit/gnokii/gnokii-extras.git/tree/snippets/sms/sms_status.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...