2016-12-01 2 views
0

Я заглянул в исходный код «dpkg-query» и попытался получить список установленных пакетов.Работа с libdpkg в C

Он компилируется, но когда я пытаюсь запустить, я получаю ошибку в функции modstatdb_open().

#define LIBDPKG_VOLATILE_API 1 
#include <stdio.h> 
#include <unistd.h> 
#include <dpkg/macros.h> 
#include <dpkg/dpkg.h> 
#include <dpkg/dpkg-db.h> 
#include <dpkg/pkg-array.h> 
#include <dpkg/debug.h> 
#include <dpkg/pkg-list.h> 

void main() 
{ 
    struct pkg_array array; 

    modstatdb_open(msdbrw_readonly | msdbrw_available_readonly); 

    pkg_array_init_from_db(&array); 

    printf("%d\n",array.n_pkgs); 

    pkg_array_destroy(&array); 
    modstatdb_shutdown(); 
} 

вина Сегментация (ядро сбрасывали)

Что плохого?

+1

Вы должны вызвать 'standard_startup();' и 'filesdbinit()' 'Перед modstatdb_open()' – LPs

+1

и standard_shutdown(); в конце концов – Adam

+0

Tahnk вы так много. Он работает сейчас. –

ответ

0

Рабочая версия. Он должен использовать dpkg_program_init (char * progname); прежде всего.

#define LIBDPKG_VOLATILE_API 1 

#include <stdio.h> 
#include <unistd.h> 
#include <dpkg/dpkg.h> 
#include <dpkg/dpkg-db.h> 
#include <dpkg/pkg-array.h> 


void main() 
{ 
    struct pkgset *set; 
    struct pkginfo *inf; 
    struct pkg_array array; 

    dpkg_program_init("a.out"); 
    modstatdb_open(msdbrw_available_readonly); 

    pkg_array_init_from_db(&array); 
    printf("Number of packages in local database: %d\n",array.n_pkgs); 

    inf = pkg_db_find_singleton("kate"); 
    printf("status code of package: %d\n", inf->status);// 7 means installed 

    dpkg_program_done(); 
}