seperately).
--- /dev/null
+/* For fdopen(), fclose(), sscanf(), printf() */
+#include <stdio.h>
+
+/* For allocMem(), freeMem() */
+#include <hadesstd.h>
+
+/* For msglog() */
+#include <hadesstd.h>
+#include <errno.h>
+
+/* For open() */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/* For read(), close() */
+#include <unistd.h>
+
+/* For st */
+#include <sys/ioctl.h>
+#include <sys/mtio.h>
+
+#include "hwtape.h"
+#include "hwtapeal.h"
+#include "hwtapevol.h"
+
+static FILE *openTape(const char* filename) {
+ int tape;
+ int fileSeqNum;
+ int stat;
+ int i = 0;
+
+ char *vol;
+ char *label;
+
+ FILE *outFile;
+
+ struct mtop *eom, *sbm, *rewind;
+
+ tape = open(filename, O_RDWR);
+ if(tape == -1) {
+ msglog(LOG_ERR, "Could not open tape!\n");
+ exit(-2);
+ }
+
+ eom->mt_op = MTEOM;
+ eom->mt_count = 1;
+ stat = ioctl(tape, MTIOCTOP, &eom);
+ if (stat == -1) {
+ msglog(LOG_ERR, "Could not go to the eon of the tape!\n");
+ exit(-2);
+ }
+
+ sbm->mt_op = MTBSF;
+ sbm->mt_count = 2;
+ stat = ioctl(tape, MTIOCTOP, &sbm);
+ if (stat == -1) {
+
+ rewind->mt_op = MTREW;
+ rewind->mt_count = 1;
+ stat = ioctl(tape, MTIOCTOP, &rewind);
+ if (stat == -1) {
+ msglog(LOG_ERR, "Could not rewind tape!\n");
+ exit(-2);
+ }
+
+ vol = readVolumeLabel(tape);
+
+ stat = ioctl(tape, MTIOCTOP, &rewind);
+ if (stat == -1) {
+ msglog(LOG_ERR, "Could not rewind tape!\n");
+ exit(-2);
+ }
+
+ writeVolumeLabel(vol, tape);
+ fileSeqNum = 1;
+ } else {
+ label = allocMem(80*sizeof(char));
+ do {
+ stat = read(tape, label, 80);
+ if (i == 0) {
+ sscanf(label, "%*31c%4d", &fileSeqNum);
+ printf("File Sequence Number: %04i\n", fileSeqNum);
+ }
+ i++;
+ } while (stat != -1);
+ freeMem(label);
+ }
+
+ writeHeader(tape, fileSeqNum, filename);
+
+ outFile = fdopen(tape, "wb");
+}
+
+int closeTape(FILE *openTape, int tape, int numBlocks, const char *filename) {
+ int stat;
+ stat = fclose(openTape);
+ if (stat == -1) {
+ msglog(LOG_ERR, "Could not close file on tape!\n");
+ exit(-2);
+ }
+
+ writeTrailer(tape, 0, numBlocks, filename);
+
+ stat = close(tape);
+ if (stat == -1) {
+ msglog(LOG_ERR, "Could not close tape!\n");
+ exit(-2);
+ }
+
+ return 0;
+}
+
--- /dev/null
+#ifndef HWTAPE_H
+#define HWTAPE_H
+
+static FILE *openTape(const char *);
+
+int closeTape(FILE *, int, int, const char *);
+
+#endif
+
--- /dev/null
+/* For msglog() */
+#include <hadesstd.h>
+#include <errno.h>
+
+/* For time() */
+#include <time.h>
+
+/* For gethostname() */
+#include <unistd.h>
+
+/* For getpwent() */
+#include <pwd.h>
+#include <sys/types.h>
+
+/* For getuid() */
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "hwtapeal.h"
+
+int writeHeader(int tape, int fileSeqNum, const char *filename) {
+ int stat;
+ int i;
+ int blockSize = BLOCKSIZE;
+ char *hostname;
+ char *creaCent;
+ char *label;
+#ifdef LINUX
+ const char *impId = "LINUXHADAQ023";
+#endif
+#ifdef UNIX
+ const char *impId = "UNIXHADAQ0023";
+#endif
+#ifndef LINUX
+ #ifndef UNIX
+ const char *impId = " HADAQ0023";
+ #endif
+#endif
+ uid_t uid, first_uid;
+ time_t tim;
+ struct passwd *pwentry;
+ struct tm *cd;
+
+ gethostname(hostname, 20);
+
+ tim = time(0);
+ cd = gmtime(&tim);
+ if ((cd->tm_year)/100 == 19) {
+ *creaCent = ' ';
+ } else {
+ *creaCent = '0';
+ }
+
+ label = allocMem(80*sizeof(char));
+
+ sprintf(label, "HDR1 %s0000010001%04d000100%s%02d%03d 99366 000000%s ", ansichar(filename, 17), fileSeqNum, creaCent, (cd->tm_year)%100, cd->tm_yday, impId);
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ sprintf(label, "HDR2F%05d%05d010664 bin 33000 ", blockSize, blockSize);
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ uid = getuid();
+ pwentry = getpwent();
+ first_uid = pwentry->pw_uid;
+ do {
+ pwentry = getpwent();
+ } while (pwentry->pw_uid != uid && pwentry->pw_uid != first_uid);
+
+ if (pwentry->pw_name == "root") {
+ pwentry->pw_name = "hades";
+ }
+
+ sprintf(label, "HDR3%010d%s%s%s", tim, unixchar(pwentry->pw_name, 10), unixchar(hostname, 20), unixchar(filename, 36));
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ freeMem(label);
+ return 0;
+}
+
+
+int writeTrailer(int tape, int fileSeqNum, int numBlocks, const char *filename) {
+ int stat;
+ int i;
+ int blockSize = BLOCKSIZE;
+ char *hostname;
+ char *creaCent;
+ char *label;
+#ifdef LINUX
+ const char *impId = "LINUXHADAQ023";
+#endif
+#ifdef UNIX
+ const char *impId = "UNIXHADAQ0023";
+#endif
+#ifndef LINUX
+ #ifndef UNIX
+ const char *impId = " HADAQ0023";
+ #endif
+#endif
+ uid_t uid, first_uid;
+ time_t tim;
+ struct passwd *pwentry;
+ struct tm *cd;
+
+ gethostname(hostname, 20);
+
+ tim = time(0);
+ cd = gmtime(&tim);
+ if ((cd->tm_year)/100 == 19) {
+ *creaCent = ' ';
+ } else {
+ *creaCent = '0';
+ }
+
+ label = allocMem(80*sizeof(char));
+
+ sprintf(label, "HDR1 %s0000010001%04d000100%s%02d%03d 99366 %06d%s ", ansichar(filename, 17), fileSeqNum, creaCent, (cd->tm_year)%100, cd->tm_yday, numBlocks, impId);
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ sprintf(label, "HDR2F%05d%05d010664 bin %010d33000 ", blockSize, blockSize, numBlocks*blockSize);
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ uid = getuid();
+ pwentry = getpwent();
+ first_uid = pwentry->pw_uid;
+ do {
+ pwentry = getpwent();
+ } while (pwentry->pw_uid != uid && pwentry->pw_uid != first_uid);
+
+ if (pwentry->pw_name == "root") {
+ pwentry->pw_name = "hades";
+ }
+
+ sprintf(label, "HDR3%010d%s%s%s", tim, unixchar(pwentry->pw_name, 10), unixchar(hostname, 20), unixchar(filename, 36));
+ stat = write(tape, label, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write ANSI label on tape!\n");
+ exit(-3);
+ }
+
+ freeMem(label);
+ return 0;
+}
+
--- /dev/null
+#ifndef AL_H
+#define AL_H
+
+/* For write() */
+#include <unistd.h>
+
+/* For gethostname() */
+#include <unistd.h>
+
+/* For stat() */
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "hwtapeansichar.h"
+
+#define BLOCKSIZE 8192
+
+int writeHeader(int, int, const char *);
+int writeTrailer(int, int, int, const char *);
+
+#endif
+
--- /dev/null
+#include "hwtapeansichar.h"
+
+const char *ansichar(const char *s, int length) {
+ char *r;
+ int i, end;
+ end = 0;
+ *r = *s;
+ for(i=0 ; i<length ; i++) {
+ if (end == 0) {
+ switch (s[i]) {
+ case ('A'):
+ case ('B'):
+ case ('C'):
+ case ('D'):
+ case ('E'):
+ case ('F'):
+ case ('G'):
+ case ('H'):
+ case ('I'):
+ case ('J'):
+ case ('K'):
+ case ('L'):
+ case ('M'):
+ case ('N'):
+ case ('O'):
+ case ('P'):
+ case ('Q'):
+ case ('R'):
+ case ('S'):
+ case ('T'):
+ case ('U'):
+ case ('V'):
+ case ('W'):
+ case ('X'):
+ case ('Y'):
+ case ('Z'):
+
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ case ('9'):
+
+ case (' '):
+ case ('!'):
+ case ('"'):
+ case ('%'):
+ case ('&'):
+ case ('\''):
+ case ('('):
+ case (')'):
+ case ('*'):
+ case ('+'):
+ case (','):
+ case ('-'):
+ case ('_'):
+ case ('.'):
+ case ('/'):
+ case (':'):
+ case (';'):
+ case ('<'):
+ case ('='):
+ case ('>'):
+ case ('?'):
+ break;
+ case ('a'):
+ r[i] = 'A';
+ break;
+ case ('b'):
+ r[i] = 'B';
+ break;
+ case ('c'):
+ r[i] = 'C';
+ break;
+ case ('d'):
+ r[i] = 'D';
+ break;
+ case ('e'):
+ r[i] = 'E';
+ break;
+ case ('f'):
+ r[i] = 'F';
+ break;
+ case ('g'):
+ r[i] = 'G';
+ break;
+ case ('h'):
+ r[i] = 'H';
+ break;
+ case ('i'):
+ r[i] = 'I';
+ break;
+ case ('j'):
+ r[i] = 'J';
+ break;
+ case ('k'):
+ r[i] = 'K';
+ break;
+ case ('l'):
+ r[i] = 'L';
+ break;
+ case ('m'):
+ r[i] = 'M';
+ break;
+ case ('n'):
+ r[i] = 'N';
+ break;
+ case ('o'):
+ r[i] = 'O';
+ break;
+ case ('p'):
+ r[i] = 'P';
+ break;
+ case ('q'):
+ r[i] = 'Q';
+ break;
+ case ('r'):
+ r[i] = 'R';
+ break;
+ case ('s'):
+ r[i] = 'S';
+ break;
+ case ('t'):
+ r[i] = 'T';
+ break;
+ case ('u'):
+ r[i] = 'U';
+ break;
+ case ('v'):
+ r[i] = 'V';
+ break;
+ case ('w'):
+ r[i] = 'W';
+ break;
+ case ('x'):
+ r[i] = 'X';
+ break;
+ case ('y'):
+ r[i] = 'Y';
+ break;
+ case ('z'):
+ r[i] = 'Z';
+ break;
+ case ('\0'):
+ r[i] = ' ';
+ end = 1;
+ break;
+ default:
+ r[i] = 'Z';
+ break;
+ }
+ } else {
+ r[i] = ' ';
+ }
+ }
+ r[length] = '\0';
+
+ return r;
+}
+
--- /dev/null
+#ifndef HWTAPEANSICHAR_H
+#define HWTAPEANSICHAR_H
+
+const char *ansichar(const char *, int);
+
+#endif
+
--- /dev/null
+#include "hwtapeunixchar.h"
+
+const char *unixchar(const char *s, int length) {
+ char *r;
+ int i, end;
+ *r = *s;
+ end = 0;
+ for(i=0 ; i<length ; i++) {
+ if (end == 0) {
+ if(s[i] == '\0') {
+ r[i] = ' ';
+ end = 1;
+ }
+ } else {
+ r[i] = ' ';
+ }
+ }
+ r[length] = '\0';
+
+ return r;
+}
+
--- /dev/null
+#ifndef HWTAPEUNIXCHAR_H
+#define HWTAPEUNIXCHAR_H
+
+const char *unixchar(const char *, int);
+
+#endif
+
--- /dev/null
+/* For read(), write() */
+#include <unistd.h>
+
+/* For allocMem(), freeMem() */
+#include <hadesstd.h>
+
+/* For msglog() */
+#include <hadesstd.h>
+#include <errno.h>
+
+/* For memcpy() */
+#include <string.h>
+
+#include "hwtapevol.h"
+
+char *readVolumeLabel(int tape) {
+ char *vol;
+ int stat;
+ vol = allocMem(80*sizeof(char));
+ stat = read(tape, vol, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not read volume label from tape!\n");
+ exit(-3);
+ }
+ return vol;
+ freeMem(vol);
+}
+
+int writeVolumeLabel(const char *vol, int tape) {
+ char *v;
+ int stat;
+ v = allocMem(80*sizeof(char));
+ memcpy(v, vol, 80);
+ stat = write(tape, v, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write volume label to tape!\n");
+ exit(-3);
+ }
+ freeMem(v);
+ return 0;
+}
+
+int writeNewVolumeLabel(const char *volId, const char *ownerId, int tape) {
+ char *vol;
+ int stat;
+
+#ifdef LINUX
+ const char *impId = "LINUXHADAQ023";
+#endif
+#ifdef UNIX
+ const char *impId = "UNIXHADAQ0023";
+#endif
+#ifndef LINUX
+#ifndef UNIX
+ const char *impId = " HADAQ0023";
+#endif
+#endif
+
+ vol = allocMem(80*sizeof(char));
+
+ sprintf(vol, "VOL1HADAQ %s%s 4", impId, ansichar(ownerId, 14));
+
+ stat = write(tape, vol, 80);
+ if(stat == -1) {
+ msglog(LOG_ERR, "Could not write volume label to tape!\n");
+ exit(-3);
+ }
+ freeMem(vol);
+
+ return 0;
+}
+
--- /dev/null
+#ifndef HWTAPEVOL_H
+#define HWTAPEVOL_H
+
+char *readVolumeLabel(int);
+
+int writeVolumeLabel(const char *, int);
+
+int writeNewVolumeLabel(const char *, const char *, int);
+
+#endif
+