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