|
|
1.1 root 1: #include <stdio.h>
2: #include <string.h>
3: #include <stdlib.h>
4: #include "c370.h"
5:
6: void printhex( void *buf, int len )
7: { int i;
8: char *s = buf;
9: while (len >= 0) {
10: for (i=0;i < 16 && len >= 0; s++,i++,len--) {
11: int ch = (*s) & 0xff;
12: printf( "%3d ", ch );
13: }
14: printf( "\n" );
15: }
16: printf( "\n" );
17: }
18:
19: #undef fseek
20: int myfseek( FILE *stream, long int offset, int origin )
21: { int i;
22: i = fseek( stream, offset, origin );
23: if (i != 0 && origin == SEEK_CUR) {
24: i = fseek( stream, ftell(stream) + offset, SEEK_SET );
25: if (i != 0)
26: printf("myfseek: ftell=%i, orig=%i, offset=%i, ret=%i\n",
27: ftell(stream), origin, offset, i );
28: }
29: return i;
30: }
31:
32: #undef fread
33: int myfread( void *buffer, size_t size, size_t count, FILE *stream )
34: { size_t i;
35: i = fread( buffer, size, count, stream );
36: if (count == 1 && size == 1 && i == 1) { /* skip padding zeroes */
37: char ch = *(char *)buffer;
38: fpos_t pos;
39: fgetpos( stream, &pos );
40: while ( ch == '\0' && fread(&ch, 1, 1, stream) == 1);
41: fsetpos( stream, &pos );
42: if (ch == '\0')
43: return 0;
44: }
45: return i;
46: }
47:
48: int fileno( FILE *fp )
49: {
50: return (int)fp;
51: }
52:
53: int access( const char *filename, int how )
54: {
55: struct stat buf;
56: return stat( filename, &buf ); /* dummy 'access' */
57: }
58:
59: int close( int fd )
60: {
61: return fclose( (FILE *)fd );
62: }
63:
64: int isatty( int fd )
65: {
66: return (fd==((int)stdin) || fd==((int)stdout) || fd==((int)stderr));
67: }
68:
69: off_t lseek( int fd, off_t offset, int whence )
70: {
71: return fseek( (FILE *)fd, offset, whence );
72: }
73:
74: size_t read( int fd, void *buf, size_t size )
75: {
76: return fread( buf, 1, size, (FILE *)fd );
77: }
78:
79: int unlink( char *filename )
80: {
81: return remove( filename );
82: }
83:
84: int write( int fd, void *buf, size_t len )
85: {
86: return fwrite( buf, 1, len, (FILE *)fd );
87: }
88:
89: char dcb_flags[50];
90:
91: static void access2mode( int access, char *mode)
92: {
93: /* O_EXCL not supported */
94: switch (access & ~(O_BINARY | O_MEMORY | O_EXCL | O_DCB)) {
95: case O_RDONLY : strcpy( mode, "r" ); break;
96: case O_RDWR : strcpy( mode, "r+" ); break;
97: case O_WRONLY :
98: case O_CREAT | O_WRONLY : strcpy( mode, "w" ); break;
99: case O_CREAT | O_RDWR : strcpy( mode, "w+" ); break;
100: case O_APPEND | O_WRONLY :
101: case O_APPEND | O_CREAT | O_WRONLY : strcpy( mode, "a" ); break;
102: case O_APPEND | O_RDWR :
103: case O_APPEND | O_CREAT | O_RDWR : strcpy( mode, "a+" ); break;
104: default : strcpy( mode, "" );
105: }
106: if (access & O_BINARY) strcat( mode, "b" );
107: if (access & O_MEMORY) strcat( mode, ",type=memory" );
108: if (access & O_RECORD) strcat( mode, ",type=record" );
109: if (access & O_DCB) strcat( mode, dcb_flags );
110: }
111:
112: int open(const char *path, int access)
113: {
114: char mode[30];
115: FILE *f;
116: access2mode( access, mode );
117: f = fopen( path, mode );
118: return (f == NULL ? -1 : fileno(f) );
119: }
120:
121: int eof( int fd )
122: {
123: return feof( (FILE *)fd );
124: }
125:
126: int tell( int fd )
127: {
128: return ftell( (FILE *)fd );
129: }
130:
131: int setmode(int fd, int access)
132: {
133: char mode[30];
134: FILE *f;
135:
136: switch (fd) {
137: case 0: access |= O_RDONLY; fd = fileno(stdin); break;
138: case 1: access |= O_WRONLY; fd = fileno(stdout); break;
139: case 2: access |= O_WRONLY; fd = fileno(stderr); break;
140: }
141: access2mode( access, mode );
142: f = freopen( "", mode, (FILE *)fd );
143: return (f == NULL ? -1 : fileno(f) );
144: }
145:
146: int chmod( const char* filename, mode_t mode )
147: {
148: return 0;
149: }
150:
151: int stat(const char *filename, struct stat *buf )
152: {
153: if ((buf->fp = fopen(filename, "r")) != NULL) {
154: fldata_t fdata;
155: if (fldata( buf->fp, buf->fname, &fdata ) == 0) {
156: buf->st_dev = fdata.__device;
157: buf->st_mode = *(short *)(&fdata);
158: }
159: strcpy( buf->fname, filename );
160: fseek( buf->fp, 0, SEEK_END );
161: buf->st_size = ftell( buf->fp );
162: fclose(buf->fp);
163: }
164: return (buf->fp != NULL ? 0 : -1);
165: }
166:
167: int fstat(int fd, struct stat *buf )
168: {
169: fldata_t fdata;
170:
171: if ((fd != -1) && (fldata( (FILE *)fd, buf->fname, &fdata ) == 0))
172: {
173: buf->st_dev = fdata.__device;
174: buf->st_mode = *(short *)(&fdata);
175: buf->fp = (FILE *)fd;
176: return 0;
177: }
178: return -1;
179: }
180:
181:
182: #define ALIAS_MASK (unsigned int) 0x80
183: #define SKIP_MASK (unsigned int) 0x1F
184: #define TTRLEN 3
185: #define RECLEN 254
186: typedef _Packed struct {
187: unsigned short int count;
188: char rest[RECLEN];
189: } RECORD;
190: char *endmark = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
191:
192: static int gen_node( DIR *dirp, RECORD *recptr )
193: {
194: char *ptr, *name, ttr[TTRLEN];
195: int skip, count = 2;
196: unsigned int info_byte, alias, ttrn;
197: struct dirent *new;
198:
199: ptr = recptr->rest;
200: while (count < recptr->count) {
201: if (!memcmp( ptr, endmark, NAMELEN ))
202: return 1;
203: name = ptr; /* member name */
204: ptr += NAMELEN;
205: memcpy( ttr, ptr, TTRLEN ); /* ttr name */
206: ptr += TTRLEN;
207: info_byte = (unsigned int) (*ptr); /* info byte */
208: if ( !(info_byte & ALIAS_MASK) ) { /* no alias */
209: new = malloc( sizeof(struct dirent) );
210: if (dirp->D_list == NULL)
211: dirp->D_list = dirp->D_curpos = new;
212: else
213: dirp->D_curpos = (dirp->D_curpos->d_next = new);
214: new->d_next = NULL;
215: memcpy( new->d_name, name, NAMELEN );
216: new->d_name[NAMELEN] = '\0';
217: if ((name = strchr( new->d_name, ' ' )) != NULL)
218: *name = '\0'; /* skip trailing blanks */
219: }
220: skip = (info_byte & SKIP_MASK) * 2 + 1;
221: ptr += skip;
222: count += (TTRLEN + NAMELEN + skip);
223: }
224: return 0;
225: }
226:
227: DIR *opendir(const char *dirname)
228: {
229: int bytes, list_end = 0;
230: DIR *dirp;
231: FILE *fp;
232: RECORD rec;
233:
234: fp = fopen( dirname, "rb" );
235: if (fp != NULL) {
236: dirp = malloc( sizeof(DIR) );
237: if (dirp != NULL) {
238: dirp->D_list = dirp->D_curpos = NULL;
239: strcpy( dirp->D_path, dirname );
240: do {
241: bytes = fread( &rec, 1, sizeof(rec), fp );
242: if (bytes == sizeof(rec))
243: list_end = gen_node( dirp, &rec );
244: } while (!feof(fp) && !list_end);
245: fclose( fp );
246: dirp->D_curpos = dirp->D_list;
247: return dirp;
248: }
249: fclose( fp );
250: }
251: return NULL;
252: }
253:
254: struct dirent *readdir(DIR *dirp)
255: {
256: struct dirent *cur;
257:
258: cur = dirp->D_curpos;
259: if (cur != NULL)
260: dirp->D_curpos = cur->d_next;
261: return cur;
262: }
263:
264: void rewinddir(DIR *dirp)
265: {
266: dirp->D_curpos = dirp->D_list;
267: }
268:
269: int closedir(DIR *dirp)
270: {
271: struct dirent *node;
272:
273: while (dirp->D_list != NULL) {
274: node = dirp->D_list;
275: dirp->D_list = dirp->D_list->d_next;
276: free( node );
277: }
278: free( dirp );
279: return 0;
280: }
281:
282:
283:
284:
285: /* ebcdic-ascii converting, accustom to your local MVS-settings */
286:
287: unsigned char ebcdic_ascii[] = {
288: 0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00, 0x00,0x00,0x00,0x0b,0x0c,0x0d,0x00,0x00,
289: 0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
290: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
291: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
292: 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2e,0x3c,0x28,0x2b,0x7c,
293: 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x24,0x2a,0x29,0x3b,0x5e,
294: 0x2d,0x2f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0x2c,0x25,0x5f,0x3e,0x3f,
295: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22,
296: 0x00,0x61,0x62,0x63,0x64,0x65,0x66,0x67, 0x68,0x69,0x00,0x00,0x00,0x00,0x00,0x00,
297: 0x00,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70, 0x71,0x72,0x00,0x00,0x00,0x00,0x00,0x00,
298: 0x00,0x7e,0x73,0x74,0x75,0x76,0x77,0x78, 0x79,0x7a,0x00,0x00,0x00,0x5b,0x00,0x00,
299: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x5d,0x00,0x00,
300: 0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x00,0x00,0x00,0x00,0x00,0x00,
301: 0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50, 0x51,0x52,0x00,0x00,0x00,0x00,0x00,0x00,
302: 0x5c,0x00,0x53,0x54,0x55,0x56,0x57,0x58, 0x59,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,
303: 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x00,0x00,0x00,0x00,0x00,0x00
304: };
305:
306: unsigned char ascii_ebcdic[] = {
307: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f, 0x16,0x05,0x15,0x0b,0x0c,0x0d,0x00,0x00,
308: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
309: 0x40,0x5a,0x7f,0x7b,0x5b,0x6c,0x50,0x7d, 0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61,
310: 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, 0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f,
311: 0x7c,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, 0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,
312: 0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6, 0xe7,0xe8,0xe9,0xad,0xe0,0xbd,0x5f,0x6d,
313: 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96,
314: 0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6, 0xa7,0xa8,0xa9,0xc0,0x6a,0xd0,0xa1,0x00,
315: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
316: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
317: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
318: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
319: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
320: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
321: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
322: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
323: };
324:
325: void ebcdic2ascii( unsigned char *buf, unsigned size )
326: {
327: while (size--)
328: *(buf+size) = ebcdic_ascii[ *(buf+size) ];
329: }
330:
331: void ascii2ebcdic( unsigned char *buf, unsigned size )
332: {
333: while (size--)
334: *(buf+size) = ascii_ebcdic[ *(buf+size) ];
335: }
336:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.