1 /*
2 * $Header: /cvsroot/arc/arc/arcsvc.c,v 1.4 2005/10/09 01:38:22 highlandsun Exp $
3 */
4
5 /* ARC - Archive utility - ARCSVC
6
7 Version 2.23, created on 04/22/87 at 13:10:10
8
9 (C) COPYRIGHT 1985-87 by System Enhancement Associates; ALL RIGHTS RESERVED
10
11 By: Thom Henderson
12
13 Description:
14 This file contains service routines needed to maintain an archive.
15
16 Language:
17 Computer Innovations Optimizing C86
18 */
19 #include <stdio.h>
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <fcntl.h>
23 #include "arc.h"
24 #if _MTS
25 #include <mts.h>
26 #endif
27
28 #include "proto.h"
29
30 VOID arcdie(), setstamp();
31 int unlink();
32
33 VOID
openarc(chg)34 openarc(chg) /* open archive */
35 int chg; /* true to open for changes */
36 {
37 FILE *fopen();/* file opener */
38
39 if (!(arc = fopen(arcname, OPEN_R))) {
40 if (chg) {
41 if (note)
42 printf("Creating new archive: %s\n", arcname);
43 }
44 else
45 arcdie("Archive not found: %s", arcname);
46 }
47 #if _MTS /* allow reading archives of max MTS record length */
48 {
49 char *buf, *malloc();
50 int inlen;
51 struct GDDSECT *region;
52
53 region=gdinfo(arc->_fd._fdub);
54 inlen=region->GDINLEN;
55 buf=malloc(inlen);
56 setbuffer(arc, buf, inlen);
57 }
58 #endif
59 if (chg) { /* if opening for changes */
60 if (!(new = tmpopen(newname)))
61 arcdie("Cannot create archive copy: %s", newname);
62
63 changing = chg; /* note if open for changes */
64 }
65 }
66
67 VOID
closearc(chg)68 closearc(chg) /* close an archive */
69 int chg; /* true if archive was changed */
70 {
71 if (arc) { /* if we had an initial archive */
72 fclose(arc);
73 #if !_MTS
74 if (kludge) /* kludge to update timestamp */
75 setstamp(arcname, olddate, oldtime);
76 #endif
77 }
78 if (chg) { /* if things have changed */
79 fclose(new); /* close the new copy */
80 if (arc) { /* if we had an original archive */
81 #if _MTS
82 {
83 fortran VOID permit();
84 char what[FNLEN+2];
85 /* copy permissions */ char who[FNLEN+6];
86 /* of old archive to */ int how,whotyp,wholen,info;
87 /* new copy... */ strcpy(what, newname);
88 strcat(what," ");
89 whotyp=9;
90 sprintf(who,"like %s",arcname);
91 wholen=strlen(who);
92 info=0;
93 permit(what,&how,&whotyp,&wholen,who,&info);
94 }
95 #endif
96 if (keepbak) { /* if a backup is wanted */
97 unlink(bakname); /* erase any old copies */
98 if (move(arcname, bakname))
99 arcdie("Cannot rename %s to %s", arcname, bakname);
100 printf("Keeping backup archive: %s\n", bakname);
101 } else if (unlink(arcname))
102 arcdie("Cannot delete old archive: %s", arcname);
103 }
104 if (move(newname, arcname))
105 arcdie("Cannot move %s to %s", newname, arcname);
106 #if !_MTS
107 setstamp(arcname, arcdate, arctime);
108 #endif
109 }
110 }
111
112 /*
113 * CRC computation logic
114 *
115 * The logic for this method of calculating the CRC 16 bit polynomial is taken
116 * from an article by David Schwaderer in the April 1985 issue of PC Tech
117 * Journal.
118 */
119
120 static short crctab[] = /* CRC lookup table */
121 {
122 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
123 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
124 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
125 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
126 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
127 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
128 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
129 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
130 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
131 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
132 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
133 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
134 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
135 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
136 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
137 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
138 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
139 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
140 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
141 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
142 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
143 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
144 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
145 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
146 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
147 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
148 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
149 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
150 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
151 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
152 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
153 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
154 };
155
156 /*
157 * Update a CRC check on the given buffer.
158 */
159
160 int
crcbuf(crc,len,buf)161 crcbuf(crc, len, buf)
162 register int crc; /* running CRC value */
163 register u_int len;
164 register u_char *buf;
165 {
166 register u_int i;
167
168 for (i=0; i<len; i++)
169 crc = ((crc >> 8) & 0xff) ^ crctab[(crc ^ *buf++) & 0xff];
170
171 return (crc);
172 }
173