Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
e54e42af
Unverified
Commit
e54e42af
authored
Dec 10, 2017
by
Mike Gabriel
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'Ionic-feature/backport-asprintf' into 3.6.x
Attributes GH PR #592:
https://github.com/ArcticaProject/nx-libs/pull/592
parents
804ff445
a6e632aa
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
330 additions
and
50 deletions
+330
-50
Imakefile
nx-X11/programs/Xserver/include/Imakefile
+1
-0
Xprintf.h
nx-X11/programs/Xserver/include/Xprintf.h
+81
-0
os.h
nx-X11/programs/Xserver/include/os.h
+9
-4
xprintf.c
nx-X11/programs/Xserver/os/xprintf.c
+239
-46
No files found.
nx-X11/programs/Xserver/include/Imakefile
View file @
e54e42af
...
@@ -14,6 +14,7 @@ all::
...
@@ -14,6 +14,7 @@ all::
depend::
depend::
InstallDriverSDKNonExecFile(XIstubs.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(XIstubs.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(Xprintf.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstore.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstore.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstorestr.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstorestr.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(client.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(client.h,$(DRIVERSDKINCLUDEDIR))
...
...
nx-X11/programs/Xserver/include/Xprintf.h
0 → 100644
View file @
e54e42af
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef XPRINTF_H
#define XPRINTF_H
#include <stdio.h>
#include <stdarg.h>
#include <nx-X11/Xfuncproto.h>
#ifndef _X_RESTRICT_KYWD
#if defined(restrict)
/* assume autoconf set it correctly */
|| \
(defined(__STDC__) && (__STDC_VERSION__ - 0 >= 199901L))
/* C99 */
#define _X_RESTRICT_KYWD restrict
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* gcc w/C89+extensions */
#define _X_RESTRICT_KYWD __restrict__
#else
#define _X_RESTRICT_KYWD
#endif
#endif
/*
* These functions provide a portable implementation of the common (but not
* yet universal) asprintf & vasprintf routines to allocate a buffer big
* enough to sprintf the arguments to. The XNF variants terminate the server
* if the allocation fails.
* The buffer allocated is returned in the pointer provided in the first
* argument. The return value is the size of the allocated buffer, or -1
* on failure.
*/
extern
_X_EXPORT
int
Xasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
...)
_X_ATTRIBUTE_PRINTF
(
2
,
3
);
extern
_X_EXPORT
int
Xvasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
va_list
va
)
_X_ATTRIBUTE_PRINTF
(
2
,
0
);
extern
_X_EXPORT
int
XNFasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
...)
_X_ATTRIBUTE_PRINTF
(
2
,
3
);
extern
_X_EXPORT
int
XNFvasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
va_list
va
)
_X_ATTRIBUTE_PRINTF
(
2
,
0
);
#if !defined(HAVE_ASPRINTF) && !defined(HAVE_VASPRINTF)
#define asprintf Xasprintf
#define vasprintf Xvasprintf
#endif
/*
* These functions provide a portable implementation of the linux kernel
* scnprintf & vscnprintf routines that return the number of bytes actually
* copied during a snprintf, (excluding the final '\0').
*/
extern
_X_EXPORT
int
Xscnprintf
(
char
*
s
,
int
n
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
...)
_X_ATTRIBUTE_PRINTF
(
3
,
4
);
extern
_X_EXPORT
int
Xvscnprintf
(
char
*
s
,
int
n
,
const
char
*
_X_RESTRICT_KYWD
fmt
,
va_list
va
)
_X_ATTRIBUTE_PRINTF
(
3
,
0
);
#endif
/* XPRINTF_H */
nx-X11/programs/Xserver/include/os.h
View file @
e54e42af
...
@@ -230,10 +230,15 @@ extern void OsInitAllocator(void);
...
@@ -230,10 +230,15 @@ extern void OsInitAllocator(void);
extern
char
*
Xstrdup
(
const
char
*
s
);
extern
char
*
Xstrdup
(
const
char
*
s
);
extern
char
*
XNFstrdup
(
const
char
*
s
);
extern
char
*
XNFstrdup
(
const
char
*
s
);
extern
char
*
Xprintf
(
const
char
*
fmt
,
...);
extern
char
*
Xvprintf
(
const
char
*
fmt
,
va_list
va
);
/* Include new X*asprintf API */
extern
char
*
XNFprintf
(
const
char
*
fmt
,
...);
#include "Xprintf.h"
extern
char
*
XNFvprintf
(
const
char
*
fmt
,
va_list
va
);
/* Older api deprecated in favor of the asprintf versions */
extern
_X_EXPORT
char
*
Xprintf
(
const
char
*
fmt
,
...)
_X_ATTRIBUTE_PRINTF
(
1
,
2
)
_X_DEPRECATED
;
extern
_X_EXPORT
char
*
Xvprintf
(
const
char
*
fmt
,
va_list
va
)
_X_ATTRIBUTE_PRINTF
(
1
,
0
)
_X_DEPRECATED
;
extern
_X_EXPORT
char
*
XNFprintf
(
const
char
*
fmt
,
...)
_X_ATTRIBUTE_PRINTF
(
1
,
2
)
_X_DEPRECATED
;
extern
_X_EXPORT
char
*
XNFvprintf
(
const
char
*
fmt
,
va_list
va
)
_X_ATTRIBUTE_PRINTF
(
1
,
0
)
_X_DEPRECATED
;
typedef
SIGVAL
(
*
OsSigHandlerPtr
)(
int
/* sig */
);
typedef
SIGVAL
(
*
OsSigHandlerPtr
)(
int
/* sig */
);
...
...
nx-X11/programs/Xserver/os/xprintf.c
View file @
e54e42af
/*
/**
* printf routines which malloc their buffer
* @file
*/
*
* @section DESCRIPTION
*
* These functions provide a portable implementation of the common (but not
* yet universal) asprintf & vasprintf routines to allocate a buffer big
* enough to sprintf the arguments to. The XNF variants terminate the server
* if the allocation fails.
*/
/*
/*
* Copyright (c) 2004 Alexander Gottwald
* Copyright (c) 2004 Alexander Gottwald
*
*
...
@@ -26,6 +33,29 @@
...
@@ -26,6 +33,29 @@
* holders shall not be used in advertising or otherwise to promote the sale,
* holders shall not be used in advertising or otherwise to promote the sale,
* use or other dealings in this Software without prior written authorization.
* use or other dealings in this Software without prior written authorization.
*/
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifdef HAVE_DIX_CONFIG_H
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#include <dix-config.h>
#endif
#endif
...
@@ -35,14 +65,21 @@
...
@@ -35,14 +65,21 @@
#include <stdarg.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdio.h>
#ifdef asprintf
#undef asprintf
#endif
#ifdef vasprintf
#undef vasprintf
#endif
#ifndef va_copy
#ifndef va_copy
# ifdef __va_copy
#ifdef __va_copy
# define va_copy __va_copy
#define va_copy __va_copy
# else
#else
# error "no working va_copy was found"
#error "no working va_copy was found"
# endif
#endif
#endif
#endif
#ifdef NX_TRANS_SOCKET
#ifdef NX_TRANS_SOCKET
#define PANIC
#define PANIC
...
@@ -53,10 +90,9 @@
...
@@ -53,10 +90,9 @@
#define START_SIZE 256
#define START_SIZE 256
#define END_SIZE 2048
#define END_SIZE 2048
char
*
int
Xv
printf
(
const
char
*
format
,
va_list
va
)
Xv
asprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
format
,
va_list
va
)
{
{
char
*
ret
;
char
*
newret
;
char
*
newret
;
int
size
;
int
size
;
int
r
;
int
r
;
...
@@ -67,24 +103,24 @@ Xvprintf(const char *format, va_list va)
...
@@ -67,24 +103,24 @@ Xvprintf(const char *format, va_list va)
{
{
if
(
size
==
0
)
if
(
size
==
0
)
{
{
ret
=
(
char
*
)
malloc
(
START_SIZE
);
*
ret
=
(
char
*
)
malloc
(
START_SIZE
);
if
(
ret
==
NULL
)
if
(
*
ret
==
NULL
)
return
NULL
;
return
-
1
;
size
=
START_SIZE
;
size
=
START_SIZE
;
}
}
else
if
(
size
<
END_SIZE
&&
else
if
(
size
<
END_SIZE
&&
(
newret
=
(
char
*
)
realloc
(
ret
,
2
*
size
))
!=
NULL
)
(
newret
=
(
char
*
)
realloc
(
*
ret
,
2
*
size
))
!=
NULL
)
{
{
ret
=
newret
;
*
ret
=
newret
;
size
=
2
*
size
;
size
=
2
*
size
;
}
}
else
else
{
{
free
(
ret
);
free
(
*
ret
);
return
NULL
;
return
-
1
;
}
}
r
=
vsnprintf
(
ret
,
size
,
format
,
va
);
r
=
vsnprintf
(
*
ret
,
size
,
format
,
va
);
if
(
r
==
-
1
||
r
==
size
||
r
>
size
||
r
==
size
-
1
)
if
(
r
==
-
1
||
r
==
size
||
r
>
size
||
r
==
size
-
1
)
{
{
...
@@ -92,18 +128,30 @@ Xvprintf(const char *format, va_list va)
...
@@ -92,18 +128,30 @@ Xvprintf(const char *format, va_list va)
}
}
else
else
{
{
ret
[
r
]
=
0
;
(
*
ret
)
[
r
]
=
0
;
return
r
et
;
return
r
;
}
}
}
}
}
}
#else
#else
char
*
/**
Xvprintf
(
const
char
*
format
,
va_list
va
)
* Varargs sprintf that allocates a string buffer the right size for
* the pattern & data provided and prints the requested data to it.
*
* @param ret Pointer to which the newly allocated buffer is written
* (contents undefined on error)
* @param format printf style format string
* @param va variable argument list
* @return size of allocated buffer, or -1 on error.
*/
int
Xvasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
format
,
va_list
va
)
{
{
char
*
ret
;
#ifdef HAVE_VASPRINTF
return
vasprintf
(
ret
,
format
,
va
);
#else
int
size
;
int
size
;
va_list
va2
;
va_list
va2
;
...
@@ -111,23 +159,176 @@ Xvprintf(const char *format, va_list va)
...
@@ -111,23 +159,176 @@ Xvprintf(const char *format, va_list va)
size
=
vsnprintf
(
NULL
,
0
,
format
,
va2
);
size
=
vsnprintf
(
NULL
,
0
,
format
,
va2
);
va_end
(
va2
);
va_end
(
va2
);
ret
=
(
char
*
)
malloc
(
size
+
1
);
*
ret
=
malloc
(
size
+
1
);
if
(
ret
==
NULL
)
if
(
*
ret
==
NULL
)
return
NULL
;
return
-
1
;
vsnprintf
(
ret
,
size
+
1
,
format
,
va
);
vsnprintf
(
*
ret
,
size
+
1
,
format
,
va
);
ret
[
size
]
=
0
;
(
*
ret
)[
size
]
=
0
;
return
ret
;
return
size
;
#endif
}
}
#endif
#endif
char
*
Xprintf
(
const
char
*
format
,
...)
#ifndef HAVE_VASPRINTF
#define vasprintf Xvasprintf
#endif
/**
* sprintf that allocates a string buffer the right size for
* the pattern & data provided and prints the requested data to it.
*
* @param ret Pointer to which the newly allocated buffer is written
* (contents undefined on error)
* @param format printf style format string
* @param ... arguments for specified format
* @return size of allocated buffer, or -1 on error.
*/
int
Xasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
format
,
...)
{
int
size
;
va_list
va
;
va_start
(
va
,
format
);
size
=
vasprintf
(
ret
,
format
,
va
);
va_end
(
va
);
return
size
;
}
/**
* Varargs sprintf that allocates a string buffer the right size for
* the pattern & data provided and prints the requested data to it.
* On failure, issues a FatalError message and aborts the server.
*
* @param ret Pointer to which the newly allocated buffer is written
* (contents undefined on error)
* @param format printf style format string
* @param va variable argument list
* @return size of allocated buffer
*/
int
XNFvasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
format
,
va_list
va
)
{
int
size
=
vasprintf
(
ret
,
format
,
va
);
if
((
size
==
-
1
)
||
(
*
ret
==
NULL
))
{
FatalError
(
"XNFvasprintf failed: %s"
,
strerror
(
errno
));
}
return
size
;
}
/**
* sprintf that allocates a string buffer the right size for
* the pattern & data provided and prints the requested data to it.
* On failure, issues a FatalError message and aborts the server.
*
* @param ret Pointer to which the newly allocated buffer is written
* (contents undefined on error)
* @param format printf style format string
* @param ... arguments for specified format
* @return size of allocated buffer
*/
int
XNFasprintf
(
char
**
ret
,
const
char
*
_X_RESTRICT_KYWD
format
,
...)
{
int
size
;
va_list
va
;
va_start
(
va
,
format
);
size
=
XNFvasprintf
(
ret
,
format
,
va
);
va_end
(
va
);
return
size
;
}
/**
* snprintf that returns the actual number of bytes (excluding final '\0') that
* were copied into the buffer.
* This is opposed to the normal sprintf() usually returns the number of bytes
* that would have been written.
*
* @param s buffer to copy into
* @param n size of buffer s
* @param format printf style format string
* @param ... arguments for specified format
* @return number of bytes actually copied, excluding final '\0'
*/
int
Xscnprintf
(
char
*
s
,
int
n
,
const
char
*
format
,
...)
{
int
x
;
va_list
ap
;
va_start
(
ap
,
format
);
x
=
Xvscnprintf
(
s
,
n
,
format
,
ap
);
va_end
(
ap
);
return
x
;
}
/**
* Varargs snprintf that returns the actual number of bytes (excluding final
* '\0') that were copied into the buffer.
* This is opposed to the normal sprintf() usually returns the number of bytes
* that would have been written.
*
* @param s buffer to copy into
* @param n size of buffer s
* @param format printf style format string
* @param va variable argument list
* @return number of bytes actually copied, excluding final '\0'
*/
int
Xvscnprintf
(
char
*
s
,
int
n
,
const
char
*
format
,
va_list
args
)
{
int
x
;
if
(
n
==
0
)
return
0
;
x
=
vsnprintf
(
s
,
n
,
format
,
args
);
return
(
x
>=
n
)
?
(
n
-
1
)
:
x
;
}
/**
* snprintf that returns the actual number of bytes (excluding final '\0') that
* were copied into the buffer.
* This is opposed to the normal sprintf() usually returns the number of bytes
* that would have been written.
*
* @param s buffer to copy into
* @param n size of buffer s
* @param format printf style format string
* @param ... arguments for specified format
* @return number of bytes actually copied, excluding final '\0'
*/
int
Xscnprintf
(
char
*
s
,
int
n
,
const
char
*
format
,
...)
{
int
x
;
va_list
ap
;
va_start
(
ap
,
format
);
x
=
Xvscnprintf
(
s
,
n
,
format
,
ap
);
va_end
(
ap
);
return
x
;
}
/* Old api, now deprecated, may be removed in the future */
char
*
Xvprintf
(
const
char
*
format
,
va_list
va
)
{
char
*
ret
;
if
(
vasprintf
(
&
ret
,
format
,
va
)
==
-
1
)
ret
=
NULL
;
return
ret
;
}
char
*
Xprintf
(
const
char
*
format
,
...)
{
{
char
*
ret
;
char
*
ret
;
va_list
va
;
va_list
va
;
va_start
(
va
,
format
);
va_start
(
va
,
format
);
ret
=
Xvprintf
(
format
,
va
);
if
(
vasprintf
(
&
ret
,
format
,
va
)
==
-
1
)
ret
=
NULL
;
va_end
(
va
);
va_end
(
va
);
return
ret
;
return
ret
;
}
}
...
@@ -136,28 +337,20 @@ char *
...
@@ -136,28 +337,20 @@ char *
XNFvprintf
(
const
char
*
format
,
va_list
va
)
XNFvprintf
(
const
char
*
format
,
va_list
va
)
{
{
char
*
ret
;
char
*
ret
;
int
size
;
va_list
va2
;
va_copy
(
va2
,
va
);
XNFvasprintf
(
&
ret
,
format
,
va
);
size
=
vsnprintf
(
NULL
,
0
,
format
,
va2
);
va_end
(
va2
);
ret
=
(
char
*
)
XNFalloc
(
size
+
1
);
if
(
ret
==
NULL
)
return
NULL
;
vsnprintf
(
ret
,
size
+
1
,
format
,
va
);
ret
[
size
]
=
0
;
return
ret
;
return
ret
;
}
}
char
*
XNFprintf
(
const
char
*
format
,
...)
char
*
XNFprintf
(
const
char
*
format
,
...)
{
{
char
*
ret
;
char
*
ret
;
va_list
va
;
va_list
va
;
va_start
(
va
,
format
);
va_start
(
va
,
format
);
ret
=
XNFvprintf
(
format
,
va
);
XNFvasprintf
(
&
ret
,
format
,
va
);
va_end
(
va
);
va_end
(
va
);
return
ret
;
return
ret
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment