Annotation of uae/src/fsdb_unix.c, revision 1.1.1.2

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * Library of functions to make emulated filesystem as independent as
                      5:   * possible of the host filesystem's capabilities.
                      6:   * This is the Unix version.
                      7:   *
                      8:   * Copyright 1999 Bernd Schmidt
                      9:   */
                     10: 
                     11: #include "sysconfig.h"
                     12: #include "sysdeps.h"
                     13: 
                     14: #include "fsdb.h"
                     15: 
                     16: /* Return nonzero for any name we can't create on the native filesystem.  */
                     17: int fsdb_name_invalid (const char *n)
                     18: {
                     19:     if (strcmp (n, FSDB_FILE) == 0)
                     20:        return 1;
                     21:     if (n[0] != '.')
                     22:        return 0;
                     23:     if (n[1] == '\0')
                     24:        return 1;
                     25:     return n[1] == '.' && n[2] == '\0';
                     26: }
                     27: 
                     28: /* For an a_inode we have newly created based on a filename we found on the
                     29:  * native fs, fill in information about this file/directory.  */
                     30: void fsdb_fill_file_attrs (a_inode *aino)
                     31: {
                     32:     struct stat statbuf;
                     33:     /* This really shouldn't happen...  */
                     34:     if (stat (aino->nname, &statbuf) == -1)
                     35:        return;
                     36:     aino->dir = S_ISDIR (statbuf.st_mode) ? 1 : 0;
                     37:     aino->amigaos_mode = ((S_IXUSR & statbuf.st_mode ? 0 : A_FIBF_EXECUTE)
                     38:                          | (S_IWUSR & statbuf.st_mode ? 0 : A_FIBF_WRITE)
                     39:                          | (S_IRUSR & statbuf.st_mode ? 0 : A_FIBF_READ));
                     40: }
                     41: 
                     42: int fsdb_set_file_attrs (a_inode *aino, int mask)
                     43: {
                     44:     struct stat statbuf;
                     45:     int mode;
                     46: 
                     47:     if (stat (aino->nname, &statbuf) == -1)
1.1.1.2 ! root       48:        return ERROR_OBJECT_NOT_AROUND;
1.1       root       49: 
                     50:     mode = statbuf.st_mode;
                     51:     /* Unix dirs behave differently than AmigaOS ones.  */
                     52:     if (! aino->dir) {
                     53:        if (mask & A_FIBF_READ)
                     54:            mode &= ~S_IRUSR;
                     55:        else
                     56:            mode |= S_IRUSR;
                     57: 
                     58:        if (mask & A_FIBF_WRITE)
                     59:            mode &= ~S_IWUSR;
                     60:        else
                     61:            mode |= S_IWUSR;
                     62: 
                     63:        if (mask & A_FIBF_EXECUTE)
                     64:            mode &= ~S_IXUSR;
                     65:        else
                     66:            mode |= S_IXUSR;
                     67: 
                     68:        chmod (aino->nname, mode);
                     69:     }
                     70: 
                     71:     aino->amigaos_mode = mask;
                     72:     aino->dirty = 1;
                     73:     return 0;
                     74: }
                     75: 
                     76: /* Return nonzero if we can represent the amigaos_mode of AINO within the
                     77:  * native FS.  Return zero if that is not possible.  */
                     78: int fsdb_mode_representable_p (const a_inode *aino)
                     79: {
                     80:     if (aino->dir)
                     81:        return aino->amigaos_mode == 0;
                     82:     return (aino->amigaos_mode & (A_FIBF_DELETE | A_FIBF_SCRIPT | A_FIBF_PURE)) == 0;
                     83: }
                     84: 
                     85: char *fsdb_create_unique_nname (a_inode *base, const char *suggestion)
                     86: {
                     87:     char tmp[256] = "__uae___";
                     88:     strncat (tmp, suggestion, 240);
                     89:     for (;;) {
                     90:        int i;
                     91:        char *p = build_nname (base->nname, tmp);
                     92:        if (access (p, R_OK) < 0 && errno == ENOENT) {
                     93:            printf ("unique name: %s\n", p);
                     94:            return p;
                     95:        }
                     96:        free (p);
                     97: 
                     98:        /* tmpnam isn't reentrant and I don't really want to hack configure
                     99:         * right now to see whether tmpnam_r is available...  */
                    100:        for (i = 0; i < 8; i++) {
                    101:            tmp[i] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[random () % 63];
                    102:        }
                    103:     }
                    104: }

unix.superglobalmegacorp.com

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