DOSFNS.C
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:22k
源码类别:

操作系统开发

开发平台:

DOS

  1. /****************************************************************/
  2. /*                                                              */
  3. /*                           dosfns.c                           */
  4. /*                                                              */
  5. /*                         DOS functions                        */
  6. /*                                                              */
  7. /*                      Copyright (c) 1995                      */
  8. /*                      Pasquale J. Villani                     */
  9. /*                      All Rights Reserved                     */
  10. /*                                                              */
  11. /* This file is part of DOS-C.                                  */
  12. /*                                                              */
  13. /* DOS-C is free software; you can redistribute it and/or       */
  14. /* modify it under the terms of the GNU General Public License  */
  15. /* as published by the Free Software Foundation; either version */
  16. /* 2, or (at your option) any later version.                    */
  17. /*                                                              */
  18. /* DOS-C is distributed in the hope that it will be useful, but */
  19. /* WITHOUT ANY WARRANTY; without even the implied warranty of   */
  20. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
  21. /* the GNU General Public License for more details.             */
  22. /*                                                              */
  23. /* You should have received a copy of the GNU General Public    */
  24. /* License along with DOS-C; see the file COPYING.  If not,     */
  25. /* write to the Free Software Foundation, 675 Mass Ave,         */
  26. /* Cambridge, MA 02139, USA.                                    */
  27. /****************************************************************/
  28. #include "../../hdr/portab.h"
  29. #ifdef VERSION_STRINGS
  30. static BYTE *dosfnsRcsId = "$Header:   C:/dos-c/src/fs/dosfns.c_v   1.9   04 Jan 1998 23:14:38   patv  $";
  31. #endif
  32. /* $Logfile:   C:/dos-c/src/fs/dosfns.c_v  $ */
  33. /* $Log:   C:/dos-c/src/fs/dosfns.c_v  $
  34.  * 
  35.  *    Rev 1.9   04 Jan 1998 23:14:38   patv
  36.  * Changed Log for strip utility
  37.  * 
  38.  *    Rev 1.8   03 Jan 1998  8:36:04   patv
  39.  * Converted data area to SDA format
  40.  * 
  41.  *    Rev 1.7   22 Jan 1997 12:59:56   patv
  42.  * pre-0.92 bug fixes
  43.  * 
  44.  *    Rev 1.6   16 Jan 1997 12:46:32   patv
  45.  * pre-Release 0.92 feature additions
  46.  * 
  47.  *    Rev 1.5   29 May 1996 21:15:20   patv
  48.  * bug fixes for v0.91a
  49.  * 
  50.  *    Rev 1.4   19 Feb 1996  3:20:08   patv
  51.  * Added NLS, int2f and config.sys processing
  52.  * 
  53.  *    Rev 1.2   01 Sep 1995 17:48:48   patv
  54.  * First GPL release.
  55.  * 
  56.  *    Rev 1.1   30 Jul 1995 20:50:24   patv
  57.  * Eliminated version strings in ipl
  58.  * 
  59.  *    Rev 1.0   02 Jul 1995  8:04:20   patv
  60.  * Initial revision.
  61.  */
  62. /* $EndLog$ */
  63. #include "globals.h"
  64. #ifdef PROTO
  65. BOOL check_break(VOID);
  66. sft FAR *get_sft(COUNT);
  67. WORD get_free_hndl(VOID);
  68. sft FAR *get_free_sft(WORD FAR *);
  69. BYTE FAR *get_root(BYTE FAR *);
  70. BOOL cmatch(COUNT, COUNT, COUNT);
  71. BOOL fnmatch(BYTE FAR *, BYTE FAR *, COUNT, COUNT);
  72. #else
  73. BOOL check_break();
  74. sft FAR *get_sft();
  75. WORD get_free_hndl();
  76. sft FAR *get_free_sft();
  77. BYTE FAR *get_root();
  78. BOOL cmatch();
  79. BOOL fnmatch();
  80. #endif
  81. BOOL 
  82. check_break (void)
  83. {
  84. if(break_ena && con_break())
  85. {
  86. handle_break();
  87. /* shouldn't return, but in case...     */
  88. return TRUE;
  89. }
  90. else
  91. return FALSE;
  92. }
  93. sft FAR *get_sft(hndl)
  94. COUNT hndl;
  95. {
  96. psp FAR *p = MK_FP(cu_psp,0);
  97. WORD sys_idx;
  98. sfttbl FAR *sp;
  99. if (hndl >= p -> ps_maxfiles)
  100.     return (sft FAR *)-1;
  101. /* Get the SFT block that contains the SFT      */
  102. if (p -> ps_filetab[hndl] == 0xff)
  103.     return (sft FAR *)-1;
  104. sys_idx = p -> ps_filetab[hndl];
  105. for(sp = sfthead; sp != (sfttbl FAR *)-1; sp = sp -> sftt_next)
  106. {
  107. if(sys_idx < sp -> sftt_count)
  108. break;
  109. else
  110. sys_idx -= sp -> sftt_count;
  111. }
  112. /* If not found, return an error                */
  113. if(sp == (sfttbl FAR *)-1)
  114. return (sft FAR *)-1;
  115. /* finally, point to the right entry            */
  116. return (sft FAR *)&(sp -> sftt_table[sys_idx]);
  117. }
  118. UCOUNT 
  119. DosRead (COUNT hndl, UCOUNT n, BYTE FAR *bp, COUNT FAR *err)
  120. {
  121. sft FAR *s;
  122. WORD sys_idx;
  123. sfttbl FAR *sp;
  124. UCOUNT ReadCount;
  125. /* Test that the handle is valid                */
  126. if(hndl < 0)
  127. {
  128. *err = DE_INVLDHNDL;
  129. return 0;
  130. }
  131. /* Get the SFT block that contains the SFT      */
  132. if((s = get_sft(hndl)) == (sft FAR *)-1)
  133. {
  134. *err = DE_INVLDHNDL;
  135. return 0;
  136. }
  137. /* If not open or write permission - exit       */
  138. if(s -> sft_count == 0 || (s -> sft_mode & SFT_MWRITE))
  139. {
  140. *err = DE_INVLDACC;
  141. return 0;
  142. }
  143. /* Do a device read if device                   */
  144. if(s -> sft_flags & SFT_FDEVICE)
  145. {
  146. request rq;
  147. /* First test for eof and exit          */
  148. /* immediately if it is                 */
  149. if(!(s -> sft_flags & SFT_FEOF) || (s -> sft_flags & SFT_FNUL))
  150. {
  151. s -> sft_flags &= ~SFT_FEOF;
  152. *err = SUCCESS;
  153. return 0;
  154. }
  155. /* Now handle raw and cooked modes      */
  156. if(s -> sft_flags & SFT_FBINARY)
  157. {
  158. rq.r_length = sizeof(request);
  159. rq.r_command = C_INPUT;
  160. rq.r_count = n;
  161. rq.r_trans = (BYTE FAR *)bp;
  162. rq.r_status = 0;
  163. execrh((request FAR *)&rq, s -> sft_dev);
  164. if(rq.r_status & S_ERROR)
  165. {
  166. REG i;
  167. BYTE buff[FNAME_SIZE+1];
  168. fbcopy(s -> sft_name, (BYTE FAR *)buff, FNAME_SIZE);
  169. buff[FNAME_SIZE+1] = 0;
  170. for(i = FNAME_SIZE; i > 0; i--)
  171. if(buff[i] == ' ')
  172. buff[i] = 0;
  173. else
  174. break;
  175. char_error(&rq, buff);
  176. }
  177. else
  178. {
  179. *err = SUCCESS;
  180. return rq.r_count;
  181. }
  182. }
  183. else if(s -> sft_flags & SFT_FSTDIN)
  184. {
  185. if(!check_break())
  186. {
  187. kb_buf.kb_size = LINESIZE - 1;
  188. kb_buf.kb_count = 0;
  189. sti((keyboard FAR *)&kb_buf);
  190. fbcopy((BYTE FAR *)kb_buf.kb_buf, bp, kb_buf.kb_count);
  191. *err = SUCCESS;
  192. return kb_buf.kb_count;
  193. }
  194. else
  195. {
  196. *err = SUCCESS;
  197. return 0;
  198. }
  199. }
  200. else
  201. {
  202. if(!check_break())
  203. {
  204. *bp = _sti();
  205. *err = SUCCESS;
  206. return 1;
  207. }
  208. else
  209. {
  210. *err = SUCCESS;
  211. return 0;
  212. }
  213. }
  214. }
  215. else /* a block read                            */
  216. {
  217. if(!check_break())
  218. {
  219. COUNT rc;
  220. ReadCount = rdwrblock(s -> sft_status, bp, n, XFR_READ, &rc);
  221. if(rc != SUCCESS)
  222. {
  223. *err = rc;
  224. return 0;
  225. }
  226. else
  227. {
  228. *err = SUCCESS;
  229. return ReadCount;
  230. }
  231. }
  232. else
  233. {
  234. *err = SUCCESS;
  235. return 0;
  236. }
  237. }
  238. *err = SUCCESS;
  239. return 0;
  240. }
  241. UCOUNT 
  242. DosWrite (COUNT hndl, UCOUNT n, BYTE FAR *bp, COUNT FAR *err)
  243. {
  244. sft FAR *s;
  245. WORD sys_idx;
  246. sfttbl FAR *sp;
  247. UCOUNT ReadCount;
  248. /* Test that the handle is valid                */
  249. if(hndl < 0)
  250. {
  251. *err = DE_INVLDHNDL;
  252. return 0;
  253. }
  254. /* Get the SFT block that contains the SFT      */
  255. if((s = get_sft(hndl)) == (sft FAR *)-1)
  256. {
  257. *err = DE_INVLDHNDL;
  258. return 0;
  259. }
  260. /* If this is not opened and it's not a write   */
  261. /* another error                                */
  262. if(s -> sft_count == 0 ||
  263.  (!(s -> sft_mode & SFT_MWRITE) && !(s -> sft_mode & SFT_MRDWR)))
  264. {
  265. *err = DE_ACCESS;
  266. return 0;
  267. }
  268. /* Do a device write if device                  */
  269. if(s -> sft_flags & SFT_FDEVICE)
  270. {
  271. request rq;
  272. /* set to no EOF                        */
  273. s -> sft_flags &= ~SFT_FEOF;
  274. /* if null just report full transfer    */
  275. if(s -> sft_flags & SFT_FNUL)
  276. {
  277. *err = SUCCESS;
  278. return n;
  279. }
  280. /* Now handle raw and cooked modes      */
  281. if(s -> sft_flags & SFT_FBINARY)
  282. {
  283. rq.r_length = sizeof(request);
  284. rq.r_command = C_OUTPUT;
  285. rq.r_count = n;
  286. rq.r_trans = (BYTE FAR *)bp;
  287. rq.r_status = 0;
  288. execrh((request FAR *)&rq, s -> sft_dev);
  289. if(rq.r_status & S_ERROR)
  290. {
  291. REG i;
  292. BYTE buff[FNAME_SIZE+1];
  293. fbcopy(s -> sft_name, (BYTE FAR *)buff, FNAME_SIZE);
  294. buff[FNAME_SIZE+1] = 0;
  295. for(i = FNAME_SIZE; i > 0; i--)
  296. if(buff[i] == ' ')
  297. buff[i] = 0;
  298. else
  299. break;
  300. char_error(&rq, buff);
  301. }
  302. else
  303. {
  304. *err = SUCCESS;
  305. return rq.r_count;
  306. }
  307. }
  308. else
  309. {
  310. REG c, cnt = n, xfer = 0;
  311. while(cnt-- && (*bp != CTL_Z) && !check_break())
  312. {
  313. rq.r_length = sizeof(request);
  314. rq.r_command = C_OUTPUT;
  315. rq.r_count = 1;
  316. rq.r_trans = (BYTE FAR *)bp++;
  317. rq.r_status = 0;
  318. execrh((request FAR *)&rq, s -> sft_dev);
  319. if(rq.r_status & S_ERROR)
  320. {
  321. REG i;
  322. BYTE buff[FNAME_SIZE+1];
  323. fbcopy(s -> sft_name, (BYTE FAR *)buff, FNAME_SIZE);
  324. buff[FNAME_SIZE+1] = 0;
  325. for(i = FNAME_SIZE; i > 0; i--)
  326. if(buff[i] == ' ')
  327. buff[i] = 0;
  328. else
  329. break;
  330. char_error(&rq, buff);
  331. }
  332. ++xfer;
  333. }
  334. *err = SUCCESS;
  335. return xfer;
  336. }
  337. }
  338. else /* a block write                           */
  339. {
  340. if(!check_break())
  341. {
  342. COUNT rc;
  343. ReadCount = rdwrblock(s -> sft_status, bp, n, XFR_WRITE, &rc);
  344. if(rc < SUCCESS)
  345. {
  346. *err = rc;
  347. return 0;
  348. }
  349. else
  350. {
  351. *err = SUCCESS;
  352. return ReadCount;
  353. }
  354. }
  355. else
  356. {
  357. *err = SUCCESS;
  358. return 0;
  359. }
  360. }
  361. *err = SUCCESS;
  362. return 0;
  363. }
  364. COUNT 
  365. DosSeek (COUNT hndl, LONG new_pos, COUNT mode, ULONG *set_pos)
  366. {
  367. sft FAR *s;
  368. /* Test for invalid mode                        */
  369. if(mode < 0 || mode > 2)
  370. return DE_INVLDFUNC;
  371. /* Test that the handle is valid                */
  372. if(hndl < 0)
  373. return DE_INVLDHNDL;
  374. /* Get the SFT block that contains the SFT      */
  375. if((s = get_sft(hndl)) == (sft FAR *)-1)
  376. return DE_INVLDHNDL;
  377. /* Do special return for character devices      */
  378. if(s -> sft_flags & SFT_FDEVICE)
  379. {
  380. *set_pos = 0l;
  381. return SUCCESS;
  382. }
  383. else
  384. {
  385. *set_pos = dos_lseek(s -> sft_status, new_pos, mode);
  386. if((LONG)*set_pos < 0)
  387. return (int)*set_pos;
  388. else
  389. return SUCCESS;
  390. }
  391. }
  392. static WORD 
  393. get_free_hndl (void)
  394. {
  395. psp FAR *p = MK_FP(cu_psp,0);
  396. WORD hndl;
  397. for(hndl = 0; hndl < p -> ps_maxfiles; hndl++)
  398. {
  399. if(p -> ps_filetab[hndl] == 0xff)
  400. return hndl;
  401. }
  402. return 0xff;
  403. }
  404. static sft FAR *get_free_sft(sft_idx)
  405. WORD FAR *sft_idx;
  406. {
  407. WORD sys_idx = 0;
  408. sfttbl FAR *sp;
  409. /* Get the SFT block that contains the SFT      */
  410. for(sp = sfthead; sp != (sfttbl FAR *)-1; sp = sp -> sftt_next)
  411. {
  412. REG WORD i;
  413. for(i = 0; i < sp -> sftt_count; i++)
  414. {
  415. if(sp -> sftt_table[i].sft_count == 0)
  416. {
  417. *sft_idx = sys_idx + i;
  418. return (sft FAR *)&sp -> sftt_table[sys_idx + i];
  419. }
  420. }
  421. sys_idx += i;
  422. }
  423. /* If not found, return an error                */
  424. return (sft FAR *)-1;
  425. }
  426. static BYTE FAR *
  427. get_root (BYTE FAR *fname)
  428. {
  429. BYTE FAR *froot;
  430. REG WORD length;
  431. /* find the end                                 */
  432. for(length = 0, froot = fname; !froot != ''; ++froot)
  433. ++length;
  434. /* now back up to first path seperator or start */
  435. for(--froot; length > 0 && !(*froot == '/' || *froot == '\'); --froot)
  436. ;
  437. return ++froot;
  438. }
  439. /* Ascii only file name match routines                  */
  440. static BOOL 
  441. cmatch (COUNT s, COUNT d, COUNT mode)
  442. {
  443. if(s >= 'a' && s <= 'z')
  444. s -= 'a' - 'A';
  445. if(d >= 'a' && d <= 'z')
  446. d -= 'a' - 'A';
  447. if(mode && s == '?' && (d >= 'A' && s <= 'Z'))
  448. return TRUE;
  449. return s == d;
  450. }
  451. static BOOL 
  452. fnmatch (BYTE FAR *s, BYTE FAR *d, COUNT n, COUNT mode)
  453. {
  454. while(n--)
  455. {
  456. if(!cmatch(*s++, *d++, mode))
  457. return FALSE;
  458. }
  459. return TRUE;
  460. }
  461. #ifndef IPL
  462. COUNT 
  463. DosCreat (BYTE FAR *fname, COUNT attrib)
  464. {
  465. psp FAR *p = MK_FP(cu_psp,0);
  466. WORD hndl, sft_idx;
  467. sft FAR *sftp;
  468. struct dhdr FAR *dhp;
  469. BYTE FAR *froot;
  470. WORD i;
  471. /* get a free handle                            */
  472. if((hndl = get_free_hndl()) == 0xff)
  473. return DE_TOOMANY;
  474. /* now get a free system file table entry       */
  475. if((sftp = get_free_sft((WORD FAR *)&sft_idx)) == (sft FAR *)-1)
  476. return DE_TOOMANY;
  477. /* check for a device                           */
  478. froot = get_root(fname);
  479. for(i = 0; i < FNAME_SIZE; i++)
  480. {
  481. if(*froot != '' && *froot != '.')
  482. PriPathName[i] = *froot++;
  483. else
  484. break;
  485. }
  486. for( ; i < FNAME_SIZE; i++)
  487. PriPathName[i] = ' ';
  488. /* if we have an extension, can't be a device   */
  489. if(*froot != '.');
  490. {
  491. for(dhp = (struct dhdr FAR *)&nul_dev; dhp != (struct dhdr FAR *)-1; dhp = dhp -> dh_next)
  492. {
  493. if(fnmatch((BYTE FAR *)PriPathName, (BYTE FAR *)dhp -> dh_name, FNAME_SIZE, FALSE))
  494. {
  495. sftp -> sft_count += 1;
  496. sftp -> sft_mode = SFT_MRDWR;
  497. sftp -> sft_attrib = attrib;
  498. sftp -> sft_flags = 
  499.   (dhp -> dh_attr & ~SFT_MASK) | SFT_FDEVICE | SFT_FEOF;
  500. sftp -> sft_psp = cu_psp;
  501. fbcopy((BYTE FAR *)PriPathName, sftp -> sft_name, FNAME_SIZE+FEXT_SIZE);
  502. sftp -> sft_dev = dhp;
  503. p -> ps_filetab[hndl] = sft_idx;
  504. return hndl;
  505. }
  506. }
  507. }
  508. sftp -> sft_status = dos_creat(fname, attrib);
  509. if(sftp -> sft_status >= 0)
  510. {
  511. p -> ps_filetab[hndl] = sft_idx;
  512. sftp -> sft_count += 1;
  513. sftp -> sft_mode = SFT_MRDWR;
  514. sftp -> sft_attrib = attrib;
  515. sftp -> sft_flags = 0;
  516. sftp -> sft_psp = cu_psp;
  517. fbcopy((BYTE FAR *)PriPathName, sftp -> sft_name, FNAME_SIZE+FEXT_SIZE);
  518. return hndl;
  519. }
  520. else
  521. return sftp -> sft_status;
  522. }
  523. #endif
  524. COUNT 
  525. CloneHandle (COUNT hndl)
  526. {
  527. sft FAR *sftp;
  528. /* now get the system file table entry                          */
  529. if((sftp = get_sft(hndl)) == (sft FAR *)-1)
  530. return DE_INVLDHNDL;
  531. /* now that we have the system file table entry, get the fnode  */
  532. /* index, and increment the count, so that we've effectively    */
  533. /* cloned the file.                                             */
  534. sftp -> sft_count += 1;
  535. return hndl;
  536. }
  537. COUNT 
  538. DosDup (COUNT Handle)
  539. {
  540. psp FAR *p = MK_FP(cu_psp,0);
  541. COUNT NewHandle;
  542. sft FAR *Sftp;
  543. /* Get the SFT block that contains the SFT                      */
  544. if((Sftp = get_sft(Handle)) == (sft FAR *)-1)
  545. return DE_INVLDACC;
  546. /* If not open - exit                                           */
  547. if(Sftp -> sft_count <= 0)
  548. return DE_INVLDACC;
  549. /* now get a free handle                                        */
  550. if((NewHandle = get_free_hndl()) == 0xff)
  551. return DE_TOOMANY;
  552. /* If everything looks ok, bump it up.                          */
  553. if((Sftp -> sft_flags & SFT_FDEVICE) || (Sftp -> sft_status >= 0))
  554. {
  555. p -> ps_filetab[NewHandle] = p -> ps_filetab[Handle];
  556. Sftp -> sft_count += 1;
  557. return NewHandle;
  558. }
  559. else
  560. return DE_INVLDACC;
  561. }
  562. COUNT 
  563. DosForceDup (COUNT OldHandle, COUNT NewHandle)
  564. {
  565. psp FAR *p = MK_FP(cu_psp,0);
  566. sft FAR *Sftp;
  567. /* Get the SFT block that contains the SFT                      */
  568. if((Sftp = get_sft(OldHandle)) == (sft FAR *)-1)
  569. return DE_INVLDACC;
  570. /* If not open - exit                                           */
  571. if(Sftp -> sft_count <= 0)
  572. return DE_INVLDACC;
  573. /* now close the new handle if it's open                        */
  574. if(p -> ps_filetab[NewHandle] != 0xff)
  575. {
  576. COUNT ret;
  577. if((ret = DosClose(NewHandle)) != SUCCESS)
  578. return ret;
  579. }
  580. /* If everything looks ok, bump it up.                          */
  581. if((Sftp -> sft_flags & SFT_FDEVICE) || (Sftp -> sft_status >= 0))
  582. {
  583. p -> ps_filetab[NewHandle] = p -> ps_filetab[OldHandle];
  584. Sftp -> sft_count += 1;
  585. return SUCCESS;
  586. }
  587. else
  588. return DE_INVLDACC;
  589. }
  590. COUNT 
  591. DosOpen (BYTE FAR *fname, COUNT mode)
  592. {
  593. psp FAR *p = MK_FP(cu_psp,0);
  594. WORD hndl, sft_idx;
  595. sft FAR *sftp;
  596. struct dhdr FAR *dhp;
  597. BYTE FAR *froot;
  598. WORD i;
  599. /* test if mode is in range                     */
  600. if((mode & ~SFT_OMASK) != 0)
  601. return DE_INVLDACC;
  602. mode &= 3;
  603. if (cu_psp != DOS_PSP)
  604. {
  605.     /* get a free handle                            */
  606.     if((hndl = get_free_hndl()) == 0xff)
  607. return DE_TOOMANY;
  608. }
  609. /* now het a free system file table entry       */
  610. if((sftp = get_free_sft((WORD FAR *)&sft_idx)) == (sft FAR *)-1)
  611. return DE_TOOMANY;
  612. /* check for a device                           */
  613. froot = get_root(fname);
  614. for(i = 0; i < FNAME_SIZE; i++)
  615. {
  616. if(*froot != '' && *froot != '.')
  617. PriPathName[i] = *froot++;
  618. else
  619. break;
  620. }
  621. for( ; i < FNAME_SIZE; i++)
  622. PriPathName[i] = ' ';
  623. /* if we have an extension, can't be a device   */
  624. if(*froot != '.');
  625. {
  626. for(dhp = (struct dhdr FAR *)&nul_dev; dhp != (struct dhdr FAR *)-1; dhp = dhp -> dh_next)
  627. {
  628. if(fnmatch((BYTE FAR *)PriPathName, (BYTE FAR *)dhp -> dh_name, FNAME_SIZE, FALSE))
  629. {
  630. sftp -> sft_count += 1;
  631. sftp -> sft_mode = mode;
  632. sftp -> sft_attrib = 0;
  633. sftp -> sft_flags = 
  634.   (dhp -> dh_attr & ~SFT_MASK) | SFT_FDEVICE | SFT_FEOF;
  635. sftp -> sft_psp = cu_psp;
  636. fbcopy((BYTE FAR *)PriPathName, sftp -> sft_name, FNAME_SIZE+FEXT_SIZE);
  637. sftp -> sft_dev = dhp;
  638. if (cu_psp != DOS_PSP)
  639.     p -> ps_filetab[hndl] = sft_idx;
  640. return hndl;
  641. }
  642. }
  643. }
  644. sftp -> sft_status = dos_open(fname, mode);
  645. if(sftp -> sft_status >= 0)
  646. {
  647. if (cu_psp != DOS_PSP)
  648.     p -> ps_filetab[hndl] = sft_idx;
  649. sftp -> sft_count += 1;
  650. sftp -> sft_mode = mode;
  651. sftp -> sft_attrib = 0;
  652. sftp -> sft_flags = 0;
  653. sftp -> sft_psp = cu_psp;
  654. fbcopy((BYTE FAR *)PriPathName, sftp -> sft_name, FNAME_SIZE+FEXT_SIZE);
  655. return hndl;
  656. }
  657. else
  658. return sftp -> sft_status;
  659. }
  660. COUNT 
  661. DosClose (COUNT hndl)
  662. {
  663. psp FAR *p = MK_FP(cu_psp,0);
  664. sft FAR *s;
  665. /* Test that the handle is valid                */
  666. if(hndl < 0)
  667. return DE_INVLDHNDL;
  668. /* Get the SFT block that contains the SFT      */
  669. if((s = get_sft(hndl)) == (sft FAR *)-1)
  670. return DE_INVLDHNDL;
  671. /* If this is not opened another error          */
  672. if(s -> sft_count == 0)
  673. return DE_ACCESS;
  674. /* now just drop the count if a device, else    */
  675. /* call file system handler                     */
  676. if(s -> sft_flags & SFT_FDEVICE)
  677. {
  678. p -> ps_filetab[hndl] = 0xff;
  679. return SUCCESS;
  680. }
  681. else
  682. {
  683. p -> ps_filetab[hndl] = 0xff;
  684. s -> sft_count -= 1;
  685. if(s -> sft_count > 0)
  686. return SUCCESS;
  687. else
  688. return dos_close(s -> sft_status);
  689. }
  690. }
  691. VOID 
  692. DosGetFree (COUNT drive, COUNT FAR *spc, COUNT FAR *navc, COUNT FAR *bps, COUNT FAR *nc)
  693. {
  694. struct dpb *dpbp;
  695. /* first check for valid drive          */
  696. if(drive < 0 || drive > nblkdev)
  697. {
  698. *spc = -1;
  699. return;
  700. }
  701. /* next - "log" in the drive            */
  702. drive = (drive == 0 ? default_drive : drive - 1);
  703. dpbp = &blk_devices[drive];
  704. ++(dpbp -> dpb_count);
  705. // dpbp -> dpb_flags = -1;
  706. if((media_check(dpbp) < 0) || (dpbp -> dpb_count <= 0))
  707. {
  708. *spc = -1;
  709. return;
  710. }
  711. /* get the data vailable from dpb       */
  712. *nc = dpbp -> dpb_size;
  713. *spc = dpbp -> dpb_clssize;
  714. *bps = dpbp -> dpb_secsize;
  715. /* now tell fs to give us free cluster  */
  716. /* count                                */
  717. *navc = dos_free(dpbp);
  718. --(dpbp -> dpb_count);
  719. }
  720. COUNT 
  721. DosGetCuDir (COUNT drive, BYTE FAR *s)
  722. {
  723. REG struct dpb *dpbp;
  724. /* first check for valid drive          */
  725. if(drive < 0 || drive > nblkdev)
  726. return DE_INVLDDRV;
  727. /* next - "log" in the drive            */
  728. drive = (drive == 0 ? default_drive : drive - 1);
  729. dpbp = &blk_devices[drive];
  730. // dpbp -> dpb_flags = -1;
  731. ++(dpbp -> dpb_count);
  732. if((media_check(dpbp) < 0) || (dpbp -> dpb_count <= 0))
  733. return DE_INVLDDRV;
  734. /* now get fs to give current           */
  735. /* directory                            */
  736. dos_pwd(dpbp, s);
  737. --(dpbp -> dpb_count);
  738. return SUCCESS;
  739. }
  740. COUNT 
  741. DosChangeDir (BYTE FAR *s)
  742. {
  743. REG struct dpb *dpbp;
  744. REG COUNT drive;
  745. struct f_node FAR *fp;
  746. COUNT ret;
  747. /* test for path existance from fs      */
  748. if((fp = dir_open((BYTE FAR *)s)) == (struct f_node FAR *)0)
  749. return DE_PATHNOTFND;
  750. else
  751. dir_close(fp);
  752. /* Parse and extract drive              */
  753. if(*(s + 1) == ':')
  754. {
  755. drive = *s - '@';
  756. if (drive > 26) drive -= 'a' - 'A';
  757. }
  758. else
  759. drive = 0;
  760. /* first check for valid drive          */
  761. if(drive < 0 || drive > nblkdev)
  762. return DE_INVLDDRV;
  763. /* next - "log" in the drive            */
  764. drive = (drive == 0 ? default_drive : drive - 1);
  765. dpbp = &blk_devices[drive];
  766. ++(dpbp -> dpb_count);
  767. // dpbp -> dpb_flags = -1;
  768. if((media_check(dpbp) < 0) || (dpbp -> dpb_count <= 0))
  769. return DE_INVLDDRV;
  770. /* now get fs to change to new          */
  771. /* directory                            */
  772. ret = dos_cd(dpbp, s);
  773. --(dpbp -> dpb_count);
  774. return ret;
  775. }
  776. COUNT 
  777. DosFindFirst (UCOUNT attr, BYTE FAR *name)
  778. {
  779. return dos_findfirst(attr, name);
  780. }
  781. COUNT 
  782. DosFindNext (void)
  783. {
  784. return dos_findnext();
  785. }
  786. #ifndef IPL
  787. COUNT DosGetFtime(hndl, dp, tp)
  788. COUNT hndl;
  789. date FAR *dp;
  790. time FAR *tp;
  791. {
  792. sft FAR *s;
  793. sfttbl FAR *sp;
  794. /* Test that the handle is valid                */
  795. if(hndl < 0)
  796. return DE_INVLDHNDL;
  797. /* Get the SFT block that contains the SFT      */
  798. if((s = get_sft(hndl)) == (sft FAR *)-1)
  799. return DE_INVLDHNDL;
  800. /* If this is not opened another error          */
  801. if(s -> sft_count == 0)
  802. return DE_ACCESS;
  803. /* call file system handler                     */
  804. return dos_getftime(s -> sft_status, dp, tp);
  805. }
  806. COUNT DosSetFtime(hndl, dp, tp)
  807. COUNT hndl;
  808. date FAR *dp;
  809. time FAR *tp;
  810. {
  811. sft FAR *s;
  812. sfttbl FAR *sp;
  813. /* Test that the handle is valid                */
  814. if(hndl < 0)
  815. return DE_INVLDHNDL;
  816. /* Get the SFT block that contains the SFT      */
  817. if((s = get_sft(hndl)) == (sft FAR *)-1)
  818. return DE_INVLDHNDL;
  819. /* If this is not opened another error          */
  820. if(s -> sft_count == 0)
  821. return DE_ACCESS;
  822. /* call file system handler                     */
  823. return dos_setftime(s -> sft_status, dp, tp);
  824. }
  825. #endif
  826. COUNT 
  827. DosGetFattr (BYTE FAR *name, UWORD FAR *attrp)
  828. {
  829. return dos_getfattr(name, attrp);
  830. }
  831. COUNT 
  832. DosSetFattr (BYTE FAR *name, UWORD FAR *attrp)
  833. {
  834. return dos_setfattr(name, attrp);
  835. }