* @(#)msd_dir.c 1.4 87/11/06 Public Domain.
* A public domain implementation of BSD directory routines for
* MS-DOS. Written by Michael Rendell ({uunet,utai}michael@garfield),
#define Newisnull(a, t) ((a = (t *) malloc(sizeof(t))) == (t *) NULL)
/* #define ATTRIBUTES (A_DIR | A_HIDDEN | A_SYSTEM) */
#define ATTRIBUTES (A_RONLY | A_SYSTEM | A_DIR)
/* what find first/next calls look use */
static char *getdirent();
static void free_dircontents();
static Dta_buf
*dtapnt
= &dtabuf
;
static union REGS reg
, nreg
;
static struct SREGS sreg
;
char nbuf
[MAXPATHLEN
+ 1];
if (stat(name
, &statb
) < 0 || (statb
.st_mode
& S_IFMT
) != S_IFDIR
)
if (Newisnull(dirp
, DIR))
if (*name
&& (c
= name
[strlen(name
) - 1]) != '\\' && c
!= '/')
(void) strcat(strcpy(nbuf
, name
), "\\*.*");
(void) strcat(strcpy(nbuf
, name
), "*.*");
dirp
->dd_contents
= dirp
->dd_cp
= (struct _dircontents
*) NULL
;
if ((s
= getdirent(nbuf
)) == (char *) NULL
)
if (Newisnull(dp
, struct _dircontents
) || (dp
->_d_entry
=
malloc((unsigned) (strlen(s
) + 1))) == (char *) NULL
)
free_dircontents(dirp
->dd_contents
);
dirp
->dd_cp
= dirp
->dd_cp
->_d_next
= dp
;
dirp
->dd_contents
= dirp
->dd_cp
= dp
;
(void) strcpy(dp
->_d_entry
, s
);
dp
->_d_next
= (struct _dircontents
*) NULL
;
} while ((s
= getdirent((char *) NULL
)) != (char *) NULL
);
dirp
->dd_cp
= dirp
->dd_contents
;
free_dircontents(dirp
->dd_contents
);
if (dirp
->dd_cp
== (struct _dircontents
*) NULL
)
return (struct direct
*) NULL
;
dp
.d_namlen
= dp
.d_reclen
=
strlen(strcpy(dp
.d_name
, dirp
->dd_cp
->_d_entry
));
strlwr(dp
.d_name
); /* JF */
dirp
->dd_cp
= dirp
->dd_cp
->_d_next
;
for (dp
= dirp
->dd_contents
; --i
>= 0 && dp
; dp
= dp
->_d_next
)
dirp
->dd_loc
= off
- (i
+ 1);
struct _dircontents
*odp
;
dp
= (odp
= dp
)->_d_next
;
if (dir
!= (char *) NULL
) { /* get first entry */
reg
.x
.dx
= (unsigned) dir
;
} else { /* get next entry */
reg
.x
.dx
= FP_OFF(dtapnt
);
sreg
.ds
= FP_SEG(dtapnt
);
reg
.x
.dx
= (unsigned) dtapnt
;
intdosx(®
, &nreg
, &sreg
);
reg
.x
.dx
= FP_OFF(dtapnt
);
sreg
.ds
= FP_SEG(dtapnt
);
intdosx(®
, &nreg
, &sreg
);