From cafe9dbb04e0158e430ea11c19707b51e1b97230 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain(a)gmail.com>
Date: Mon, 30 Nov 2015 22:52:53 +0100
Subject: Initial import
Signed-off-by: Igor Gnatenko <i.gnatenko.brain(a)gmail.com>
---
.gitignore | 1 +
eegdev.spec | 107 ++++++++++++++++++++++++++++
fix-biosemi-close-hangups.patch | 63 +++++++++++++++++
fix-biosemi-on-bigendian.patch | 39 ++++++++++
fix-bison-grammar-file.patch | 81 +++++++++++++++++++++
fix-racecond-in-biosemi-tests.patch | 137 ++++++++++++++++++++++++++++++++++++
fix-unaligned-memory-access.patch | 46 ++++++++++++
include-config_h.patch | 91 ++++++++++++++++++++++++
sources | 1 +
9 files changed, 566 insertions(+)
create mode 100644 eegdev.spec
create mode 100644 fix-biosemi-close-hangups.patch
create mode 100644 fix-biosemi-on-bigendian.patch
create mode 100644 fix-bison-grammar-file.patch
create mode 100644 fix-racecond-in-biosemi-tests.patch
create mode 100644 fix-unaligned-memory-access.patch
create mode 100644 include-config_h.patch
diff --git a/.gitignore b/.gitignore
index e69de29..0586eb9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/eegdev-0.2.tar.bz2
diff --git a/eegdev.spec b/eegdev.spec
new file mode 100644
index 0000000..369de83
--- /dev/null
+++ b/eegdev.spec
@@ -0,0 +1,107 @@
+Name: eegdev
+Version: 0.2
+Release: 1%{?dist}
+Summary: Library to acquire data from various EEG recording devices
+
+License: LGPLv3+
+URL:
http://cnbi.epfl.ch/software/eegdev.html
+Source0:
http://download.sourceforge.net/eegdev/%{name}-%{version}.tar.bz2
+Patch0: fix-biosemi-on-bigendian.patch
+Patch1: fix-racecond-in-biosemi-tests.patch
+Patch2: fix-biosemi-close-hangups.patch
+Patch3: fix-bison-grammar-file.patch
+Patch4: include-config_h.patch
+Patch5: fix-unaligned-memory-access.patch
+
+BuildRequires: gcc
+BuildRequires: automake autoconf
+BuildRequires: gnulib-devel
+BuildRequires: bison flex
+# EEGfile backend
+BuildRequires: xdffileio-devel
+# Biosemi backend
+BuildRequires: libusbx-devel
+# Neurosky backend
+BuildRequires: bluez-libs-devel
+# Tobi interface A backend
+BuildRequires: expat-devel
+
+%description
+eegdev is a library that provides a unified interface for accessing various EEG
+(and other biosignals) acquisition systems. This interface has been designed to
+be both flexible and efficient. The device specific part is implemented by the
+mean of plugins which makes adding new device backend fairly easy even if the
+library does not support them yet officially.
+
+The core library not only provides to users a unified and consistent interfaces
+to the acquisition device but it also provides many functionalities to the
+device backends (plugins) ranging from configuration to data casting and scaling
+making writing new device backend an easy task.
+
+%package devel
+Summary: Development files for %{name}
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description devel
+The %{name}-devel package contains libraries and header files for
+developing applications that use %{name}.
+
+%package plugins
+Summary: Plugins for %{name}
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description plugins
+Plugins for %{name}.
+
+%prep
+%autosetup -p1
+
+# drop bundled libs
+rm -rf lib/*
+
+# do not run neurosky test (requires /dev/rfcomm0)
+sed -i -e '/TESTS += sysneurosky/d' tests/Makefile.am
+
+%build
+./autogen.sh
+%configure --enable-corelib-build \
+ --with-xdf \
+ --with-act2 \
+ --with-neurosky \
+ --with-tia
+make %{?_smp_mflags}
+
+%install
+%make_install
+
+find %{buildroot} -name '*.la' -exec rm -f {} ';'
+
+%check
+make check
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%license COPYING
+%doc AUTHORS NEWS
+%{_libdir}/lib%{name}.so.*
+%dir %{_libdir}/%{name}/
+%{_mandir}/man5/%{name}-open-options.5*
+
+%files devel
+%doc %{_docdir}/%{name}
+%{_libdir}/lib%{name}.so
+%{_libdir}/pkgconfig/%{name}.pc
+%{_includedir}/%{name}*.h
+%{_mandir}/man3/egd_*.3*
+
+%files plugins
+%{_libdir}/%{name}/*
+%exclude %{_mandir}/man5/%{name}-open-options.5*
+%{_mandir}/man5/%{name}-*.5*
+
+%changelog
+* Sun Nov 29 2015 Igor Gnatenko <i.gnatenko.brain(a)gmail.com> - 0.2-1
+- Initial package
diff --git a/fix-biosemi-close-hangups.patch b/fix-biosemi-close-hangups.patch
new file mode 100644
index 0000000..d67b7c9
--- /dev/null
+++ b/fix-biosemi-close-hangups.patch
@@ -0,0 +1,63 @@
+Description: fix possible hangups of egd_close on biosemi
+ When stopping the handshake, URB can report of URB failure because of
+ timeout. This patch makes sure that whenever a URB is not resubmitted, this
+ will be indicated by reducing the number of running transfers
+ (a2dev->num_running). This should also fix the hang when closing a device
+ that has failed during acquisition.
+Origin: upstream,
http://cnbisrv02.epfl.ch/cgit/eegdev.git/commit/?id=cdf41d
+Bug-Debian:
http://bugs.debian.org/673681
+Author: Nicolas Bourdaud <nicolas.bourdaud(a)gmail.com>
+Last-Update: 2012-05-23
+Applied-Upstream: yes
+
+diff --git a/src/plugins/biosemi.c b/src/plugins/biosemi.c
+index 473edde..6e5e4aa 100644
+--- a/src/plugins/biosemi.c
++++ b/src/plugins/biosemi.c
+@@ -393,7 +393,7 @@ void process_usbbuf(struct act2_eegdev* a2dev, uint32_t* buf, ssize_t
bs)
+ #endif
+ static void LIBUSB_CALL req_completion_fn(struct libusb_transfer *transfer)
+ {
+- int ret;
++ int ret, requeue = 1;
+ struct act2_eegdev* a2dev = transfer->user_data;
+ const struct core_interface* ci = &(a2dev->dev.ci);
+
+@@ -405,20 +405,24 @@ static void LIBUSB_CALL req_completion_fn(struct libusb_transfer
*transfer)
+ // Check that no error occured
+ if ((ret = proc_libusb_transfer_ret(transfer->status))) {
+ ci->report_error(&(a2dev->dev), ret);
+- return;
++ requeue = 0;
+ }
+
+- // requeue again the chunk buffer if still running
+ pthread_mutex_lock(&a2dev->mtx);
+- if (a2dev->resubmit) {
+- // Try submit
+- if ((ret = libusb_submit_transfer(transfer))) {
+- ci->report_error(&(a2dev->dev),
+- proc_libusb_error(ret));
+- a2dev->num_running--;
+- }
+- } else if (!--(a2dev->num_running))
++
++ // requeue again the chunk buffer if still running
++ requeue = a2dev->resubmit ? requeue : 0;
++ if (requeue && (ret = libusb_submit_transfer(transfer))) {
++ ci->report_error(&(a2dev->dev), proc_libusb_error(ret));
++ requeue = 0;
++ }
++
++ // Signal main thread that this urb stopped
++ if (!requeue) {
++ a2dev->num_running--;
+ pthread_cond_signal(&a2dev->cond);
++ }
++
+ pthread_mutex_unlock(&a2dev->mtx);
+ }
+
+--
+1.7.10
+
diff --git a/fix-biosemi-on-bigendian.patch b/fix-biosemi-on-bigendian.patch
new file mode 100644
index 0000000..4ca939f
--- /dev/null
+++ b/fix-biosemi-on-bigendian.patch
@@ -0,0 +1,39 @@
+Subject: fix biosemi execution on big endian architectures
+ replace preprocessor conditional on WORD_BIGENDIAN by WORDS_BIGENDIAN.
+Origin: upstream,
http://cnbisrv02.epfl.ch/cgit/eegdev.git/commit/?id=be3fc5
+Author: Nicolas Bourdaud <nicolas.bourdaud(a)gmail.com>
+Last-Update: 2012-05-21
+diff --git a/src/plugins/biosemi.c b/src/plugins/biosemi.c
+index 4ec9c7c..473edde 100644
+--- a/src/plugins/biosemi.c
++++ b/src/plugins/biosemi.c
+@@ -32,11 +32,11 @@
+ #include <eegdev-pluginapi.h>
+
+ #ifndef le_to_cpu_32
+-# if WORD_BIGENDIAN
++# if WORDS_BIGENDIAN
+ # define le_to_cpu_u32(data) bswap_32(data)
+ # else
+ # define le_to_cpu_u32(data) (data)
+-# endif //WORD_BIGENDIAN
++# endif //WORDS_BIGENDIAN
+ #endif
+
+ // It should ABSOLUTELY be a power of two or the read call will fail
+@@ -367,10 +367,10 @@ void process_usbbuf(struct act2_eegdev* a2dev, uint32_t* buf,
ssize_t bs)
+ int i, start, slen = a2dev->samplelen, inoffset = a2dev->inoffset;
+ const struct core_interface* ci = &(a2dev->dev.ci);
+
+-#if WORD_BIGENDIAN
++#if WORDS_BIGENDIAN
+ for (i=0; i<bs; i++)
+ buf[i] = bswap_32(buf[i]);
+-#endif //WORD_BIGENDIAN
++#endif //WORDS_BIGENDIAN
+
+ // check presence synchro code and shift trigger value
+ start = (slen - inoffset) % slen;
+--
+1.7.10
+
diff --git a/fix-bison-grammar-file.patch b/fix-bison-grammar-file.patch
new file mode 100644
index 0000000..b4a99e5
--- /dev/null
+++ b/fix-bison-grammar-file.patch
@@ -0,0 +1,81 @@
+From: Dejan Latinovic <Dejan.Latinovic(a)imgtec.com>
+Date: Tue, 11 Mar 2014 18:16:39 +0100
+Description: FTBFS: conflicting types for 'cff_parse'
+ Changes to bison input files (src/core/conffile.y and src/core/confline.y),
+ in order to adapt to newer bison version.
+Debian-Bug:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=720833
+
+--- a/src/core/conffile.y
++++ b/src/core/conffile.y
+@@ -17,9 +17,11 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ %define api.pure
++%no-lines
+ %name-prefix "cff_"
+ %defines "conffile.tab.h"
+ %parse-param { struct cfdata *pp }
++%lex-param { yyscan_t cff_scaninfo }
+ %{
+ #if HAVE_CONFIG_H
+ # include <config.h>
+@@ -28,6 +30,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include "configuration.h"
++#ifndef YY_TYPEDEF_YY_SCANNER_T
++#define YY_TYPEDEF_YY_SCANNER_T
++typedef void* yyscan_t;
++#endif
++#include "conffile.h"
+ %}
+
+ %union value {
+@@ -36,9 +43,7 @@
+
+ %{
+ #include "conffile.lex.h"
+-#include "conffile.h"
+-#define YYLEX_PARAM pp->scaninfo
+-
++#define cff_scaninfo pp->scaninfo
+ static int yyerror(struct cfdata *pp, const char* s);
+ %}
+
+--- a/src/core/confline.y
++++ b/src/core/confline.y
+@@ -17,9 +17,11 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ %define api.pure
++%no-lines
+ %name-prefix "cfl_"
+ %defines "confline.tab.h"
+ %parse-param { struct cfldata *pp }
++%lex-param { yyscan_t cfl_scaninfo }
+ %{
+ #if HAVE_CONFIG_H
+ # include <config.h>
+@@ -28,6 +30,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include "configuration.h"
++#ifndef YY_TYPEDEF_YY_SCANNER_T
++#define YY_TYPEDEF_YY_SCANNER_T
++typedef void* yyscan_t;
++#endif
++#include "confline.h"
+ %}
+
+ %union value {
+@@ -36,9 +43,7 @@
+
+ %{
+ #include "confline.lex.h"
+-#include "confline.h"
+-#define YYLEX_PARAM pp->scaninfo
+-
++#define cfl_scaninfo pp->scaninfo
+ static int yyerror(struct cfldata *pp, const char* s);
+ %}
+
diff --git a/fix-racecond-in-biosemi-tests.patch b/fix-racecond-in-biosemi-tests.patch
new file mode 100644
index 0000000..40052fe
--- /dev/null
+++ b/fix-racecond-in-biosemi-tests.patch
@@ -0,0 +1,137 @@
+Description: fix race conditions in biosemi tests
+ Fix two race conditions in the synchronous transfer and in transfer queues
+ destruction of the fake libusb library. In addition to these fixes, the
+ synchronous transfer wrapper has slightly been rewritten to avoid the use
+ of stack allocated objects for synchronization: this is done solely to
+ avoid the false positives with helgrind (which have masked until now the
+ previous race conditions).
+Origin: upstream,
http://cnbisrv02.epfl.ch/cgit/eegdev.git/commit/?id=88b1ff
+Bug-Debian:
http://bugs.debian.org/673681
+Author: Nicolas Bourdaud <nicolas.bourdaud(a)gmail.com>
+Last-Update: 2012-05-21
+
+diff --git a/tests/fakelibs/activetwo.c b/tests/fakelibs/activetwo.c
+index 1e95ced..f11ce0e 100644
+--- a/tests/fakelibs/activetwo.c
++++ b/tests/fakelibs/activetwo.c
+@@ -95,13 +95,16 @@ void init_queue(struct event_queue* queue)
+
+
+ static
+-void destroy_queue(struct event_queue* queue)
++void destroy_queue(struct event_queue* queue, pthread_t thid)
+ {
+ pthread_mutex_lock(&queue->lock);
+ queue->free = 1;
+ pthread_cond_signal(&queue->cond);
+ pthread_mutex_unlock(&queue->lock);
+
++ if (thid)
++ pthread_join(thid, NULL);
++
+ pthread_cond_destroy(&queue->cond);
+ pthread_mutex_destroy(&queue->lock);
+ }
+@@ -471,12 +474,8 @@ void init_device(struct libusb_device_handle* dev, struct
libusb_context* ctx)
+ static
+ void destroy_device(struct libusb_device_handle* dev)
+ {
+- destroy_queue(&dev->ep_in);
+- destroy_queue(&dev->ep_out);
+-
+- pthread_join(dev->th_ep_in, NULL);
+- pthread_join(dev->th_ep_out, NULL);
+-
++ destroy_queue(&dev->ep_in, dev->th_ep_in);
++ destroy_queue(&dev->ep_out, dev->th_ep_out);
+ }
+
+
+@@ -499,7 +498,7 @@ int libusb_init(libusb_context **context)
+ LIBUSB_CALL
+ void libusb_exit(libusb_context *ctx)
+ {
+- destroy_queue(&ctx->queue);
++ destroy_queue(&ctx->queue, 0);
+ free(ctx);
+ }
+
+@@ -507,6 +506,7 @@ void libusb_exit(libusb_context *ctx)
+ LIBUSB_CALL
+ int libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
+ {
++ int free_xfer;
+ struct libusb_transfer* xfer = NULL;
+ struct timespec tots, curr, *to = NULL;
+
+@@ -521,8 +521,9 @@ int libusb_handle_events_timeout(libusb_context *ctx, struct timeval
*tv)
+ // Get transfer one by one
+ while ((xfer = dequeue_transfer(&ctx->queue, to))) {
+ to = NULL;
++ free_xfer = xfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER;
+ xfer->callback(xfer);
+- if (xfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER)
++ if (free_xfer)
+ libusb_free_transfer(xfer);
+ }
+
+@@ -631,35 +632,37 @@ int libusb_bulk_transfer(libusb_device_handle *dev,
+ int *actual_length, unsigned int timeout)
+ {
+ int retval = 0;
+- struct sync_data user_data = {
+- .done = 0,
+- .cond = PTHREAD_COND_INITIALIZER,
+- .lock = PTHREAD_MUTEX_INITIALIZER
+- };
++ struct sync_data* user_data;
++ struct libusb_transfer* xfer;
+
+- struct libusb_transfer xfer = {.num_iso_packets = 0};
++ // Initialize sychronization primitives
++ user_data = calloc(1, sizeof(*user_data));
++ pthread_mutex_init(&user_data->lock, NULL);
++ pthread_cond_init(&user_data->cond, NULL);
+
+ // Submit asynchronous transfer
+- libusb_fill_bulk_transfer(&xfer, dev, endpoint, data, length,
+- sync_transfer_cb, &user_data, timeout);
+- libusb_submit_transfer(&xfer);
++ xfer = libusb_alloc_transfer(0);
++ libusb_fill_bulk_transfer(xfer, dev, endpoint, data, length,
++ sync_transfer_cb, user_data, timeout);
++ libusb_submit_transfer(xfer);
+
+ // wait for completion
+- pthread_mutex_lock(&user_data.lock);
+- while (!user_data.done)
+- pthread_cond_wait(&user_data.cond, &user_data.lock);
+- pthread_mutex_unlock(&user_data.lock);
++ pthread_mutex_lock(&user_data->lock);
++ while (!user_data->done)
++ pthread_cond_wait(&user_data->cond, &user_data->lock);
++ pthread_mutex_unlock(&user_data->lock);
+
+- *actual_length = user_data.actual_length;
+- if (user_data.status == LIBUSB_TRANSFER_COMPLETED)
++ *actual_length = user_data->actual_length;
++ if (user_data->status == LIBUSB_TRANSFER_COMPLETED)
+ retval = 0;
+- else if (user_data.status == LIBUSB_TRANSFER_TIMED_OUT)
++ else if (user_data->status == LIBUSB_TRANSFER_TIMED_OUT)
+ retval = LIBUSB_ERROR_TIMEOUT;
+
++ libusb_free_transfer(xfer);
+
+- pthread_cond_destroy(&user_data.cond);
+- pthread_mutex_destroy(&user_data.lock);
+-
++ pthread_cond_destroy(&user_data->cond);
++ pthread_mutex_destroy(&user_data->lock);
++ free(user_data);
+
+ return retval;
+ }
+--
+1.7.10
+
diff --git a/fix-unaligned-memory-access.patch b/fix-unaligned-memory-access.patch
new file mode 100644
index 0000000..9e11e28
--- /dev/null
+++ b/fix-unaligned-memory-access.patch
@@ -0,0 +1,46 @@
+From: Dejan Latinovic <Dejan.Latinovic(a)imgtec.com>
+Date: Tue, 11 Mar 2014 18:16:39 +0100
+Description: Fix unaligned memory access errors on MIPS systems
+ This patch fixes unaligned memory access errors on MIPS systems.
+Debian-Bug:
+
+--- a/src/core/typecast.c 2014-03-17 17:03:03.868239764 +0000
++++ b/src/core/typecast.c 2014-03-17 17:07:18.253726412 +0000
+@@ -37,6 +37,28 @@ static void cast_##tsrc##_##tdst (void*
+ } \
+ }
+
++// Prototype of a generic type scale and cast function for unaligned memory access
++#define DEFINE_CASTUNALIGNED_FN(tsrc, tdst) \
++static void cast_##tsrc##_##tdst (void* restrict d, const void* restrict s, union gval
sc, size_t len) \
++{ \
++ union dstdata \
++ { \
++ tdst Data; \
++ unsigned int intData[2]; \
++ }; \
++ const tsrc* src = s; \
++ union dstdata *dst = d; \
++ tdst scale = sc.val##tdst; \
++ while(len) \
++ { \
++ union dstdata dst_tmp; \
++ dst_tmp.Data = scale * ((tdst)(*src)); \
++ dst->intData[0] = dst_tmp.intData[0]; \
++ dst->intData[1] = dst_tmp.intData[1]; \
++ src++; dst++; \
++ len -= sizeof(*src); \
++ } \
++}
+ // Prototype of a generic type cast function
+ #define DEFINE_CASTNOSC_FN(tsrc, tdst) \
+ static void castnosc_##tsrc##_##tdst (void* restrict d, const void* restrict s, union
gval sc, size_t len) \
+@@ -60,7 +82,7 @@ static void identity(void* restrict d, c
+
+ // Declaration/definition of type cast and scale functions
+ DEFINE_CAST_FN(int32_t, int32_t)
+-DEFINE_CAST_FN(int32_t, double)
++DEFINE_CASTUNALIGNED_FN(int32_t, double)
+ DEFINE_CAST_FN(double, int32_t)
+ DEFINE_CAST_FN(int32_t, float)
+ DEFINE_CAST_FN(float, int32_t)
diff --git a/include-config_h.patch b/include-config_h.patch
new file mode 100644
index 0000000..0984c5e
--- /dev/null
+++ b/include-config_h.patch
@@ -0,0 +1,91 @@
+From: Dejan Latinovic <Dejan.Latinovic(a)imgtec.com>
+Date: Tue, 11 Mar 2014 18:16:39 +0100
+Description: include "config.h" before including system headers
+ The following source files were modified to include "config.h" before
+ including system headers (due to changes in gnulib).
+Debian-Bug:
+
+--- a/doc/examples/library-usage/acquisition.c
++++ b/doc/examples/library-usage/acquisition.c
+@@ -15,6 +15,9 @@
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <stdint.h>
+--- a/doc/examples/library-usage/eegdev_acq.c
++++ b/doc/examples/library-usage/eegdev_acq.c
+@@ -15,6 +15,9 @@
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+--- a/doc/examples/library-usage/recinxdf.c
++++ b/doc/examples/library-usage/recinxdf.c
+@@ -15,6 +15,9 @@
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <unistd.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+--- a/tests/sysbiosemi.c
++++ b/tests/sysbiosemi.c
+@@ -17,6 +17,9 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ //#include <sys/time.h>
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <time.h>
+ #include <string.h>
+ #include <stdlib.h>
+--- a/tests/syseegfile.c
++++ b/tests/syseegfile.c
+@@ -17,6 +17,9 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ //#include <sys/time.h>
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <time.h>
+ #include <string.h>
+ #include <stdlib.h>
+--- a/tests/sysneurosky.c
++++ b/tests/sysneurosky.c
+@@ -17,6 +17,9 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ //#include <sys/time.h>
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <time.h>
+ #include <string.h>
+ #include <stdlib.h>
+--- a/tests/systobiia.c
++++ b/tests/systobiia.c
+@@ -16,6 +16,9 @@
+ along with this program. If not, see <
http://www.gnu.org/licenses/>.
+ */
+ //#include <sys/time.h>
++#if HAVE_CONFIG_H
++#include <config.h>
++#endif
+ #include <time.h>
+ #include <string.h>
+ #include <stdlib.h>
diff --git a/sources b/sources
index e69de29..85779ce 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+4508e0c8fedfc122c01a73149036d23d eegdev-0.2.tar.bz2
--
cgit v0.11.2
http://pkgs.fedoraproject.org/cgit/eegdev.git/commit/?h=master&id=caf...