1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/examples/filesystem/main.c
Benjamin Valentin e657590ce0 examples/filesystem: drop manual mounts
File systems should be mounted via `vfs_default`, not manually by
the application.

Also, `vfs` gained the `format` sub-command, so no need to provide
it in the example application.
2022-08-21 22:55:30 +02:00

149 lines
3.5 KiB
C

/*
* Copyright (C) 2018 OTA keys S.A.
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup examples
* @{
*
* @file
* @brief File system usage example application
*
* @author Vincent Dupont <vincent@otakeys.com>
*
* @}
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include "shell.h"
static int _cat(int argc, char **argv)
{
if (argc < 2) {
printf("Usage: %s <file>\n", argv[0]);
return 1;
}
/* With newlib or picolibc, low-level syscalls are plugged to RIOT vfs
* on native, open/read/write/close/... are plugged to RIOT vfs */
#if defined(MODULE_NEWLIB) || defined(MODULE_PICOLIBC)
FILE *f = fopen(argv[1], "r");
if (f == NULL) {
printf("file %s does not exist\n", argv[1]);
return 1;
}
char c;
while (fread(&c, 1, 1, f) != 0) {
putchar(c);
}
fclose(f);
#else
int fd = open(argv[1], O_RDONLY);
if (fd < 0) {
printf("file %s does not exist\n", argv[1]);
return 1;
}
char c;
while (read(fd, &c, 1) != 0) {
putchar(c);
}
close(fd);
#endif
fflush(stdout);
return 0;
}
static int _tee(int argc, char **argv)
{
if (argc != 3) {
printf("Usage: %s <file> <str>\n", argv[0]);
return 1;
}
#if defined(MODULE_NEWLIB) || defined(MODULE_PICOLIBC)
FILE *f = fopen(argv[1], "w+");
if (f == NULL) {
printf("error while trying to create %s\n", argv[1]);
return 1;
}
if (fwrite(argv[2], 1, strlen(argv[2]), f) != strlen(argv[2])) {
puts("Error while writing");
}
fclose(f);
#else
int fd = open(argv[1], O_RDWR | O_CREAT, 00777);
if (fd < 0) {
printf("error while trying to create %s\n", argv[1]);
return 1;
}
if (write(fd, argv[2], strlen(argv[2])) != (ssize_t)strlen(argv[2])) {
puts("Error while writing");
}
close(fd);
#endif
return 0;
}
static const shell_command_t shell_commands[] = {
{ "cat", "print the content of a file", _cat },
{ "tee", "write a string in a file", _tee },
{ NULL, NULL, NULL }
};
/* constfs example */
#include "fs/constfs.h"
#define HELLO_WORLD_CONTENT "Hello World!\n"
#define HELLO_RIOT_CONTENT "Hello RIOT!\n"
/* this defines two const files in the constfs */
static constfs_file_t constfs_files[] = {
{
.path = "/hello-world",
.size = sizeof(HELLO_WORLD_CONTENT),
.data = (const uint8_t *)HELLO_WORLD_CONTENT,
},
{
.path = "/hello-riot",
.size = sizeof(HELLO_RIOT_CONTENT),
.data = (const uint8_t *)HELLO_RIOT_CONTENT,
}
};
/* this is the constfs specific descriptor */
static constfs_t constfs_desc = {
.nfiles = ARRAY_SIZE(constfs_files),
.files = constfs_files,
};
/* constfs mount point, as for previous example, it needs a file system driver,
* a mount point and private_data as a pointer to the constfs descriptor */
static vfs_mount_t const_mount = {
.fs = &constfs_file_system,
.mount_point = "/const",
.private_data = &constfs_desc,
};
int main(void)
{
int res = vfs_mount(&const_mount);
if (res < 0) {
puts("Error while mounting constfs");
}
else {
puts("constfs mounted successfully");
}
char line_buf[SHELL_DEFAULT_BUFSIZE];
shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
return 0;
}