Changeset 3221
- Timestamp:
- Apr 29, 2007, 7:38:19 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/essentials/dev-lang/perl/os2/os2.c
r3215 r3221 13 13 #define SPU_ENABLESUPPRESSION 1 14 14 #include <os2.h> 15 #ifdef __KLIBC__ 16 # include <share.h> 17 # include <sys/stat.h> 18 #endif 15 19 #include "dlfcn.h" 16 20 #include <emx/syscalls.h> … … 24 28 25 29 #ifdef __KLIBC__ 26 # define INSTALL_PREFIX "u:/perl"30 # define INSTALL_PREFIX "/@unixroot" /* ??? */ 27 31 #endif 28 32 … … 1869 1873 flag = (unsigned long)SvIV(ST(2)); 1870 1874 } 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 1872 1964 RETVAL = !CheckOSError(DosCopy(src, dst, flag)); 1965 #endif 1873 1966 /* FIXME: this copies EAs as well, including the unix EAs. great. */ 1874 1967 XSprePUSH; PUSHi((IV)RETVAL);
Note:
See TracChangeset
for help on using the changeset viewer.