/* Call me SSCopy. I copy a prescribed range of bytes from SS disk(s) * (perhaps a scan) to a new file created with a prescribed name. * Usage: * SSCopy filename startbyte endbyte * Please use EndM5 if you need to interrupt. * Revised: 2002 June 27, JAB */ #include "Parse5A.h" #include /* For signal() to catch ^C */ void signalint(int k); /* To catch signal SIGINT (below) */ SSHANDLE dev; /* xlrDevice */ UINT indx = 1; /* Index */ S_READDESC readdesc; /* readDesc */ char * me; /* My name */ int msglev = 0; /* Debug message level */ int main(int argc, char * argv[]) { /* SSCopy */ unsigned long long startbyte, nowbyte, endbyte; unsigned long plapnt[2]; /* Convert to/from long long */ unsigned long long * pplapnt = (unsigned long long *) plapnt; unsigned long rbuff[BUFFL]; /* Write and read buffer */ FILE * ofile; int len; /* *** Initialize *** */ me = (me = strrchr(argv[0], '/')) == NULL ? argv[0] : me+1; /* My name */ /* Check for errors on the command line and decode bytes */ if (argc != 4) { /* OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR on command line. Usage: \n" " %s filename startbyte endbyte \n", me, me); return(-1); /* Error */ } nowbyte = startbyte = atoll(argv[2]) & 0xfffffffffffffff8LL; /* Now 8-byte aligned */ endbyte = atoll(argv[3]); if (startbyte >= endbyte) { /* OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR on command line: startbyte >= endbyte \n", me); return(-2); /* Error */ } /* (We'll try to create a file with name argv[1] later) */ /* ** Initialize and check XLR ** */ if (XLRDeviceFind() <= 0) { /* StreamStor cards? */ (void) fprintf(stderr, "%s ERROR: \007 XLRDeviceFind() returned none \n", me); /* Error */ (void) errors(); return(-3); /* Error */ } if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLRDeviceFind() OK \n", me); (void) errors(); 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(-4); /* Error */ } if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s DEBUG: XLROpen() OK \n", me); (void) errors(); signal(SIGINT, signalint); /* Catch interrupt signal */ /* * SS mode to PCI for reading * */ if (XLRSetMode(dev, SS_MODE_PCI) != XLR_SUCCESS) { /* Set mode, OK? */ (void) fprintf(stderr, "%s ERROR: \007 XLRSetMode() returned error \n", me); /* Nope */ (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-5); /* Error */ } (void) errors(); /* (FPDP mode is not used) */ /* ** Create or truncate a file to write to ** */ if ((ofile = fopen(argv[1], "wb")) == NULL) { /* OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: Can;t fopen() file ", me); perror(argv[1]); return(-6); /* Error */ } /* *** Working loop *** */ while (TRUE) { /* Loop until break */ /* ** Read a buffer full from SS ** */ *pplapnt = nowbyte; /* Start of this cycle */ plapnt[0] &= 0xfffffff8; /* Now 8-byte aligned */ readdesc.XferLength = MIN(sizeof(rbuff), endbyte - nowbyte); if (XLRReadData(dev, rbuff, plapnt[1], plapnt[0], readdesc.XferLength)) { /* Read into rbuff, OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: XLRReadData() returned error \n", me); (void) errors(); XLRClose(dev); /* See manual notes on XLROpen() */ return(-7); /* Error */ } /* ** Write the buffer full to file ** */ if ((len = fwrite(rbuff, readdesc.XferLength, 1, ofile)) != 1) { /* OK? */ (void) fprintf(stderr, /* Nope */ "%s ERROR: fwrite() returned %d on ", me, len); perror(argv[1]); return(-8); /* Error */ } nowbyte += readdesc.XferLength; /* Yes, OK */ if (nowbyte >= endbyte) /* Done? */ break; /* Yes */ } /* End of while loop until break */ /* *** Done *** */ (void) errors(); if (msglev < 2) /* Debuggery? */ (void) fprintf(stderr, "%s Done \n", me); /* Yes */ return(0); /* Normal end */ } /* End of main = SSCopy */ int errors() { /* XLR errors? Print XLR error code if so */ extern char * me; /* My name */ extern int msglev; /* Debug print? */ char messg[XLR_ERROR_LENGTH]; /* Error message as a string */ XLR_ERROR_CODE error; /* Return from error request */ if (msglev > 1) /* Should we be here? */ return(FALSE); /* Nope */ if ((error = XLRGetLastError()) != 3) { /* Errors? */ /* Yes, get error message */ if (XLRGetErrorMessage(messg, error) != XLR_SUCCESS) { /* OK? */ if (msglev < 2) /* Nope. Debuggery? */ (void) fprintf(stderr, "%s errors() ERROR: XLR error %ld, " "but XLRGetErrorMessage() failed \n", me, error); } else /* Error message, messg[], OK */ if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s errors() ERROR: XLR error %ld %s \n", me, error, messg); return(TRUE); /* Yes, XLR error */ } return(FALSE); /* Else no error */ } /* End of errors() */ void signalint(int k) { /* To catch interrupt signal SIGINT */ /* (k is not used) */ extern SSHANDLE dev; /* xlrDevice */ extern char * me; /* My name */ extern int msglev; /* Debug message level */ if (msglev < 2) /* Debuggery? */ (void) fprintf(stderr, "%s INTERRUPT \n", me); /* Yes */ /* An XLRReset() here allows swapping disks after XLRClose() below */ if (XLRReset(dev) != XLR_SUCCESS) { /* OK? */ if (msglev < 2) /* No. Debuggery? */ (void) fprintf(stderr, /* Yes */ "%s WARNING: XLRReset() returned error \n", me); (void) errors(); } else if (msglev < 1) /* Debuggery? */ (void) fprintf(stderr, "%s DEBUG: XLRReset() OK \n", me); // XLRClose(dev); /* See manual notes on XLROpen() */ // if (msglev < 1) /* Debuggery? */ // (void) fprintf(stderr, "%s DEBUG: XLRClose() done \n", me); /* Yes */ if (msglev < 2) /* Debuggery? */ (void) printf("%s: The End \n", me); exit(0); /* Bye */ } /* End of signalint() */