cregit-Linux how code gets into the kernel

Release 4.7 lib/argv_split.c

Directory: lib
 * Helper function for splitting a string into an argv-like array.

#include <linux/kernel.h>
#include <linux/ctype.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/export.h>

static int count_argc(const char *str) { int count = 0; bool was_space; for (was_space = true; *str; str++) { if (isspace(*str)) { was_space = true; } else if (was_space) { was_space = false; count++; } } return count; }


jeremy fitzhardingejeremy fitzhardinge3554.69%150.00%
oleg nesterovoleg nesterov2945.31%150.00%

/** * argv_free - free an argv * @argv - the argument vector to be freed * * Frees an argv and the strings it points to. */
void argv_free(char **argv) { argv--; kfree(argv[0]); kfree(argv); }


jeremy fitzhardingejeremy fitzhardinge2076.92%150.00%
oleg nesterovoleg nesterov623.08%150.00%

EXPORT_SYMBOL(argv_free); /** * argv_split - split a string at whitespace, returning an argv * @gfp: the GFP mask used to allocate memory * @str: the string to be split * @argcp: returned argument count * * Returns an array of pointers to strings which are split out from * @str. This is performed by strictly splitting on white-space; no * quote processing is performed. Multiple whitespace characters are * considered to be a single argument separator. The returned array * is always NULL-terminated. Returns NULL on memory allocation * failure. * * The source string at `str' may be undergoing concurrent alteration via * userspace sysctl activity (at least). The argv_split() implementation * attempts to handle this gracefully by taking a local copy to work on. */
char **argv_split(gfp_t gfp, const char *str, int *argcp) { char *argv_str; bool was_space; char **argv, **argv_ret; int argc; argv_str = kstrndup(str, KMALLOC_MAX_SIZE - 1, gfp); if (!argv_str) return NULL; argc = count_argc(argv_str); argv = kmalloc(sizeof(*argv) * (argc + 2), gfp); if (!argv) { kfree(argv_str); return NULL; } *argv = argv_str; argv_ret = ++argv; for (was_space = true; *argv_str; argv_str++) { if (isspace(*argv_str)) { was_space = true; *argv_str = 0; } else if (was_space) { was_space = false; *argv++ = argv_str; } } *argv = NULL; if (argcp) *argcp = argc; return argv_ret; }


oleg nesterovoleg nesterov10157.06%133.33%
jeremy fitzhardingejeremy fitzhardinge7542.37%133.33%
neil hormanneil horman10.56%133.33%


Overall Contributors

jeremy fitzhardingejeremy fitzhardinge15050.85%116.67%
oleg nesterovoleg nesterov13746.44%116.67%
andre goddard rosaandre goddard rosa31.02%116.67%
robert p. j. dayrobert p. j. day31.02%116.67%
neil hormanneil horman10.34%116.67%
paul gortmakerpaul gortmaker10.34%116.67%
Directory: lib
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}