/* * ipl_tools - Linux for System z reipl and shutdown tools * * Shared system functions * * Copyright IBM Corp. 2008, 2017 * * s390-tools is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include "lib/util_libc.h" #include "ipl_tools.h" /* * Check if we are running in an LPAR environment */ int is_lpar(void) { size_t bytes_read; char buf[2048]; int rc = 0; FILE *fh; fh = fopen("/proc/cpuinfo", "r"); if (fh == NULL) ERR_EXIT_ERRNO("Could not open \"/proc/cpuinfo\""); bytes_read = fread(buf, 1, sizeof(buf), fh); if (bytes_read == 0) ERR_EXIT("Could not read \"/proc/cpuinfo\""); buf[bytes_read] = '\0'; if (strstr(buf, "version = FF") == NULL) rc = 1; fclose(fh); return rc; } /* * Check whether we are started as root */ int is_root(void) { if (geteuid() == 0) return 1; else return 0; } /* * Convert a string to lower case */ void strlow(char *s) { while (*s) { *s = tolower(*s); s++; } } /* * Read a string from a particular file */ void read_str(char *string, const char *path, size_t len) { size_t rc; FILE *fh; fh = fopen(path, "rb"); if (fh == NULL) ERR_EXIT_ERRNO("Could not open \"%s\"", path); rc = fread(string, 1, len - 1, fh); if (rc == 0 && ferror(fh)) ERR_EXIT_ERRNO("Could not read \"%s\"", path); fclose(fh); string[rc] = 0; if (string[strlen(string) - 1] == '\n') string[strlen(string) - 1] = 0; } /* * Read a string from a particular /sys/firmware file */ void read_fw_str(char *string, const char *file, size_t len) { char *path; util_asprintf(&path, "/sys/firmware/%s", file); read_str(string, path, len); free(path); } /* * Print content of a file (path = dir/file) */ void print_fw_str(const char *fmt, const char *dir, const char *file) { char path[PATH_MAX], str[4096]; snprintf(path, sizeof(path), "%s/%s", dir, file); read_fw_str(str, path, sizeof(str)); printf(fmt, str); } /* * Write a string to a file */ void write_str(char *string, char *file) { char path[PATH_MAX], value[4096]; int fh; snprintf(value, sizeof(value), "%s\n", string); snprintf(path, sizeof(path), "/sys/firmware/%s", file); fh = open(path, O_WRONLY); if (fh < 0) ERR_EXIT_ERRNO("Could not open \"%s\"", file); if (write(fh, value, strlen(value)) < 0) ERR_EXIT_ERRNO("Could not set \"%s\"", file); close(fh); } /* * Write a string to a file and return ERRNO */ int write_str_errno(char *string, char *file) { char path[PATH_MAX], value[4096]; int fh; snprintf(value, sizeof(value), "%s\n", string); snprintf(path, sizeof(path), "/sys/firmware/%s", file); fh = open(path, O_WRONLY); if (fh < 0) return errno; if (write(fh, value, strlen(value)) < 0) return errno; close(fh); return 0; }