Annotation of qemu/roms/SLOF/clients/net-snk/app/netapps/args.c, revision 1.1

1.1     ! root        1: /******************************************************************************
        !             2:  * Copyright (c) 2004, 2008 IBM Corporation
        !             3:  * All rights reserved.
        !             4:  * This program and the accompanying materials
        !             5:  * are made available under the terms of the BSD License
        !             6:  * which accompanies this distribution, and is available at
        !             7:  * http://www.opensource.org/licenses/bsd-license.php
        !             8:  *
        !             9:  * Contributors:
        !            10:  *     IBM Corporation - initial implementation
        !            11:  *****************************************************************************/
        !            12: 
        !            13: #include <types.h>
        !            14: #include <ctype.h>
        !            15: #include <stdlib.h>
        !            16: #include <string.h>
        !            17: 
        !            18: /**
        !            19:  * Returns pointer of the n'th argument within a string.
        !            20:  *
        !            21:  * @param  arg_str    string with arguments, seperated with ','
        !            22:  * @param  index      index of the requested arguments whithin arg_str
        !            23:  * @return            pointer of argument[index] on success
        !            24:  *                    NULL if index is out of range
        !            25:  */
        !            26: const char *
        !            27: get_arg_ptr(const char *arg_str, unsigned int index)
        !            28: {
        !            29:        unsigned int i;
        !            30: 
        !            31:        for (i = 0; i < index; ++i) {
        !            32:                for (; *arg_str != ',' && *arg_str != 0; ++arg_str);
        !            33:                if (*arg_str == 0)
        !            34:                        return 0;
        !            35:                ++arg_str;
        !            36:        }
        !            37:        return arg_str;
        !            38: }
        !            39: 
        !            40: /**
        !            41:  * Returns number of arguments within a string.
        !            42:  *
        !            43:  * @param  arg_str    string with arguments, seperated with ','
        !            44:  * @return            number of arguments
        !            45:  */
        !            46: unsigned int
        !            47: get_args_count(const char *arg_str)
        !            48: {
        !            49:        unsigned int count = 1;
        !            50: 
        !            51:        while ((arg_str = get_arg_ptr(arg_str, 1)) != 0)
        !            52:                ++count;
        !            53:        return count;
        !            54: }
        !            55: 
        !            56: /**
        !            57:  * Returns the length of the first argument.
        !            58:  *
        !            59:  * @param  arg_str    string with arguments, seperated with ','
        !            60:  * @return            length of first argument
        !            61:  */
        !            62: unsigned int
        !            63: get_arg_length(const char *arg_str)
        !            64: {
        !            65:        unsigned int i;
        !            66: 
        !            67:        for (i = 0; *arg_str != ',' && *arg_str != 0; ++i)
        !            68:                ++arg_str;
        !            69:        return i;
        !            70: }
        !            71: 
        !            72: /**
        !            73:  * Copy the n'th argument within a string into a buffer in respect
        !            74:  * to a limited buffer size
        !            75:  *
        !            76:  * @param  arg_str    string with arguments, seperated with ','
        !            77:  * @param  index      index of the requested arguments whithin arg_str
        !            78:  * @param  buffer     pointer to the buffer
        !            79:  * @param  length     size of the buffer
        !            80:  * @return            pointer of buffer on success
        !            81:  *                    NULL if index is out of range.
        !            82:  */
        !            83: char *
        !            84: argncpy(const char *arg_str, unsigned int index, char *buffer,
        !            85:        unsigned int length)
        !            86: {
        !            87:        const char *ptr = get_arg_ptr(arg_str, index);
        !            88:        unsigned int len;
        !            89: 
        !            90:        if (!ptr)
        !            91:                return 0;
        !            92:        len = get_arg_length(ptr);
        !            93:        if (!strncpy(buffer, ptr, length))
        !            94:                return 0;
        !            95:        buffer[len] = 0;
        !            96:        return buffer;
        !            97: }
        !            98: 
        !            99: /**
        !           100:  * Converts "255.255.255.255" -> char[4] = { 0xff, 0xff, 0xff, 0xff }
        !           101:  *
        !           102:  * @param  str        string to be converted
        !           103:  * @param  ip         in case of SUCCESS - 32-bit long IP
        !           104:                       in case of FAULT - zero
        !           105:  * @return            TRUE - IP converted successfully;
        !           106:  *                    FALSE - error condition occurs (e.g. bad format)
        !           107:  */
        !           108: int
        !           109: strtoip(const char *str, char ip[4])
        !           110: {
        !           111:        char octet[10];
        !           112:        int res;
        !           113:        unsigned int i = 0, len;
        !           114: 
        !           115:        while (*str != 0) {
        !           116:                if (i > 3 || !isdigit(*str))
        !           117:                        return 0;
        !           118:                if (strstr(str, ".") != NULL) {
        !           119:                        len = (int16_t) (strstr(str, ".") - str);
        !           120:                        if (len >= 10)
        !           121:                                return 0;
        !           122:                        strncpy(octet, str, len);
        !           123:                        octet[len] = 0;
        !           124:                        str += len;
        !           125:                } else {
        !           126:                        strncpy(octet, str, 9);
        !           127:                        octet[9] = 0;
        !           128:                        str += strlen(octet);
        !           129:                }
        !           130:                res = strtol(octet, NULL, 10);
        !           131:                if ((res > 255) || (res < 0))
        !           132:                        return 0;
        !           133:                ip[i] = (char) res;
        !           134:                i++;
        !           135:                if (*str == '.')
        !           136:                        str++;
        !           137:        }
        !           138: 
        !           139:        if (i != 4)
        !           140:                return 0;
        !           141:        return -1;
        !           142: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.