/* * Iterate over the list of kernel modules from the manifest file; generate * and store module information records for each module in the Package. */ static int parse_kernel_modules_list(Package *p, char *list) { char *name; p->num_kernel_modules = 0; /* in case this gets called more than once */ for (name = strtok(list, " "); name; name = strtok(NULL, " ")) { KernelModuleInfo *module; p->kernel_modules = nvrealloc(p->kernel_modules, (p->num_kernel_modules + 1) * sizeof(p->kernel_modules[0])); module = p->kernel_modules + p->num_kernel_modules; memset(module, 0, sizeof(*module)); module->module_name = nvstrdup(name); module->module_filename = nvstrcat(name, ".ko", NULL); module->has_separate_interface_file = has_separate_interface_file(name); if (module->has_separate_interface_file) { char *core_binary = nvidia_to_nv(name, "-kernel.o_binary"); module->interface_filename = nvidia_to_nv(name, "-linux.o"); module->core_object_name = nvstrcat(name, "/", core_binary, NULL); nvfree(core_binary); } populate_optional_module_info(module); p->num_kernel_modules++; } return p->num_kernel_modules; }
void add_package_entry(Package *p, char *file, char *path, char *name, char *target, char *dst, PackageEntryFileType type, PackageEntryFileTlsClass tls_class, PackageEntryFileCompatArch compat_arch, mode_t mode) { int n; struct stat stat_buf; n = p->num_entries; p->entries = (PackageEntry *) nvrealloc(p->entries, (n + 1) * sizeof(PackageEntry)); memset(&p->entries[n], 0, sizeof(PackageEntry)); p->entries[n].file = file; p->entries[n].path = path; p->entries[n].name = name; p->entries[n].target = target; p->entries[n].dst = dst; p->entries[n].type = type; p->entries[n].tls_class = tls_class; p->entries[n].mode = mode; p->entries[n].caps = get_file_type_capabilities(type); p->entries[n].compat_arch = compat_arch; if (stat(p->entries[n].file, &stat_buf) != -1) { p->entries[n].inode = stat_buf.st_ino; p->entries[n].device = stat_buf.st_dev; } else { p->entries[n].inode = 0; p->entries[n].device = 0; } p->num_entries++; } /* add_package_entry() */
static ParsedAttributeWrapper *parse_config_file(char *buf, const char *file, const int length, ConfigProperties *conf) { int line, has_data, current_tmp_len, len, n, ret; char *cur, *c, *comment, *tmp; ParsedAttributeWrapper *w; cur = buf; line = 1; current_tmp_len = 0; n = 0; w = NULL; tmp = NULL; while (cur) { c = cur; comment = NULL; has_data = NV_FALSE;; while (((c - buf) < length) && (*c != '\n') && (*c != '\0')) { if (comment) { c++; continue; } if (*c == '#') { comment = c; continue; } if (!isspace(*c)) has_data = NV_TRUE; c++; } if (has_data) { if (!comment) comment = c; len = comment - cur; /* grow the tmp buffer if it's too small */ if (len >= current_tmp_len) { current_tmp_len = len + 1; if (tmp) { free(tmp); } tmp = nvalloc(sizeof(char) * current_tmp_len); } strncpy (tmp, cur, len); tmp[len] = '\0'; /* first, see if this line is a config property */ if (!parse_config_property(file, tmp, conf)) { w = nvrealloc(w, sizeof(ParsedAttributeWrapper) * (n+1)); ret = nv_parse_attribute_string(tmp, NV_PARSER_ASSIGNMENT, &w[n].a); if (ret != NV_PARSER_STATUS_SUCCESS) { nv_error_msg("Error parsing configuration file '%s' on " "line %d: '%s' (%s).", file, line, tmp, nv_parse_strerror(ret)); goto failed; } w[n].line = line; n++; } } if (((c - buf) >= length) || (*c == '\0')) cur = NULL; else cur = c + 1; line++; } free(tmp); /* mark the end of the array */ w = nvrealloc(w, sizeof(ParsedAttributeWrapper) * (n+1)); w[n].line = -1; return w; failed: if (w) free(w); free(tmp); return NULL; } /* parse_config_file() */