aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorLRN <lrn1986@gmail.com>2013-02-14 16:15:15 +0000
committerLRN <lrn1986@gmail.com>2013-02-14 16:15:15 +0000
commitfb325794836981c17396a187f97da0c542ff34d0 (patch)
treeb6118f2e0cee3df9e6358398b6b6d3df870ab78e /src/util
parentbb0344c616bfa067498fbfd455768847115fe96e (diff)
downloadgnunet-fb325794836981c17396a187f97da0c542ff34d0.tar.gz
gnunet-fb325794836981c17396a187f97da0c542ff34d0.zip
More flexible native->GNUnet_handle file opening
Can now open not just FILEs, but also integer fds and native Windows handles. The last two will be used later by the new pipe control code.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/disk.c112
1 files changed, 80 insertions, 32 deletions
diff --git a/src/util/disk.c b/src/util/disk.c
index 4b9e5fd65..47325fe4e 100644
--- a/src/util/disk.c
+++ b/src/util/disk.c
@@ -1866,52 +1866,81 @@ GNUNET_DISK_file_close (struct GNUNET_DISK_FileHandle *h)
1866 return ret; 1866 return ret;
1867} 1867}
1868 1868
1869 1869#ifndef WINDOWS
1870/** 1870/**
1871 * Get a handle from a native FD. 1871 * Get a GNUnet file handle from a W32 handle.
1872 * 1872 *
1873 * @param fd native file descriptor 1873 * @param handle native handle
1874 * @return file handle corresponding to the descriptor 1874 * @return GNUnet file handle corresponding to the W32 handle
1875 */ 1875 */
1876struct GNUNET_DISK_FileHandle * 1876struct GNUNET_DISK_FileHandle *
1877GNUNET_DISK_get_handle_from_native (FILE *fd) 1877GNUNET_DISK_get_handle_from_w32_handle (HANDLE osfh)
1878{ 1878{
1879 struct GNUNET_DISK_FileHandle *fh; 1879 struct GNUNET_DISK_FileHandle *fh;
1880 int fno;
1881#if MINGW
1882 intptr_t osfh;
1883#endif
1884 1880
1885 fno = fileno (fd); 1881 DWORD dwret;
1886 if (-1 == fno) 1882 enum GNUNET_FILE_Type ftype;
1887 return NULL;
1888 1883
1889#if MINGW 1884 dwret = GetFileType (osfh);
1890 osfh = _get_osfhandle (fno); 1885 switch (dwret)
1891 if (INVALID_HANDLE_VALUE == (HANDLE) osfh) 1886 {
1887 case FILE_TYPE_DISK:
1888 ftype = GNUNET_DISK_HANLDE_TYPE_FILE;
1889 break;
1890 case FILE_TYPE_PIPE:
1891 ftype = GNUNET_DISK_HANLDE_TYPE_PIPE;
1892 break;
1893 default:
1892 return NULL; 1894 return NULL;
1895 }
1896
1897 fh = GNUNET_malloc (sizeof (struct GNUNET_DISK_FileHandle));
1898
1899 fh->h = osfh;
1900 fh->type = ftype;
1901 if (ftype == GNUNET_DISK_HANLDE_TYPE_PIPE)
1902 {
1903 /**
1904 * Note that we can't make it overlapped if it isn't already.
1905 * (ReOpenFile() is only available in 2003/Vista).
1906 * The process that opened this file in the first place (usually a parent
1907 * process, if this is stdin/stdout/stderr) must make it overlapped,
1908 * otherwise we're screwed, as selecting on non-overlapped handle
1909 * will block.
1910 */
1911 fh->oOverlapRead = GNUNET_malloc (sizeof (OVERLAPPED));
1912 fh->oOverlapWrite = GNUNET_malloc (sizeof (OVERLAPPED));
1913 fh->oOverlapRead->hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
1914 fh->oOverlapWrite->hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
1915 }
1916
1917 return fh;
1918}
1893#endif 1919#endif
1894 1920
1921/**
1922 * Get a handle from a native integer FD.
1923 *
1924 * @param fd native integer file descriptor
1925 * @return file handle corresponding to the descriptor
1926 */
1927struct GNUNET_DISK_FileHandle *
1928GNUNET_DISK_get_handle_from_int_fd (int fno)
1929{
1930 struct GNUNET_DISK_FileHandle *fh;
1931
1932#ifndef WINDOWS
1895 fh = GNUNET_malloc (sizeof (struct GNUNET_DISK_FileHandle)); 1933 fh = GNUNET_malloc (sizeof (struct GNUNET_DISK_FileHandle));
1896 1934
1897#if MINGW
1898 fh->h = (HANDLE) osfh;
1899 /* Assume it to be a pipe. TODO: use some kind of detection
1900 * function to figure out handle type.
1901 * Note that we can't make it overlapped if it isn't already.
1902 * (ReOpenFile() is only available in 2003/Vista).
1903 * The process that opened this file in the first place (usually a parent
1904 * process, if this is stdin/stdout/stderr) must make it overlapped,
1905 * otherwise we're screwed, as selecting on non-overlapped handle
1906 * will block.
1907 */
1908 fh->type = GNUNET_DISK_HANLDE_TYPE_PIPE;
1909 fh->oOverlapRead = GNUNET_malloc (sizeof (OVERLAPPED));
1910 fh->oOverlapWrite = GNUNET_malloc (sizeof (OVERLAPPED));
1911 fh->oOverlapRead->hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
1912 fh->oOverlapWrite->hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
1913#else
1914 fh->fd = fno; 1935 fh->fd = fno;
1936#else
1937 intptr_t osfh;
1938
1939 osfh = _get_osfhandle (fno);
1940 if (INVALID_HANDLE_VALUE == (HANDLE) osfh)
1941 return NULL;
1942
1943 fh = GNUNET_DISK_get_handle_from_w32_handle ((HANDLE) osfh);
1915#endif 1944#endif
1916 1945
1917 return fh; 1946 return fh;
@@ -1919,6 +1948,25 @@ GNUNET_DISK_get_handle_from_native (FILE *fd)
1919 1948
1920 1949
1921/** 1950/**
1951 * Get a handle from a native streaming FD.
1952 *
1953 * @param fd native streaming file descriptor
1954 * @return file handle corresponding to the descriptor
1955 */
1956struct GNUNET_DISK_FileHandle *
1957GNUNET_DISK_get_handle_from_native (FILE *fd)
1958{
1959 int fno;
1960
1961 fno = fileno (fd);
1962 if (-1 == fno)
1963 return NULL;
1964
1965 return GNUNET_DISK_get_handle_from_int_fd (fno);
1966}
1967
1968
1969/**
1922 * Construct full path to a file inside of the private 1970 * Construct full path to a file inside of the private
1923 * directory used by GNUnet. Also creates the corresponding 1971 * directory used by GNUnet. Also creates the corresponding
1924 * directory. If the resulting name is supposed to be 1972 * directory. If the resulting name is supposed to be