Как я могу получить версии пакета в C ++? (Linux)

0

Я пишу программу, которая нуждается в винной версии версии 2.6 или новее. Я хотел бы получить его как логическое, поэтому я пытался использовать следующий код:

#include <string>
#include <iostream>
#include "WineCheck.h"
#include <cstdlib>

using namespace std;

bool checkForWine()
{
    // Create variables for checking wine state
    bool wineIsThere   = false;
    bool wineIsVersion = false;

    // Check dpkg if wine is there
    if (string(system("dpkg -l | cut -c 4-9 | grep \\ wine\\ ")) == " wine ")
        {
        wineIsThere = true;
        // Check version
        if (double(system("wine --version | cut -c 6-8")) >= 2.6)
            wineIsVersion = true;
        }

    // Return
    if (wineIsThere && wineIsVersion)
        return true;
    else
        return false;
}
Теги:
system

1 ответ

0

Во-первых, это мое мнение, что вы не должны беспокоиться об этом. Wine 2.6 должен просто включаться в зависимости от вашего сценария конфигурации и/или вашего файла пакета. Ориентация на определенную систему управления пакетами в исходном коде программы не является хорошей идеей, если вы хотите поддерживать переносимость других дистрибутивов GNU/Linux, которые не используют этот пакет.

Чтобы ответить на ваш вопрос. Есть два пути, по которым я могу это сделать. Вы можете проверить /var/lib/dpkg/status. Прочитайте файл по строкам, пока не дойдете до этого раздела. Если вы не нашли раздел или строка Status:... не указала installed то вино не установлено. Строка Version:... сообщит вам, какая версия установлена. Я проверил этот метод, установив и удалив Wine на Debian Wheezy. Вы не сказали, с чем вы работаете, но очевидно, что вы используете систему упаковки Debian, поэтому это должно работать и с Ubuntu и другими дистрибутивами на базе Debian.

$cat /var/lib/dpkg/status
...
Package: wine
Status: install ok installed
Priority: optional
Section: otherosf
Installed-Size: 80
Maintainer: Debian Wine Party &lt;[email protected]&gt;
Architecture: amd64
Version: 1.4.1-4
...

Другой вариант - использование libdpkg. Я нашел пример, в котором перечислены все установленные пакеты.

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

#include <sys/types.h>
#include <sys/stat.h>

#include <dpkg/dpkg.h>
#include <dpkg/dpkg-db.h>
#include <dpkg/pkg-array.h>
#include "filesdb.h"

const char thisname[] = "example1";

int
main(int argc, const char *const *argv)
{
    struct pkg_array array;
    struct pkginfo *pkg;
    int i;
    enum modstatdb_rw msdb_status;

    standard_startup();
    filesdbinit();
    msdb_status = modstatdb_open(msdbrw_readonly);
    pkg_infodb_init(msdb_status);

    pkg_array_init_from_db(&array);
    pkg_array_sort(&array, pkg_sorter_by_name);

    for (i = 0; i < array.n_pkgs; i++) {
        pkg = array.pkgs[i];
        if (pkg->status == stat_notinstalled)
            continue;
        printf("Package --> %s\n", pkg->set->name);
    }

    pkg_array_destroy(&array);

    modstatdb_shutdown();
    standard_shutdown();

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню