Hello,
I’m experiencing a strange issue in my firmware running web server on a RCM3700.
When I try to upload a file, on CGI_START the sspec_open() function returns -16 so the CGI is skipped.
According to errno.lib -16 should be EBUSY but I’m using the FAT blocking mode. How is this possible?
Here my code snippet:
#define FAT_BLOCK
#use “fat.lib”
#use “http.lib”
SSPEC_RESOURCETABLE_START
SSPEC_RESOURCE_P_CGI(“/upload.cgi”, http_uploadCGI, “File Upload”,
ADMIN_GROUP, 0x0000, SERVER_HTTP, SERVER_AUTH_BASIC)
SSPEC_RESOURCETABLE_END
_debug int http_uploadCGI(HttpState *state) {
int rc, len, newlen;
if (http_getState(state) == 0) {
http_setState(state, 1);
http_setCond(state, COND_FILEHANDLE, -1);
}
rc = 0;
switch (http_getAction(state)) {
case CGI_START:
if (http_getField(state)[0] != ‘/’) {
log_print(“CGI upload skipping %s”, http_getAction(state), http_getField(state));
return http_skipCGI(state);
}
http_setCond(state, COND_FILEHANDLE, sspec_open(http_getField(state), http_getContext(state), O_WRITE|O_CREATE|O_TRUNC, 0));
if (http_getCond(state, COND_FILEHANDLE) < 0) {
log_print(“CGI upload action %d error %d”, http_getAction(state), http_getCond(state, COND_FILEHANDLE));
return http_skipCGI(state);
}
state->main_timeout = set_timeout(HTTP_TIMEOUT);
break;
case CGI_DATA:
len = sspec_write(http_getCond(state, COND_FILEHANDLE), http_getData(state), http_getDataLength(state));
if (len < 0) {
log_print(“CGI upload action %d error %d”, http_getAction(state), len);
http_genStatus(state, http_getData(state), HTTP_MAXBUFFER, 503, NULL, 0, NULL, NULL);
rc = CGI_SEND_DONE;
} else if (len < http_getDataLength(state)) {
http_setCond(state, COND_FILELENGTH, len);
rc = CGI_MORE;
}
break;
case CGI_CONTINUE:
len = http_getCond(state, COND_FILELENGTH);
newlen = sspec_write(http_getCond(state, COND_FILEHANDLE), http_getData(state) + len, http_getDataLength(state) - len);
if (newlen < 0) {
log_print(“CGI upload action %d error %d”, http_getAction(state), len);
http_genStatus(state, http_getData(state), HTTP_MAXBUFFER, 503, NULL, 0, NULL, NULL);
rc = CGI_SEND_DONE;
} else {
len += newlen;
if (len < http_getDataLength(state)) {
http_setCond(state, COND_FILELENGTH, len);
rc = CGI_MORE;
}
}
break;
case CGI_END:
if (strcmpi(FAT_FILE_DEVICES, http_getFileName(state)) == 0) {
cgi_upload_devices(state);
} else if (strcmpi(FAT_FILE_PASSKEYS, http_getFileName(state)) == 0) {
cgi_upload_passkeys(state);
} else if (strcmpi(FAT_FILE_IOLOGIC, http_getFileName(state)) == 0) {
cgi_upload_iologic(state);
} else if (strcmpi(FAT_FILE_SMTP, http_getFileName(state)) == 0) {
cgi_upload_smtp(state);
}
sspec_close(http_getCond(state, COND_FILEHANDLE));
http_setCond(state, COND_FILEHANDLE, -1);
break;
case CGI_EOF:
if (http_getCond(state, COND_REDIRECT) > 0) {
cgi_redirectto(state, “/index.htm”);
} else {
http_genStatus(state, http_getData(state), HTTP_MAXBUFFER, 200, NULL, 0, NULL, NULL);
rc = CGI_SEND_DONE;
}
break;
case CGI_ABORT:
if (http_getCond(state, COND_FILEHANDLE) >= 0) {
sspec_close(http_getCond(state, COND_FILEHANDLE));
}
break;
}
return rc;
}