1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2011-2013 ProFUSION embedded systems
*/
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "kmod.h"
int options_from_array(char **args, int nargs, char **output)
{
char *opts = NULL;
size_t optslen = 0;
int i, err = 0;
for (i = 0; i < nargs; i++) {
size_t len = strlen(args[i]);
size_t qlen = 0;
const char *value;
void *tmp;
value = strchr(args[i], '=');
if (value) {
value++;
if (*value != '"' && *value != '\'') {
if (strchr(value, ' '))
qlen = 2;
}
}
tmp = realloc(opts, optslen + len + qlen + 2);
if (!tmp) {
err = -errno;
free(opts);
opts = NULL;
ERR("could not gather module options: out-of-memory\n");
break;
}
opts = tmp;
if (optslen > 0) {
opts[optslen] = ' ';
optslen++;
}
if (qlen == 0) {
memcpy(opts + optslen, args[i], len + 1);
optslen += len;
} else {
size_t keylen = value - args[i];
size_t valuelen = len - keylen;
memcpy(opts + optslen, args[i], keylen);
optslen += keylen;
opts[optslen] = '"';
optslen++;
memcpy(opts + optslen, value, valuelen);
optslen += valuelen;
opts[optslen] = '"';
optslen++;
opts[optslen] = '\0';
}
}
*output = opts;
return err;
}
|