add function write_file() (#2181)

* add function write_file()

* handle EAGIN & EWOULDBLOCK

* don't  handle errno
albatross
Dean Lee 2020-09-21 22:10:38 +08:00 committed by GitHub
parent 861ef4a397
commit 6476207009
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 61 deletions

View File

@ -1,3 +1,4 @@
#include "util.h"
#include <cstdio>
#include <cstdlib>
#include <cassert>
@ -37,13 +38,9 @@ extern "C" void framebuffer_swap(FramebufferState *s) {
}
extern "C" bool set_brightness(int brightness) {
FILE *f = fopen("/sys/class/leds/lcd-backlight/brightness", "wb");
if (f != NULL) {
fprintf(f, "%d", brightness);
fclose(f);
return true;
}
return false;
char bright[64];
snprintf(bright, sizeof(bright), "%d", brightness);
return 0 == write_file("/sys/class/leds/lcd-backlight/brightness", bright, strlen(bright));
}
extern "C" void framebuffer_set_power(FramebufferState *s, int mode) {

View File

@ -1,75 +1,29 @@
#include "gpio.h"
#include "util.h"
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
// We assume that all pins have already been exported on boot,
// and that we have permission to write to them.
int gpio_init(int pin_nr, bool output){
int ret = 0;
int fd = -1, tmp;
char pin_dir_path[50];
int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path),
"/sys/class/gpio/gpio%d/direction", pin_nr);
if(pin_dir_path_len <= 0){
ret = -1;
goto cleanup;
return -1;
}
fd = open(pin_dir_path, O_WRONLY);
if(fd == -1){
ret = -1;
goto cleanup;
}
if(output){
tmp = write(fd, "out", 3);
if(tmp != 3){
ret = -1;
goto cleanup;
}
} else {
tmp = write(fd, "in", 2);
if(tmp != 2){
ret = -1;
goto cleanup;
}
}
cleanup:
if(fd >= 0){
close(fd);
}
return ret;
const char *value = output ? "out" : "in";
return write_file(pin_dir_path, (void*)value, strlen(value));
}
int gpio_set(int pin_nr, bool high){
int ret = 0;
int fd = -1, tmp;
char pin_val_path[50];
int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path),
"/sys/class/gpio/gpio%d/value", pin_nr);
if(pin_val_path_len <= 0){
ret = -1;
goto cleanup;
return -1;
}
fd = open(pin_val_path, O_WRONLY);
if(fd == -1){
ret = -1;
goto cleanup;
}
tmp = write(fd, high ? "1" : "0", 1);
if(tmp != 1){
ret = -1;
goto cleanup;
}
cleanup:
if(fd >= 0){
close(fd);
}
return ret;
return write_file(pin_val_path, (void*)(high ? "1" : "0"), 1);
}

View File

@ -3,7 +3,8 @@
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#ifdef __linux__
#include <sys/prctl.h>
#include <sys/syscall.h>
@ -41,6 +42,16 @@ void* read_file(const char* path, size_t* out_len) {
return buf;
}
int write_file(const char* path, const void* data, size_t size) {
int fd = open(path, O_WRONLY);
if (fd == -1) {
return -1;
}
ssize_t n = write(fd, data, size);
close(fd);
return n == size ? 0 : -1;
}
void set_thread_name(const char* name) {
#ifdef __linux__
// pthread_setname_np is dumb (fails instead of truncates)

View File

@ -41,6 +41,7 @@ extern "C" {
// Returns NULL on failure, otherwise the NULL-terminated file contents.
// The result must be freed by the caller.
void* read_file(const char* path, size_t* out_len);
int write_file(const char* path, const void* data, size_t size);
void set_thread_name(const char* name);