#ifdef MSDOS /* { */ #include "ndir.h" #include char *malloc(); #define MAX_PATH (64+3) /* maximum path length in msdos */ /* +3 for the drive selector */ DIR * opendir(dir) char *dir; { register DIR *dirp; register char *p; short cf, ecode; union REGS r; struct SREGS s; static char add[] = "\\*.*"; char nbuf[MAX_PATH]; if(strlen(dir) + 5 >= MAX_PATH) /* check max path length */ return(NULL); dirp = (DIR *)malloc(sizeof(DIR)); if(dirp == NULL) return(NULL); /* convert / to backslash */ for(p = nbuf ; *dir ; dir++) if(*dir == '/') *p++ = '\\'; else *p++ = *dir; dir = add; if(*(p-1) == '\\' || *(p-1) == ':') dir++; while(*p++ = *dir++); segread(&s); dirp->_dta_dtaseg = s.ds; dirp->_dta_set = 1; r.h.ah = 0x2f; /* get dta */ intdosx(&r, &r, &s); dirp->_dta_adr = r.x.bx; dirp->_dta_seg = s.es; r.h.ah = 0x1a; /* set dta */ r.x.dx = (int)&dirp->msdos_info; s.ds = dirp->_dta_dtaseg; intdosx(&r, &r, &s); /* * now get first match */ r.h.ah = 0x4e; r.x.cx = 0x37; /* all attributes */ r.x.dx = (int)nbuf; s.ds = dirp->_dta_dtaseg; intdosx(&r, &r, &s); cf = r.x.cflag; /* get error status */ r.x.bx = dirp->_dta_adr; s.es = dirp->_dta_seg; r.h.ah = 0x1a; /* set dta back */ intdosx(&r, &r, &s); if (cf) { /* error */ free( (char *)dirp); return(NULL); } dirp->msdos_info.dta_fname[13] = 0; /* zap for later */ return(dirp); } struct direct * readdir(dirp) DIR *dirp; { union REGS r; struct SREGS s; short cf; register struct direct *dp; char *p, *q; /* if first call to readdir then just return info */ dp = &dirp->_u; if(dirp->_dta_set) { dirp->_dta_set = 0; goto out; } /* set dta address */ r.h.ah = 0x1a; r.x.dx = (int)&dirp->msdos_info; s.ds = dirp->_dta_dtaseg; intdosx(&r, &r, &s); r.h.ah = 0x4f; /* search for next match */ intdos(&r, &r); cf = r.x.cflag; /* * set dta back */ r.x.bx = dirp->_dta_adr; s.es = dirp->_dta_seg; r.h.ah = 0x1a; intdosx(&r, &r, &s); if (cf) /* error = end of directory */ return(NULL); out: for(p = dp->d_name, q = dirp->msdos_info.dta_fname ; *q ; p++, q++) if(*q >= 'A' && *q <= 'Z') *p = *q - 'A' + 'a'; else *p = *q; *p = 0; dp->d_namlen = strlen(dp->d_name); dp->d_reclen = DIRSIZ(dp); return(dp); } void closedir(dirp) DIR *dirp; { free( (char *)dirp); } #endif /* } */