summaryrefslogtreecommitdiff
path: root/genkey.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-11-17 20:32:26 -0500
committerJakob Kaivo <jkk@ung.org>2020-11-17 20:32:26 -0500
commit78d6a052fc6431ad45ff3a24461fd7744a3c1c28 (patch)
tree421b9ba21dad14eee3094de81618734e58009bd4 /genkey.c
parentdbd1640b9f41dd0699e5ac09df6f0b1f2a607bdb (diff)
enforce device type of mmcblk, fail if /sys/block/<device>/device is not a readable directory
Diffstat (limited to 'genkey.c')
-rw-r--r--genkey.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/genkey.c b/genkey.c
index 8bb224a..fd17060 100644
--- a/genkey.c
+++ b/genkey.c
@@ -1,8 +1,12 @@
+#define _XOPEN_SOURCE 700
#include <ctype.h>
+#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <unistd.h>
+
#include "deonebook.h"
#define SCR_SIZE 8
@@ -34,27 +38,25 @@ static unsigned char twiddle(unsigned char buf[2])
return c;
}
-static bool get_sd_register(const char *dev, const char *reg, size_t n, unsigned char buf[n])
+static bool get_sd_register(int dirfd, const char *reg, size_t n, unsigned char buf[n])
{
- char path[256];
- snprintf(path, sizeof(path), "/sys/block/%s/device/%s", dev, reg);
-
- FILE *f = fopen(path, "r");
- if (f == NULL) {
+ int fd = openat(dirfd, reg, O_RDONLY);
+ if (fd == -1) {
return false;
}
for (size_t i = 0; i < n; i++) {
unsigned char hex[2];
- fread(hex, 2, 1, f);
+ read(fd, hex, sizeof(hex));
buf[i] = twiddle(hex);
}
- fclose(f);
+ close(fd);
+
return true;
}
-unsigned char * genkey(const char *dev)
+unsigned char * genkey(int dirfd)
{
static unsigned char key[KEY_SIZE];
const unsigned char keycode[] = "eone";
@@ -65,15 +67,15 @@ unsigned char * genkey(const char *dev)
unsigned char csd[CSD_SIZE] = "testtesttesttest";
unsigned char cid[CID_SIZE] = "testtesttesttest";
- if (!get_sd_register(dev, "cid", sizeof(cid), cid)) {
+ if (!get_sd_register(dirfd, "cid", sizeof(cid), cid)) {
fprintf(stderr, "warning: CID register not read\n");
allread = false;
}
- if (!get_sd_register(dev, "csd", sizeof(csd), csd)) {
+ if (!get_sd_register(dirfd, "csd", sizeof(csd), csd)) {
fprintf(stderr, "warning: CSD register not read\n");
allread = false;
}
- if (!get_sd_register(dev, "scr", sizeof(scr), scr)) {
+ if (!get_sd_register(dirfd, "scr", sizeof(scr), scr)) {
fprintf(stderr, "warning: SCR register not read\n");
allread = false;
}