From f54783ae6e6de44dafcecefdc8963c58a2ed98b9 Mon Sep 17 00:00:00 2001 From: My Karlsson Date: Thu, 26 Oct 2017 20:11:51 +0200 Subject: [PATCH] Emulate timeradd and timersub on Solaris Solaris does not have timeradd and timersub. Add solaris_support.c which provides emulated versions of them on Solaris. --- psycopg/pqpath.c | 4 +++ psycopg/solaris_support.c | 54 +++++++++++++++++++++++++++++++++++++++ psycopg/solaris_support.h | 37 +++++++++++++++++++++++++++ setup.py | 2 +- 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 psycopg/solaris_support.c create mode 100644 psycopg/solaris_support.h diff --git a/psycopg/pqpath.c b/psycopg/pqpath.c index 7e8c8e8b..a4235d1d 100644 --- a/psycopg/pqpath.c +++ b/psycopg/pqpath.c @@ -52,6 +52,10 @@ #include "win32_support.h" #endif +#if defined(__sun) && defined(__SVR4) +#include "solaris_support.h" +#endif + extern HIDDEN PyObject *psyco_DescriptionType; extern HIDDEN const char *srv_isolevels[]; extern HIDDEN const char *srv_readonly[]; diff --git a/psycopg/solaris_support.c b/psycopg/solaris_support.c new file mode 100644 index 00000000..cf82e2ed --- /dev/null +++ b/psycopg/solaris_support.c @@ -0,0 +1,54 @@ +/* solaris_support.c - emulate functions missing on Solaris + * + * Copyright (C) 2017 My Karlsson + * + * This file is part of psycopg. + * + * psycopg2 is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * In addition, as a special exception, the copyright holders give + * permission to link this program with the OpenSSL library (or with + * modified versions of OpenSSL that use the same license as OpenSSL), + * and distribute linked combinations including the two. + * + * You must obey the GNU Lesser General Public License in all respects for + * all of the code used other than OpenSSL. + * + * psycopg2 is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + */ + +#define PSYCOPG_MODULE +#include "psycopg/psycopg.h" +#include "psycopg/solaris_support.h" + +#if defined(__sun) && defined(__SVR4) +/* timeradd is missing on Solaris */ +void +timeradd(struct timeval *a, struct timeval *b, struct timeval *c) +{ + c->tv_sec = a->tv_sec + b->tv_sec; + c->tv_usec = a->tv_usec + b->tv_usec; + if (c->tv_usec >= 1000000) { + c->tv_usec -= 1000000; + c->tv_sec += 1; + } +} + +/* timersub is missing on Solaris */ +void +timersub(struct timeval *a, struct timeval *b, struct timeval *c) +{ + c->tv_sec = a->tv_sec - b->tv_sec; + c->tv_usec = a->tv_usec - b->tv_usec; + if (c->tv_usec < 0) { + c->tv_usec += 1000000; + c->tv_sec -= 1; + } +} +#endif /* defined(__sun) && defined(__SVR4) */ diff --git a/psycopg/solaris_support.h b/psycopg/solaris_support.h new file mode 100644 index 00000000..33c2f2b8 --- /dev/null +++ b/psycopg/solaris_support.h @@ -0,0 +1,37 @@ +/* solaris_support.h - definitions for solaris_support.c + * + * Copyright (C) 2017 My Karlsson + * + * This file is part of psycopg. + * + * psycopg2 is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * In addition, as a special exception, the copyright holders give + * permission to link this program with the OpenSSL library (or with + * modified versions of OpenSSL that use the same license as OpenSSL), + * and distribute linked combinations including the two. + * + * You must obey the GNU Lesser General Public License in all respects for + * all of the code used other than OpenSSL. + * + * psycopg2 is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + */ +#ifndef PSYCOPG_SOLARIS_SUPPORT_H +#define PSYCOPG_SOLARIS_SUPPORT_H + +#include "psycopg/config.h" + +#if defined(__sun) && defined(__SVR4) +#include + +extern HIDDEN void timeradd(struct timeval *a, struct timeval *b, struct timeval *c); +extern HIDDEN void timersub(struct timeval *a, struct timeval *b, struct timeval *c); +#endif + +#endif /* !defined(PSYCOPG_SOLARIS_SUPPORT_H) */ diff --git a/setup.py b/setup.py index 67af9db0..f2f63c57 100644 --- a/setup.py +++ b/setup.py @@ -480,7 +480,7 @@ data_files = [] sources = [ 'psycopgmodule.c', 'green.c', 'pqpath.c', 'utils.c', 'bytes_format.c', - 'libpq_support.c', 'win32_support.c', + 'libpq_support.c', 'win32_support.c', 'solaris_support.c', 'connection_int.c', 'connection_type.c', 'cursor_int.c', 'cursor_type.c',