home *** CD-ROM | disk | FTP | other *** search
/ Software Recommendations - 1998 Season 1 / DNBCD4.iso / share / DOS / ipxcopy / SRC.ZIP / SRC / CIO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-19  |  6.1 KB  |  344 lines

  1. /*
  2.  
  3.    CIO.C
  4.  
  5.    compatible direct access
  6.  
  7.    (c) 1996 Oliver Kraus
  8.  
  9.    kraus@lrs.e-technik.uni-erlangen.de
  10.  
  11. */
  12.  
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <errno.h>
  16. #include "ccommon.h"
  17.  
  18. /*--- ms-dos ---*/
  19.  
  20. #ifdef C_DOS
  21.  
  22. #include <direct.h>
  23. #include <ctype.h>
  24. #include "dpmicall.h"
  25.  
  26. short c_pathbuf_sel_dir;
  27. short c_pathbuf_seg_dir;
  28. int c_pathbuf_is_dos_mem = 0;
  29.  
  30.  
  31. /*
  32.    returns name of filesystem ("FAT", ...)
  33.    fills flags:
  34.    Bit(s)   Description (Table 1083)
  35.     0 searches are case sensitive
  36.     1 preserves case in directory entries
  37.     2 uses Unicode characters in file and directory names
  38.     3-13 reserved (0)
  39.     14   supports DOS long filename functions
  40.     15   volume is compressed
  41. */
  42. char *c_get_vol_info(const char *root, int *flags)
  43. {
  44.    static char s[64];
  45.    rminfo_struct rmi;
  46.    short sel_root, seg_root;
  47.    short sel_sys, seg_sys;
  48.  
  49.    if ( dpmi_alloc_dos_memory(strlen(root)+1, &sel_root, &seg_root ) == 0 )
  50.       return NULL;
  51.    if ( dpmi_alloc_dos_memory(64, &sel_sys, &seg_sys ) == 0 )
  52.    {
  53.       dpmi_free_dos_memory(sel_root);
  54.       return NULL;
  55.    }
  56.  
  57.    dpmi_copy_to_dos(sel_root, (void *)root, strlen(root)+1);
  58.  
  59.    rmi.eax = 0x071a0L;
  60.    rmi.ebx = 0UL;
  61.    rmi.ecx = 64UL;
  62.    rmi.edx = 0UL;
  63.  
  64.    rmi.ds = seg_root;
  65.    rmi.esi = 0L;
  66.    rmi.es = seg_sys;
  67.    rmi.edi = 0L;
  68.  
  69.    if ( dpmi_simulate_rmi(0x021, &rmi) != 0 )
  70.    {
  71.       dpmi_free_dos_memory(sel_root);
  72.       dpmi_free_dos_memory(sel_sys);
  73.       return NULL;
  74.    }
  75.  
  76.    dpmi_copy_from_dos(sel_sys, s, 64);
  77.  
  78.    if ( flags != NULL )
  79.    {
  80.       *flags = (int)rmi.ebx;
  81.    }
  82.  
  83.    dpmi_free_dos_memory(sel_root);
  84.    dpmi_free_dos_memory(sel_sys);
  85.    return s;
  86. }
  87.  
  88. int c_is_long_filename(void)
  89. {
  90.    static int is_long_filename = 2;
  91.    if ( is_long_filename >= 2 )
  92.    {
  93.       is_long_filename = 0;
  94.       /*
  95.       int flags;
  96.       if ( c_get_vol_info("C:\\", &flags) == NULL )
  97.       {
  98.          is_long_filename = 0;
  99.          return is_long_filename;
  100.       }
  101.       if ( (flags & (1<<14)) == 0 )
  102.       {
  103.          is_long_filename = 0;
  104.          return is_long_filename;
  105.       }
  106.       is_long_filename = 1;
  107.       */
  108.    }
  109.    return is_long_filename;
  110. }
  111.  
  112. /* 0 == 'A' */
  113. void c_chdrive(int drive)
  114. {
  115.    rminfo_struct rmi;
  116.  
  117.    rmi.eax = 0x0e00UL;
  118.    rmi.ebx = 0UL;
  119.    rmi.ecx = 0UL;
  120.    rmi.edx = (unsigned long)drive;
  121.  
  122.    if ( dpmi_simulate_rmi(0x021, &rmi) != 0 )
  123.    {
  124.       return;
  125.    }
  126.  
  127.    return;
  128. }
  129.  
  130.  
  131. static int c_chdir_lfn(const char *newdir)
  132. {
  133.    size_t len;
  134.    rminfo_struct rmi;
  135.  
  136.    if ( c_pathbuf_is_dos_mem == 0 )
  137.    {
  138.       if ( dpmi_alloc_dos_memory(C_MAX_PATHNAME, &c_pathbuf_sel_dir, &c_pathbuf_seg_dir ) == 0 )
  139.          return ENOMEM;
  140.       c_pathbuf_is_dos_mem = 1;
  141.    }
  142.    len = strlen(newdir);
  143.    if ( len+1 >= C_MAX_PATHNAME )
  144.          return EINVAL;
  145.    dpmi_copy_to_dos(c_pathbuf_sel_dir, (void *)newdir, len+1);
  146.  
  147.    rmi.eax = 0x0713bL;
  148.    rmi.ebx = 0UL;
  149.    rmi.ecx = 0UL;
  150.    rmi.edx = 0UL;
  151.  
  152.    rmi.ds = c_pathbuf_seg_dir;
  153.    rmi.edx = 0L;
  154.  
  155.    if ( dpmi_simulate_rmi(0x021, &rmi) != 0 )
  156.    {
  157.       return (int)rmi.eax;
  158.    }
  159.  
  160.    return (int)rmi.eax;
  161. }
  162.  
  163. static int c_mkdir_lfn(const char *newdir)
  164. {
  165.    size_t len;
  166.    rminfo_struct rmi;
  167.  
  168.    if ( c_pathbuf_is_dos_mem == 0 )
  169.    {
  170.       if ( dpmi_alloc_dos_memory(C_MAX_PATHNAME, &c_pathbuf_sel_dir, &c_pathbuf_seg_dir ) == 0 )
  171.          return ENOMEM;
  172.       c_pathbuf_is_dos_mem = 1;
  173.    }
  174.    len = strlen(newdir);
  175.    if ( len+1 >= C_MAX_PATHNAME )
  176.          return EINVAL;
  177.    dpmi_copy_to_dos(c_pathbuf_sel_dir, (void *)newdir, len+1);
  178.  
  179.    rmi.eax = 0x07139L;
  180.    rmi.ebx = 0UL;
  181.    rmi.ecx = 0UL;
  182.    rmi.edx = 0UL;
  183.  
  184.    rmi.ds = c_pathbuf_seg_dir;
  185.    rmi.edx = 0L;
  186.  
  187.    if ( dpmi_simulate_rmi(0x021, &rmi) != 0 )
  188.    {
  189.       return (int)rmi.eax;
  190.    }
  191.  
  192.    return (int)rmi.eax;
  193. }
  194.  
  195. static char *c_getcwd_lfn(char *s)
  196. {
  197.    rminfo_struct rmi;
  198.  
  199.    if ( c_pathbuf_is_dos_mem == 0 )
  200.    {
  201.       if ( dpmi_alloc_dos_memory(C_MAX_PATHNAME, &c_pathbuf_sel_dir, &c_pathbuf_seg_dir ) == 0 )
  202.          return NULL;
  203.       c_pathbuf_is_dos_mem = 1;
  204.    }
  205.  
  206.    rmi.eax = 0x07147L;
  207.    rmi.ebx = 0UL;
  208.    rmi.ecx = 0UL;
  209.    rmi.edx = 0UL;    /* current drive */
  210.  
  211.    rmi.ds = c_pathbuf_seg_dir;
  212.    rmi.esi = 0L;
  213.  
  214.    if ( dpmi_simulate_rmi(0x021, &rmi) != 0 )
  215.    {
  216.       return NULL;
  217.    }
  218.  
  219.    dpmi_copy_from_dos(c_pathbuf_sel_dir, (void *)s, C_MAX_PATHNAME);
  220.  
  221.    return s;
  222. }
  223.  
  224.  
  225. int c_chdir(const char *newdir)
  226. {
  227.    if ( c_is_long_filename() != 0 )
  228.       return c_chdir_lfn(newdir);
  229.    return chdir(newdir);
  230. }
  231.  
  232. int c_mkdir(const char *newdir)
  233. {
  234.    if ( c_is_long_filename() != 0 )
  235.       return c_mkdir_lfn(newdir);
  236.    return mkdir(newdir);
  237. }
  238.  
  239. char *c_getcwd(void)
  240. {
  241.    static char s[C_MAX_PATHNAME];
  242.    if ( c_is_long_filename() != 0 )
  243.       return c_getcwd_lfn(s);
  244.    return getcwd(s,C_MAX_PATHNAME);
  245. }
  246.  
  247. void c_io_clear(void)
  248. {
  249.    dpmi_free_dos_memory(c_pathbuf_sel_dir);
  250.    c_pathbuf_is_dos_mem = 0;
  251. }
  252. #endif
  253.  
  254. /*--- unix ---*/
  255.  
  256. #ifdef C_UNIX
  257. int c_chdir(const char *newdir)
  258. {
  259.    return chdir(newdir);
  260. }
  261.  
  262. int c_mkdir(const char *newdir)
  263. {
  264.    return mkdir(newdir);
  265. }
  266.  
  267. void c_io_clear(void)
  268. {
  269. }
  270. #endif
  271.  
  272. /*--- common ---*/
  273.  
  274. char c_common_buf[C_MAX_PATHNAME];
  275.  
  276. void c_strncpy(char *dest, const char *src, size_t n)
  277. {
  278.    strncpy(dest, src, n);
  279.    dest[n-1] = '\0';
  280. }
  281.  
  282. /* 0 if successful */
  283. int c_create_path(const char *path)
  284. {
  285.    char *s = c_common_buf;
  286.    char *t;
  287.    c_strncpy(s, path, C_MAX_PATHNAME);
  288.    if ( *s == C_DELIMITER_CHAR )
  289.    {
  290.       c_chdir(C_DELIMITER_STR);
  291.       s++;
  292.    }
  293.    t = strtok(s, C_DELIMITER_STR);
  294.    for(;;)
  295.    {
  296.       if ( t == NULL )
  297.          break;
  298.       if ( *t == '\0' )
  299.          break;
  300.       if ( c_chdir(t) != 0 )
  301.       {
  302.          if ( c_mkdir(t) != 0 )
  303.             return -1;
  304.       }
  305.       t = strtok(NULL, C_DELIMITER_STR);
  306.    }
  307.    return 0;
  308. }
  309.  
  310. /* 0 if successful */
  311. int c_set_path(const char *path)
  312. {
  313.    char *s = c_common_buf;
  314.    char *t;
  315.    c_strncpy(s, path, C_MAX_PATHNAME);
  316. #ifdef C_DOS
  317.    if ( s[1] == ':' )
  318.    {
  319.       c_chdrive(toupper(s[0])-'A');
  320.       s+=2;
  321.    }
  322. #endif
  323.  
  324.    if ( *s == C_DELIMITER_CHAR )
  325.    {
  326.       c_chdir(C_DELIMITER_STR);
  327.       s++;
  328.    }
  329.    t = strtok(s, C_DELIMITER_STR);
  330.    for(;;)
  331.    {
  332.       if ( t == NULL )
  333.          break;
  334.       if ( *t == '\0' )
  335.          break;
  336.       if ( c_chdir(t) != 0 )
  337.       {
  338.          return -1;
  339.       }
  340.       t = strtok(NULL, C_DELIMITER_STR);
  341.    }
  342.    return 0;
  343. }
  344.