2025-01-17 18:27:46 +03:00

72 lines
1.7 KiB
C

// SPDX-License-Identifier: MIT
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/stat.h>
#define OQS_STORE_DIR "tmp"
#define OQS_STORE_PREFIX "/oqs-temp-file-"
#define MAXPATHLEN 128
#if (defined(_WIN32) || defined(__WIN32__))
#include <windows.h>
#endif
static OQS_STATUS oqs_fstore_init(void) {
#ifndef _WIN32
return mkdir(OQS_STORE_DIR, 0755);
#else
if (CreateDirectory(OQS_STORE_DIR, NULL)) {
return OQS_SUCCESS;
} else {
return OQS_ERROR;
}
#endif
}
static OQS_STATUS oqs_fstore(const char *fname, const char *mname, uint8_t *data, size_t len) {
char fpath[MAXPATHLEN];
strcpy(fpath, OQS_STORE_DIR);
strcat(fpath, OQS_STORE_PREFIX);
strcat(fpath, mname);
strcat(fpath, fname);
FILE *fp = fopen(fpath, "wb");
if (!fp) {
fprintf(stderr, "Couldn't open %s for writing.\n", fpath);
return OQS_ERROR;
}
fwrite(data, len, 1, fp);
fclose(fp);
return OQS_SUCCESS;
}
static OQS_STATUS oqs_fload(const char *fname, const char *mname, uint8_t *data, size_t len, size_t *rcvd) {
size_t len_read = 0, r = 0;
uint8_t *dr = NULL;
char fpath[MAXPATHLEN];
strcpy(fpath, OQS_STORE_DIR);
strcat(fpath, OQS_STORE_PREFIX);
strcat(fpath, mname);
strcat(fpath, fname);
FILE *fp = fopen(fpath, "rb");
if (!fp) {
fprintf(stderr, "Couldn't open %s for reading.\n", fpath);
return OQS_ERROR;
}
do { // assume some OSs don't deliver all data in one go...
dr = (uint8_t *)(data + len_read);
r = fread(dr, 1, len - len_read, fp);
len_read += r;
} while (r > 0);
*rcvd = len_read;
if (len_read <= 0) {
fprintf(stderr, "Error reading data (operations called in proper sequence?). Expecting %zu. Exiting.\n", len);
return OQS_ERROR;
}
fclose(fp);
return OQS_SUCCESS;
}