Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bf9e6fc in mainline


Ignore:
Timestamp:
2012-05-13T10:01:08Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
ce1836e
Parents:
f8dbc12
Message:

Detect duplicate address names.

Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/inet/inet.c

    rf8dbc12 rbf9e6fc  
    187187        rc = inetcfg_addr_create_static(aobj_name, &naddr, link_id, &addr_id);
    188188        if (rc != EOK) {
    189                 printf(NAME ": Failed creating static address '%s' (%d)\n",
    190                     aobj_name, rc);
     189                printf(NAME ": Failed creating static address '%s' (%s)\n",
     190                    aobj_name, str_error(rc));
    191191                return EIO;
    192192        }
  • uspace/srv/net/inetsrv/addrobj.c

    rf8dbc12 rbf9e6fc  
    4848#include "inet_util.h"
    4949
     50static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     51
    5052static FIBRIL_MUTEX_INITIALIZE(addr_list_lock);
    5153static LIST_INITIALIZE(addr_list);
     
    7779}
    7880
    79 void inet_addrobj_add(inet_addrobj_t *addr)
    80 {
    81         fibril_mutex_lock(&addr_list_lock);
     81int inet_addrobj_add(inet_addrobj_t *addr)
     82{
     83        inet_addrobj_t *aobj;
     84
     85        fibril_mutex_lock(&addr_list_lock);
     86        aobj = inet_addrobj_find_by_name_locked(addr->name, addr->ilink);
     87        if (aobj != NULL) {
     88                /* Duplicate address name */
     89                fibril_mutex_unlock(&addr_list_lock);
     90                return EEXISTS;
     91        }
     92
    8293        list_append(&addr->addr_list, &addr_list);
    8394        fibril_mutex_unlock(&addr_list_lock);
     95
     96        return EOK;
    8497}
    8598
     
    130143 * @return      Address object
    131144 */
    132 inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
    133 {
    134         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
     145static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *name, inet_link_t *ilink)
     146{
     147        assert(fibril_mutex_is_locked(&addr_list_lock));
     148
     149        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked('%s', '%s')",
    135150            name, ilink->svc_name);
    136151
    137         fibril_mutex_lock(&addr_list_lock);
    138 
    139152        list_foreach(addr_list, link) {
    140153                inet_addrobj_t *naddr = list_get_instance(link,
     
    142155
    143156                if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
    144                         fibril_mutex_unlock(&addr_list_lock);
    145                         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: found %p",
     157                        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked: found %p",
    146158                            naddr);
    147159                        return naddr;
     
    149161        }
    150162
    151         log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: Not found");
    152         fibril_mutex_unlock(&addr_list_lock);
     163        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name_locked: Not found");
    153164
    154165        return NULL;
     166}
     167
     168
     169/** Find address object on a link, with a specific name.
     170 *
     171 * @param name  Address object name
     172 * @param ilink Inet link
     173 * @return      Address object
     174 */
     175inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
     176{
     177        inet_addrobj_t *aobj;
     178
     179        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
     180            name, ilink->svc_name);
     181
     182        fibril_mutex_lock(&addr_list_lock);
     183        aobj = inet_addrobj_find_by_name_locked(name, ilink);
     184        fibril_mutex_unlock(&addr_list_lock);
     185
     186        return aobj;
    155187}
    156188
  • uspace/srv/net/inetsrv/addrobj.h

    rf8dbc12 rbf9e6fc  
    5050extern inet_addrobj_t *inet_addrobj_new(void);
    5151extern void inet_addrobj_delete(inet_addrobj_t *);
    52 extern void inet_addrobj_add(inet_addrobj_t *);
     52extern int inet_addrobj_add(inet_addrobj_t *);
    5353extern void inet_addrobj_remove(inet_addrobj_t *);
    5454extern inet_addrobj_t *inet_addrobj_find(inet_addr_t *, inet_addrobj_find_t);
  • uspace/srv/net/inetsrv/inet_link.c

    rf8dbc12 rbf9e6fc  
    207207        addr->ilink = ilink;
    208208        addr->name = str_dup("v4a");
    209         inet_addrobj_add(addr);
     209        rc = inet_addrobj_add(addr);
     210        if (rc != EOK) {
     211                log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
     212                inet_addrobj_delete(addr);
     213                /* XXX Roll back */
     214                return rc;
     215        }
    210216
    211217        iaddr.ipv4 = addr->naddr.ipv4;
     
    213219        if (rc != EOK) {
    214220                log_msg(LVL_ERROR, "Failed setting IP address on internet link.");
     221                inet_addrobj_remove(addr);
     222                inet_addrobj_delete(addr);
    215223                /* XXX Roll back */
    216224                return rc;
  • uspace/srv/net/inetsrv/inetcfg.c

    rf8dbc12 rbf9e6fc  
    7575        addr->ilink = ilink;
    7676        addr->name = str_dup(name);
    77         inet_addrobj_add(addr);
     77        rc = inet_addrobj_add(addr);
     78        if (rc != EOK) {
     79                log_msg(LVL_DEBUG, "Duplicate address name '%s'.", addr->name);
     80                inet_addrobj_delete(addr);
     81                return rc;
     82        }
    7883
    7984        iaddr.ipv4 = addr->naddr.ipv4;
Note: See TracChangeset for help on using the changeset viewer.