summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@sun.com>2009-08-18 20:11:23 -0700
committerAlan Coopersmith <alan.coopersmith@sun.com>2009-08-18 20:18:36 -0700
commit2d34eace13c2016048c627c4e96c3b2399901078 (patch)
tree6d9962694301c8f948dc139f8ec0fd2530e6b307
parentd225230148b3cdab3b32fce3abee26b818d4bab0 (diff)
Sun bug 6872917: Xorg not querying /dev/fb when no xorg.conf exists
commit 48ee5558333bd324463b6994735cabb23de262ec (OpenSolaris VT support) broke the autoconfiguration code in xf86AutoConfig.c that uses the Solaris-specific VIS_GETIDENTIFIER ioctl on a frame buffer device like /dev/fb by changing xf86Info.consoleFd from /dev/fb to a /dev/vt/* device. This fixes it by reworking the code to split the console device (/dev/vt/*, the vtXX CLI option) from the frame buffer device (/dev/fb, -dev option) to allow both VT and autoconfig to work. It also fixes the console device to use /dev/fb when VT's are not supported instead of throwing a Fatal Error because it can't open /dev/vt/0. Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
-rw-r--r--hw/xfree86/common/xf86AutoConfig.c19
-rw-r--r--hw/xfree86/os-support/solaris/sun_init.c26
2 files changed, 33 insertions, 12 deletions
diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index ac40ab35c..c6c839a2a 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -410,8 +410,25 @@ listPossibleVideoDrivers(char *matches[], int nmatches)
if (xf86Info.consoleFd >= 0) {
struct vis_identifier visid;
const char *cp;
+ extern char xf86SolarisFbDev[PATH_MAX];
+ int iret;
- if (ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid) >= 0) {
+ SYSCALL(iret = ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid));
+ if (iret < 0) {
+ int fbfd;
+
+ fbfd = open(xf86SolarisFbDev, O_RDONLY);
+ if (fbfd >= 0) {
+ SYSCALL(iret = ioctl(fbfd, VIS_GETIDENTIFIER, &visid));
+ close(fbfd);
+ }
+ }
+
+ if (iret < 0) {
+ xf86Msg(X_WARNING,
+ "could not get frame buffer identifier from %s\n",
+ xf86SolarisFbDev);
+ } else {
xf86Msg(X_PROBED, "console driver: %s\n", visid.name);
/* Special case from before the general case was set */
diff --git a/hw/xfree86/os-support/solaris/sun_init.c b/hw/xfree86/os-support/solaris/sun_init.c
index 44588dd9f..2c569f02c 100644
--- a/hw/xfree86/os-support/solaris/sun_init.c
+++ b/hw/xfree86/os-support/solaris/sun_init.c
@@ -39,11 +39,15 @@ static Bool Protect0 = FALSE;
static int VTnum = -1;
static int xf86StartVT = -1;
static int vtEnabled = 0;
-static char fb_dev[PATH_MAX] = "/dev/vt/0";
-#else
-static char fb_dev[PATH_MAX] = "/dev/fb";
#endif
+/* Device to open as xf86Info.consoleFd */
+static char consoleDev[PATH_MAX] = "/dev/fb";
+
+/* Set by -dev argument on CLI
+ Used by hw/xfree86/common/xf86AutoConfig.c for VIS_GETIDENTIFIER */
+_X_HIDDEN char xf86SolarisFbDev[PATH_MAX] = "/dev/fb";
+
void
xf86OpenConsole(void)
{
@@ -116,6 +120,7 @@ xf86OpenConsole(void)
xf86StartVT = 0;
xf86Info.vtno = 0;
+ strlcpy(consoleDev, xf86SolarisFbDev, sizeof(consoleDev));
}
else
{
@@ -138,7 +143,7 @@ xf86OpenConsole(void)
}
xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
- snprintf(fb_dev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
+ snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
}
if (fd != -1) {
@@ -150,14 +155,14 @@ xf86OpenConsole(void)
if (!KeepTty)
setpgrp();
- if (((xf86Info.consoleFd = open(fb_dev, O_RDWR | O_NDELAY, 0)) < 0))
+ if (((xf86Info.consoleFd = open(consoleDev, O_RDWR | O_NDELAY, 0)) < 0))
FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
- fb_dev, strerror(errno));
+ consoleDev, strerror(errno));
#ifdef HAS_USL_VTS
/* Change ownership of the vt */
- chown(fb_dev, getuid(), getgid());
+ chown(consoleDev, getuid(), getgid());
if (vtEnabled)
{
@@ -192,7 +197,7 @@ xf86OpenConsole(void)
if (i < 0) {
xf86Msg(X_WARNING,
"xf86OpenConsole: KDSETMODE KD_GRAPHICS failed on %s (%s)\n",
- fb_dev, strerror(errno));
+ consoleDev, strerror(errno));
}
#endif
}
@@ -241,7 +246,7 @@ xf86CloseConsole(void)
* at this point whether this should be done for all framebuffers in
* the system, rather than only the console.
*/
- if ((fd = open("/dev/fb", O_RDWR, 0)) < 0) {
+ if ((fd = open(xf86SolarisFbDev, O_RDWR, 0)) < 0) {
xf86Msg(X_WARNING,
"xf86CloseConsole(): unable to open framebuffer (%s)\n",
strerror(errno));
@@ -336,8 +341,7 @@ xf86ProcessArgument(int argc, char **argv, int i)
if ((i + 1) < argc) {
if (!strcmp(argv[i], "-dev")) {
- strncpy(fb_dev, argv[i+1], PATH_MAX);
- fb_dev[PATH_MAX - 1] = '\0';
+ strlcpy(xf86SolarisFbDev, argv[i+1], sizeof(xf86SolarisFbDev));
return 2;
}
}