/* if we get OC_EDATADDS error, then try to capture any error message and log it; assumes that in this case, the datadds is not big. */ void ocdataddsmsg(OCstate* state, OCtree* tree) { #define ERRCHUNK 1024 #define ERRFILL ' ' #define ERRTAG "Error {" int i,j; size_t len; XXDR* xdrs; char* contents; off_t ckp; if(tree == NULL) return; /* get available space */ xdrs = tree->data.xdrs; len = xxdr_length(xdrs); if(len < strlen(ERRTAG)) return; /* no room */ ckp = xxdr_getpos(xdrs); xxdr_setpos(xdrs,(off_t)0); /* read the whole thing */ contents = (char*)malloc(len+1); (void)xxdr_getbytes(xdrs,contents,(off_t)len); contents[len] = '\0'; /* Look for error tag */ for(i=0;i<len;i++) { if(ocstrncmp(contents+i,ERRTAG,strlen(ERRTAG))==0) { /* log the error message */ /* Do a quick and dirty escape */ for(j=i;j<len;j++) { int c = contents[i+j]; if(c > 0 && (c < ' ' || c >= '\177')) contents[i+j] = ERRFILL; } oclog(OCLOGERR,"DATADDS failure, possible message: '%s'\n", contents+i); goto done; } } xxdr_setpos(xdrs,ckp); done: return; }
static int dataError(XXDR* xdrs, OCstate* state) { int depth=0; int errfound = 0; off_t ckp=0,avail=0; int i=0; char* errmsg = NULL; char errortext[16]; /* bigger thant |ERROR_TAG|*/ avail = xxdr_getavail(xdrs); if(avail < strlen(ERROR_TAG)) goto done; /* assume it is ok */ ckp = xxdr_getpos(xdrs); /* Read enough characters to test for 'ERROR ' */ errortext[0] = '\0'; xxdr_getbytes(xdrs,errortext,(off_t)strlen(ERROR_TAG)); if(ocstrncmp(errortext,ERROR_TAG,strlen(ERROR_TAG)) != 0) goto done; /* not an immediate error */ /* Try to locate the whole error body */ xxdr_setpos(xdrs,ckp); for(depth=0,i=0;i<avail;i++) { xxdr_getbytes(xdrs,errortext,(off_t)1); if(errortext[0] == CLBRACE) depth++; else if(errortext[0] == CRBRACE) { depth--; if(depth == 0) {i++; break;} } } errmsg = (char*)malloc((size_t)i+1); if(errmsg == NULL) {errfound = 1; goto done;} xxdr_setpos(xdrs,ckp); xxdr_getbytes(xdrs,errmsg,(off_t)i); errmsg[i] = '\0'; state->error.message = errmsg; state->error.code = strdup("?"); state->error.httpcode = 404; xxdr_setpos(xdrs,ckp); errfound = 1; done: xxdr_setpos(xdrs,ckp); return errfound; }