1 /***********************************************************
2 
3 Copyright 1987, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
24 
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26 
27                         All Rights Reserved
28 
29 Permission to use, copy, modify, and distribute this software and its
30 documentation for any purpose and without fee is hereby granted,
31 provided that the above copyright notice appear in all copies and that
32 both that copyright notice and this permission notice appear in
33 supporting documentation, and that the name of Digital not be
34 used in advertising or publicity pertaining to distribution of the
35 software without specific, written prior permission.
36 
37 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43 SOFTWARE.
44 
45 ******************************************************************/
46 
47 #ifndef OS_H
48 #define OS_H
49 
50 #include "misc.h"
51 #include <stdarg.h>
52 #include <stdint.h>
53 #include <string.h>
54 #ifdef MONOTONIC_CLOCK
55 #include <time.h>
56 #endif
57 #if defined(HAVE_LIBBSD) && defined(HAVE_REALLOCARRAY)
58 #include <bsd/stdlib.h>       /* for reallocarray */
59 #endif
60 #if defined(HAVE_LIBBSD) && defined(HAVE_STRLCPY)
61 #include <bsd/string.h>       /* for strlcpy, strlcat */
62 #endif
63 
64 #define SCREEN_SAVER_ON   0
65 #define SCREEN_SAVER_OFF  1
66 #define SCREEN_SAVER_FORCER 2
67 #define SCREEN_SAVER_CYCLE  3
68 
69 #ifndef MAX_REQUEST_SIZE
70 #define MAX_REQUEST_SIZE 65535
71 #endif
72 #ifndef MAX_BIG_REQUEST_SIZE
73 #define MAX_BIG_REQUEST_SIZE 4194303
74 #endif
75 
76 typedef struct _FontPathRec *FontPathPtr;
77 typedef struct _NewClientRec *NewClientPtr;
78 
79 #ifndef xnfalloc
80 #define xnfalloc(size) XNFalloc((unsigned long)(size))
81 #define xnfcalloc(_num, _size) XNFcallocarray((_num), (_size))
82 #define xnfrealloc(ptr, size) XNFrealloc((void *)(ptr), (unsigned long)(size))
83 
84 #define xstrdup(s) Xstrdup(s)
85 #define xnfstrdup(s) XNFstrdup(s)
86 
87 #define xallocarray(num, size) reallocarray(NULL, (num), (size))
88 #define xnfallocarray(num, size) XNFreallocarray(NULL, (num), (size))
89 #define xnfreallocarray(ptr, num, size) XNFreallocarray((ptr), (num), (size))
90 #endif
91 
92 #include <stdio.h>
93 #include <stdarg.h>
94 
95 #ifdef DDXBEFORERESET
96 extern void ddxBeforeReset(void);
97 #endif
98 
99 #ifdef DDXOSVERRORF
100 extern _X_EXPORT void (*OsVendorVErrorFProc) (const char *,
101                                               va_list args)
102 _X_ATTRIBUTE_PRINTF(1, 0);
103 #endif
104 
105 extern _X_EXPORT Bool WaitForSomething(Bool clients_are_ready);
106 
107 extern _X_EXPORT int ReadRequestFromClient(ClientPtr /*client */ );
108 
109 extern _X_EXPORT int ReadFdFromClient(ClientPtr client);
110 
111 extern _X_EXPORT int WriteFdToClient(ClientPtr client, int fd, Bool do_close);
112 
113 extern _X_EXPORT Bool InsertFakeRequest(ClientPtr /*client */ ,
114                                         char * /*data */ ,
115                                         int /*count */ );
116 
117 extern _X_EXPORT void ResetCurrentRequest(ClientPtr /*client */ );
118 
119 extern _X_EXPORT void FlushAllOutput(void);
120 
121 extern _X_EXPORT void FlushIfCriticalOutputPending(void);
122 
123 extern _X_EXPORT void SetCriticalOutputPending(void);
124 
125 extern _X_EXPORT int WriteToClient(ClientPtr /*who */ , int /*count */ ,
126                                    const void * /*buf */ );
127 
128 extern _X_EXPORT void ResetOsBuffers(void);
129 
130 extern _X_EXPORT void InitConnectionLimits(void);
131 
132 extern _X_EXPORT void NotifyParentProcess(void);
133 
134 extern _X_EXPORT void CreateWellKnownSockets(void);
135 
136 extern _X_EXPORT void ResetWellKnownSockets(void);
137 
138 extern _X_EXPORT void CloseWellKnownConnections(void);
139 
140 extern _X_EXPORT XID AuthorizationIDOfClient(ClientPtr /*client */ );
141 
142 extern _X_EXPORT const char *ClientAuthorized(ClientPtr /*client */ ,
143                                               unsigned int /*proto_n */ ,
144                                               char * /*auth_proto */ ,
145                                               unsigned int /*string_n */ ,
146                                               char * /*auth_string */ );
147 
148 extern _X_EXPORT void CloseDownConnection(ClientPtr /*client */ );
149 
150 typedef void (*NotifyFdProcPtr)(int fd, int ready, void *data);
151 
152 #define X_NOTIFY_NONE   0x0
153 #define X_NOTIFY_READ   0x1
154 #define X_NOTIFY_WRITE  0x2
155 #define X_NOTIFY_ERROR  0x4     /* don't need to select for, always reported */
156 
157 extern _X_EXPORT Bool SetNotifyFd(int fd, NotifyFdProcPtr notify_fd, int mask, void *data);
158 
RemoveNotifyFd(int fd)159 static inline void RemoveNotifyFd(int fd)
160 {
161     (void) SetNotifyFd(fd, NULL, X_NOTIFY_NONE, NULL);
162 }
163 
164 extern _X_EXPORT int OnlyListenToOneClient(ClientPtr /*client */ );
165 
166 extern _X_EXPORT void ListenToAllClients(void);
167 
168 extern _X_EXPORT void IgnoreClient(ClientPtr /*client */ );
169 
170 extern _X_EXPORT void AttendClient(ClientPtr /*client */ );
171 
172 extern _X_EXPORT void MakeClientGrabImpervious(ClientPtr /*client */ );
173 
174 extern _X_EXPORT void MakeClientGrabPervious(ClientPtr /*client */ );
175 
176 extern _X_EXPORT void ListenOnOpenFD(int /* fd */ , int /* noxauth */ );
177 
178 extern _X_EXPORT Bool AddClientOnOpenFD(int /* fd */ );
179 
180 #ifdef MONOTONIC_CLOCK
181 extern void ForceClockId(clockid_t /* forced_clockid */);
182 #endif
183 
184 extern _X_EXPORT CARD32 GetTimeInMillis(void);
185 extern _X_EXPORT CARD64 GetTimeInMicros(void);
186 
187 extern _X_EXPORT void AdjustWaitForDelay(void *waitTime, int newdelay);
188 
189 typedef struct _OsTimerRec *OsTimerPtr;
190 
191 typedef CARD32 (*OsTimerCallback) (OsTimerPtr timer,
192                                    CARD32 time,
193                                    void *arg);
194 
195 extern _X_EXPORT void TimerInit(void);
196 
197 extern _X_EXPORT Bool TimerForce(OsTimerPtr /* timer */ );
198 
199 #define TimerAbsolute (1<<0)
200 #define TimerForceOld (1<<1)
201 
202 extern _X_EXPORT OsTimerPtr TimerSet(OsTimerPtr timer,
203                                      int flags,
204                                      CARD32 millis,
205                                      OsTimerCallback func,
206                                      void *arg);
207 
208 extern _X_EXPORT void TimerCheck(void);
209 extern _X_EXPORT void TimerCancel(OsTimerPtr /* pTimer */ );
210 extern _X_EXPORT void TimerFree(OsTimerPtr /* pTimer */ );
211 
212 extern _X_EXPORT void SetScreenSaverTimer(void);
213 extern _X_EXPORT void FreeScreenSaverTimer(void);
214 
215 extern _X_EXPORT void AutoResetServer(int /*sig */ );
216 
217 extern _X_EXPORT void GiveUp(int /*sig */ );
218 
219 extern _X_EXPORT void UseMsg(void);
220 
221 extern _X_EXPORT void ProcessCommandLine(int /*argc */ , char * /*argv */ []);
222 
223 extern _X_EXPORT int set_font_authorizations(char **authorizations,
224                                              int *authlen,
225                                              void *client);
226 
227 /*
228  * This function malloc(3)s buffer, terminating the server if there is not
229  * enough memory.
230  */
231 extern _X_EXPORT void *
232 XNFalloc(unsigned long /*amount */ );
233 
234 /*
235  * This function calloc(3)s buffer, terminating the server if there is not
236  * enough memory.
237  */
238 extern _X_EXPORT void *
239 XNFcalloc(unsigned long /*amount */ ) _X_DEPRECATED;
240 
241 /*
242  * This function calloc(3)s buffer, terminating the server if there is not
243  * enough memory or the arguments overflow when multiplied
244  */
245 extern _X_EXPORT void *
246 XNFcallocarray(size_t nmemb, size_t size);
247 
248 /*
249  * This function realloc(3)s passed buffer, terminating the server if there is
250  * not enough memory.
251  */
252 extern _X_EXPORT void *
253 XNFrealloc(void * /*ptr */ , unsigned long /*amount */ );
254 
255 /*
256  * This function reallocarray(3)s passed buffer, terminating the server if
257  * there is not enough memory or the arguments overflow when multiplied.
258  */
259 extern _X_EXPORT void *
260 XNFreallocarray(void *ptr, size_t nmemb, size_t size);
261 
262 /*
263  * This function strdup(3)s passed string. The only difference from the library
264  * function that it is safe to pass NULL, as NULL will be returned.
265  */
266 extern _X_EXPORT char *
267 Xstrdup(const char *s);
268 
269 /*
270  * This function strdup(3)s passed string, terminating the server if there is
271  * not enough memory. If NULL is passed to this function, NULL is returned.
272  */
273 extern _X_EXPORT char *
274 XNFstrdup(const char *s);
275 
276 /* Include new X*asprintf API */
277 #include "Xprintf.h"
278 
279 /* Older api deprecated in favor of the asprintf versions */
280 extern _X_EXPORT char *
281 Xprintf(const char *fmt, ...)
282 _X_ATTRIBUTE_PRINTF(1, 2)
283     _X_DEPRECATED;
284 extern _X_EXPORT char *
285 Xvprintf(const char *fmt, va_list va)
286 _X_ATTRIBUTE_PRINTF(1, 0)
287     _X_DEPRECATED;
288 extern _X_EXPORT char *
289 XNFprintf(const char *fmt, ...)
290 _X_ATTRIBUTE_PRINTF(1, 2)
291     _X_DEPRECATED;
292 extern _X_EXPORT char *
293 XNFvprintf(const char *fmt, va_list va)
294 _X_ATTRIBUTE_PRINTF(1, 0)
295     _X_DEPRECATED;
296 
297 typedef void (*OsSigHandlerPtr) (int /* sig */ );
298 typedef int (*OsSigWrapperPtr) (int /* sig */ );
299 
300 extern _X_EXPORT OsSigHandlerPtr
301 OsSignal(int /* sig */ , OsSigHandlerPtr /* handler */ );
302 extern _X_EXPORT OsSigWrapperPtr
303 OsRegisterSigWrapper(OsSigWrapperPtr newWrap);
304 
305 extern _X_EXPORT int auditTrailLevel;
306 
307 extern _X_EXPORT void
308 LockServer(void);
309 extern _X_EXPORT void
310 UnlockServer(void);
311 
312 extern _X_EXPORT int
313 OsLookupColor(int /*screen */ ,
314               char * /*name */ ,
315               unsigned /*len */ ,
316               unsigned short * /*pred */ ,
317               unsigned short * /*pgreen */ ,
318               unsigned short * /*pblue */ );
319 
320 extern _X_EXPORT void
321 OsInit(void);
322 
323 extern _X_EXPORT void
324 OsCleanup(Bool);
325 
326 extern _X_EXPORT void
327 OsVendorFatalError(const char *f, va_list args)
328 _X_ATTRIBUTE_PRINTF(1, 0);
329 
330 extern _X_EXPORT void
331 OsVendorInit(void);
332 
333 extern _X_EXPORT void
334 OsBlockSignals(void);
335 
336 extern _X_EXPORT void
337 OsReleaseSignals(void);
338 
339 extern void
340 OsResetSignals(void);
341 
342 extern _X_EXPORT void
343 OsAbort(void)
344     _X_NORETURN;
345 
346 #if !defined(WIN32)
347 extern _X_EXPORT int
348 System(const char *);
349 extern _X_EXPORT void *
350 Popen(const char *, const char *);
351 extern _X_EXPORT int
352 Pclose(void *);
353 extern _X_EXPORT void *
354 Fopen(const char *, const char *);
355 extern _X_EXPORT int
356 Fclose(void *);
357 #else
358 
359 extern const char *
360 Win32TempDir(void);
361 
362 extern int
363 System(const char *cmdline);
364 
365 #define Fopen(a,b) fopen(a,b)
366 #define Fclose(a) fclose(a)
367 #endif
368 
369 extern _X_EXPORT Bool
370 PrivsElevated(void);
371 
372 extern _X_EXPORT void
373 CheckUserParameters(int argc, char **argv, char **envp);
374 extern _X_EXPORT void
375 CheckUserAuthorization(void);
376 
377 extern _X_EXPORT int
378 AddHost(ClientPtr /*client */ ,
379         int /*family */ ,
380         unsigned /*length */ ,
381         const void * /*pAddr */ );
382 
383 extern _X_EXPORT Bool
384 ForEachHostInFamily(int family,
385                     Bool (*func)(
386                                            unsigned char *addr,
387                                            short len,
388                                            void *closure),
389                     void *closure);
390 
391 extern _X_EXPORT int
392 RemoveHost(ClientPtr client,
393            int family,
394            unsigned length,
395            void *pAddr);
396 
397 extern _X_EXPORT int
398 GetHosts(void ** /*data */ ,
399          int * /*pnHosts */ ,
400          int * /*pLen */ ,
401          BOOL * /*pEnabled */ );
402 
403 typedef struct sockaddr *sockaddrPtr;
404 
405 extern _X_EXPORT int
406 InvalidHost(sockaddrPtr /*saddr */ , int /*len */ , ClientPtr client);
407 
408 #define LCC_UID_SET	(1 << 0)
409 #define LCC_GID_SET	(1 << 1)
410 #define LCC_PID_SET	(1 << 2)
411 #define LCC_ZID_SET	(1 << 3)
412 
413 typedef struct {
414     int fieldsSet;              /* Bit mask of fields set */
415     int euid;                   /* Effective uid */
416     int egid;                   /* Primary effective group id */
417     int nSuppGids;              /* Number of supplementary group ids */
418     int *pSuppGids;             /* Array of supplementary group ids */
419     int pid;                    /* Process id */
420     int zoneid;                 /* Only set on Solaris 10 & later */
421 } LocalClientCredRec;
422 
423 extern _X_EXPORT int
424 GetLocalClientCreds(ClientPtr, LocalClientCredRec **);
425 
426 extern _X_EXPORT void
427 FreeLocalClientCreds(LocalClientCredRec *);
428 
429 extern _X_EXPORT int
430 ChangeAccessControl(ClientPtr /*client */ , int /*fEnabled */ );
431 
432 extern _X_EXPORT int
433 GetClientFd(ClientPtr);
434 
435 extern _X_EXPORT Bool
436 ClientIsLocal(ClientPtr client);
437 
438 extern _X_EXPORT int
439 GetAccessControl(void);
440 
441 extern _X_EXPORT void
442 AddLocalHosts(void);
443 
444 extern _X_EXPORT void
445 ResetHosts(const char *display);
446 
447 extern _X_EXPORT void
448 EnableLocalAccess(void);
449 
450 extern _X_EXPORT void
451 DisableLocalAccess(void);
452 
453 extern _X_EXPORT void
454 EnableLocalHost(void);
455 
456 extern _X_EXPORT void
457 DisableLocalHost(void);
458 
459 #ifndef NO_LOCAL_CLIENT_CRED
460 extern _X_EXPORT void
461 EnableLocalUser(void);
462 
463 extern _X_EXPORT void
464 DisableLocalUser(void);
465 
466 extern _X_EXPORT void
467 LocalAccessScopeUser(void);
468 #endif
469 
470 extern _X_EXPORT void
471 AccessUsingXdmcp(void);
472 
473 extern _X_EXPORT void
474 DefineSelf(int /*fd */ );
475 
476 #ifdef XDMCP
477 extern _X_EXPORT void
478 AugmentSelf(void *from, int len);
479 
480 extern _X_EXPORT void
481 RegisterAuthorizations(void);
482 #endif
483 
484 extern _X_EXPORT void
485 InitAuthorization(const char * /*filename */ );
486 
487 /* extern int LoadAuthorization(void); */
488 
489 extern _X_EXPORT int
490 AuthorizationFromID(XID id,
491                     unsigned short *name_lenp,
492                     const char **namep,
493                     unsigned short *data_lenp, char **datap);
494 
495 extern _X_EXPORT XID
496 CheckAuthorization(unsigned int /*namelength */ ,
497                    const char * /*name */ ,
498                    unsigned int /*datalength */ ,
499                    const char * /*data */ ,
500                    ClientPtr /*client */ ,
501                    const char **        /*reason */
502     );
503 
504 extern _X_EXPORT void
505 ResetAuthorization(void);
506 
507 extern _X_EXPORT int
508 RemoveAuthorization(unsigned short name_length,
509                     const char *name,
510                     unsigned short data_length, const char *data);
511 
512 extern _X_EXPORT int
513 AddAuthorization(unsigned int /*name_length */ ,
514                  const char * /*name */ ,
515                  unsigned int /*data_length */ ,
516                  char * /*data */ );
517 
518 #ifdef XCSECURITY
519 extern _X_EXPORT XID
520 GenerateAuthorization(unsigned int /* name_length */ ,
521                       const char * /* name */ ,
522                       unsigned int /* data_length */ ,
523                       const char * /* data */ ,
524                       unsigned int * /* data_length_return */ ,
525                       char ** /* data_return */ );
526 #endif
527 
528 extern _X_EXPORT int
529 ddxProcessArgument(int /*argc */ , char * /*argv */ [], int /*i */ );
530 
531 extern _X_EXPORT void
532 ddxUseMsg(void);
533 
534 /* stuff for ReplyCallback */
535 extern _X_EXPORT CallbackListPtr ReplyCallback;
536 typedef struct {
537     ClientPtr client;
538     const void *replyData;
539     unsigned long dataLenBytes; /* actual bytes from replyData + pad bytes */
540     unsigned long bytesRemaining;
541     Bool startOfReply;
542     unsigned long padBytes;     /* pad bytes from zeroed array */
543 } ReplyInfoRec;
544 
545 /* stuff for FlushCallback */
546 extern _X_EXPORT CallbackListPtr FlushCallback;
547 
548 enum ExitCode {
549     EXIT_NO_ERROR = 0,
550     EXIT_ERR_ABORT = 1,
551     EXIT_ERR_CONFIGURE = 2,
552     EXIT_ERR_DRIVERS = 3,
553 };
554 
555 extern _X_EXPORT void
556 AbortDDX(enum ExitCode error);
557 extern _X_EXPORT void
558 ddxGiveUp(enum ExitCode error);
559 extern _X_EXPORT void
560 ddxInputThreadInit(void);
561 extern _X_EXPORT int
562 TimeSinceLastInputEvent(void);
563 
564 /* Function fallbacks provided by AC_REPLACE_FUNCS in configure.ac */
565 
566 #ifndef HAVE_REALLOCARRAY
567 #define reallocarray xreallocarray
568 extern _X_EXPORT void *
569 reallocarray(void *optr, size_t nmemb, size_t size);
570 #endif
571 
572 #ifndef HAVE_STRCASECMP
573 #define strcasecmp xstrcasecmp
574 extern _X_EXPORT int
575 xstrcasecmp(const char *s1, const char *s2);
576 #endif
577 
578 #ifndef HAVE_STRNCASECMP
579 #define strncasecmp xstrncasecmp
580 extern _X_EXPORT int
581 xstrncasecmp(const char *s1, const char *s2, size_t n);
582 #endif
583 
584 #ifndef HAVE_STRCASESTR
585 #define strcasestr xstrcasestr
586 extern _X_EXPORT char *
587 xstrcasestr(const char *s, const char *find);
588 #endif
589 
590 #ifndef HAVE_STRLCPY
591 extern _X_EXPORT size_t
592 strlcpy(char *dst, const char *src, size_t siz);
593 extern _X_EXPORT size_t
594 strlcat(char *dst, const char *src, size_t siz);
595 #endif
596 
597 #ifndef HAVE_STRNDUP
598 extern _X_EXPORT char *
599 strndup(const char *str, size_t n);
600 #endif
601 
602 #ifndef HAVE_TIMINGSAFE_MEMCMP
603 extern _X_EXPORT int
604 timingsafe_memcmp(const void *b1, const void *b2, size_t len);
605 #endif
606 
607 /* Logging. */
608 typedef enum _LogParameter {
609     XLOG_FLUSH,
610     XLOG_SYNC,
611     XLOG_VERBOSITY,
612     XLOG_FILE_VERBOSITY
613 } LogParameter;
614 
615 /* Flags for log messages. */
616 typedef enum {
617     X_PROBED,                   /* Value was probed */
618     X_CONFIG,                   /* Value was given in the config file */
619     X_DEFAULT,                  /* Value is a default */
620     X_CMDLINE,                  /* Value was given on the command line */
621     X_NOTICE,                   /* Notice */
622     X_ERROR,                    /* Error message */
623     X_WARNING,                  /* Warning message */
624     X_INFO,                     /* Informational message */
625     X_NONE,                     /* No prefix */
626     X_NOT_IMPLEMENTED,          /* Not implemented */
627     X_DEBUG,                    /* Debug message */
628     X_UNKNOWN = -1              /* unknown -- this must always be last */
629 } MessageType;
630 
631 extern _X_EXPORT const char *
632 LogInit(const char *fname, const char *backup);
633 extern void
634 LogSetDisplay(void);
635 extern _X_EXPORT void
636 LogClose(enum ExitCode error);
637 extern _X_EXPORT Bool
638 LogSetParameter(LogParameter param, int value);
639 extern _X_EXPORT void
640 LogVWrite(int verb, const char *f, va_list args)
641 _X_ATTRIBUTE_PRINTF(2, 0);
642 extern _X_EXPORT void
643 LogWrite(int verb, const char *f, ...)
644 _X_ATTRIBUTE_PRINTF(2, 3);
645 extern _X_EXPORT void
646 LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
647 _X_ATTRIBUTE_PRINTF(3, 0);
648 extern _X_EXPORT void
649 LogMessageVerb(MessageType type, int verb, const char *format, ...)
650 _X_ATTRIBUTE_PRINTF(3, 4);
651 extern _X_EXPORT void
652 LogMessage(MessageType type, const char *format, ...)
653 _X_ATTRIBUTE_PRINTF(2, 3);
654 extern _X_EXPORT void
655 LogMessageVerbSigSafe(MessageType type, int verb, const char *format, ...)
656 _X_ATTRIBUTE_PRINTF(3, 4);
657 extern _X_EXPORT void
658 LogVMessageVerbSigSafe(MessageType type, int verb, const char *format, va_list args)
659 _X_ATTRIBUTE_PRINTF(3, 0);
660 
661 extern _X_EXPORT void
662 LogVHdrMessageVerb(MessageType type, int verb,
663                    const char *msg_format, va_list msg_args,
664                    const char *hdr_format, va_list hdr_args)
665 _X_ATTRIBUTE_PRINTF(3, 0)
666 _X_ATTRIBUTE_PRINTF(5, 0);
667 extern _X_EXPORT void
668 LogHdrMessageVerb(MessageType type, int verb,
669                   const char *msg_format, va_list msg_args,
670                   const char *hdr_format, ...)
671 _X_ATTRIBUTE_PRINTF(3, 0)
672 _X_ATTRIBUTE_PRINTF(5, 6);
673 extern _X_EXPORT void
674 LogHdrMessage(MessageType type, const char *msg_format,
675               va_list msg_args, const char *hdr_format, ...)
676 _X_ATTRIBUTE_PRINTF(2, 0)
677 _X_ATTRIBUTE_PRINTF(4, 5);
678 
679 extern _X_EXPORT void
680 FreeAuditTimer(void);
681 extern _X_EXPORT void
682 AuditF(const char *f, ...)
683 _X_ATTRIBUTE_PRINTF(1, 2);
684 extern _X_EXPORT void
685 VAuditF(const char *f, va_list args)
686 _X_ATTRIBUTE_PRINTF(1, 0);
687 extern _X_EXPORT void
688 FatalError(const char *f, ...)
689 _X_ATTRIBUTE_PRINTF(1, 2)
690     _X_NORETURN;
691 
692 #ifdef DEBUG
693 #define DebugF ErrorF
694 #else
695 #define DebugF(...)             /* */
696 #endif
697 
698 extern _X_EXPORT void
699 VErrorF(const char *f, va_list args)
700 _X_ATTRIBUTE_PRINTF(1, 0);
701 extern _X_EXPORT void
702 ErrorF(const char *f, ...)
703 _X_ATTRIBUTE_PRINTF(1, 2);
704 extern _X_EXPORT void
705 VErrorFSigSafe(const char *f, va_list args)
706 _X_ATTRIBUTE_PRINTF(1, 0);
707 extern _X_EXPORT void
708 ErrorFSigSafe(const char *f, ...)
709 _X_ATTRIBUTE_PRINTF(1, 2);
710 extern _X_EXPORT void
711 LogPrintMarkers(void);
712 
713 extern _X_EXPORT void
714 xorg_backtrace(void);
715 
716 extern _X_EXPORT int
717 os_move_fd(int fd);
718 
719 #include <signal.h>
720 
721 extern _X_EXPORT int
722 xthread_sigmask(int how, const sigset_t *set, sigset_t *oldest);
723 
724 #endif                          /* OS_H */
725