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

Changeset fa101c4 in mainline


Ignore:
Timestamp:
2012-03-08T22:30:19Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
637a3b4
Parents:
291c792
Message:

Address deletion (needs better synchronization).

Location:
uspace
Files:
7 edited

Legend:

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

    r291c792 rfa101c4  
    4848static void print_syntax(void)
    4949{
    50         printf("syntax: " NAME " create <addr>/<width> <link-name> <addr-name>\n");
     50        printf("syntax:\n");
     51        printf("\t" NAME " create <addr>/<width> <link-name> <addr-name>\n");
     52        printf("\t" NAME " delete <link-name> <addr-name>\n");
    5153}
    5254
     
    143145        if (rc != EOK) {
    144146                printf(NAME ": Failed creating static address '%s' (%d)\n",
    145                     "v4s", rc);
     147                    aobj_name, rc);
     148                return EIO;
     149        }
     150
     151        return EOK;
     152}
     153
     154static int addr_delete(int argc, char *argv[])
     155{
     156        char *aobj_name;
     157        char *link_name;
     158        sysarg_t link_id;
     159        sysarg_t addr_id;
     160        int rc;
     161
     162        if (argc < 2) {
     163                printf(NAME ": Missing arguments.\n");
     164                print_syntax();
     165                return EINVAL;
     166        }
     167
     168        if (argc > 2) {
     169                printf(NAME ": Too many arguments.\n");
     170                print_syntax();
     171                return EINVAL;
     172        }
     173
     174        link_name = argv[0];
     175        aobj_name = argv[1];
     176
     177        rc = loc_service_get_id(link_name, &link_id, 0);
     178        if (rc != EOK) {
     179                printf(NAME ": Service '%s' not found (%d).\n", link_name, rc);
     180                return ENOENT;
     181        }
     182
     183        rc = inetcfg_addr_get_id(aobj_name, link_id, &addr_id);
     184        if (rc != EOK) {
     185                printf(NAME ": Address '%s' not found (%d).\n", aobj_name, rc);
     186                return ENOENT;
     187        }
     188
     189        rc = inetcfg_addr_delete(addr_id);
     190        if (rc != EOK) {
     191                printf(NAME ": Failed deleting address '%s' (%d)\n", aobj_name,
     192                    rc);
    146193                return EIO;
    147194        }
     
    223270                if (rc != EOK)
    224271                        return 1;
     272        } else if (str_cmp(argv[1], "delete") == 0) {
     273                rc = addr_delete(argc - 2, argv + 2);
     274                if (rc != EOK)
     275                        return 1;
    225276        } else {
    226277                printf(NAME ": Unknown command '%s'.\n", argv[1]);
  • uspace/lib/c/generic/inetcfg.c

    r291c792 rfa101c4  
    205205}
    206206
     207int inetcfg_addr_get_id(const char *name, sysarg_t link_id, sysarg_t *addr_id)
     208{
     209        async_exch_t *exch = async_exchange_begin(inetcfg_sess);
     210
     211        ipc_call_t answer;
     212        aid_t req = async_send_1(exch, INETCFG_ADDR_GET_ID, link_id, &answer);
     213        sysarg_t retval = async_data_write_start(exch, name, str_size(name));
     214
     215        async_exchange_end(exch);
     216
     217        if (retval != EOK) {
     218                async_wait_for(req, NULL);
     219                return retval;
     220        }
     221
     222        async_wait_for(req, &retval);
     223        *addr_id = IPC_GET_ARG1(answer);
     224
     225        return retval;
     226}
     227
    207228int inetcfg_get_addr_list(sysarg_t **addrs, size_t *count)
    208229{
  • uspace/lib/c/include/inet/inetcfg.h

    r291c792 rfa101c4  
    6767extern int inetcfg_addr_delete(sysarg_t);
    6868extern int inetcfg_addr_get(sysarg_t, inet_addr_info_t *);
     69extern int inetcfg_addr_get_id(const char *, sysarg_t, sysarg_t *);
    6970extern int inetcfg_get_addr_list(sysarg_t **, size_t *);
    7071extern int inetcfg_get_link_list(sysarg_t **, size_t *);
  • uspace/lib/c/include/ipc/inet.h

    r291c792 rfa101c4  
    6464        INETCFG_ADDR_DELETE,
    6565        INETCFG_ADDR_GET,
     66        INETCFG_ADDR_GET_ID,
    6667        INETCFG_GET_ADDR_LIST,
    6768        INETCFG_GET_LINK_LIST,
  • uspace/srv/inet/addrobj.c

    r291c792 rfa101c4  
    4141#include <ipc/loc.h>
    4242#include <stdlib.h>
     43#include <str.h>
    4344
    4445#include "addrobj.h"
     
    119120                        fibril_mutex_unlock(&addr_list_lock);
    120121                        log_msg(LVL_DEBUG, "inet_addrobj_find: found %p",
    121                             addr);
     122                            naddr);
    122123                        return naddr;
    123124                }
     
    125126
    126127        log_msg(LVL_DEBUG, "inet_addrobj_find: Not found");
     128        fibril_mutex_unlock(&addr_list_lock);
     129
     130        return NULL;
     131}
     132
     133/** Find address object on a link, with a specific name.
     134 *
     135 * @param name  Address object name
     136 * @param ilink Inet link
     137 * @return      Address object
     138 */
     139inet_addrobj_t *inet_addrobj_find_by_name(const char *name, inet_link_t *ilink)
     140{
     141        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name('%s', '%s')",
     142            name, ilink->svc_name);
     143
     144        fibril_mutex_lock(&addr_list_lock);
     145
     146        list_foreach(addr_list, link) {
     147                inet_addrobj_t *naddr = list_get_instance(link,
     148                    inet_addrobj_t, addr_list);
     149
     150                if (naddr->ilink == ilink && str_cmp(naddr->name, name) == 0) {
     151                        fibril_mutex_unlock(&addr_list_lock);
     152                        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: found %p",
     153                            naddr);
     154                        return naddr;
     155                }
     156        }
     157
     158        log_msg(LVL_DEBUG, "inet_addrobj_find_by_name: Not found");
    127159        fibril_mutex_unlock(&addr_list_lock);
    128160
  • uspace/srv/inet/addrobj.h

    r291c792 rfa101c4  
    5353extern void inet_addrobj_remove(inet_addrobj_t *);
    5454extern inet_addrobj_t *inet_addrobj_find(inet_addr_t *, inet_addrobj_find_t);
     55extern inet_addrobj_t *inet_addrobj_find_by_name(const char *, inet_link_t *);
    5556extern inet_addrobj_t *inet_addrobj_get_by_id(sysarg_t);
    5657extern int inet_addrobj_send_dgram(inet_addrobj_t *, inet_dgram_t *,
  • uspace/srv/inet/inetcfg.c

    r291c792 rfa101c4  
    8585static int inetcfg_addr_delete(sysarg_t addr_id)
    8686{
    87         return ENOTSUP;
     87        inet_addrobj_t *addr;
     88
     89        addr = inet_addrobj_get_by_id(addr_id);
     90        if (addr == NULL)
     91                return ENOENT;
     92
     93        inet_addrobj_remove(addr);
     94        inet_addrobj_delete(addr);
     95
     96        return EOK;
    8897}
    8998
     
    100109        ainfo->name = str_dup(addr->name);
    101110
     111        return EOK;
     112}
     113
     114static int inetcfg_addr_get_id(char *name, sysarg_t link_id, sysarg_t *addr_id)
     115{
     116        inet_link_t *ilink;
     117        inet_addrobj_t *addr;
     118
     119        ilink = inet_link_get_by_id(link_id);
     120        if (ilink == NULL) {
     121                log_msg(LVL_DEBUG, "Link %zu not found.", (size_t) link_id);
     122                return ENOENT;
     123        }
     124
     125        addr = inet_addrobj_find_by_name(name, ilink);
     126        if (addr == NULL) {
     127                log_msg(LVL_DEBUG, "Address '%s' not found.", name);
     128                return ENOENT;
     129        }
     130
     131        *addr_id = addr->id;
    102132        return EOK;
    103133}
     
    202232        async_answer_3(callid, retval, ainfo.naddr.ipv4, ainfo.naddr.bits,
    203233            ainfo.ilink);
     234}
     235
     236static void inetcfg_addr_get_id_srv(ipc_callid_t callid, ipc_call_t *call)
     237{
     238        char *name;
     239        sysarg_t link_id;
     240        sysarg_t addr_id;
     241        int rc;
     242
     243        log_msg(LVL_DEBUG, "inetcfg_addr_get_id_srv()");
     244
     245        link_id = IPC_GET_ARG1(*call);
     246
     247        rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
     248            0, NULL);
     249        if (rc != EOK) {
     250                async_answer_0(callid, rc);
     251                return;
     252        }
     253
     254        addr_id = 0;
     255        rc = inetcfg_addr_get_id(name, link_id, &addr_id);
     256        free(name);
     257        async_answer_1(callid, rc, addr_id);
    204258}
    205259
     
    333387                        inetcfg_addr_get_srv(callid, &call);
    334388                        break;
     389                case INETCFG_ADDR_GET_ID:
     390                        inetcfg_addr_get_id_srv(callid, &call);
     391                        break;
    335392                case INETCFG_GET_ADDR_LIST:
    336393                        inetcfg_get_addr_list_srv(callid, &call);
Note: See TracChangeset for help on using the changeset viewer.