gnokii: ошибка API?
У меня проблемы со следующим кодом:
#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 ответ
Для начала, следующее вызовет проблемы:
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