Annotation of uae/src/od-win32/fsdb_win32.c, revision 1.1.1.1

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 Win32 version.
                      7:   *
                      8:   * Copyright 1997 Mathias Ortmann
                      9:   * Copyright 1999 Bernd Schmidt
                     10:   */
                     11: 
                     12: #include "sysconfig.h"
                     13: #include "sysdeps.h"
                     14: 
                     15: #include "fsdb.h"
                     16: 
                     17: /* Return nonzero for any name we can't create on the native filesystem.  */
                     18: int fsdb_name_invalid (const char *n)
                     19: {
                     20:     char a = n[0];
                     21:     char b = (a == '\0' ? a : n[1]);
                     22:     char c = (b == '\0' ? b : n[2]);
                     23: 
                     24:     if (a >= 'a' && a <= 'z')
                     25:        a -= 32;
                     26:     if (b >= 'a' && b <= 'z')
                     27:        b -= 32;
                     28:     if (c >= 'a' && c <= 'z')
                     29:        c -= 32;
                     30: 
                     31:     if ((a == 'A' && b == 'U' && c == 'X')
                     32:        || (a == 'C' && b == 'O' && c == 'N')
                     33:        || (a == 'P' && b == 'R' && c == 'N')
                     34:        || (a == 'N' && b == 'U' && c == 'L'))
                     35:        return 1;
                     36: 
                     37:     if (strchr (n, '\\') != 0)
                     38:        return 1;
                     39: 
                     40:     if (strcmp (n, FSDB_FILE) == 0)
                     41:        return 1;
                     42:     if (n[0] != '.')
                     43:        return 0;
                     44:     if (n[1] == '\0')
                     45:        return 1;
                     46:     return n[1] == '.' && n[2] == '\0';
                     47: }
                     48: 
                     49: /* For an a_inode we have newly created based on a filename we found on the
                     50:  * native fs, fill in information about this file/directory.  */
                     51: void fsdb_fill_file_attrs (a_inode *aino)
                     52: {
                     53:     struct stat statbuf;
                     54:     /* This really shouldn't happen...  */
                     55:     if (stat (aino->nname, &statbuf) == -1)
                     56:        return;
                     57:     aino->dir = S_ISDIR (statbuf.st_mode) ? 1 : 0;
                     58:     aino->amigaos_mode = ((S_IXUSR & statbuf.st_mode ? 0 : A_FIBF_EXECUTE)
                     59:                          | (S_IWUSR & statbuf.st_mode ? 0 : A_FIBF_WRITE)
                     60:                          | (S_IRUSR & statbuf.st_mode ? 0 : A_FIBF_READ));
                     61: }
                     62: 
                     63: int fsdb_set_file_attrs (a_inode *aino, int mask)
                     64: {
                     65:     struct stat statbuf;
                     66:     int mode;
                     67: 
                     68:     if (stat (aino->nname, &statbuf) == -1)
                     69:        return ERROR_OBJECT_NOT_FOUND;
                     70: 
                     71:     mode = statbuf.st_mode;
                     72:     /* Unix dirs behave differently than AmigaOS ones.  */
                     73:     if (! aino->dir) {
                     74:        if (mask & A_FIBF_READ)
                     75:            mode &= ~S_IRUSR;
                     76:        else
                     77:            mode |= S_IRUSR;
                     78: 
                     79:        if (mask & A_FIBF_WRITE)
                     80:            mode &= ~S_IWUSR;
                     81:        else
                     82:            mode |= S_IWUSR;
                     83: 
                     84:        if (mask & A_FIBF_EXECUTE)
                     85:            mode &= ~S_IXUSR;
                     86:        else
                     87:            mode |= S_IXUSR;
                     88: 
                     89:        chmod (aino->nname, mode);
                     90:     }
                     91: 
                     92:     aino->amigaos_mode = mask;
                     93:     aino->dirty = 1;
                     94:     return 0;
                     95: }
                     96: 
                     97: /* Return nonzero if we can represent the amigaos_mode of AINO within the
                     98:  * native FS.  Return zero if that is not possible.  */
                     99: int fsdb_mode_representable_p (const a_inode *aino)
                    100: {
                    101:     if (aino->dir)
                    102:        return aino->amigaos_mode == 0;
                    103:     return (aino->amigaos_mode & (A_FIBF_DELETE | A_FIBF_SCRIPT | A_FIBF_PURE)) == 0;
                    104: }
                    105: 
                    106: char *fsdb_create_unique_nname (a_inode *base, const char *suggestion)
                    107: {
                    108:     char *c;
                    109:     char tmp[256] = "__uae___";
                    110:     strncat (tmp, suggestion, 240);
                    111: 
                    112:     /* @@@ Brian... this may or may not need fixing.  */
                    113:     while ((c = strchr (tmp, '\\')) != 0)
                    114:        *c = '_';
                    115:     while ((c = strchr (tmp, '.')) != 0)
                    116:        *c = '_';
                    117: 
                    118:     for (;;) {
                    119:        int i;
                    120:        char *p = build_nname (base->nname, tmp);
                    121:        if (access (p, R_OK) < 0 && errno == ENOENT) {
                    122:            printf ("unique name: %s\n", p);
                    123:            return p;
                    124:        }
                    125:        free (p);
                    126: 
                    127:        /* tmpnam isn't reentrant and I don't really want to hack configure
                    128:         * right now to see whether tmpnam_r is available...  */
                    129:        for (i = 0; i < 8; i++) {
                    130:            tmp[i] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[random () % 63];
                    131:        }
                    132:     }
                    133: }

unix.superglobalmegacorp.com

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