/* Call me Recover. I use Conduant's XLRRecoverData() with Overwritten * TRUE (or optionally FALSE) to recover any recorded data lost but not * overwritten. * My command-line options: * -o Overwritten, 0 for FALSE, 1 for TRUE; default 1 * -m Msglev, default 1; change to 0 for debug printing * More details below. Revised: 2004 October 22, JAB */ #include "Parse5A.h" SSHANDLE dev; /* xlrDevice */ UINT indx = 1; /* Index */ XLR_ERROR_CODE error = 0; /* Return from error request, etc. */ char messg[XLR_ERROR_LENGTH]; /* Error message as a string */ char * me; /* My name */ int msglev = 1; /* Debug message level */ int ovrwrttn = TRUE; /* Default */ int main(int argc, char * argv[]) { /* Recover */ int k; /* *** Initialize *** */ me = (me = strrchr(argv[0], '/')) == NULL ? argv[0] : me+1; /* My name */ /* * Parse command-line options, if any * */ k = 0; while (k >= 0) { switch (k = getopt(argc, argv, "m:o:")) { /* That's msglev and ovrwrttn */ case 'm' : /* msglev */ /* msglev = -1 Vast quantities of debuggery prints * msglev = 0 Some debuggery prints * msglev = 1 Default and normal operation; warnings and errors print * msglev = 2 Only errors and operational messages print * msglev = 3 Nothing prints except fatal errors when program dies * (default 1 above) */ msglev = atoi(optarg); /* (No check) */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: msglev set to %d \n", me, msglev); break; case 'o' : /* Overwritten (ovrwrttn) */ /* ovrwrttn = 1 (TRUE), recover part of overwritten recording * ovrwrttn = 0 (FALSE), recover recording that ended improperly */ ovrwrttn = atoi(optarg); /* (No check) */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: ovrwrttn set to %d \n", me, ovrwrttn); break; case '?' : /* Error: character not in list */ if (msglev < 2) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s WARNING: Unknown option on command line \n", me); break; case ':' : /* Error: missing numerical parameter */ if (msglev < 2) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s WARNING: Missing number on command line \n", me); break; default : /* Probably -1, end of parameters */ break; } /* End of switch on k */ } /* End of while k */ /* ** Initialize and check XLR ** */ if (XLRDeviceFind() <= 0) { /* StreamStor cards? */ (void) fprintf(stderr, "%s ERROR: \007 XLRDeviceFind() returned none \n", me); /* Error */ (void) errors(); return(-1); /* Error */ } if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLRDeviceFind() OK \n", me); (void) errors(); /* XLR errors? */ if (XLRCardReset(indx) != XLR_SUCCESS) { /* Reset, OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLRCardReset() returned error \n", me); /* Nope */ (void) errors(); return(-2); /* Error */ } (void) errors(); if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRCardReset() OK \n", me); /* Yes */ (void) sleep(2); /* Wait a bit for XLRCardReset() to finish */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: Trying to XLROpen() ... \n", me); if (XLROpen(indx, &dev) != XLR_SUCCESS) { /* Open, OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLROpen() returned error \n", me); /* Nope */ (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-3); /* Error */ } (void) errors(); if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLROpen() OK \n", me); /* Yes */ /* ** Try to recover data ** */ if (XLRRecoverData(dev, ovrwrttn) != XLR_SUCCESS) { /* OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: \007 XLRRecoverData() returned error \n", me); (void) errors(); return(-4); /* Error */ } /* Else OK */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRRecoverData() OK \n", me); /* Yes */ return(0); /* Normal end */ } /* End of Recover */ int errors() { /* XLR errors? Print XLR error code if so */ static XLR_ERROR_CODE lerror = 0; /* Last error printed */ if (msglev > 1) /* Should we be here? */ return(FALSE); /* Nope */ if (error == 0 || error == 3) { /* Pending errors? */ lerror = error; /* Nope, forget last error printed */ error = XLRGetLastError(); /* Get update */ } if (error == 3) { /* Error? */ lerror = error; /* Nope */ return(FALSE); /* Normal end for case no error */ } if (error == lerror) /* Error, but have we already printed it? */ return(TRUE); /* Yes, so don't repeat printing */ if (error < 1000) { /* XLR error? */ /* Yes, get XLR error message */ if (XLRGetErrorMessage(messg, error) != XLR_SUCCESS) /* OK? */ /* Nope (we already know that msglev < 2) */ (void) fprintf(stderr, "%s errors() ERROR: XLR error %ld, " "but XLRGetErrorMessage() failed \n", me, error); /* (Error in getting error message, but we try to go on) */ if (msglev < 1) { /* Debuggery? */ if (error != 7) /* Yes, Normal XLR error message? */ (void) fprintf(stderr, /* Yes */ "%s errors() ERROR: XLR error %lu %s \n", me, error, messg); else /* Demote XLR error 7 to warning */ (void) fprintf(stderr, /* Yes */ "%s errors() WARNING: XLR error %lu %s \n", me, error, messg); lerror = error; /* Remember that we printed this error */ } /* End of if debuggery */ } /* End of if XLR error */ else if (msglev < 1) { /* Print other (non-XLR) error message? */ (void) fprintf(stderr, /* Yes */ "%s errors() ERROR: %lu %s \n", me, error, messg); lerror = error; /* Remember that we printed this error */ } /* (But do not "use up" this error, i.e., do not set error to 0) */ return(TRUE); /* Normal end with error */ } /* End of errors() */