xserver-multidpi/hw/xfree86/os-support/linux/lnx_kmod.c
Keith Packard 9838b7032e Introduce a consistent coding style
This is strictly the application of the script 'x-indent-all.sh'
from util/modular. Compared to the patch that Daniel posted in
January, I've added a few indent flags:

	-bap
	-psl
	-T PrivatePtr
	-T pmWait
	-T _XFUNCPROTOBEGIN
	-T _XFUNCPROTOEND
	-T _X_EXPORT

The typedefs were needed to make the output of sdksyms.sh match the
previous output, otherwise, the code is formatted badly enough that
sdksyms.sh generates incorrect output.

The generated code was compared with the previous version and found to
be essentially identical -- "assert" line numbers and BUILD_TIME were
the only differences found.

The comparison was done with this script:

dir1=$1
dir2=$2

for dir in $dir1 $dir2; do
	(cd $dir && find . -name '*.o' | while read file; do
		dir=`dirname $file`
		base=`basename $file .o`
		dump=$dir/$base.dump
		objdump -d $file > $dump
	done)
done

find $dir1 -name '*.dump' | while read dump; do
	otherdump=`echo $dump | sed "s;$dir1;$dir2;"`
	diff -u $dump $otherdump
done

Signed-off-by: Keith Packard <keithp@keithp.com>
Acked-by: Daniel Stone <daniel@fooishbar.org>
Acked-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2012-03-21 13:54:42 -07:00

112 lines
2.9 KiB
C

#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include "xf86_OSlib.h"
#include "xf86.h"
#define MODPROBE_PATH_FILE "/proc/sys/kernel/modprobe"
#define MAX_PATH 1024
#if 0
/* XFree86 #defines execl to be the xf86execl() function which does
* a fork AND exec. We don't want that. We want the regular,
* standard execl().
*/
#ifdef execl
#undef execl
#endif
#endif
/*
* Load a Linux kernel module.
* This is used by the DRI/DRM to load a DRM kernel module when
* the X server starts. It could be used for other purposes in the future.
* Input:
* modName - name of the kernel module (Ex: "tdfx")
* Return:
* 0 for failure, 1 for success
*/
int
xf86LoadKernelModule(const char *modName)
{
char mpPath[MAX_PATH] = "";
int fd = -1, status, n;
pid_t pid;
/* get the path to the modprobe program */
fd = open(MODPROBE_PATH_FILE, O_RDONLY);
if (fd >= 0) {
int count = read(fd, mpPath, MAX_PATH - 1);
if (count <= 0) {
mpPath[0] = 0;
}
else if (mpPath[count - 1] == '\n') {
mpPath[count - 1] = 0; /* replaces \n with \0 */
}
close(fd);
/* if this worked, mpPath will be "/sbin/modprobe" or similar. */
}
if (mpPath[0] == 0) {
/* we failed to get the path from the system, use a default */
strcpy(mpPath, "/sbin/modprobe");
}
/* now fork/exec the modprobe command */
/*
* It would be good to capture stdout/stderr so that it can be directed
* to the log file. modprobe errors currently are missing from the log
* file.
*/
switch (pid = fork()) {
case 0: /* child */
/* change real/effective user ID to 0/0 as we need to
* preinstall agpgart module for some DRM modules
*/
if (setreuid(0, 0)) {
xf86Msg(X_WARNING, "LoadKernelModule: "
"Setting of real/effective user Id to 0/0 failed");
}
setenv("PATH", "/sbin", 1);
n = execl(mpPath, "modprobe", modName, NULL);
xf86Msg(X_WARNING, "LoadKernelModule %s\n", strerror(errno));
exit(EXIT_FAILURE); /* if we get here the child's exec failed */
break;
case -1: /* fork failed */
return 0;
default: /* fork worked */
{
/* XXX we loop over waitpid() because it sometimes fails on
* the first attempt. Don't know why!
*/
int count = 0, p;
do {
p = waitpid(pid, &status, 0);
} while (p == -1 && count++ < 4);
if (p == -1) {
return 0;
}
if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
return 1; /* success! */
}
else {
return 0;
}
}
}
/* never get here */
return 0;
}