varp_util.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 78 行

C
78
字号
/* * Copyright (C) 2005 Mike Wray <mike.wray@hp.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the  * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free software Foundation, Inc., * 59 Temple Place, suite 330, Boston, MA 02111-1307 USA * */static int hex16(char *s, uint16_t *val){    int err = -EINVAL;    uint16_t v = 0;        for( ; *s; s++){        v <<= 4;        if('0' <= *s && *s <= '9'){            v |= *s - '0';        } else if('A' <= *s && *s <= 'F'){            v |= *s - 'A' + 10;        } else if('a' <= *s && *s <= 'f'){            v |= *s - 'a' + 10;        } else {            goto exit;        }    }    err = 0;  exit:    *val = (err ? 0 : v);    return err;}int VnetId_aton(const char *s, VnetId *vnet){    int err = -EINVAL;    const char *p, *q;    uint16_t v;    char buf[5];    int buf_n = sizeof(buf) - 1;    int i, n;    const int elts_n = VNETID_SIZE16;    q = s;    p = strchr(q, ':');    i = (p ? 0 : elts_n - 1);    do {        if(!p){            if(i < elts_n - 1) goto exit;            p = s + strlen(s);        }        n = p - q;        if(n > buf_n) goto exit;        memcpy(buf, q, n);        buf[n] = '\0';        err = hex16(buf, &v);        if(err) goto exit;        vnet->u.vnet16[i] = htons(v);        q = p+1;        p = strchr(q, ':');        i++;    } while(i < elts_n);    err = 0;  exit:    if(err){        *vnet = (VnetId){};    }    return err;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?