summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac8
-rw-r--r--dix/eventconvert.c4
-rw-r--r--dix/getevents.c1
-rw-r--r--glx/glxdri.c2
-rw-r--r--glx/glxdri2.c2
-rw-r--r--hw/kdrive/ephyr/ephyr.c6
-rw-r--r--hw/kdrive/ephyr/hostx.c6
-rw-r--r--hw/kdrive/ephyr/hostx.h3
-rw-r--r--include/eventstr.h1
-rw-r--r--os/log.c115
-rw-r--r--test/signal-logging.c95
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 */
diff --git a/os/log.c b/os/log.c
index 95bd8cca9..f19faf5ee 100644
--- a/os/log.c
+++ b/os/log.c
@@ -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 */