
+static CMPIStatus get_vnc_sessions(const CMPIBroker *broker, + const CMPIObjectPath *ref, + virConnectPtr conn, + struct vnc_ports ports, + struct inst_list *list) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst; + const char *path[2] = {PROC_TCP4, PROC_TCP6}; + FILE *tcp_info; + int i, j; + int error = 0;
- inst = get_console_sap(broker, ref, conn, ports.list[i], &s); - if ((s.rc != CMPI_RC_OK) || (inst == NULL)) - goto out; + for (j = 0; j < 2; j++) { + tcp_info = fopen(path[j], "r"); + if (tcp_info == NULL) { + cu_statusf(broker, &s, + CMPI_RC_ERR_FAILED, + "Failed to open %s: %m", tcp_info); + goto error; + }
- inst_list_add(list, inst); + s = read_tcp_file(broker, + ref, + conn, + ports, + list, + tcp_info); + + if (s.rc != CMPI_RC_OK) + goto error; + + /* Handle any guests that were missed. These guest don't have active + or enabled sessions. */ + for (i = 0; i < ports.max; i++) { + if (ports.list[i]->remote_port != -1) + continue; + + inst = get_console_sap(broker, ref, conn, ports.list[i], &s); + if ((s.rc != CMPI_RC_OK) || (inst == NULL)) + goto error; + + inst_list_add(list, inst); + }
This for loop doesn't need to be part of the greater for loop. Otherwise, you will generate two instances for the same guest: # wbemcli ein http://localhost:5988/root/virt:KVM_KVMRedirectionSAP -nl localhost:5988/root/virt:KVM_KVMRedirectionSAP.CreationClassName="KVM_KVMRedirectionSAP",Name="5903:0",SystemCreationClassName="KVM_ComputerSystem",SystemName="f10_test" localhost:5988/root/virt:KVM_KVMRedirectionSAP.CreationClassName="KVM_KVMRedirectionSAP",Name="-1:-1",SystemCreationClassName="KVM_ComputerSystem",SystemName="xtest2" localhost:5988/root/virt:KVM_KVMRedirectionSAP.CreationClassName="KVM_KVMRedirectionSAP",Name="-1:-1",SystemCreationClassName="KVM_ComputerSystem",SystemName="xtest2" This loop creates an instance for guests that are in define state. For these guests, the remote port is -1 because the hypervisor doesn't start a VNC server for the guest until the guest is running.
+ + error:
Moving the above loop outside of the outer for loop will remove the need for this error tag. And should remove the need for the error variable.
+ if (tcp_info != NULL) + fclose(tcp_info); + + if ((j == 0) && (s.rc != CMPI_RC_OK)) { + error = 1; + s.rc = CMPI_RC_OK; + } }
- out: - fclose(tcp_info); + if ((s.rc != CMPI_RC_OK) && (error == 0)) + s.rc = CMPI_RC_OK; + return s; }
_______________________________________________ Libvirt-cim mailing list Libvirt-cim@redhat.com https://www.redhat.com/mailman/listinfo/libvirt-cim
-- Kaitlin Rupert IBM Linux Technology Center kaitlin@linux.vnet.ibm.com