Реализация OpenWrt LibUbi

Я пытаюсь разработать приложение (написанное на ANSI C) для маршрутизатора OpenWrt, используя libuci. Я прочитал этот полезный пост: Как узнать, является ли режим eth0 статическим или dhcp?

и я разработал часть моего приложения, которое может читать сетевые данные (в этом случае я читаю, если включен ppp), используя библиотеку uci.

char path[]="network.ppp.enabled";
struct  uci_ptr ptr;
struct  uci_context *c = uci_alloc_context();       

if(!c) return;

if (strcmp(typeCmd, "GET") == 0){

    if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) || (ptr.o==NULL || ptr.o->v.string==NULL)) {
            uci_free_context(c);
            return;
        }

    if(ptr.flags & UCI_LOOKUP_COMPLETE)
            strcpy(buffer, ptr.o->v.string);

    uci_free_context(c);

    printf("\n\nUCI result data: %s\n\n", buffer);
}

Теперь я хочу попробовать установить новые сетевые данные (поэтому я хочу включить ppp -> установить ppp в 1) Я пишу:

}else if (strcmp(typeCmd, "SET") == 0){

    if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) || (ptr.o==NULL || ptr.o->v.string==NULL)) {
            uci_free_context(c);
            return;
        }

    ptr.o->v.string = "1";
    if ((uci_set(c, &ptr) != UCI_OK) || (ptr.o==NULL || ptr.o->v.string==NULL)) {
            uci_free_context(c);
            return;
        }

    if (uci_commit(c, struct uci_package **p, true) != UCI_OK){
            uci_free_context(c);
            return;
        }
}

Документация LibUci не существует, в файле uci.h есть только некоторая информация, я не знаю, как заполнить структуру uci_ptr, поэтому я извлек ее из uci_lookup_ptr, изменил ptr.o->v.string и запустить uci_set с новыми параметрами, но насчет uci_commit я не знаю, что такое struct uci_package ** p.

Кто-нибудь позвонил, поделитесь со мной небольшим количеством документации или покажите мне несколько примеров?

большое спасибо

1 ответ

Решение

Документация по UCI очень тонкая. Я понял это с помощью свойства .value uci_ptr из структуры uci.

С этого момента я меняю строку:

ptr.o->v.string = "1";

чтобы:

ptr.value = "1";

Я также изменил вашу строку коммита следующим образом:

uci_commit(ctx, &ptr.p, false);

Это сработало для меня.

Другие вопросы по тегам