|
|
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.