Morse Micro IoT SDK  2.9.7
restfs.c
1/*
2 * Copyright 2022-2023 Morse Micro
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include "restfs.h"
8
9#include <stdarg.h>
10#include <string.h>
11
12#include "lwip/apps/fs.h"
13#include "lwip/mem.h"
14
15#include "mmosal.h"
16
23};
24
25static const struct rest_endpoint *rest_endpoints;
26static uint16_t num_rest_endpoints = 0;
27
28void rest_init_endpoints(const struct rest_endpoint* endpoints, uint16_t num_endpoints)
29{
30 rest_endpoints = endpoints;
31 num_rest_endpoints = num_endpoints;
32}
33
34int restfs_printf(struct restfs_file *rest_file, const char *fmt, ...)
35{
36 struct fs_file *file = rest_file->fs_file;
37 MMOSAL_ASSERT(file->pextension != NULL);
38
39 char *data = (char *)file->pextension;
40 int bytes_written;
41 va_list args;
42
43 va_start(args, fmt);
44 bytes_written = vsnprintf(data + file->index, (file->len - file->index), fmt, args);
45 va_end(args);
46
47 file->index += bytes_written;
48 return bytes_written;
49}
50
51int restfs_write(struct restfs_file *rest_file, const uint8_t *buff, uint16_t len)
52{
53 struct fs_file *file = rest_file->fs_file;
54
55 MMOSAL_ASSERT(file->pextension != NULL);
56
57 char *data = (char *)file->pextension;
58 uint16_t bytes_written = (len < (file->len - file->index) ? len : (file->len - file->index));
59
60 memcpy(data + file->index, buff, bytes_written);
61 file->index += bytes_written;
62
63 return bytes_written;
64}
65
66int restfs_alloc_buffer(struct restfs_file *rest_file, uint16_t size)
67{
68 struct fs_file *file = rest_file->fs_file;
69
70 MMOSAL_ASSERT((file->pextension == NULL) && (file->data == NULL));
71
72 file->pextension = mem_malloc(size);
73
74 if (file->pextension != NULL)
75 {
76 memset(file->pextension, 0, size);
77 file->data = (const char *) file->pextension;
78 file->len = size;
79 return ERR_OK;
80 }
81 return ERR_MEM;
82}
83
84void restfs_write_const(struct restfs_file *rest_file, const char* str)
85{
86 struct fs_file *file = rest_file->fs_file;
87
88 MMOSAL_ASSERT((file->pextension == NULL) && (file->data == NULL));
89
90 file->data = str;
91 file->index = strlen(str);
92}
93
94char* restfs_claim_raw_buffer(struct restfs_file *rest_file)
95{
96 struct fs_file *file = rest_file->fs_file;
97
98 MMOSAL_ASSERT((file->pextension != NULL) && (file->data != NULL));
99
100 char *buff = (char *)file->pextension;
101 file->pextension = NULL; /* Prevent access while raw buffer is aquired */
102 return buff + file->index;
103}
104
105void restfs_release_raw_buffer(struct restfs_file *rest_file, uint16_t wr_len)
106{
107 struct fs_file *file = rest_file->fs_file;
108
109 MMOSAL_ASSERT((file->pextension == NULL) && (file->data != NULL));
110
111 file->index += wr_len;
112 file->pextension = (char*) file->data;
113}
114
118int fs_open_custom(struct fs_file *file, const char *name)
119{
120 for (int i = 0; i < num_rest_endpoints; i++)
121 {
122 if (!strcmp(name, rest_endpoints[i].uri))
123 {
124 struct restfs_file rest_file = {
125 .fs_file = file
126 };
127 memset(file, 0, sizeof(*file));
128
129 rest_endpoints[i].user_function(&rest_file);
130
131 file->len = file->index;
132
133 /* Persistent header flag will force lwIP to add a content-length header */
134 file->flags |= FS_FILE_FLAGS_HEADER_PERSISTENT;
135
136 return 1;
137 }
138 }
139 return 0;
140}
141
142void fs_close_custom(struct fs_file *file)
143{
144 if (file && file->pextension)
145 {
146 mem_free(file->pextension);
147 file->pextension = NULL;
148 }
149}
150
151int fs_read_custom(struct fs_file *file, char *buffer, int count)
152{
153 (void) (file);
154 (void) (buffer);
155 (void) (count);
156 /* Empty for now. */
157 return FS_READ_EOF;
158}
#define MMOSAL_ASSERT(expr)
Assert that the given expression evaluates to true and abort execution if not.
Definition: mmosal.h:927
static const struct rest_endpoint rest_endpoints[]
Vector table of rest endpoints.
Definition: http.c:150
A REST endpoint.
Definition: restfs.h:28
rest_endpoint_handler_t user_function
User defined function to call when this endpoint is requested by a client.
Definition: restfs.h:32
Opaque object used for writing REST output data.
Definition: restfs.c:20
struct fs_file * fs_file
lwIP httpd custom file object
Definition: restfs.c:22