209 lines
5.3 KiB
C++
209 lines
5.3 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
** Contact: https://www.qt.io/licensing/
|
|
**
|
|
** This file is part of the QtCore module of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** Commercial License Usage
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
** accordance with the commercial license agreement provided with the
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
|
**
|
|
** GNU Lesser General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
** General Public License version 3 as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
** packaging of this file. Please review the following information to
|
|
** ensure the GNU Lesser General Public License version 3 requirements
|
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
** General Public License version 2.0 or (at your option) the GNU General
|
|
** Public license version 3 or any later version approved by the KDE Free
|
|
** Qt Foundation. The licenses are as published by the Free Software
|
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
** included in the packaging of this file. Please review the following
|
|
** information to ensure the GNU General Public License requirements will
|
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "qglobal.h"
|
|
|
|
#ifdef Q_OS_VXWORKS
|
|
|
|
#include "qplatformdefs.h"
|
|
#include "qfunctions_vxworks.h"
|
|
|
|
#if defined(_WRS_KERNEL)
|
|
#include <vmLib.h>
|
|
#endif
|
|
#include <selectLib.h>
|
|
#include <ioLib.h>
|
|
|
|
QT_USE_NAMESPACE
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// no lfind() - used by the TIF image format
|
|
void *lfind(const void* key, const void* base, size_t* elements, size_t size,
|
|
int (*compare)(const void*, const void*))
|
|
{
|
|
const char* current = (char*) base;
|
|
const char* const end = (char*) (current + (*elements) * size);
|
|
while (current != end) {
|
|
if (compare(current, key) == 0)
|
|
return (void*)current;
|
|
current += size;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
// no rand_r(), but rand()
|
|
// NOTE: this implementation is wrong for multi threaded applications,
|
|
// but there is no way to get it right on VxWorks (in kernel mode)
|
|
#if defined(_WRS_KERNEL)
|
|
int rand_r(unsigned int * /*seedp*/)
|
|
{
|
|
return rand();
|
|
}
|
|
#endif
|
|
|
|
// no usleep() support
|
|
int usleep(unsigned int usec)
|
|
{
|
|
div_t dt = div(usec, 1000000);
|
|
struct timespec ts = { dt.quot, dt.rem * 1000 };
|
|
|
|
return nanosleep(&ts, 0);
|
|
}
|
|
|
|
|
|
// gettimeofday() is declared, but is missing from the library
|
|
// It IS however defined in the Curtis-Wright X11 libraries, so
|
|
// we have to make the symbol 'weak'
|
|
#if defined(Q_CC_DIAB) && !defined(VXWORKS_DKM) && !defined(VXWORKS_RTP)
|
|
# pragma weak gettimeofday
|
|
#endif
|
|
int gettimeofday(struct timeval *tv, void /*struct timezone*/ *)
|
|
{
|
|
// the compiler will optimize this and will only use one code path
|
|
if (sizeof(struct timeval) == sizeof(struct timespec)) {
|
|
int res = clock_gettime(CLOCK_REALTIME, (struct timespec *) tv);
|
|
if (!res)
|
|
tv->tv_usec /= 1000;
|
|
return res;
|
|
} else {
|
|
struct timespec ts;
|
|
|
|
int res = clock_gettime(CLOCK_REALTIME, &ts);
|
|
if (!res) {
|
|
tv->tv_sec = ts.tv_sec;
|
|
tv->tv_usec = ts.tv_nsec / 1000;
|
|
}
|
|
return res;
|
|
}
|
|
}
|
|
|
|
// neither getpagesize() or sysconf(_SC_PAGESIZE) are available
|
|
int getpagesize()
|
|
{
|
|
#if defined(_WRS_KERNEL)
|
|
return vmPageSizeGet();
|
|
#else
|
|
return sysconf(_SC_PAGESIZE);
|
|
#endif
|
|
}
|
|
|
|
// symlinks are not supported (lstat is now just a call to stat - see qplatformdefs.h)
|
|
int symlink(const char *, const char *)
|
|
{
|
|
errno = EIO;
|
|
return -1;
|
|
}
|
|
|
|
ssize_t readlink(const char *, char *, size_t)
|
|
{
|
|
errno = EIO;
|
|
return -1;
|
|
}
|
|
|
|
// there's no truncate(), but ftruncate() support...
|
|
int truncate(const char *path, off_t length)
|
|
{
|
|
int fd = open(path, O_WRONLY, 00777);
|
|
if (fd >= 0) {
|
|
int res = ftruncate(fd, length);
|
|
int en = errno;
|
|
close(fd);
|
|
errno = en;
|
|
return res;
|
|
}
|
|
// errno is already set by open
|
|
return -1;
|
|
}
|
|
|
|
|
|
|
|
// VxWorks doesn't know about passwd & friends.
|
|
// in order to avoid patching the unix fs path everywhere
|
|
// we introduce some dummy functions that simulate a single
|
|
// 'root' user on the system.
|
|
|
|
uid_t getuid()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
gid_t getgid()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
uid_t geteuid()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
struct passwd *getpwuid(uid_t uid)
|
|
{
|
|
static struct passwd pwbuf = { "root", 0, 0, 0, 0, 0, 0 };
|
|
|
|
if (uid == 0) {
|
|
return &pwbuf;
|
|
} else {
|
|
errno = ENOENT;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
struct group *getgrgid(gid_t gid)
|
|
{
|
|
static struct group grbuf = { "root", 0, 0, 0 };
|
|
|
|
if (gid == 0) {
|
|
return &grbuf;
|
|
} else {
|
|
errno = ENOENT;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
|
|
#endif // Q_OS_VXWORKS
|