static int find_ino (char *dir, struct stat *sb, char *name) { char _name[PATH_MAX]; char *where = _name; long drv; struct stat testsb; struct dbuf { long ino; char name[NAME_MAX + 1]; } dbuf; drv = Dopendir (dir, 0); if ((drv & 0xff000000L) == 0xff000000L) return 0; while (*dir) *where++ = *dir++; while (Dreaddir (sizeof (dbuf), drv, &dbuf) == 0) { strcpy (where, dbuf.name); if (__sys_stat (_name, &testsb, 0, 0)) continue; if (testsb.st_dev == sb->st_dev && testsb.st_ino == sb->st_ino) { Dclosedir (drv); _dos2unx (_name, name, L_ctermid); return 1; } } Dclosedir (drv); return 0; }
XDIR *x_opendir(const char *path, int *error) { #if _MINT_ if (mint) /* HR 151102 */ { XDIR *dir; if ((dir = malloc(sizeof(XDIR))) == NULL) *error = ENSMEM; else { dir->path = (char *) path; dir->type = x_inq_xfs(path, nil) ? 0 : 1; /* HR 151102 */ if (dir->type) { /* * Dos file system. */ dir->data.gdata.first = 1; #if USE_gemdos dir->data.gdata.old_dta = (DTA *) gemdos(47); gemdos(26, &dir->data.gdata.dta); #else dir->data.gdata.old_dta = Fgetdta(); Fsetdta(&dir->data.gdata.dta); #endif *error = 0; } else { /* * File system with long filenames. */ #if USE_gemdos if (((dir->data.handle = gemdos(0x128, path, 0)) & 0xFF000000L) == 0xFF000000L) #else if (((dir->data.handle = Dopendir(path, 0)) & 0xFF000000L) == 0xFF000000L) #endif { *error = xerror((int) dir->data.handle); free(dir); dir = NULL; } } } return dir; } else #endif { XDIR *dir; if ((dir = malloc(sizeof(XDIR))) == NULL) *error = ENSMEM; else { dir->path = (char *) path; dir->data.gdata.first = 1; #if USE_gemdos dir->data.gdata.old_dta = (DTA *) gemdos(47); gemdos(26, &dir->data.gdata.dta); #else dir->data.gdata.old_dta = Fgetdta(); Fsetdta(&dir->data.gdata.dta); #endif *error = 0; } return dir; } }