else
buf[s] = c;
}
+
buf[s] = '\0';
if (len)
dirnamelen = strlen(dirname);
if (dirnamelen + 2 >= PATH_MAX)
return 0;
+
memcpy(buf, dirname, dirnamelen);
buf[dirnamelen] = '/';
dirnamelen++;
{
if (entry == NULL)
return NULL;
+
return kmod_module_ref(entry->data);
}
if (mod == NULL)
return NULL;
+
snprintf(dname, sizeof(dname), "/sys/module/%s/sections", mod->name);
d = opendir(dname);
err = read_str_ulong(fd, &address, 16);
close(fd);
-
if (err < 0) {
ERR(mod->ctx, "could not read long from '%s/%s': %m\n",
dname, de.d_name);
KMOD_EXPORT const char *kmod_module_section_get_name(const struct kmod_list *entry)
{
struct kmod_module_section *section;
+
if (entry == NULL)
return NULL;
+
section = entry->data;
return section->name;
}
KMOD_EXPORT unsigned long kmod_module_section_get_address(const struct kmod_list *entry)
{
struct kmod_module_section *section;
+
if (entry == NULL)
return (unsigned long)-1;
+
section = entry->data;
return section->address;
}
const struct kmod_list *l, *ctx_options;
char *opts = NULL;
size_t optslen = 0;
+
ctx_options = kmod_get_options(mod->ctx);
+
kmod_list_foreach(l, ctx_options) {
const char *modname = kmod_option_get_modname(l);
const char *str;
free(opts);
goto failed;
}
+
opts = tmp;
+
if (optslen > 0) {
opts[optslen] = ' ';
optslen++;
}
+
memcpy(opts + optslen, str, len);
optslen += len;
opts[optslen] = '\0';
}
+
m->init.options = true;
m->options = opts;
}
const struct kmod_list *l, *ctx_install_commands;
char *cmds = NULL;
size_t cmdslen = 0;
+
ctx_install_commands = kmod_get_install_commands(mod->ctx);
+
kmod_list_foreach(l, ctx_install_commands) {
const char *modname = kmod_command_get_modname(l);
const char *str;
free(cmds);
goto failed;
}
+
cmds = tmp;
+
if (cmdslen > 0) {
cmds[cmdslen] = ';';
cmdslen++;
}
+
memcpy(cmds + cmdslen, str, len);
cmdslen += len;
cmds[cmdslen] = '\0';
}
+
m->init.install_commands = true;
m->install_commands = cmds;
}
const struct kmod_list *l, *ctx_remove_commands;
char *cmds = NULL;
size_t cmdslen = 0;
+
ctx_remove_commands = kmod_get_remove_commands(mod->ctx);
+
kmod_list_foreach(l, ctx_remove_commands) {
const char *modname = kmod_command_get_modname(l);
const char *str;
free(cmds);
goto failed;
}
+
cmds = tmp;
+
if (cmdslen > 0) {
cmds[cmdslen] = ';';
cmdslen++;
}
+
memcpy(cmds + cmdslen, str, len);
cmdslen += len;
cmds[cmdslen] = '\0';
}
+
m->init.remove_commands = true;
m->remove_commands = cmds;
}
int size = 256;
int i = 0;
char *buf = malloc(size);
+
for(;;) {
int ch = getc_unlocked(fp);
ssize_t read_str_safe(int fd, char *buf, size_t buflen) {
size_t todo = buflen;
size_t done;
+
do {
ssize_t r = read(fd, buf, todo);
+
if (r == 0)
break;
else if (r > 0)
return -errno;
}
} while (todo > 0);
+
done = buflen - todo;
+
if (done == 0)
buf[0] = '\0';
else {
else if (buf[done - 1] != '\0')
return -ENOSPC;
}
+
return done;
}
char buf[32], *end;
long v;
int err;
+
*value = 0;
err = read_str_safe(fd, buf, sizeof(buf));
if (err < 0)
v = strtol(buf, &end, base);
if (end == buf || !isspace(*end))
return -EINVAL;
+
*value = v;
return 0;
}
char buf[32], *end;
long v;
int err;
+
*value = 0;
err = read_str_safe(fd, buf, sizeof(buf));
if (err < 0)
char *strchr_replace(char *s, int c, char r)
{
char *p;
+
for (p = s; *p != '\0'; p++)
if (*p == c)
*p = r;
+
return s;
}