 a58c439a2d
			
		
	
	
		a58c439a2d
		
	
	
	
	
		
			
			The __linux__ version of qemu_chr_open_pp_fd() tries to claim the parport device with a PPCLAIM ioctl(). On success, it stores the file descriptor in the chardev object, and returns success. On failure, it closes the file descriptor, and returns failure. chardev_new() then passes the Chardev to object_unref(). This duly calls char_parallel_finalize(), which closes the file descriptor stored in the chardev object. Since qemu_chr_open_pp_fd() didn't store it, it's still zero, so this closes standard input. Ooopsie. To demonstate, add a unit test. With the bug above unfixed, running this test closes standard input. char_hotswap_test() happens to run next. It opens a socket, duly gets file descriptor 0, and since it tests for success with > 0 instead of >= 0, it fails. The new unit test needs to be conditional exactly like the chardev it tests. Since the condition is rather complicated, steal the solution from the serial chardev: define HAVE_CHARDEV_PARALLEL in qemu/osdep.h. This also permits simplifying chardev/meson.build a bit. The bug fix is easy enough: store the file descriptor, and leave closing it to char_parallel_finalize(). The next commit will fix char_hotswap_test()'s test for success. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-ID: <20240203080228.2766159-2-armbru@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> [Test fixed up for BSDs, indentation fixed up, commit message improved]
		
			
				
	
	
		
			52 lines
		
	
	
		
			975 B
		
	
	
	
		
			Meson
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			975 B
		
	
	
	
		
			Meson
		
	
	
	
	
	
| chardev_ss.add(files(
 | |
|   'char-fe.c',
 | |
|   'char-file.c',
 | |
|   'char-io.c',
 | |
|   'char-mux.c',
 | |
|   'char-null.c',
 | |
|   'char-pipe.c',
 | |
|   'char-ringbuf.c',
 | |
|   'char-serial.c',
 | |
|   'char-socket.c',
 | |
|   'char-stdio.c',
 | |
|   'char-udp.c',
 | |
|   'char.c',
 | |
| ))
 | |
| if host_os == 'windows'
 | |
|   chardev_ss.add(files(
 | |
|     'char-console.c',
 | |
|     'char-win-stdio.c',
 | |
|     'char-win.c',
 | |
|   ))
 | |
| else
 | |
|   chardev_ss.add(files(
 | |
|       'char-fd.c',
 | |
|       'char-parallel.c',
 | |
|       'char-pty.c',
 | |
|     ), util)
 | |
| endif
 | |
| 
 | |
| chardev_ss = chardev_ss.apply({})
 | |
| 
 | |
| system_ss.add(files(
 | |
|     'char-hmp-cmds.c',
 | |
|     'msmouse.c',
 | |
|     'wctablet.c',
 | |
|     'testdev.c'))
 | |
| 
 | |
| chardev_modules = {}
 | |
| 
 | |
| if brlapi.found()
 | |
|   module_ss = ss.source_set()
 | |
|   module_ss.add(when: [brlapi], if_true: [files('baum.c'), pixman])
 | |
|   chardev_modules += { 'baum': module_ss }
 | |
| endif
 | |
| 
 | |
| if spice.found()
 | |
|   module_ss = ss.source_set()
 | |
|   module_ss.add(when: [spice], if_true: files('spice.c'))
 | |
|   chardev_modules += { 'spice': module_ss }
 | |
| endif
 | |
| 
 | |
| modules += { 'chardev': chardev_modules }
 |