at v5.8-rc2 91 lines 1.7 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Intel MIC Platform Software Stack (MPSS) 4 * 5 * Copyright(c) 2013 Intel Corporation. 6 * 7 * Intel MIC User Space Tools. 8 */ 9 10#include "mpssd.h" 11 12#define PAGE_SIZE 4096 13 14char * 15readsysfs(char *dir, char *entry) 16{ 17 char filename[PATH_MAX]; 18 char value[PAGE_SIZE]; 19 char *string = NULL; 20 int fd; 21 int len; 22 23 if (dir == NULL) 24 snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry); 25 else 26 snprintf(filename, PATH_MAX, 27 "%s/%s/%s", MICSYSFSDIR, dir, entry); 28 29 fd = open(filename, O_RDONLY); 30 if (fd < 0) { 31 mpsslog("Failed to open sysfs entry '%s': %s\n", 32 filename, strerror(errno)); 33 return NULL; 34 } 35 36 len = read(fd, value, sizeof(value)); 37 if (len < 0) { 38 mpsslog("Failed to read sysfs entry '%s': %s\n", 39 filename, strerror(errno)); 40 goto readsys_ret; 41 } 42 if (len == 0) 43 goto readsys_ret; 44 45 value[len - 1] = '\0'; 46 47 string = malloc(strlen(value) + 1); 48 if (string) 49 strcpy(string, value); 50 51readsys_ret: 52 close(fd); 53 return string; 54} 55 56int 57setsysfs(char *dir, char *entry, char *value) 58{ 59 char filename[PATH_MAX]; 60 char *oldvalue; 61 int fd, ret = 0; 62 63 if (dir == NULL) 64 snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry); 65 else 66 snprintf(filename, PATH_MAX, "%s/%s/%s", 67 MICSYSFSDIR, dir, entry); 68 69 oldvalue = readsysfs(dir, entry); 70 71 fd = open(filename, O_RDWR); 72 if (fd < 0) { 73 ret = errno; 74 mpsslog("Failed to open sysfs entry '%s': %s\n", 75 filename, strerror(errno)); 76 goto done; 77 } 78 79 if (!oldvalue || strcmp(value, oldvalue)) { 80 if (write(fd, value, strlen(value)) < 0) { 81 ret = errno; 82 mpsslog("Failed to write new sysfs entry '%s': %s\n", 83 filename, strerror(errno)); 84 } 85 } 86 close(fd); 87done: 88 if (oldvalue) 89 free(oldvalue); 90 return ret; 91}