diff options
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | dix/eventconvert.c | 4 | ||||
-rw-r--r-- | dix/getevents.c | 1 | ||||
-rw-r--r-- | glx/glxdri.c | 2 | ||||
-rw-r--r-- | glx/glxdri2.c | 2 | ||||
-rw-r--r-- | hw/kdrive/ephyr/ephyr.c | 6 | ||||
-rw-r--r-- | hw/kdrive/ephyr/hostx.c | 6 | ||||
-rw-r--r-- | hw/kdrive/ephyr/hostx.h | 3 | ||||
-rw-r--r-- | include/eventstr.h | 1 | ||||
-rw-r--r-- | os/log.c | 115 | ||||
-rw-r--r-- | test/signal-logging.c | 95 |
11 files changed, 214 insertions, 29 deletions
diff --git a/configure.ac b/configure.ac index 428986330..bc53f1675 100644 --- a/configure.ac +++ b/configure.ac @@ -2216,6 +2216,14 @@ AC_SUBST([prefix]) AC_CONFIG_COMMANDS([sdksyms], [touch hw/xfree86/sdksyms.dep]) +if test "x$CONFIG_HAL" = xno && test "x$CONFIG_UDEV" = xno; then + AC_WARN([ + *********************************************** + Neither HAL nor udev backend will be enabled. + Input device hotplugging will not be available! + ***********************************************]) +fi + AC_OUTPUT([ Makefile glx/Makefile diff --git a/dix/eventconvert.c b/dix/eventconvert.c index ebc52c36c..f7ecdba77 100644 --- a/dix/eventconvert.c +++ b/dix/eventconvert.c @@ -501,9 +501,7 @@ appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo * info, info->min.frac = 0; info->max.integral = dce->valuators[axisnumber].max; info->max.frac = 0; - /* FIXME: value */ - info->value.integral = 0; - info->value.frac = 0; + info->value = double_to_fp3232(dce->valuators[axisnumber].value); info->resolution = dce->valuators[axisnumber].resolution; info->number = axisnumber; info->mode = dce->valuators[axisnumber].mode; diff --git a/dix/getevents.c b/dix/getevents.c index a4f192cf0..241c7ec0d 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -277,6 +277,7 @@ CreateClassesChangedEvent(InternalEvent *event, dce->valuators[i].mode = slave->valuator->axes[i].mode; dce->valuators[i].name = slave->valuator->axes[i].label; dce->valuators[i].scroll = slave->valuator->axes[i].scroll; + dce->valuators[i].value = slave->valuator->axisVal[i]; } } if (slave->key) { diff --git a/glx/glxdri.c b/glx/glxdri.c index da4646845..5891a68c5 100644 --- a/glx/glxdri.c +++ b/glx/glxdri.c @@ -885,7 +885,7 @@ glxDRILeaveVT(ScrnInfoPtr scrn) __GLXDRIscreen *screen = (__GLXDRIscreen *) glxGetScreen(xf86ScrnToScreen(scrn)); - LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n"); + LogMessageVerbSigSafe(X_INFO, -1, "AIGLX: Suspending AIGLX clients for VT switch\n"); glxSuspendClients(); diff --git a/glx/glxdri2.c b/glx/glxdri2.c index b26e501dc..16e7e3dee 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -835,7 +835,7 @@ glxDRILeaveVT(ScrnInfoPtr scrn) __GLXDRIscreen *screen = (__GLXDRIscreen *) glxGetScreen(xf86ScrnToScreen(scrn)); - LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n"); + LogMessageVerbSigSafe(X_INFO, -1, "AIGLX: Suspending AIGLX clients for VT switch\n"); glxSuspendClients(); diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index e6520d035..c9672c04a 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -237,13 +237,11 @@ ephyrMapFramebuffer(KdScreenInfo * screen) KdComputePointerMatrix(&m, ephyrRandr, screen->width, screen->height); KdSetPointerMatrix(&m); - priv->bytes_per_line = - ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2; - buffer_height = ephyrBufferHeight(screen); priv->base = - hostx_screen_init(screen, screen->width, screen->height, buffer_height); + hostx_screen_init(screen, screen->width, screen->height, buffer_height, + &priv->bytes_per_line, &screen->fb.bitsPerPixel); if ((scrpriv->randr & RR_Rotate_0) && !(scrpriv->randr & RR_Reflect_All)) { scrpriv->shadow = FALSE; diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c index 157ac36b2..6bbccd3e8 100644 --- a/hw/kdrive/ephyr/hostx.c +++ b/hw/kdrive/ephyr/hostx.c @@ -617,7 +617,8 @@ hostx_set_cmap_entry(unsigned char idx, */ void * hostx_screen_init(EphyrScreenInfo screen, - int width, int height, int buffer_height) + int width, int height, int buffer_height, + int *bytes_per_line, int *bits_per_pixel) { int bitmap_pad; Bool shm_success = False; @@ -694,6 +695,9 @@ hostx_screen_init(EphyrScreenInfo screen, malloc(host_screen->ximg->bytes_per_line * buffer_height); } + *bytes_per_line = host_screen->ximg->bytes_per_line; + *bits_per_pixel = host_screen->ximg->bits_per_pixel; + XResizeWindow(HostX.dpy, host_screen->win, width, height); /* Ask the WM to keep our size static */ diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h index 31c4053aa..38b7b3768 100644 --- a/hw/kdrive/ephyr/hostx.h +++ b/hw/kdrive/ephyr/hostx.h @@ -193,7 +193,8 @@ hostx_set_cmap_entry(unsigned char idx, unsigned char r, unsigned char g, unsigned char b); void *hostx_screen_init(EphyrScreenInfo screen, - int width, int height, int buffer_height); + int width, int height, int buffer_height, + int *bytes_per_line, int *bits_per_pixel); void diff --git a/include/eventstr.h b/include/eventstr.h index 38fab4f3c..5c1adc459 100644 --- a/include/eventstr.h +++ b/include/eventstr.h @@ -175,6 +175,7 @@ struct _DeviceChangedEvent { struct { uint32_t min; /**< Minimum value */ uint32_t max; /**< Maximum value */ + double value; /**< Current value */; /* FIXME: frac parts of min/max */ uint32_t resolution; /**< Resolution counts/m */ uint8_t mode; /**< Relative or Absolute */ @@ -250,7 +250,7 @@ void LogClose(enum ExitCode error) { if (logFile) { - ErrorF("Server terminated %s (%d). Closing log file.\n", + ErrorFSigSafe("Server terminated %s (%d). Closing log file.\n", (error == EXIT_NO_ERROR) ? "successfully" : "with error", error); fclose(logFile); logFile = NULL; @@ -279,6 +279,59 @@ LogSetParameter(LogParameter param, int value) } } +enum { + LMOD_LONG = 0x1, + LMOD_LONGLONG = 0x2, + LMOD_SHORT = 0x4, + LMOD_SIZET = 0x8, +}; + +/** + * Parse non-digit length modifiers and set the corresponding flag in + * flags_return. + * + * @return the number of bytes parsed + */ +static int parse_length_modifier(const char *format, size_t len, int *flags_return) +{ + int idx = 0; + int length_modifier = 0; + + while (idx < len) { + switch (format[idx]) { + case 'l': + BUG_RETURN_VAL(length_modifier & LMOD_SHORT, 0); + + if (length_modifier & LMOD_LONG) + length_modifier |= LMOD_LONGLONG; + else + length_modifier |= LMOD_LONG; + break; + case 'h': + BUG_RETURN_VAL(length_modifier & (LMOD_LONG|LMOD_LONGLONG), 0); + length_modifier |= LMOD_SHORT; + /* gcc says 'short int' is promoted to 'int' when + * passed through '...', so ignored during + * processing */ + break; + case 'z': + length_modifier |= LMOD_SIZET; + break; + default: + goto out; + } + idx++; + } + +out: + *flags_return = length_modifier; + return idx; +} + +/** + * Signal-safe snprintf, with some limitations over snprintf. Be careful + * which directives you use. + */ static int pnprintf(char *string, size_t size, const char *f, va_list args) { @@ -293,6 +346,7 @@ pnprintf(char *string, size_t size, const char *f, va_list args) int64_t si; for (; f_idx < f_len && s_idx < size - 1; f_idx++) { + int length_modifier = 0; if (f[f_idx] != '%') { string[s_idx++] = f[f_idx]; continue; @@ -300,10 +354,18 @@ pnprintf(char *string, size_t size, const char *f, va_list args) f_idx++; - /* silently swallow length modifiers */ + /* silently swallow digit length modifiers */ while (f_idx < f_len && ((f[f_idx] >= '0' && f[f_idx] <= '9') || f[f_idx] == '.')) f_idx++; + /* non-digit length modifiers */ + if (f_idx < f_len) { + int parsed_bytes = parse_length_modifier(&f[f_idx], f_len - f_idx, &length_modifier); + if (parsed_bytes < 0) + return 0; + f_idx += parsed_bytes; + } + if (f_idx >= f_len) break; @@ -317,7 +379,15 @@ pnprintf(char *string, size_t size, const char *f, va_list args) break; case 'u': - ui = va_arg(args, unsigned); + if (length_modifier & LMOD_LONGLONG) + ui = va_arg(args, unsigned long long); + else if (length_modifier & LMOD_LONG) + ui = va_arg(args, unsigned long); + else if (length_modifier & LMOD_SIZET) + ui = va_arg(args, size_t); + else + ui = va_arg(args, unsigned); + FormatUInt64(ui, number); p_len = strlen_sigsafe(number); @@ -326,7 +396,15 @@ pnprintf(char *string, size_t size, const char *f, va_list args) break; case 'i': case 'd': - si = va_arg(args, int); + if (length_modifier & LMOD_LONGLONG) + si = va_arg(args, long long); + else if (length_modifier & LMOD_LONG) + si = va_arg(args, long); + else if (length_modifier & LMOD_SIZET) + si = va_arg(args, ssize_t); + else + si = va_arg(args, int); + FormatInt64(si, number); p_len = strlen_sigsafe(number); @@ -347,7 +425,15 @@ pnprintf(char *string, size_t size, const char *f, va_list args) break; case 'x': - ui = va_arg(args, unsigned); + if (length_modifier & LMOD_LONGLONG) + ui = va_arg(args, unsigned long long); + else if (length_modifier & LMOD_LONG) + ui = va_arg(args, unsigned long); + else if (length_modifier & LMOD_SIZET) + ui = va_arg(args, size_t); + else + ui = va_arg(args, unsigned); + FormatUInt64Hex(ui, number); p_len = strlen_sigsafe(number); @@ -364,7 +450,18 @@ pnprintf(char *string, size_t size, const char *f, va_list args) string[s_idx++] = number[i]; } break; + case 'c': + { + char c = va_arg(args, int); + if (s_idx < size - 1) + string[s_idx++] = c; + } + break; + case '%': + string[s_idx++] = '%'; + break; default: + BUG_WARN_MSG(f[f_idx], "Unsupported printf directive '%c'\n", f[f_idx]); va_arg(args, char*); string[s_idx++] = '%'; if (s_idx < size - 1) @@ -781,9 +878,9 @@ FatalError(const char *f, ...) static Bool beenhere = FALSE; if (beenhere) - ErrorF("\nFatalError re-entered, aborting\n"); + ErrorFSigSafe("\nFatalError re-entered, aborting\n"); else - ErrorF("\nFatal server error:\n"); + ErrorFSigSafe("\nFatal server error:\n"); va_start(args, f); @@ -800,9 +897,9 @@ FatalError(const char *f, ...) va_end(apple_args); } #endif - VErrorF(f, args); + VErrorFSigSafe(f, args); va_end(args); - ErrorF("\n"); + ErrorFSigSafe("\n"); if (!beenhere) OsVendorFatalError(f, args2); va_end(args2); diff --git a/test/signal-logging.c b/test/signal-logging.c index e0eb81006..f6bc85ce8 100644 --- a/test/signal-logging.c +++ b/test/signal-logging.c @@ -158,6 +158,8 @@ static void logging_format(void) char buf[1024]; int i; unsigned int ui; + long li; + unsigned long lui; FILE *f; char read_buf[2048]; char *logmsg; @@ -194,6 +196,23 @@ static void logging_format(void) read_log_msg(logmsg); assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0); + /* literal % */ + LogMessageVerbSigSafe(X_ERROR, -1, "test %%\n"); + read_log_msg(logmsg); + assert(strcmp(logmsg, "(EE) test %\n") == 0); + + /* character */ + LogMessageVerbSigSafe(X_ERROR, -1, "test %c\n", 'a'); + read_log_msg(logmsg); + assert(strcmp(logmsg, "(EE) test a\n") == 0); + + /* something unsupported % */ + LogMessageVerbSigSafe(X_ERROR, -1, "test %Q\n"); + read_log_msg(logmsg); + assert(strstr(logmsg, "BUG") != NULL); + LogMessageVerbSigSafe(X_ERROR, -1, "\n"); + fseek(f, 0, SEEK_END); + /* string substitution */ LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", "substituted string"); read_log_msg(logmsg); @@ -207,6 +226,14 @@ static void logging_format(void) LogMessageVerbSigSafe(X_ERROR, -1, "\n"); fseek(f, 0, SEEK_END); +#warning Ignore compiler warning below "unknown conversion type character". This is intentional. + /* %hld is bogus */ + LogMessageVerbSigSafe(X_ERROR, -1, "%hld\n", 4); + read_log_msg(logmsg); + assert(strstr(logmsg, "BUG") != NULL); + LogMessageVerbSigSafe(X_ERROR, -1, "\n"); + fseek(f, 0, SEEK_END); + /* number substitution */ ui = 0; do { @@ -215,12 +242,47 @@ static void logging_format(void) LogMessageVerbSigSafe(X_ERROR, -1, "%u\n", ui); read_log_msg(logmsg); assert(strcmp(logmsg, expected) == 0); + + sprintf(expected, "(EE) %x\n", ui); + LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + if (ui == 0) ui = 1; else ui <<= 1; } while(ui); + lui = 0; + do { + char expected[30]; + sprintf(expected, "(EE) %lu\n", lui); + LogMessageVerbSigSafe(X_ERROR, -1, "%lu\n", lui); + read_log_msg(logmsg); + + sprintf(expected, "(EE) %lld\n", (unsigned long long)ui); + LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (unsigned long long)ui); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + sprintf(expected, "(EE) %lx\n", lui); + printf("%s\n", expected); + LogMessageVerbSigSafe(X_ERROR, -1, "%lx\n", lui); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + sprintf(expected, "(EE) %llx\n", (unsigned long long)ui); + LogMessageVerbSigSafe(X_ERROR, -1, "%llx\n", (unsigned long long)ui); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + if (lui == 0) + lui = 1; + else + lui <<= 1; + } while(lui); + /* signed number substitution */ i = 0; do { @@ -230,7 +292,6 @@ static void logging_format(void) read_log_msg(logmsg); assert(strcmp(logmsg, expected) == 0); - sprintf(expected, "(EE) %d\n", i | INT_MIN); LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i | INT_MIN); read_log_msg(logmsg); @@ -242,19 +303,35 @@ static void logging_format(void) i <<= 1; } while(i > INT_MIN); - /* hex number substitution */ - ui = 0; + li = 0; do { char expected[30]; - sprintf(expected, "(EE) %x\n", ui); - LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui); + sprintf(expected, "(EE) %ld\n", li); + LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li); read_log_msg(logmsg); assert(strcmp(logmsg, expected) == 0); - if (ui == 0) - ui = 1; + + sprintf(expected, "(EE) %ld\n", li | LONG_MIN); + LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li | LONG_MIN); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + sprintf(expected, "(EE) %lld\n", (long long)li); + LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)li); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + sprintf(expected, "(EE) %lld\n", (long long)(li | LONG_MIN)); + LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)(li | LONG_MIN)); + read_log_msg(logmsg); + assert(strcmp(logmsg, expected) == 0); + + if (li == 0) + li = 1; else - ui <<= 1; - } while(ui); + li <<= 1; + } while(li > LONG_MIN); + /* pointer substitution */ /* we print a null-pointer differently to printf */ |