Files
nv-xconfig/nvidia-xconfig-35.6.2/util.c
svcmobrel-release 4ece7a7e48 Updating prebuilts and/or headers
22a5c807291792a264b5acca7ff6d199468890b8 - nvidia-xconfig-35.6.2/Makefile
4cc77b90af91e615a64ae04893fdffa7939db84c - nvidia-xconfig-35.6.2/COPYING
f14e9577e537037d4778d490ef70f13b0e94a70a - nvidia-xconfig-35.6.2/option_table.h
647e7896275a1113ec99352d573823a05001f57e - nvidia-xconfig-35.6.2/lscf.c
1e39095238886dfc6a69f7ec750e10c05a93e7d1 - nvidia-xconfig-35.6.2/nvidia-xconfig.1.m4
a5ad539267b73169480e7898b284823639c4db3a - nvidia-xconfig-35.6.2/tree.c
b3d0f9f27c4d9cb7940d04e1dd387d357a16024c - nvidia-xconfig-35.6.2/nvidia-xconfig.c
46f2ea329459b0b16cb36cc14cec0de737d0963e - nvidia-xconfig-35.6.2/options.c
6f6f68f976250f2646450e571f9ab2d7eee1ac80 - nvidia-xconfig-35.6.2/nvidia-cfg.h
913b088cb559f31e09a1baf89d85d75cb43079b4 - nvidia-xconfig-35.6.2/nvidia-xconfig.h
bfa37f78ba458f14a1865bbf3f67eb84987a7e1c - nvidia-xconfig-35.6.2/extract_edids.c
d37da5a118e0418b267a48d05fd144611316b42c - nvidia-xconfig-35.6.2/gen-manpage-opts.c
41bcac41393c9a465c30c07cf1ab386647a16687 - nvidia-xconfig-35.6.2/util.c
9b0c02164398be2795fea7cb13c9e1b062d24bfb - nvidia-xconfig-35.6.2/query_gpu_info.c
c946eefad99cec9366d8abbd4e45c5d138d3b7be - nvidia-xconfig-35.6.2/make_usable.c
10edc2c301fd331439b38d001c0df41669c238b2 - nvidia-xconfig-35.6.2/multiple_screens.c
c7b8d8ca0f7c9dcc2cdca4f8e77d1122c71892ef - nvidia-xconfig-35.6.2/XF86Config-parser/Read.c
a9bc06f33bf525c2b08be2dc3cd64a59c4c7946d - nvidia-xconfig-35.6.2/XF86Config-parser/Configint.h
2022a4a3c2a1b23a67ae74f50a3849f5f3a45e4b - nvidia-xconfig-35.6.2/XF86Config-parser/Keyboard.c
83b0a8efd6a508db54995688ab353591bdb242a2 - nvidia-xconfig-35.6.2/XF86Config-parser/Flags.c
e67d630ef396ab7d34524c333f3a77fc42ba8fc6 - nvidia-xconfig-35.6.2/XF86Config-parser/configProcs.h
f3d611bdbddfa64675a0810ef81dada57e224bcd - nvidia-xconfig-35.6.2/XF86Config-parser/Extensions.c
5ffb2caa5077a2e6ec1c5ece807e71503fb2fbce - nvidia-xconfig-35.6.2/XF86Config-parser/Module.c
7344be997921dec57959691e986763ee686888d5 - nvidia-xconfig-35.6.2/XF86Config-parser/Device.c
33211ca0a10f50e2c87b9e8feef6c1ab381b57a1 - nvidia-xconfig-35.6.2/XF86Config-parser/DRI.c
953b945f3b117d6fb44f1f738af17b6380a9ec72 - nvidia-xconfig-35.6.2/XF86Config-parser/Monitor.c
6c210ad0eaee1db3fec48ff01746cb054b4f9aaa - nvidia-xconfig-35.6.2/XF86Config-parser/Video.c
4407207cf890539dc604cff5b834c994b307729a - nvidia-xconfig-35.6.2/XF86Config-parser/Write.c
de1c758e29f217e1a99e4c076d54ac84bce98b18 - nvidia-xconfig-35.6.2/XF86Config-parser/Screen.c
c66a0a141e25e31b568fb9df41f17d7fb9e6d3b9 - nvidia-xconfig-35.6.2/XF86Config-parser/xf86Parser.h
9cbc29da282aa957f28b7fc83caf1e3b19ee2a52 - nvidia-xconfig-35.6.2/XF86Config-parser/Vendor.c
18711ff932af2202869a30f3b32d6d7fe7811c84 - nvidia-xconfig-35.6.2/XF86Config-parser/Layout.c
cda3a4ab05bf48ba28af35b5c4c632e968afc7fa - nvidia-xconfig-35.6.2/XF86Config-parser/Util.c
ec19d673a6a7d1d8f855f2d32d3e8f63046c3625 - nvidia-xconfig-35.6.2/XF86Config-parser/Files.c
ac878b26ded86a3c502a6a81fc4c4a96162afefb - nvidia-xconfig-35.6.2/XF86Config-parser/Merge.c
0a274c4bc54b6ae0f6d009e443bda0cb033d66b5 - nvidia-xconfig-35.6.2/XF86Config-parser/Pointer.c
3f2238c88d737bd329a9bca1ac4b0bcf77bb9ac2 - nvidia-xconfig-35.6.2/XF86Config-parser/xf86tokens.h
45ceb0129668346ae3e52d81bb6e2f97efadf9d0 - nvidia-xconfig-35.6.2/XF86Config-parser/Input.c
4d9b03ea3badceb6bdfdf6589e6731140ec44079 - nvidia-xconfig-35.6.2/XF86Config-parser/Generate.c
04efe162cf6d97882f2bb87f3712d9a65c2320f3 - nvidia-xconfig-35.6.2/XF86Config-parser/Scan.c
5d55b94375c2055cfa1578e4c7f34c90e63a33f7 - nvidia-xconfig-35.6.2/common-utils/gen-manpage-opts-helper.c
384e36102dcd08ed4c5de05b5e3b8a7cdb2e257d - nvidia-xconfig-35.6.2/common-utils/nvgetopt.c
dc2678d8a9d794a4b2b2718fce57ec087f21f54b - nvidia-xconfig-35.6.2/common-utils/common-utils.h
aac5cbf0e68e1da4e646c316a7c0e620304ee16b - nvidia-xconfig-35.6.2/common-utils/msg.c
e572cac43202f6c2af1c80b9e3901215126093ed - nvidia-xconfig-35.6.2/common-utils/nvgetopt.h
8a346196b052cfb1e06dd83d2ad1fe71e928d2b3 - nvidia-xconfig-35.6.2/common-utils/common-utils.c
1654638c567bc7f2bd70b54d807b498ab14c1061 - nvidia-xconfig-35.6.2/common-utils/nvpci-utils.h
8259a24058c714629f9819cc8c830ea9b202bb27 - nvidia-xconfig-35.6.2/common-utils/gen-manpage-opts-helper.h
524990f5497f9bbeb3d148b5e7dc8d2267c3163d - nvidia-xconfig-35.6.2/common-utils/nvpci-utils.c
abb5c1b445d9353f2d2840bda848cd16109710a4 - nvidia-xconfig-35.6.2/common-utils/msg.h

Change-Id: I99682b72c725a16fef77ba060c57fd78b05ae428
2025-07-01 06:51:17 -07:00

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);
}