bool process_command_line()

in common/recipes-core/asd_1.4.7/files/daemon/asd_main.c [86:290]


bool process_command_line(int argc, char** argv, asd_args* args)
{
    int c = 0;
    opterr = 0;              // prevent getopt_long from printing shell messages
    uint8_t bus_counter = 0; // Up to 4 buses

    // Set Default argument values.

    args->busopt.enable_i2c = DEFAULT_I2C_ENABLE;
    args->busopt.enable_i3c = DEFAULT_I3C_ENABLE;
    args->busopt.bus = DEFAULT_I2C_BUS;
    args->use_syslog = DEFAULT_LOG_TO_SYSLOG;
    args->log_level = DEFAULT_LOG_LEVEL;
    args->log_streams = DEFAULT_LOG_STREAMS;
    args->session.n_port_number = DEFAULT_PORT;
    args->session.cp_certkeyfile = DEFAULT_CERT_FILE;
    args->session.cp_net_bind_device = NULL;
    args->session.e_extnet_type = EXTNET_HDLR_NON_ENCRYPT;
    args->session.e_auth_type = AUTH_HDLR_NONE;
    args->xdp_fail_enable = DEFAULT_XDP_FAIL_ENABLE;
    args->force_jtag_hw = DEFAULT_FORCE_JTAG_HW;
    args->msg_flow = DEFAULT_JTAG_FLOW;
    args->fru = DEFAULT_FRU;

    enum
    {
        ARG_LOG_LEVEL = 256,
        ARG_LOG_STREAMS,
        ARG_HELP,
        ARG_XDP
    };

    struct option opts[] = {
        {"xdp-ignore", 0, NULL, ARG_XDP},
        {"log-level", 1, NULL, ARG_LOG_LEVEL},
        {"log-streams", 1, NULL, ARG_LOG_STREAMS},
        {"help", 0, NULL, ARG_HELP},
        {NULL, 0, NULL, 0},
    };

    while ((c = getopt_long(argc, argv, "p:uk:n:si:c:f:j:m", opts, NULL)) != -1)
    {
        switch (c)
        {
            case 'f':
            {
                uint8_t fru = (uint8_t)strtol(optarg, NULL, 10);
                args->fru = fru;
                break;
            }
            case 'j':
            {
                args->msg_flow = (uint8_t)strtol(optarg, NULL, 10);
                break;
            }
            case 'm':
            {
                args->force_jtag_hw = true;
                break;
            }
            case 'p':
            {
                uint16_t port = (uint16_t)strtol(optarg, NULL, 10);
                fprintf(stderr, "Setting Port: %d\n", port);
                args->session.n_port_number = port;
                break;
            }
            case 's':
            {
                args->use_syslog = true;
                break;
            }
            case 'u':
            {
                args->session.e_extnet_type = EXTNET_HDLR_NON_ENCRYPT;
                args->session.e_auth_type = AUTH_HDLR_NONE;
                break;
            }
            case 'k':
            {
                args->session.cp_certkeyfile = optarg;
                break;
            }
            case 'n':
            {
                args->session.cp_net_bind_device = optarg;
                break;
            }
            case 'i':
            {
                char* pch;
                uint8_t bus;
                bool first_i2c = true;
                char* endptr;
                args->busopt.enable_i2c = true;
                pch = strtok(optarg, ",");
                while (pch != NULL)
                {
                    errno = 0;
                    bus = (uint8_t)strtol(pch, &endptr, 10);
                    if ((errno == ERANGE) || (endptr == pch))
                    {
                        fprintf(stderr, "Wrong I2C bus list arguments(-i)\n");
                        break;
                    }
                    if (bus_counter >= MAX_IxC_BUSES)
                    {
                        fprintf(stderr, "Discard I2C bus: %d\n", bus);
                    }
                    else
                    {
                        if (first_i2c)
                        {
                            args->busopt.bus = bus;
                            first_i2c = false;
                        }
                        fprintf(stderr, "Enabling I2C bus: %d\n", bus);
                        args->busopt.bus_config_type[bus_counter] =
                            BUS_CONFIG_I2C;
                        args->busopt.bus_config_map[bus_counter] = bus;
                    }
                    pch = strtok(NULL, ",");
                    bus_counter++;
                }
                break;
            }
            case 'c':
            {
                char* pch;
                uint8_t bus;
                bool first_i3c = true;
                char* endptr;
                args->busopt.enable_i3c = true;
                pch = strtok(optarg, ",");
                while (pch != NULL)
                {
                    errno = 0;
                    bus = (uint8_t)strtol(pch, &endptr, 10);
                    if ((errno == ERANGE) || (endptr == pch))
                    {
                        fprintf(stderr, "Wrong I3C bus list arguments(-c)\n");
                        break;
                    }
                    if (bus_counter >= MAX_IxC_BUSES)
                    {
                        fprintf(stderr, "Discard I3C bus: %d\n", bus);
                    }
                    else
                    {
                        if (first_i3c)
                        {
                            args->busopt.bus = bus;
                            first_i3c = false;
                        }
                        fprintf(stderr, "Enabling I3C bus: %d\n", bus);
                        args->busopt.bus_config_type[bus_counter] =
                            BUS_CONFIG_I3C;
                        args->busopt.bus_config_map[bus_counter] = bus;
                    }
                    pch = strtok(NULL, ",");
                    bus_counter++;
                }
                break;
            }
            case ARG_XDP:
            {
                args->xdp_fail_enable = false;
                fprintf(stderr, "Ignore XDP presence\n");
                break;
            }
            case ARG_LOG_LEVEL:
            {
                if (!strtolevel(optarg, &args->log_level))
                {
                    showUsage(argv);
                    return false;
                }
                break;
            }
            case ARG_LOG_STREAMS:
            {
                if (!strtostreams(optarg, &args->log_streams))
                {
                    showUsage(argv);
                    return false;
                }
                break;
            }
            case ARG_HELP:
            default:
            {
                showUsage(argv);
                return false;
            }
        }
    }

    fprintf(stderr, "ASD ver: %s\n", asd_version);
    fprintf(stderr, "Setting Port: %d, FRU: %d\n", args->session.n_port_number, args->fru);
    fprintf(stderr, "Msg Flow: %d\n", args->msg_flow);
    fprintf(stderr, "Log level: %s\n", ASD_LogLevelString[args->log_level]);
    if (args->force_jtag_hw)
        fprintf(stderr, "Force JTAG driver in HW mode\n");
    return true;
}