|
|
@@ -0,0 +1,93 @@
|
|
|
+From be615daf41b4bcc61322a987088ee209b5e66c19 Mon Sep 17 00:00:00 2001
|
|
|
+From: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
|
|
|
+Date: Wed, 24 Sep 2014 13:54:15 +0100
|
|
|
+Subject: [PATCH] Add support for uClibc
|
|
|
+
|
|
|
+The stable-1.1 branch of freerdp fails to build when using a uClibc
|
|
|
+toolchain because it's using functions which are not implemented in
|
|
|
+uClibc, like eventfd_read, eventfd_write and futimes. That is causing
|
|
|
+build failures like these ones:
|
|
|
+
|
|
|
+../../libwinpr/synch/libwinpr-synch.so.0.1.0: undefined reference to
|
|
|
+`eventfd_read'
|
|
|
+../../libwinpr/synch/libwinpr-synch.so.0.1.0: undefined reference to
|
|
|
+`eventfd_write'
|
|
|
+
|
|
|
+../../common/libfreerdp-client.so.1.1.0: undefined reference to
|
|
|
+`futimes'
|
|
|
+
|
|
|
+This patch is based on this upstream patch:
|
|
|
+
|
|
|
+ https://github.com/FreeRDP/FreeRDP/commit/5f9c36da5d5cd3c5dce49f7b32fe011cb293f9ec/
|
|
|
+
|
|
|
+Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
|
|
|
+---
|
|
|
+ channels/drive/client/drive_file.c | 12 +++++++++---
|
|
|
+ winpr/libwinpr/synch/event.c | 14 ++++++++++++++
|
|
|
+ 2 files changed, 23 insertions(+), 3 deletions(-)
|
|
|
+
|
|
|
+diff --git a/channels/drive/client/drive_file.c b/channels/drive/client/drive_file.c
|
|
|
+index 376b4fe..b20f408 100644
|
|
|
+--- a/channels/drive/client/drive_file.c
|
|
|
++++ b/channels/drive/client/drive_file.c
|
|
|
+@@ -480,7 +480,11 @@ BOOL drive_file_set_information(DRIVE_FILE* file, UINT32 FsInformationClass, UIN
|
|
|
+ int status;
|
|
|
+ char* fullpath;
|
|
|
+ struct STAT st;
|
|
|
++#if defined(ANDROID)
|
|
|
+ struct timeval tv[2];
|
|
|
++#else
|
|
|
++ struct timespec tv[2];
|
|
|
++#endif
|
|
|
+ UINT64 LastWriteTime;
|
|
|
+ UINT32 FileAttributes;
|
|
|
+ UINT32 FileNameLength;
|
|
|
+@@ -501,15 +505,17 @@ BOOL drive_file_set_information(DRIVE_FILE* file, UINT32 FsInformationClass, UIN
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ tv[0].tv_sec = st.st_atime;
|
|
|
+- tv[0].tv_usec = 0;
|
|
|
+ tv[1].tv_sec = (LastWriteTime > 0 ? FILE_TIME_RDP_TO_SYSTEM(LastWriteTime) : st.st_mtime);
|
|
|
+- tv[1].tv_usec = 0;
|
|
|
+ #ifndef WIN32
|
|
|
+ /* TODO on win32 */
|
|
|
+ #ifdef ANDROID
|
|
|
++ tv[0].tv_usec = 0;
|
|
|
++ tv[1].tv_usec = 0;
|
|
|
+ utimes(file->fullpath, tv);
|
|
|
+ #else
|
|
|
+- futimes(file->fd, tv);
|
|
|
++ tv[0].tv_nsec = 0;
|
|
|
++ tv[1].tv_nsec = 0;
|
|
|
++ futimens(file->fd, tv);
|
|
|
+ #endif
|
|
|
+
|
|
|
+ if (FileAttributes > 0)
|
|
|
+diff --git a/winpr/libwinpr/synch/event.c b/winpr/libwinpr/synch/event.c
|
|
|
+index 173afaf..943cccb 100644
|
|
|
+--- a/winpr/libwinpr/synch/event.c
|
|
|
++++ b/winpr/libwinpr/synch/event.c
|
|
|
+@@ -115,6 +115,20 @@ HANDLE OpenEventA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
++#ifdef HAVE_EVENTFD_H
|
|
|
++#if defined(__UCLIBC__)
|
|
|
++static int eventfd_read(int fd, eventfd_t* value)
|
|
|
++{
|
|
|
++ return (read(fd, value, sizeof(*value)) == sizeof(*value)) ? 0 : -1;
|
|
|
++}
|
|
|
++
|
|
|
++static int eventfd_write(int fd, eventfd_t value)
|
|
|
++{
|
|
|
++ return (write(fd, &value, sizeof(value)) == sizeof(value)) ? 0 : -1;
|
|
|
++}
|
|
|
++#endif
|
|
|
++#endif
|
|
|
++
|
|
|
+ BOOL SetEvent(HANDLE hEvent)
|
|
|
+ {
|
|
|
+ ULONG Type;
|
|
|
+--
|
|
|
+1.7.1
|
|
|
+
|