mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-26 03:33:28 +00:00 
			
		
		
		
	 82a628f887
			
		
	
	
		82a628f887
		
	
	
	
	
		
			
			A zero value for dpi will lead to a division by zero in qemu_edid_dpi_to_mm(). Tested by runnig qemu-edid -dX, X = 0, 100. Resolves: qemu-project/qemu#1249 Suggested-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Sebastian Mitterle <smitterl@redhat.com> Message-Id: <20221011151216.64897-1-smitterl@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * QEMU EDID test tool.
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
|  * See the COPYING file in the top-level directory.
 | |
|  */
 | |
| #include "qemu/osdep.h"
 | |
| #include "qemu/bswap.h"
 | |
| #include "qemu/cutils.h"
 | |
| #include "hw/display/edid.h"
 | |
| 
 | |
| static qemu_edid_info info = {
 | |
|     .prefx = 1280,
 | |
|     .prefy = 800,
 | |
| };
 | |
| 
 | |
| static void usage(FILE *out)
 | |
| {
 | |
|     fprintf(out,
 | |
|             "\n"
 | |
|             "This is a test tool for the qemu edid generator.\n"
 | |
|             "\n"
 | |
|             "Typically you'll pipe the output into edid-decode\n"
 | |
|             "to check if the generator works correctly.\n"
 | |
|             "\n"
 | |
|             "usage: qemu-edid <options>\n"
 | |
|             "options:\n"
 | |
|             "    -h             print this text\n"
 | |
|             "    -o <file>      set output file (stdout by default)\n"
 | |
|             "    -v <vendor>    set monitor vendor (three letters)\n"
 | |
|             "    -n <name>      set monitor name\n"
 | |
|             "    -s <serial>    set monitor serial\n"
 | |
|             "    -d <dpi>       set display resolution\n"
 | |
|             "    -x <prefx>     set preferred width\n"
 | |
|             "    -y <prefy>     set preferred height\n"
 | |
|             "    -X <maxx>      set maximum width\n"
 | |
|             "    -Y <maxy>      set maximum height\n"
 | |
|             "\n");
 | |
| }
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|     FILE *outfile = NULL;
 | |
|     uint8_t blob[512];
 | |
|     size_t size;
 | |
|     uint32_t dpi = 100;
 | |
|     int rc;
 | |
| 
 | |
|     for (;;) {
 | |
|         rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:");
 | |
|         if (rc == -1) {
 | |
|             break;
 | |
|         }
 | |
|         switch (rc) {
 | |
|         case 'o':
 | |
|             if (outfile) {
 | |
|                 fprintf(stderr, "outfile specified twice\n");
 | |
|                 exit(1);
 | |
|             }
 | |
|             outfile = fopen(optarg, "w");
 | |
|             if (outfile == NULL) {
 | |
|                 fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'x':
 | |
|             if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) {
 | |
|                 fprintf(stderr, "not a number: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'y':
 | |
|             if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) {
 | |
|                 fprintf(stderr, "not a number: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'X':
 | |
|             if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) {
 | |
|                 fprintf(stderr, "not a number: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'Y':
 | |
|             if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) {
 | |
|                 fprintf(stderr, "not a number: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'd':
 | |
|             if (qemu_strtoui(optarg, NULL, 10, &dpi) < 0) {
 | |
|                 fprintf(stderr, "not a number: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             if (dpi == 0) {
 | |
|                 fprintf(stderr, "cannot be zero: %s\n", optarg);
 | |
|                 exit(1);
 | |
|             }
 | |
|             break;
 | |
|         case 'v':
 | |
|             info.vendor = optarg;
 | |
|             break;
 | |
|         case 'n':
 | |
|             info.name = optarg;
 | |
|             break;
 | |
|         case 's':
 | |
|             info.serial = optarg;
 | |
|             break;
 | |
|         case 'h':
 | |
|             usage(stdout);
 | |
|             exit(0);
 | |
|         default:
 | |
|             usage(stderr);
 | |
|             exit(1);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (outfile == NULL) {
 | |
|         outfile = stdout;
 | |
|     }
 | |
| 
 | |
|     info.width_mm = qemu_edid_dpi_to_mm(dpi, info.prefx);
 | |
|     info.height_mm = qemu_edid_dpi_to_mm(dpi, info.prefy);
 | |
| 
 | |
|     memset(blob, 0, sizeof(blob));
 | |
|     qemu_edid_generate(blob, sizeof(blob), &info);
 | |
|     size = qemu_edid_size(blob);
 | |
|     fwrite(blob, size, 1, outfile);
 | |
|     fflush(outfile);
 | |
| 
 | |
|     exit(0);
 | |
| }
 |