Annotation of pgp/src/c370.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.