Annotation of coherent/g/usr/bin/vi/amisysio.c, revision 1.1

1.1     ! root        1: /* amisysio.c */
        !             2: 
        !             3: /*-
        !             4:  *     Mike Rieser                             Dale Rahn
        !             5:  *     2410 Happy Hollow Rd. Apt D-10          540 Vine St.
        !             6:  *     West Lafayette, IN 47906                West Lafayette, IN 47906
        !             7:  *     [email protected]           [email protected]
        !             8:  */
        !             9: 
        !            10: #if AZTEC_C
        !            11: 
        !            12: /*
        !            13:  * This file is only to supply behavior a little closer to UNIX for the Aztec
        !            14:  * Library functions stat() and creat().
        !            15:  * 
        !            16:  * If you don't have a decent stat() function move the above #if to the
        !            17:  * end of the stat() function.
        !            18:  *
        !            19:  * The creat() function is pretty Aztec specific.
        !            20:  */
        !            21: 
        !            22: #include "amistat.h"
        !            23: #include <fcntl.h>
        !            24: #include <string.h>
        !            25: #include <dos/dos.h>
        !            26: #include <dos/dosextens.h>
        !            27: #include <clib/exec_protos.h>
        !            28: #include <clib/dos_protos.h>
        !            29: 
        !            30: #if AZTEC_C
        !            31: #include <pragmas/exec_lib.h>
        !            32: #include <pragmas/dos_lib.h>
        !            33: #else
        !            34: #include <pragmas/exec.h>
        !            35: #include <pragmas/dos.h>
        !            36: #endif
        !            37: 
        !            38: /*-
        !            39:  *  struct InfoData {
        !            40:  *     LONG   id_NumSoftErrors;     // number of soft errors on disk
        !            41:  *     LONG   id_UnitNumber;        // Which unit disk is (was) mounted on
        !            42:  *     LONG   id_DiskState;         // See defines below
        !            43:  *     LONG   id_NumBlocks;         // Number of blocks on disk
        !            44:  *     LONG   id_NumBlocksUsed;     // Number of block in use
        !            45:  *     LONG   id_BytesPerBlock;
        !            46:  *     LONG   id_DiskType;          // Disk Type code
        !            47:  *     BPTR   id_VolumeNode;        // BCPL pointer to volume node
        !            48:  *     LONG   id_InUse;             // Flag, zero if not in use
        !            49:  * }; // InfoData
        !            50:  * returned by Info(), must be on a 4 byte boundary
        !            51: */
        !            52: /*-
        !            53:  *  struct FileInfoBlock {
        !            54:  *     LONG   fib_DiskKey;
        !            55:  *     LONG   fib_DirEntryType;  // Type of Directory. If < 0, then a plain file.
        !            56:  *                              // If > 0 a directory
        !            57:  *     char   fib_FileName[108]; // Null terminated. Max 30 chars used for now
        !            58:  *     LONG   fib_Protection;    // bit mask of protection, rwxd are 3-0.
        !            59:  *     LONG   fib_EntryType;
        !            60:  *     LONG   fib_Size;          // Number of bytes in file
        !            61:  *     LONG   fib_NumBlocks;     // Number of blocks in file
        !            62:  *     struct DateStamp fib_Date;// Date file last changed
        !            63:  *     char   fib_Comment[80];   // Null terminated comment associated with file
        !            64:  *     char   fib_Reserved[36];
        !            65:  *  }; // FileInfoBlock
        !            66:  * filled by Examin(), must be on a 4 byte boundary
        !            67: */
        !            68: 
        !            69: int
        !            70: stat(char   *path, struct stat *statbuf)
        !            71: {
        !            72:     struct FileLock *lock;
        !            73:     struct FileInfoBlock *pFIB;
        !            74:     struct InfoData *pID;
        !            75:     int          success = 0;
        !            76: 
        !            77:     /* Zero the stat buffer. */
        !            78:     memset(statbuf, '\000', sizeof(struct stat));
        !            79: 
        !            80:     /* Get Lock */
        !            81:     lock = (struct FileLock *) Lock((UBYTE *) path, ACCESS_READ);
        !            82:     if ((struct FileLock *) 0 == lock)
        !            83:     {                                  /* Lock() fails if file is a softlink */
        !            84:        if (ERROR_IS_SOFT_LINK == IoErr())
        !            85:        {
        !            86:            statbuf->st_mode |= S_IFLNK;/* symbolic link */
        !            87:            return 0;
        !            88:        } else
        !            89:            return -1;
        !            90:     }
        !            91:     /* Allocate InfoData */
        !            92:     pID = (struct InfoData *) AllocMem(sizeof(struct InfoData), 0);
        !            93: 
        !            94:     if ((struct InfoData *) 0 == pID)
        !            95:     {
        !            96:        UnLock((BPTR) lock);
        !            97:        return -1;
        !            98:     }
        !            99:     /* Allocate FileInfoBlock */
        !           100:     pFIB = (struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock), 0);
        !           101: 
        !           102:     if ((struct FileInfoBlock *) 0 == pFIB)
        !           103:     {
        !           104:        FreeMem(pID, sizeof(struct InfoData));
        !           105: 
        !           106:        UnLock((BPTR) lock);
        !           107:        return -1;
        !           108:     }
        !           109:     /* Fill InfoData */
        !           110:     if (DOSFALSE == Info((BPTR) lock, pID))
        !           111:     {                                  /* Not critical */
        !           112:        FreeMem(pID, sizeof(struct InfoData));
        !           113: 
        !           114:        pID = (struct InfoData *) 0;
        !           115:     }
        !           116:     /* Fill FileInfoBlock */
        !           117:     if (DOSFALSE == Examine((BPTR) lock, pFIB))
        !           118:     {
        !           119:        FreeMem(pID, sizeof(struct InfoData));
        !           120:        FreeMem(pFIB, sizeof(struct FileInfoBlock));
        !           121: 
        !           122:        UnLock((BPTR) lock);
        !           123:        return -1;
        !           124:     }
        !           125:     statbuf->st_ino = pFIB->fib_DiskKey;/* inode's number */
        !           126:     ++statbuf->st_nlink;
        !           127: 
        !           128:     if (pFIB->fib_DirEntryType < 0)
        !           129:     {                                  /* plain file */
        !           130:        statbuf->st_mode |= S_IFREG;
        !           131:     } else
        !           132:     {                                  /* >= 0 then directory */
        !           133:        statbuf->st_mode |= S_IFDIR;
        !           134:     }
        !           135:     if (pFIB->fib_DirEntryType == ST_SOFTLINK)
        !           136:     {
        !           137:        statbuf->st_mode |= S_IFLNK;
        !           138:     }
        !           139:     if (pFIB->fib_DirEntryType == ST_SOFTLINK
        !           140:        || pFIB->fib_DirEntryType == ST_LINKDIR
        !           141:        || pFIB->fib_DirEntryType == ST_LINKFILE)
        !           142:     {
        !           143:        ++statbuf->st_nlink;
        !           144:     }
        !           145:     statbuf->st_flags = statbuf->st_attr = pFIB->fib_Protection;
        !           146: 
        !           147:     /* mask off arwed -> rwx and shift to owner bits */
        !           148:     statbuf->st_mode |= ((~0 ^ pFIB->fib_Protection) & 016) << 5;
        !           149: 
        !           150:     statbuf->st_size = pFIB->fib_Size;
        !           151:     if (pID)
        !           152:        statbuf->st_blksize = pID->id_BytesPerBlock;    /* optimal blocksize for
        !           153:                                                         * I/O */
        !           154:     statbuf->st_blocks = pFIB->fib_NumBlocks;  /* actual number of blocks
        !           155:                                                 * allocated */
        !           156:     statbuf->st_atime =
        !           157:        statbuf->st_mtime =
        !           158:        statbuf->st_ctime = pFIB->fib_Date.ds_Days * 24 * 60 * 60 +
        !           159:        pFIB->fib_Date.ds_Minute * 60 +
        !           160:        pFIB->fib_Date.ds_Tick / TICKS_PER_SECOND;
        !           161: 
        !           162:     UnLock((BPTR) lock);
        !           163:     if (pID)
        !           164:        FreeMem(pID, sizeof(struct InfoData));
        !           165:     FreeMem(pFIB, sizeof(struct FileInfoBlock));
        !           166: 
        !           167:     return 0;
        !           168: }
        !           169: 
        !           170: 
        !           171: /*
        !           172:  * Aztec creat() replacement.
        !           173:  * 
        !           174:  * This one doesn't delete the file, thereby preserving the original file
        !           175:  * protection bits!
        !           176:  */
        !           177: int
        !           178: creat(const char *name, int mode)
        !           179: {
        !           180:     int          c = 0;
        !           181:     BPTR         fh;
        !           182: 
        !           183:     if (isOldDOS())
        !           184:        return (_creat(name, mode));
        !           185: 
        !           186:     fh = Open((UBYTE *) name, MODE_READWRITE);
        !           187:     if ((BPTR) 0 == fh)
        !           188:        return (_open(name, O_WRONLY | O_TRUNC | O_CREAT, mode));
        !           189:     SetFileSize(fh, 0, OFFSET_BEGINNING);      /* Set back to beginning */
        !           190:     Close(fh);                         /* Truncate at the start */
        !           191: 
        !           192:     return (_open(name, O_WRONLY, mode));      /* actually get a fd */
        !           193: }
        !           194: 
        !           195: #endif

unix.superglobalmegacorp.com

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