2016-06-24 9 views
1

UCI verwenden wir ganze Listen mit folgendem Befehl abrufen:UCI C API - Wie mit Listenoptionen arbeiten

config system 
    option hostname 'OpenWrt' 
    option timezone 'UTC' 

config timeserver 'ntp' 
    list server '0.openwrt.pool.ntp.org' 
    list server '1.openwrt.pool.ntp.org' 
    list server '2.openwrt.pool.ntp.org' 
    list server '3.openwrt.pool.ntp.org' 
    option enabled '1' 
    option enable_server '0' 

Das Rückkehr:

$ uci get system.ntp.server 

dies die Art von Konfiguration unten lesen würde alle NTP-Server in einer langen Zeichenfolge in Ordnung.

0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org 

Ich möchte das gleiche (oder gleichwertig) mit dem CAPI erreichen.

habe ich den folgenden Code zusammen:

#include <uci.h> 
#include <string.h> 
void main() 
{ 
    //char path[] = "system.ntp.enabled"; 
    char path[] = "system.ntp.server"; 
    char buffer[80]; 
    get_config_entry(path, &buffer); 
    printf("%s\n", buffer); 

} 

int get_config_entry (char *path, char *buffer) 
{ 
    struct uci_context *c; 
    struct uci_ptr ptr; 

    c = uci_alloc_context(); 
    if (uci_lookup_ptr (c, &ptr, path, true) != UCI_OK) 
    { 
     uci_perror (c, "XXX"); 
     return 1; 
    } 

    strcpy(buffer, ptr.o->v.string); 
    uci_free_context (c); 
    return 0; 
} 

Ausführen dies gibt nur Müll in der Ausgabe-String.

Wie soll ich mit der UCI C API Listeninhalte bearbeiten?

+0

Sie müssen sich für 'get_config_entry' einen Prototyp setzen, bevor' main' (oder einfach die ganze Funktion vor 'main' nach oben). Beachten Sie, dass der Compiler hilfreich auf Ihre Fehler hingewiesen hätte, wenn Sie mit aktivierten Warnungen kompiliert hätten (z. B. "gcc -Wall ..."). –

+0

Ich habe das UCI-Tag entfernt, welches sich momentan mit der "Universalschach-Schnittstelle" beschäftigt, nicht über die "Unified Configuration Interface". –

+0

Ich glaube, Sie sollten den Aufruf so machen: get_config_entry (Pfad, Puffer); Hinweis: "Puffer" hat kein Und-Zeichen davor. – TonyB

Antwort

1

Wenn ein Listenelement angefordert wird, wird es in v.list nicht v.string gespeichert.

Ich fand die uci_show_value-Funktion im UCI-CLI-Code, die sehr geholfen hat. Ich habe es geschafft, den folgenden Code zu bekommen, um gut mit den Listenoptionen zu arbeiten.

#include <uci.h> 
#include <string.h> 

static const char *delimiter = " "; 

static void uci_show_value(struct uci_option *o) 
{ 
    struct uci_element *e; 
    bool sep = false; 

    switch(o->type) { 
    case UCI_TYPE_STRING: 
     printf("%s\n", o->v.string); 
     break; 
    case UCI_TYPE_LIST: 
     uci_foreach_element(&o->v.list, e) { 
      printf("%s%s", (sep ? delimiter : ""), e->name); 
      sep = true; 
     } 
     printf("\n"); 
     break; 
    default: 
     printf("<unknown>\n"); 
     break; 
    } 
} 

int show_config_entry (char *path) 
{ 
    struct uci_context *c; 
    struct uci_ptr ptr; 

    c = uci_alloc_context(); 
    if (uci_lookup_ptr (c, &ptr, path, true) != UCI_OK) 
    { 
     uci_perror (c, "get_config_entry Error"); 
     return 1; 
    } 

    uci_show_value(ptr.o); 
    uci_free_context (c); 
    return 0; 
} 

void main() 
{ 
    char path[] = "system.ntp.server"; 
    show_config_entry(path); 

}