-
Notifications
You must be signed in to change notification settings - Fork 0
/
lmi_fs.c
264 lines (238 loc) · 7.27 KB
/
lmi_fs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
//*****************************************************************************
//
// lmi_fs.c - File System Processing for lwIP Web Server Apps.
//
// Copyright (c) 2007-2011 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 8264 of the EK-LM3S8962 Firmware Package.
//
//*****************************************************************************
// COMPILER
#include <string.h>
// STELLARISWARE
#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "utils/lwiplib.h"
#include "httpserver_raw/fs.h"
#include "httpserver_raw/fsdata.h"
#include "device.h"
//*****************************************************************************
//
// Include the file system data for this application. This file is generated
// by the makefsfile script from lwIP, using the following command (all on one
// line):
//
// makefsfile -i fs -o lmi-fsdata.h -r -h
//
// If any changes are made to the static content of the files served by the
// application, this command must be used to regenerate lmi-fsdata.h in order
// for those changes to be picked up by the file server.
//
//*****************************************************************************
#ifdef ONE_CHANNEL
#include "one-lmi-fsdata.h"
#else
#include "lmi-fsdata.h"
#endif
//*****************************************************************************
//
// Open a file and return a handle to the file, if found. Otherwise,
// return NULL.
//
//*****************************************************************************
struct fs_file *
fs_open(char *name)
{
const struct fsdata_file *ptTree;
struct fs_file *ptFile = NULL;
//
// Allocate memory for the file system structure.
//
ptFile = mem_malloc(sizeof(struct fs_file));
if(NULL == ptFile)
{
return(NULL);
}
//
// Initialize the file system tree pointer to the root of the linked list.
//
ptTree = FS_ROOT;
//
// Begin processing the linked list, looking for the requested file name.
//
while(NULL != ptTree)
{
//
// Compare the requested file "name" to the file name in the
// current node.
//
if(strncmp(name, (char *)ptTree->name, ptTree->len) == 0)
{
//
// Fill in the data pointer and length values from the
// linked list node.
//
ptFile->data = (char *)ptTree->data;
ptFile->len = ptTree->len;
//
// For now, we setup the read index to the end of the file,
// indicating that all data has been read.
//
ptFile->index = ptTree->len;
//
// We are not using any file system extensions in this
// application, so set the pointer to NULL.
//
ptFile->pextension = NULL;
//
// Exit the loop and return the file system pointer.
//
break;
}
//
// If we get here, we did not find the file at this node of the linked
// list. Get the next element in the list.
//
ptTree = ptTree->next;
}
//
// If we didn't find the file, ptTee will be NULL. Make sure we
// return a NULL pointer if this happens.
//
if(NULL == ptTree)
{
mem_free(ptFile);
ptFile = NULL;
}
//
// Return the file system pointer.
//
return(ptFile);
}
//*****************************************************************************
//
// Close an opened file designated by the handle.
//
//*****************************************************************************
void
fs_close(struct fs_file *file)
{
//
// If a Fat file was opened, free its object.
//
if(file->pextension)
{
mem_free(file->pextension);
}
//
// Free the main file system object.
//
mem_free(file);
}
//*****************************************************************************
//
// Move file pointer.
//
//*****************************************************************************
int fs_seek(struct fs_file *file, int offset)
{
//
// Check to see if a Fat File was opened and process it.
//
if(file->pextension)
{
return((int)offset);
}
//
// Check if offset is feasible
//
if(offset > file->len)
{
//
// Can not go beyond EOF. Return a -1 to indicate EOF.
//
return(-1);
}
//
// Move flash file pointer
//
file->index = offset;
return((int)offset);
}
//*****************************************************************************
//
// Read the next chunk of data from the file. Return the count of data
// that was read. Return 0 if no data is currently available. Return
// a -1 if at the end of file.
//
//*****************************************************************************
int
fs_read(struct fs_file *file, char *buffer, int count)
{
int iAvailable;
//
// Check to see if a Fat File was opened and process it.
//
if(file->pextension)
{
unsigned short usBytesRead = -1;
return((int)usBytesRead);
}
//
// Check to see if more data is available.
//
if(file->len == file->index)
{
//
// There is no remaining data. Return a -1 for EOF indication.
//
return(-1);
}
//
// Determine how much data we can copy. The minimum of the 'count'
// parameter or the available data in the file system buffer.
//
iAvailable = file->len - file->index;
if(iAvailable > count)
{
iAvailable = count;
}
//
// Copy the data.
//
memcpy(buffer, file->data + iAvailable, iAvailable);
file->index += iAvailable;
//
// Return the count of data that we copied.
//
return(iAvailable);
}
//*****************************************************************************
//
// Write a chunk of data to the file. Return the count of data written.
//
//*****************************************************************************
int fs_write(struct fs_file *file, char *buffer, int count)
{
//
// Flash filesystem is read-only. Return a -1 for EOF indication.
//
return(-1);
}