Annotation of qemu/roms/ipxe/src/hci/linux_args.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (C) 2010 Piotr JaroszyƄski <[email protected]>
                      3:  *
                      4:  * This program is free software; you can redistribute it and/or
                      5:  * modify it under the terms of the GNU General Public License as
                      6:  * published by the Free Software Foundation; either version 2 of the
                      7:  * License, or any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful, but
                     10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     12:  * General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with this program; if not, write to the Free Software
                     16:  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
                     17:  */
                     18: 
                     19: FILE_LICENCE(GPL2_OR_LATER);
                     20: 
                     21: #include <hci/linux_args.h>
                     22: #include <getopt.h>
                     23: #include <string.h>
                     24: #include <stdio.h>
                     25: #include <ipxe/settings.h>
                     26: #include <ipxe/linux.h>
                     27: #include <ipxe/malloc.h>
                     28: #include <ipxe/init.h>
                     29: 
                     30: /** Saved argc */
                     31: static int saved_argc = 0;
                     32: /** Saved argv */
                     33: static char ** saved_argv;
                     34: 
                     35: /**
                     36:  * Save argc and argv for later access.
                     37:  *
                     38:  * To be called by linuxprefix
                     39:  */
                     40: __asmcall void save_args(int argc, char **argv)
                     41: {
                     42:        saved_argc = argc;
                     43:        saved_argv = argv;
                     44: }
                     45: 
                     46: /** Supported command-line options */
                     47: static struct option options[] = {
                     48:        {"net", 1, 0, 'n'},
                     49:        {"settings", 1, 0, 's'},
                     50:        {0, 0, 0, 0}
                     51: };
                     52: 
                     53: /**
                     54:  * Parse k1=v1[,k2=v2]* into linux_settings
                     55:  */
                     56: static int parse_kv(char *kv, struct list_head *list)
                     57: {
                     58:        char *token;
                     59:        char *name;
                     60:        char *value;
                     61:        struct linux_setting *setting;
                     62: 
                     63:        while ((token = strsep(&kv, ",")) != NULL) {
                     64:                name = strsep(&token, "=");
                     65:                if (name == NULL)
                     66:                        continue;
                     67:                value = token;
                     68:                if (value == NULL) {
                     69:                        DBG("Bad parameter: '%s'\n", name);
                     70:                        continue;
                     71:                }
                     72: 
                     73:                setting = malloc(sizeof(*setting));
                     74: 
                     75:                if (! setting)
                     76:                        return -1;
                     77: 
                     78:                setting->name = name;
                     79:                setting->value = value;
                     80:                setting->applied = 0;
                     81:                list_add(&setting->list, list);
                     82:        }
                     83: 
                     84:        return 0;
                     85: }
                     86: 
                     87: /**
                     88:  * Parse --net arguments
                     89:  *
                     90:  * Format is --net driver_name[,name=value]*
                     91:  */
                     92: static int parse_net_args(char *args)
                     93: {
                     94:        char *driver;
                     95:        struct linux_device_request *dev_request;
                     96:        int rc;
                     97: 
                     98:        driver = strsep(&args, ",");
                     99: 
                    100:        if (strlen(driver) == 0) {
                    101:                printf("Missing driver name");
                    102:                return -1;
                    103:        }
                    104: 
                    105:        dev_request = malloc(sizeof(*dev_request));
                    106: 
                    107:        dev_request->driver = driver;
                    108:        INIT_LIST_HEAD(&dev_request->settings);
                    109:        list_add_tail(&dev_request->list, &linux_device_requests);
                    110: 
                    111:        /* Parse rest of the settings */
                    112:        rc = parse_kv(args, &dev_request->settings);
                    113: 
                    114:        if (rc)
                    115:                printf("Parsing net settings failed");
                    116: 
                    117:        return rc;
                    118: }
                    119: 
                    120: /**
                    121:  * Parse --settings arguments
                    122:  *
                    123:  * Format is --settings name=value[,name=value]*
                    124:  */
                    125: static int parse_settings_args(char *args)
                    126: {
                    127:        return parse_kv(args, &linux_global_settings);
                    128: }
                    129: 
                    130: 
                    131: /** Parse passed command-line arguments */
                    132: void linux_args_parse()
                    133: {
                    134:        int c;
                    135:        int rc;
                    136: 
                    137:        reset_getopt();
                    138:        while (1) {
                    139:                int option_index = 0;
                    140: 
                    141:                c = getopt_long(saved_argc, saved_argv, "", options, &option_index);
                    142:                if (c == -1)
                    143:                        break;
                    144: 
                    145:                switch (c) {
                    146:                case 'n':
                    147:                        if ((rc = parse_net_args(optarg)) != 0)
                    148:                                return;
                    149:                        break;
                    150:                case 's':
                    151:                        if ((rc = parse_settings_args(optarg)) != 0)
                    152:                                return;
                    153:                        break;
                    154:                default:
                    155:                        return;
                    156:                }
                    157:        }
                    158: 
                    159:        return;
                    160: }
                    161: 
                    162: /** Clean up requests and settings */
                    163: void linux_args_cleanup(int flags __unused)
                    164: {
                    165:        struct linux_device_request *request;
                    166:        struct linux_device_request *rtmp;
                    167:        struct linux_setting *setting;
                    168:        struct linux_setting *stmp;
                    169: 
                    170:        /* Clean up requests and their settings */
                    171:        list_for_each_entry_safe(request, rtmp, &linux_device_requests, list) {
                    172:                list_for_each_entry_safe(setting, stmp, &request->settings, list) {
                    173:                        list_del(&setting->list);
                    174:                        free(setting);
                    175:                }
                    176:                list_del(&request->list);
                    177:                free(request);
                    178:        }
                    179: 
                    180:        /* Clean up global settings */
                    181:        list_for_each_entry_safe(setting, stmp, &linux_global_settings, list) {
                    182:                list_del(&setting->list);
                    183:                free(setting);
                    184:        }
                    185: }
                    186: 
                    187: struct startup_fn startup_linux_args __startup_fn(STARTUP_EARLY) = {
                    188:        .startup = linux_args_parse,
                    189:        .shutdown = linux_args_cleanup,
                    190: };

unix.superglobalmegacorp.com

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