mirror of
git://nv-tegra.nvidia.com/tegra/gfx-src/nv-xconfig.git
synced 2025-12-22 09:22:53 +03:00
913b088cb559f31e09a1baf89d85d75cb43079b4 - nvidia-xconfig-35.2.1/nvidia-xconfig.h 1e39095238886dfc6a69f7ec750e10c05a93e7d1 - nvidia-xconfig-35.2.1/nvidia-xconfig.1.m4 f14e9577e537037d4778d490ef70f13b0e94a70a - nvidia-xconfig-35.2.1/option_table.h 4cc77b90af91e615a64ae04893fdffa7939db84c - nvidia-xconfig-35.2.1/COPYING 41bcac41393c9a465c30c07cf1ab386647a16687 - nvidia-xconfig-35.2.1/util.c 647e7896275a1113ec99352d573823a05001f57e - nvidia-xconfig-35.2.1/lscf.c 22a5c807291792a264b5acca7ff6d199468890b8 - nvidia-xconfig-35.2.1/Makefile bfa37f78ba458f14a1865bbf3f67eb84987a7e1c - nvidia-xconfig-35.2.1/extract_edids.c c946eefad99cec9366d8abbd4e45c5d138d3b7be - nvidia-xconfig-35.2.1/make_usable.c 46f2ea329459b0b16cb36cc14cec0de737d0963e - nvidia-xconfig-35.2.1/options.c b3d0f9f27c4d9cb7940d04e1dd387d357a16024c - nvidia-xconfig-35.2.1/nvidia-xconfig.c 6f6f68f976250f2646450e571f9ab2d7eee1ac80 - nvidia-xconfig-35.2.1/nvidia-cfg.h 9b0c02164398be2795fea7cb13c9e1b062d24bfb - nvidia-xconfig-35.2.1/query_gpu_info.c 10edc2c301fd331439b38d001c0df41669c238b2 - nvidia-xconfig-35.2.1/multiple_screens.c d37da5a118e0418b267a48d05fd144611316b42c - nvidia-xconfig-35.2.1/gen-manpage-opts.c a5ad539267b73169480e7898b284823639c4db3a - nvidia-xconfig-35.2.1/tree.c 5d55b94375c2055cfa1578e4c7f34c90e63a33f7 - nvidia-xconfig-35.2.1/common-utils/gen-manpage-opts-helper.c 8259a24058c714629f9819cc8c830ea9b202bb27 - nvidia-xconfig-35.2.1/common-utils/gen-manpage-opts-helper.h 8a346196b052cfb1e06dd83d2ad1fe71e928d2b3 - nvidia-xconfig-35.2.1/common-utils/common-utils.c aac5cbf0e68e1da4e646c316a7c0e620304ee16b - nvidia-xconfig-35.2.1/common-utils/msg.c e572cac43202f6c2af1c80b9e3901215126093ed - nvidia-xconfig-35.2.1/common-utils/nvgetopt.h 384e36102dcd08ed4c5de05b5e3b8a7cdb2e257d - nvidia-xconfig-35.2.1/common-utils/nvgetopt.c 1654638c567bc7f2bd70b54d807b498ab14c1061 - nvidia-xconfig-35.2.1/common-utils/nvpci-utils.h 524990f5497f9bbeb3d148b5e7dc8d2267c3163d - nvidia-xconfig-35.2.1/common-utils/nvpci-utils.c abb5c1b445d9353f2d2840bda848cd16109710a4 - nvidia-xconfig-35.2.1/common-utils/msg.h dc2678d8a9d794a4b2b2718fce57ec087f21f54b - nvidia-xconfig-35.2.1/common-utils/common-utils.h 4d9b03ea3badceb6bdfdf6589e6731140ec44079 - nvidia-xconfig-35.2.1/XF86Config-parser/Generate.c 0a274c4bc54b6ae0f6d009e443bda0cb033d66b5 - nvidia-xconfig-35.2.1/XF86Config-parser/Pointer.c 6c210ad0eaee1db3fec48ff01746cb054b4f9aaa - nvidia-xconfig-35.2.1/XF86Config-parser/Video.c 3f2238c88d737bd329a9bca1ac4b0bcf77bb9ac2 - nvidia-xconfig-35.2.1/XF86Config-parser/xf86tokens.h 33211ca0a10f50e2c87b9e8feef6c1ab381b57a1 - nvidia-xconfig-35.2.1/XF86Config-parser/DRI.c 2022a4a3c2a1b23a67ae74f50a3849f5f3a45e4b - nvidia-xconfig-35.2.1/XF86Config-parser/Keyboard.c 45ceb0129668346ae3e52d81bb6e2f97efadf9d0 - nvidia-xconfig-35.2.1/XF86Config-parser/Input.c e67d630ef396ab7d34524c333f3a77fc42ba8fc6 - nvidia-xconfig-35.2.1/XF86Config-parser/configProcs.h 953b945f3b117d6fb44f1f738af17b6380a9ec72 - nvidia-xconfig-35.2.1/XF86Config-parser/Monitor.c c7b8d8ca0f7c9dcc2cdca4f8e77d1122c71892ef - nvidia-xconfig-35.2.1/XF86Config-parser/Read.c de1c758e29f217e1a99e4c076d54ac84bce98b18 - nvidia-xconfig-35.2.1/XF86Config-parser/Screen.c 7344be997921dec57959691e986763ee686888d5 - nvidia-xconfig-35.2.1/XF86Config-parser/Device.c 4407207cf890539dc604cff5b834c994b307729a - nvidia-xconfig-35.2.1/XF86Config-parser/Write.c 18711ff932af2202869a30f3b32d6d7fe7811c84 - nvidia-xconfig-35.2.1/XF86Config-parser/Layout.c ac878b26ded86a3c502a6a81fc4c4a96162afefb - nvidia-xconfig-35.2.1/XF86Config-parser/Merge.c 83b0a8efd6a508db54995688ab353591bdb242a2 - nvidia-xconfig-35.2.1/XF86Config-parser/Flags.c 04efe162cf6d97882f2bb87f3712d9a65c2320f3 - nvidia-xconfig-35.2.1/XF86Config-parser/Scan.c f3d611bdbddfa64675a0810ef81dada57e224bcd - nvidia-xconfig-35.2.1/XF86Config-parser/Extensions.c a9bc06f33bf525c2b08be2dc3cd64a59c4c7946d - nvidia-xconfig-35.2.1/XF86Config-parser/Configint.h ec19d673a6a7d1d8f855f2d32d3e8f63046c3625 - nvidia-xconfig-35.2.1/XF86Config-parser/Files.c cda3a4ab05bf48ba28af35b5c4c632e968afc7fa - nvidia-xconfig-35.2.1/XF86Config-parser/Util.c c66a0a141e25e31b568fb9df41f17d7fb9e6d3b9 - nvidia-xconfig-35.2.1/XF86Config-parser/xf86Parser.h 9cbc29da282aa957f28b7fc83caf1e3b19ee2a52 - nvidia-xconfig-35.2.1/XF86Config-parser/Vendor.c 5ffb2caa5077a2e6ec1c5ece807e71503fb2fbce - nvidia-xconfig-35.2.1/XF86Config-parser/Module.c Change-Id: I95f040ed93f9532cc6977e9284d2be1256f1b734
205 lines
6.1 KiB
C
205 lines
6.1 KiB
C
/*
|
|
* nvidia-xconfig: A tool for manipulating XF86Config files,
|
|
* specifically for use by the NVIDIA Linux graphics driver.
|
|
*
|
|
* Copyright (C) 2004 NVIDIA Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses>.
|
|
*
|
|
*
|
|
* util.c
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <ctype.h>
|
|
#include <pwd.h>
|
|
#include <termios.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include "nvidia-xconfig.h"
|
|
#include "msg.h"
|
|
|
|
Options *__op = NULL;
|
|
|
|
|
|
/*
|
|
* copy_file() - copy the file specified by srcfile to dstfile, using
|
|
* mmap and memcpy. The destination file is created with the
|
|
* permissions specified by mode. Roughly based on code presented by
|
|
* Richard Stevens, in Advanced Programming in the Unix Environment,
|
|
* 12.9.
|
|
*/
|
|
|
|
int copy_file(const char *srcfile, const char *dstfile, mode_t mode)
|
|
{
|
|
int src_fd = -1, dst_fd = -1;
|
|
struct stat stat_buf;
|
|
char *src, *dst;
|
|
int ret = FALSE;
|
|
|
|
if ((src_fd = open(srcfile, O_RDONLY)) == -1) {
|
|
nv_error_msg("Unable to open '%s' for copying (%s)",
|
|
srcfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if ((dst_fd = open(dstfile, O_RDWR | O_CREAT | O_TRUNC, mode)) == -1) {
|
|
nv_error_msg("Unable to create '%s' for copying (%s)",
|
|
dstfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if (fstat(src_fd, &stat_buf) == -1) {
|
|
nv_error_msg("Unable to determine size of '%s' (%s)",
|
|
srcfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if (stat_buf.st_size == 0) {
|
|
/* src file is empty; silently ignore */
|
|
ret = TRUE;
|
|
goto done;
|
|
}
|
|
if (lseek(dst_fd, stat_buf.st_size - 1, SEEK_SET) == -1) {
|
|
nv_error_msg("Unable to set file size for '%s' (%s)",
|
|
dstfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if (write(dst_fd, "", 1) != 1) {
|
|
nv_error_msg("Unable to write file size for '%s' (%s)",
|
|
dstfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if ((src = mmap(0, stat_buf.st_size, PROT_READ,
|
|
MAP_SHARED, src_fd, 0)) == (void *) -1) {
|
|
nv_error_msg("Unable to map source file '%s' for "
|
|
"copying (%s)", srcfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if ((dst = mmap(0, stat_buf.st_size, PROT_READ | PROT_WRITE,
|
|
MAP_SHARED, dst_fd, 0)) == (void *) -1) {
|
|
nv_error_msg("Unable to map destination file '%s' for "
|
|
"copying (%s)", dstfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
|
|
memcpy(dst, src, stat_buf.st_size);
|
|
|
|
if (munmap (src, stat_buf.st_size) == -1) {
|
|
nv_error_msg("Unable to unmap source file '%s' after "
|
|
"copying (%s)", srcfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
if (munmap (dst, stat_buf.st_size) == -1) {
|
|
nv_error_msg("Unable to unmap destination file '%s' after "
|
|
"copying (%s)", dstfile, strerror (errno));
|
|
goto done;
|
|
}
|
|
|
|
ret = TRUE;
|
|
|
|
done:
|
|
|
|
if (src_fd != -1) close(src_fd);
|
|
if (dst_fd != -1) close(dst_fd);
|
|
|
|
return ret;
|
|
|
|
} /* copy_file() */
|
|
|
|
|
|
/*
|
|
* xconfigPrint() - this is the one entry point that a user of the
|
|
* XF86Config-Parser library must provide.
|
|
*/
|
|
|
|
void xconfigPrint(MsgType t, const char *msg)
|
|
{
|
|
typedef struct {
|
|
MsgType msg_type;
|
|
char *prefix;
|
|
FILE *stream;
|
|
int newline;
|
|
} MessageTypeAttributes;
|
|
|
|
char *prefix = NULL;
|
|
int i, newline = FALSE;
|
|
FILE *stream = stdout;
|
|
|
|
const MessageTypeAttributes msg_types[] = {
|
|
{ ParseErrorMsg, "PARSE ERROR: ", stderr, TRUE },
|
|
{ ParseWarningMsg, "PARSE WARNING: ", stderr, TRUE },
|
|
{ ValidationErrorMsg, "VALIDATION ERROR: ", stderr, TRUE },
|
|
{ InternalErrorMsg, "INTERNAL ERROR: ", stderr, TRUE },
|
|
{ WriteErrorMsg, "ERROR: ", stderr, TRUE },
|
|
{ WarnMsg, "WARNING: ", stderr, TRUE },
|
|
{ ErrorMsg, "ERROR: ", stderr, TRUE },
|
|
{ DebugMsg, "DEBUG: ", stdout, FALSE },
|
|
{ UnknownMsg, NULL, stdout, FALSE },
|
|
};
|
|
|
|
for (i = 0; msg_types[i].msg_type != UnknownMsg; i++) {
|
|
if (msg_types[i].msg_type == t) {
|
|
prefix = msg_types[i].prefix;
|
|
newline = msg_types[i].newline;
|
|
stream = msg_types[i].stream;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (newline) nv_info_msg_to_file(stream, NULL, "");
|
|
nv_info_msg_to_file(stream, prefix, "%s", msg);
|
|
if (newline) nv_info_msg_to_file(stream, NULL, "");
|
|
|
|
} /* xconfigPrint */
|
|
|
|
/* a round number longer than "PCI:bus@domain:slot:function" */
|
|
#define BUS_ID_STRING_LENGTH 32
|
|
|
|
/*
|
|
* nv_format_busid() - returns a newly allocated formatted string with the PCI
|
|
* Bus ID of the device with the given index, or NULL on failure.
|
|
*/
|
|
char *nv_format_busid(Options *op, int index)
|
|
{
|
|
char buf[BUS_ID_STRING_LENGTH];
|
|
DevicesPtr pDevices;
|
|
NvCfgPciDevice *dev;
|
|
|
|
pDevices = find_devices(op);
|
|
if (!pDevices || pDevices->nDevices < 1) {
|
|
nv_error_msg("Unable to find any GPUs in the system.");
|
|
return NULL;
|
|
}
|
|
if (index >= pDevices->nDevices) {
|
|
nv_error_msg("Invalid GPU index value.");
|
|
return NULL;
|
|
}
|
|
|
|
dev = &pDevices->devices[index].dev;
|
|
|
|
xconfigFormatPciBusString(buf, sizeof(buf),
|
|
dev->domain, dev->bus, dev->slot, 0);
|
|
|
|
return nvstrdup(buf);
|
|
}
|