Changeset 3221


Ignore:
Timestamp:
Apr 29, 2007, 7:38:19 PM (18 years ago)
Author:
bird
Message:

Don't use DosCopy.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/essentials/dev-lang/perl/os2/os2.c

    r3215 r3221  
    1313#define SPU_ENABLESUPPRESSION           1
    1414#include <os2.h>
     15#ifdef __KLIBC__
     16# include <share.h>
     17# include <sys/stat.h>
     18#endif
    1519#include "dlfcn.h"
    1620#include <emx/syscalls.h>
     
    2428
    2529#ifdef __KLIBC__
    26 #define INSTALL_PREFIX "u:/perl"
     30# define INSTALL_PREFIX "/@unixroot" /* ??? */
    2731#endif
    2832
     
    18691873            flag = (unsigned long)SvIV(ST(2));
    18701874        }
    1871 
     1875#ifdef __KLIBC__
     1876    {
     1877        /* open the input file and verify that it is a file. */
     1878        int err = 0;
     1879        int fdSrc = sopen(src, O_RDONLY | O_BINARY | O_NOINHERIT, SH_DENYRW);
     1880        if (fdSrc < 0)
     1881            fdSrc = sopen(src, O_RDONLY | O_BINARY | O_NOINHERIT, SH_DENYNO);
     1882        if (fdSrc)
     1883        {
     1884            struct stat stSrc;
     1885            if (!fstat(fdSrc, &stSrc))
     1886            {
     1887                if (S_ISREG(stSrc.st_mode))
     1888                {
     1889                    /* open the output file. */
     1890                    unsigned dstFlags = O_WRONLY | O_BINARY | O_CREAT;
     1891                    if (flag & DCPY_EXISTING)
     1892                        dstFlags |= O_TRUNC;
     1893                    else
     1894                        dstFlags |= O_EXCL;
     1895                    if (flag & DCPY_APPEND)
     1896                        dstFlags |= O_APPEND;
     1897                    int fdDst = sopen(dst, dstFlags | O_SIZE, SH_DENYRW, 0777, stSrc.st_size);
     1898                    if (fdDst < 0)
     1899                        fdDst = sopen(dst, dstFlags | O_SIZE, SH_DENYNO, 0777, stSrc.st_size);
     1900                    if (fdDst < 0)
     1901                        fdDst = sopen(dst, dstFlags, SH_DENYNO, 0777, 0);
     1902                    if (fdDst >= 0)
     1903                    {
     1904                        /* allocate buffer */
     1905                        void *pvBuf, *pvFree;
     1906                        size_t cbBuf = 0xf000;
     1907                        pvFree = pvBuf = _tmalloc(cbBuf);
     1908                        if (!pvBuf)
     1909                            pvBuf = alloca(cbBuf = 0x8000);
     1910
     1911                        /* copy loop. */
     1912                        while (!err)
     1913                        {
     1914                            ssize_t cbSrc, cbDst;
     1915
     1916                            cbSrc = read(fdSrc, pvBuf, cbBuf);
     1917                            if (cbSrc == 0)
     1918                                break; /* eof */
     1919                            if (cbSrc < 0)
     1920                                err = errno;
     1921                            else
     1922                            {
     1923                                cbDst = write(fdDst, pvBuf, cbSrc);
     1924                                if (cbDst <= 0)
     1925                                    err = errno;
     1926                                else if (cbDst < cbSrc)
     1927                                {
     1928                                    ssize_t cb;
     1929                                    do
     1930                                    {
     1931                                        cb = write(fdDst, (const char *)pvBuf + cbDst, cbSrc - cbDst);
     1932                                        if (cb >= 0)
     1933                                            cbDst += cb;
     1934                                        else
     1935                                            err = errno;
     1936                                    }
     1937                                    while (cbDst < cbSrc && !err);
     1938                                }
     1939                            }
     1940                        } /* the copy loop  */
     1941
     1942                        /* TODO/FIXME: EAs! */
     1943
     1944                        /* cleanup */
     1945                        free(pvFree);
     1946                        close(fdDst);
     1947                    }
     1948                    else
     1949                        err = errno;
     1950                }
     1951                else
     1952                    err = ENOTSUP;
     1953            }
     1954            else
     1955                err = errno;
     1956            close(fdSrc);
     1957         }
     1958        else
     1959            err = errno;
     1960        errno = err;
     1961        RETVAL = !err;
     1962    }
     1963#else
    18721964        RETVAL = !CheckOSError(DosCopy(src, dst, flag));
     1965#endif
    18731966/* FIXME: this copies EAs as well, including the unix EAs. great. */
    18741967        XSprePUSH; PUSHi((IV)RETVAL);
Note: See TracChangeset for help on using the changeset viewer.