<div dir="ltr">I've written a userspace manager that gets configuration from the cloud and pushes it to the device. The manager receives this config which includes things like network interfaces and wireless interfaces. I take that information and create the package sections for the wireless interface then save, commit, and reload the network. I've gotten everything to work minus one "feature" that I am struggling with. The wireless interface section I create, I need it named the same as the wireless interface name instead of the generic name that is auto-assigned. So I create the section then immediately rename it. I then add the various options and then go to save and commit the changes. This is where the "feature" causes a second section with the same name as the originally auto-assigned section name gets created. For some reason, it shows up in "pkg->saved_delta" after the commit returns. The config file then contains the new section I created with all the options properly set and a second but empty section with the original auto-assigned name. Below is more information including a code snippet that exhibits the "feature". Is this behavior expected? If so, is there any workaround? <br><br>The contents of /tmp/.uci/wireless just before the commit is:<br><br><div><font face="monospace">cat /tmp/.uci/wireless<br>+wireless.cfg033579='wifi-iface'<br>@wireless.cfg033579='home-ap-50'<br>wireless.home-ap-50.ifname='home-ap-50'<br>wireless.home-ap-50.device='wifi0'<br>wireless.home-ap-50.disabled='0'<br>wireless.home-ap-50.mode='ap'<br>wireless.home-ap-50.ssid='OpenWrt'<br>wireless.home-ap-50.network='lan'<br>wireless.home-ap-50.hidden='0'<br>wireless.home-ap-50.encryption='none'<br></font><br><br>To recreate just run the following:<br><br><font face="monospace">struct uci_section*<br>openwrt_uci_add_named_section(const char* pkgname, const char* section)<br>{<br>    static struct uci_context* ctx = NULL;<br>    struct uci_package* p = NULL;<br>    struct uci_section* s = NULL;<br>    struct uci_ptr ptr = { 0 };<br><br>   // Allocate a new context if this is the first time through<br>    if (!ctx && (ctx = uci_alloc_context()) == NULL)<br>        return NULL;<br><br>    // Lookup package<br>    p = uci_lookup_package(ctx, pkgname);<br><br>    // Load package if it wasn't already loaded<br>    if (!p && uci_load(ctx, pkgname, &p))<br>        return NULL;<br><br>    // Check if the section already exists and return immediately<br>    s = uci_lookup_section(p->ctx, p, section);<br>    if (s != NULL)<br>        return s;<br><br>    // Add new section; note: section is not named<br>    ret = uci_add_section(p->ctx, p, type, &s);<br>    if (ret != UCI_OK)<br>        return NULL;<br><br>    // Rename section from its auto-assigned name<br>    ptr.p = p;<br>    ptr.s = s;<br>    ptr.value = name;<br>    ret = uci_rename(p->ctx, &ptr);<br>    if (ret != UCI_OK)<br>        return NULL;<br><br>    // Save the section<br>    if (uci_save(p->ctx, p) != UCI_OK)<br>        return NULL;<br><br>    // Commit the config (note: writes out to package file)<br>    if (uci_commit(p->ctx, &p, true) != UCI_OK)<br>        return NULL;<br><br>    return s;<br><br>}</font><br><br>The contents of /tmp/.uci/wireless just before the commit is:<br><br><div><font face="monospace">cat /tmp/.uci/wireless<br>+wireless.cfg033579='wifi-iface'<br>@wireless.cfg033579='home-ap-50'<br>wireless.home-ap-50.ifname='home-ap-50'<br>wireless.home-ap-50.device='phy0'<br>wireless.home-ap-50.disabled='0'<br>wireless.home-ap-50.mode='ap'<br>wireless.home-ap-50.ssid='OpenWrt'<br>wireless.home-ap-50.network='lan'<br>wireless.home-ap-50.hidden='0'<br>wireless.home-ap-50.encryption='none'<br></font></div><div><br></div><div><br></div>Kevin Mahoney<br><br></div></div>