2013-07-03 4 views
2

Я пытаюсь написать службу, которая связывает сторожевое устройство с помощью драйвера watchdog Linux. В функции с именем LoadConfigurationFile я передаю указатель на структуру, определенную выше. Затем эта функция получает строку и сохраняет ее по адресу переменной в структуре с вызовом библиотеки (libconfig). Однако, когда я обращаюсь к переменной 'printf ("% s \ n", options.devicepath); return 1;' вместо того, чтобы печатать содержимое файла конфигурации, как ожидалось: «/ dev/watchdog», программа отображает «/сторожевой таймер».Переменная в структуре повреждена при сохранении значения с помощью функции библиотеки

#include <errno.h> 
#include <getopt.h> 
#include <limits.h> 
#include <linux/types.h> 
#include <linux/watchdog.h> 
#include <signal.h> 
#include <stdbool.h> 
#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/ioctl.h> 
#include <syslog.h> 
#include <sys/stat.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <sys/wait.h> 
#include <time.h> 
#include <unistd.h> 
#include <libconfig.h> 

struct cfgoptions { 
    const char* devicepath; 
}; 

struct cfgoptions options; 
char *confile = "/etc/watchdogd.cfg"; 

    int LoadConfigurationFile(struct cfgoptions *s); 

int main(int argc, char *argv[]) 
{ 

struct cfgoptions *st_ptr; 
    st_ptr = &options; 

    if (LoadConfigurationFile(st_ptr) < 0) 
     /*exit(EXIT_FAILURE);*/ 
/**/ 

printf("%s\n", options.devicepath);return 1; 

/**/ 

int LoadConfigurationFile(struct cfgoptions *s) 
{ 
    config_t cfg; 
    config_init(&cfg); 

    if (!config_read_file(&cfg, confile) && config_error_file(&cfg) == NULL) 
    { 
     fprintf(stderr, "daemon: cannot open configuration file: %s\n", config_error_file(&cfg)); 
     config_destroy(&cfg); 
     return -1; 
    } else if (!config_read_file(&cfg, confile)) { 
     fprintf(stderr, "daemon:%s:%d: %s\n", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg)); 
     config_destroy(&cfg); 
     config_destroy(&cfg); 
     return -1; 
    } 

    if (!config_lookup_string(&cfg, "watchdog-device", &s->devicepath)) 
     s->devicepath = "/dev/watchdog"; 

    config_destroy(&cfg); 

    return 0; 
} 

/etc/watchdogd.cfg:

сторожевого-устройство = "/ DEV/сторожевого"

int config_setting_lookup_string(const config_setting_t *setting, 
           const char *name, const char **value) 
{ 
    config_setting_t *member = config_setting_get_member(setting, name); 
    if(! member) 
    return(CONFIG_FALSE); 

    if(config_setting_type(member) != CONFIG_TYPE_STRING) 
    return(CONFIG_FALSE); 

    *value = config_setting_get_string(member); 
    return(CONFIG_TRUE); 
} 

config_setting_t *config_setting_get_member(const config_setting_t *setting, 
              const char *name) 
{ 
    if(setting->type != CONFIG_TYPE_GROUP) 
    return(NULL); 

    return(__config_list_search(setting->value.list, name, NULL)); 
} 

const char *config_setting_get_string(const config_setting_t *setting) 
{ 
    return((setting->type == CONFIG_TYPE_STRING) ? setting->value.sval : NULL); 
} 
+0

необходимо указать код для config_lookup_string – xaxxon

ответ

2

проблема вы звоните config_destroy. Это теряет все ваши данные, выделенные во время поиска.

- Функция: void config_destroy (config_t * config) Эти функции инициализируют и уничтожают конфигурацию объекта конфигурации.

config_init() инициализирует структуру config_t, на которую указывает config, в качестве новой пустой конфигурации.

config_destroy() разрушает конфигурационный конфиг, освобождая всю память, связанную с конфигурацией, но не пытается освободить структуру config_t.

Довольно уверен в этом.

Попробуйте избавиться от этой линии и посмотреть, что произойдет.

Подробнее: Когда libconfig выделяет память для указателей, которые вы проходите, он должен хранить ссылки на память где-нибудь, чтобы позже их очистить. Это объект cfg. Это просто большой объект хранения записей для всего, что выделила библиотека. Когда вы его уничтожаете, библиотека должна освободить всю выделенную память, иначе она будет просочиться навсегда.

+0

Спасибо, ребята, за помощь, которая устраняет проблему. – clockley1

+0

@ user1450181 всякий раз, когда вы видите коррупцию, всегда пытайтесь выяснить, поврежден ли он, как только вы получите данные. Таким образом, если это не так, вы можете искать, где он становится поврежденным, и вы бы нашли его сразу после этого звонка. – xaxxon

+0

Жаль, что я не дал вам кредит, но ваше решение устраняет ошибку, которую я видел. – clockley1