mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 21:34:54 +03:00
Probe for -device and use -nodefaults
Probe for the new -device flag and if available set the -nodefaults flag, instead of using -net none, -serial none or -parallel none. Other device types will be converted to use -device in later patches. The -nodefaults flag will help avoid unwelcome surprises from future QEMU releases * src/qemu/qemu_conf.c: Probe for -device. Add -nodefaults flag. Remove -net none, -serial none or -parallel none * src/qemu/qemu_conf.h: Define QEMU_CMD_FLAG_DEVICE * tests/qemuhelpdata/qemu-0.12.1: New data file for 0.12.1 QEMU * tests/qemuhelptest.c: Test feature extraction from 0.12.1 QEMU
This commit is contained in:
parent
4ac290cc33
commit
1ed1bf3a38
@ -1115,6 +1115,8 @@ static unsigned int qemudComputeCmdFlags(const char *help,
|
|||||||
flags |= QEMUD_CMD_FLAG_CHARDEV;
|
flags |= QEMUD_CMD_FLAG_CHARDEV;
|
||||||
if (strstr(help, "-balloon"))
|
if (strstr(help, "-balloon"))
|
||||||
flags |= QEMUD_CMD_FLAG_BALLOON;
|
flags |= QEMUD_CMD_FLAG_BALLOON;
|
||||||
|
if (strstr(help, "-device"))
|
||||||
|
flags |= QEMUD_CMD_FLAG_DEVICE;
|
||||||
|
|
||||||
if (version >= 9000)
|
if (version >= 9000)
|
||||||
flags |= QEMUD_CMD_FLAG_VNC_COLON;
|
flags |= QEMUD_CMD_FLAG_VNC_COLON;
|
||||||
@ -2309,6 +2311,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||||||
if (!def->graphics)
|
if (!def->graphics)
|
||||||
ADD_ARG_LIT("-nographic");
|
ADD_ARG_LIT("-nographic");
|
||||||
|
|
||||||
|
if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)
|
||||||
|
ADD_ARG_LIT("-nodefaults");
|
||||||
|
|
||||||
if (monitor_chr) {
|
if (monitor_chr) {
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
|
||||||
@ -2531,8 +2536,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!def->nnets) {
|
if (!def->nnets) {
|
||||||
ADD_ARG_LIT("-net");
|
/* If we have -device, then we set -nodefault already */
|
||||||
ADD_ARG_LIT("none");
|
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
|
||||||
|
ADD_ARG_LIT("-net");
|
||||||
|
ADD_ARG_LIT("none");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0 ; i < def->nnets ; i++) {
|
for (i = 0 ; i < def->nnets ; i++) {
|
||||||
virDomainNetDefPtr net = def->nets[i];
|
virDomainNetDefPtr net = def->nets[i];
|
||||||
@ -2591,8 +2599,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!def->nserials) {
|
if (!def->nserials) {
|
||||||
ADD_ARG_LIT("-serial");
|
/* If we have -device, then we set -nodefault already */
|
||||||
ADD_ARG_LIT("none");
|
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
|
||||||
|
ADD_ARG_LIT("-serial");
|
||||||
|
ADD_ARG_LIT("none");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0 ; i < def->nserials ; i++) {
|
for (i = 0 ; i < def->nserials ; i++) {
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
@ -2638,8 +2649,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!def->nparallels) {
|
if (!def->nparallels) {
|
||||||
ADD_ARG_LIT("-parallel");
|
/* If we have -device, then we set -nodefault already */
|
||||||
ADD_ARG_LIT("none");
|
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
|
||||||
|
ADD_ARG_LIT("-parallel");
|
||||||
|
ADD_ARG_LIT("none");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0 ; i < def->nparallels ; i++) {
|
for (i = 0 ; i < def->nparallels ; i++) {
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
@ -78,6 +78,7 @@ enum qemud_cmd_flags {
|
|||||||
QEMUD_CMD_FLAG_ENABLE_KVM = (1 << 23), /* Is the -enable-kvm flag available to "enable KVM full virtualization support" */
|
QEMUD_CMD_FLAG_ENABLE_KVM = (1 << 23), /* Is the -enable-kvm flag available to "enable KVM full virtualization support" */
|
||||||
QEMUD_CMD_FLAG_MONITOR_JSON = (1 << 24), /* JSON mode for monitor */
|
QEMUD_CMD_FLAG_MONITOR_JSON = (1 << 24), /* JSON mode for monitor */
|
||||||
QEMUD_CMD_FLAG_BALLOON = (1 << 25), /* -balloon available */
|
QEMUD_CMD_FLAG_BALLOON = (1 << 25), /* -balloon available */
|
||||||
|
QEMUD_CMD_FLAG_DEVICE = (1 << 26), /* Is the new -device arg available */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Main driver state */
|
/* Main driver state */
|
||||||
|
203
tests/qemuhelpdata/qemu-0.12.1
Normal file
203
tests/qemuhelpdata/qemu-0.12.1
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
QEMU PC emulator version 0.12.1, Copyright (c) 2003-2008 Fabrice Bellard
|
||||||
|
usage: qemu [options] [disk_image]
|
||||||
|
|
||||||
|
'disk_image' is a raw hard image image for IDE hard disk 0
|
||||||
|
|
||||||
|
Standard options:
|
||||||
|
-h or -help display this help and exit
|
||||||
|
-version display version information and exit
|
||||||
|
-M machine select emulated machine (-M ? for list)
|
||||||
|
-cpu cpu select CPU (-cpu ? for list)
|
||||||
|
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
|
||||||
|
set the number of CPUs to 'n' [default=1]
|
||||||
|
maxcpus= maximum number of total cpus, including
|
||||||
|
offline CPUs for hotplug etc.
|
||||||
|
cores= number of CPU cores on one socket
|
||||||
|
threads= number of threads on one CPU core
|
||||||
|
sockets= number of discrete sockets in the system
|
||||||
|
-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]
|
||||||
|
-fda/-fdb file use 'file' as floppy disk 0/1 image
|
||||||
|
-hda/-hdb file use 'file' as IDE hard disk 0/1 image
|
||||||
|
-hdc/-hdd file use 'file' as IDE hard disk 2/3 image
|
||||||
|
-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)
|
||||||
|
-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
|
||||||
|
[,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
|
||||||
|
[,cache=writethrough|writeback|none][,format=f][,serial=s]
|
||||||
|
[,addr=A][,id=name][,aio=threads|native]
|
||||||
|
use 'file' as a drive image
|
||||||
|
-set group.id.arg=value
|
||||||
|
set <arg> parameter for item <id> of type <group>
|
||||||
|
i.e. -set drive.$id.file=/path/to/image
|
||||||
|
-global driver.property=value
|
||||||
|
set a global default for a driver property
|
||||||
|
-mtdblock file use 'file' as on-board Flash memory image
|
||||||
|
-sd file use 'file' as SecureDigital card image
|
||||||
|
-pflash file use 'file' as a parallel flash image
|
||||||
|
-boot [order=drives][,once=drives][,menu=on|off]
|
||||||
|
'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)
|
||||||
|
-snapshot write to temporary files instead of disk image files
|
||||||
|
-m megs set virtual RAM size to megs MB [default=128]
|
||||||
|
-k language use keyboard layout (for example 'fr' for French)
|
||||||
|
-audio-help print list of audio drivers and their options
|
||||||
|
-soundhw c1,... enable audio support
|
||||||
|
and only specified sound cards (comma separated list)
|
||||||
|
use -soundhw ? to get the list of supported cards
|
||||||
|
use -soundhw all to enable all of them
|
||||||
|
-usb enable the USB driver (will be the default soon)
|
||||||
|
-usbdevice name add the host or guest USB device 'name'
|
||||||
|
-device driver[,options] add device
|
||||||
|
-name string1[,process=string2] set the name of the guest
|
||||||
|
string1 sets the window title and string2 the process name (on Linux)
|
||||||
|
-uuid %08x-%04x-%04x-%04x-%012x
|
||||||
|
specify machine UUID
|
||||||
|
|
||||||
|
Display options:
|
||||||
|
-nographic disable graphical output and redirect serial I/Os to console
|
||||||
|
-curses use a curses/ncurses interface instead of SDL
|
||||||
|
-no-frame open SDL window without a frame and window decorations
|
||||||
|
-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)
|
||||||
|
-ctrl-grab use Right-Ctrl to grab mouse (instead of Ctrl-Alt)
|
||||||
|
-no-quit disable SDL window close capability
|
||||||
|
-sdl enable SDL
|
||||||
|
-portrait rotate graphical output 90 deg left (only PXA LCD)
|
||||||
|
-vga [std|cirrus|vmware|xenfb|none]
|
||||||
|
select video card type
|
||||||
|
-full-screen start in full screen
|
||||||
|
-vnc display start a VNC server on display
|
||||||
|
|
||||||
|
1 target only:
|
||||||
|
-win2k-hack use it when installing Windows 2000 to avoid a disk full bug
|
||||||
|
-no-fd-bootchk disable boot signature checking for floppy disks
|
||||||
|
-no-acpi disable ACPI
|
||||||
|
-no-hpet disable HPET
|
||||||
|
-balloon none disable balloon device
|
||||||
|
-balloon virtio[,addr=str]
|
||||||
|
enable virtio balloon device (default)
|
||||||
|
-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]
|
||||||
|
ACPI table description
|
||||||
|
-smbios file=binary
|
||||||
|
Load SMBIOS entry from binary file
|
||||||
|
-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]
|
||||||
|
Specify SMBIOS type 0 fields
|
||||||
|
-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]
|
||||||
|
[,uuid=uuid][,sku=str][,family=str]
|
||||||
|
Specify SMBIOS type 1 fields
|
||||||
|
|
||||||
|
Network options:
|
||||||
|
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
|
||||||
|
create a new Network Interface Card and connect it to VLAN 'n'
|
||||||
|
-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n]
|
||||||
|
[,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]
|
||||||
|
[,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]]
|
||||||
|
connect the user mode network stack to VLAN 'n', configure its
|
||||||
|
DHCP server and enabled optional services
|
||||||
|
-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off]
|
||||||
|
connect the host TAP network interface to VLAN 'n' and use the
|
||||||
|
network scripts 'file' (default=/etc/qemu-ifup)
|
||||||
|
and 'dfile' (default=/etc/qemu-ifdown);
|
||||||
|
use '[down]script=no' to disable script execution;
|
||||||
|
use 'fd=h' to connect to an already opened TAP interface
|
||||||
|
use 'sndbuf=nbytes' to limit the size of the send buffer; the
|
||||||
|
default of 'sndbuf=1048576' can be disabled using 'sndbuf=0'
|
||||||
|
use vnet_hdr=off to avoid enabling the IFF_VNET_HDR tap flag; use
|
||||||
|
vnet_hdr=on to make the lack of IFF_VNET_HDR support an error condition
|
||||||
|
-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
|
||||||
|
connect the vlan 'n' to another VLAN using a socket connection
|
||||||
|
-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]
|
||||||
|
connect the vlan 'n' to multicast maddr and port
|
||||||
|
-net dump[,vlan=n][,file=f][,len=n]
|
||||||
|
dump traffic on vlan 'n' to file 'f' (max n bytes per packet)
|
||||||
|
-net none use it alone to have zero network devices; if no -net option
|
||||||
|
is provided, the default is '-net nic -net user'
|
||||||
|
-netdev [user|tap|socket],id=str[,option][,option][,...]
|
||||||
|
|
||||||
|
Character device options:
|
||||||
|
-chardev null,id=id
|
||||||
|
-chardev socket,id=id[,host=host],port=host[,to=to][,ipv4][,ipv6][,nodelay]
|
||||||
|
[,server][,nowait][,telnet] (tcp)
|
||||||
|
-chardev socket,id=id,path=path[,server][,nowait][,telnet] (unix)
|
||||||
|
-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]
|
||||||
|
[,localport=localport][,ipv4][,ipv6]
|
||||||
|
-chardev msmouse,id=id
|
||||||
|
-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]
|
||||||
|
-chardev file,id=id,path=path
|
||||||
|
-chardev pipe,id=id,path=path
|
||||||
|
-chardev pty,id=id
|
||||||
|
-chardev stdio,id=id
|
||||||
|
-chardev tty,id=id,path=path
|
||||||
|
-chardev parport,id=id,path=path
|
||||||
|
|
||||||
|
Bluetooth(R) options:
|
||||||
|
-bt hci,null dumb bluetooth HCI - doesn't respond to commands
|
||||||
|
-bt hci,host[:id]
|
||||||
|
use host's HCI with the given name
|
||||||
|
-bt hci[,vlan=n]
|
||||||
|
emulate a standard HCI in virtual scatternet 'n'
|
||||||
|
-bt vhci[,vlan=n]
|
||||||
|
add host computer to virtual scatternet 'n' using VHCI
|
||||||
|
-bt device:dev[,vlan=n]
|
||||||
|
emulate a bluetooth device 'dev' in scatternet 'n'
|
||||||
|
|
||||||
|
Linux/Multiboot boot specific:
|
||||||
|
-kernel bzImage use 'bzImage' as kernel image
|
||||||
|
-append cmdline use 'cmdline' as kernel command line
|
||||||
|
-initrd file use 'file' as initial ram disk
|
||||||
|
|
||||||
|
Debug/Expert options:
|
||||||
|
-serial dev redirect the serial port to char device 'dev'
|
||||||
|
-parallel dev redirect the parallel port to char device 'dev'
|
||||||
|
-monitor dev redirect the monitor to char device 'dev'
|
||||||
|
-qmp dev like -monitor but opens in 'control' mode.
|
||||||
|
-mon chardev=[name][,mode=readline|control][,default]
|
||||||
|
-pidfile file write PID to 'file'
|
||||||
|
-singlestep always run in singlestep mode
|
||||||
|
-S freeze CPU at startup (use 'c' to start execution)
|
||||||
|
-gdb dev wait for gdb connection on 'dev'
|
||||||
|
-s shorthand for -gdb tcp::1234
|
||||||
|
-d item1,... output log to /tmp/qemu.log (use -d ? for a list of log items)
|
||||||
|
-hdachs c,h,s[,t]
|
||||||
|
force hard disk 0 physical geometry and the optional BIOS
|
||||||
|
translation (t=none or lba) (usually qemu can guess them)
|
||||||
|
-L path set the directory for the BIOS, VGA BIOS and keymaps
|
||||||
|
-bios file set the filename for the BIOS
|
||||||
|
-enable-kvm enable KVM full virtualization support
|
||||||
|
-xen-domid id specify xen guest domain id
|
||||||
|
-xen-create create domain using xen hypercalls, bypassing xend
|
||||||
|
warning: should not be used when xend is in use
|
||||||
|
-xen-attach attach to existing xen domain
|
||||||
|
xend will use this when starting qemu
|
||||||
|
-no-reboot exit instead of rebooting
|
||||||
|
-no-shutdown stop before shutdown
|
||||||
|
-loadvm [tag|id]
|
||||||
|
start right away with a saved state (loadvm in monitor)
|
||||||
|
-daemonize daemonize QEMU after initializing
|
||||||
|
-option-rom rom load a file, rom, into the option ROM space
|
||||||
|
-clock force the use of the given methods for timer alarm.
|
||||||
|
To see what timers are available use -clock ?
|
||||||
|
-rtc [base=utc|localtime|date][,clock=host|vm][,driftfix=none|slew]
|
||||||
|
set the RTC base and clock, enable drift fix for clock ticks
|
||||||
|
-icount [N|auto]
|
||||||
|
enable virtual instruction counter with 2^N clock ticks per
|
||||||
|
instruction
|
||||||
|
-watchdog i6300esb|ib700
|
||||||
|
enable virtual hardware watchdog [default=none]
|
||||||
|
-watchdog-action reset|shutdown|poweroff|pause|debug|none
|
||||||
|
action when watchdog fires [default=reset]
|
||||||
|
-echr chr set terminal escape character instead of ctrl-a
|
||||||
|
-virtioconsole c
|
||||||
|
set virtio console
|
||||||
|
-show-cursor show cursor
|
||||||
|
-tb-size n set TB size
|
||||||
|
-incoming p prepare for incoming migration, listen on port p
|
||||||
|
-nodefaults don't create default devices.
|
||||||
|
-chroot dir Chroot to dir just before starting the VM.
|
||||||
|
-runas user Change to user id user just before starting the VM.
|
||||||
|
-readconfig <file>
|
||||||
|
-writeconfig <file>
|
||||||
|
read/write config file
|
||||||
|
During emulation, the following keys are useful:
|
||||||
|
ctrl-alt-f toggle full screen
|
||||||
|
ctrl-alt-n switch to virtual console 'n'
|
||||||
|
ctrl-alt toggle mouse and keyboard grab
|
||||||
|
|
||||||
|
When using -nographic, press 'ctrl-a h' to get some help.
|
@ -21,6 +21,20 @@ struct testInfo {
|
|||||||
static char *progname;
|
static char *progname;
|
||||||
static char *abs_srcdir;
|
static char *abs_srcdir;
|
||||||
|
|
||||||
|
static void printMismatchedFlags(int got, int expect)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0 ; i < (sizeof(got)*8) ; i++) {
|
||||||
|
int gotFlag = (got & (1 << i));
|
||||||
|
int expectFlag = (expect & (1 << i));
|
||||||
|
if (gotFlag && !expectFlag)
|
||||||
|
fprintf(stderr, "Extra flag %i\n", i);
|
||||||
|
if (!gotFlag && expectFlag)
|
||||||
|
fprintf(stderr, "Missing flag %i\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int testHelpStrParsing(const void *data)
|
static int testHelpStrParsing(const void *data)
|
||||||
{
|
{
|
||||||
const struct testInfo *info = data;
|
const struct testInfo *info = data;
|
||||||
@ -40,6 +54,10 @@ static int testHelpStrParsing(const void *data)
|
|||||||
if (flags != info->flags) {
|
if (flags != info->flags) {
|
||||||
fprintf(stderr, "Computed flags do not match: got 0x%x, expected 0x%x\n",
|
fprintf(stderr, "Computed flags do not match: got 0x%x, expected 0x%x\n",
|
||||||
flags, info->flags);
|
flags, info->flags);
|
||||||
|
|
||||||
|
if (getenv("VIR_TEST_DEBUG"))
|
||||||
|
printMismatchedFlags(flags, info->flags);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,9 +73,9 @@ static int testHelpStrParsing(const void *data)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_version != kvm_version) {
|
if (kvm_version != info->kvm_version) {
|
||||||
fprintf(stderr, "Parsed KVM versions do not match: got %u, expected %u\n",
|
fprintf(stderr, "Parsed KVM versions do not match: got %u, expected %u\n",
|
||||||
version, kvm_version);
|
kvm_version, info->kvm_version);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +200,26 @@ mymain(int argc, char **argv)
|
|||||||
QEMUD_CMD_FLAG_ENABLE_KVM |
|
QEMUD_CMD_FLAG_ENABLE_KVM |
|
||||||
QEMUD_CMD_FLAG_BALLOON,
|
QEMUD_CMD_FLAG_BALLOON,
|
||||||
10092, 1, 0);
|
10092, 1, 0);
|
||||||
|
DO_TEST("qemu-0.12.1",
|
||||||
|
QEMUD_CMD_FLAG_VNC_COLON |
|
||||||
|
QEMUD_CMD_FLAG_NO_REBOOT |
|
||||||
|
QEMUD_CMD_FLAG_DRIVE |
|
||||||
|
QEMUD_CMD_FLAG_NAME |
|
||||||
|
QEMUD_CMD_FLAG_UUID |
|
||||||
|
QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP |
|
||||||
|
QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC |
|
||||||
|
QEMUD_CMD_FLAG_DRIVE_CACHE_V2 |
|
||||||
|
QEMUD_CMD_FLAG_DRIVE_FORMAT |
|
||||||
|
QEMUD_CMD_FLAG_DRIVE_SERIAL |
|
||||||
|
QEMUD_CMD_FLAG_VGA |
|
||||||
|
QEMUD_CMD_FLAG_0_10 |
|
||||||
|
QEMUD_CMD_FLAG_ENABLE_KVM |
|
||||||
|
QEMUD_CMD_FLAG_XEN_DOMID |
|
||||||
|
QEMUD_CMD_FLAG_MIGRATE_QEMU_UNIX |
|
||||||
|
QEMUD_CMD_FLAG_CHARDEV |
|
||||||
|
QEMUD_CMD_FLAG_BALLOON |
|
||||||
|
QEMUD_CMD_FLAG_DEVICE,
|
||||||
|
12001, 0, 0);
|
||||||
|
|
||||||
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user