Example #1
0
/**
 * virTypedParamsAddStringList:
 * @params: array of typed parameters
 * @nparams: number of parameters in the @params array
 * @maxparams: maximum number of parameters that can be stored in @params
 *      array without allocating more memory
 * @name: name of the parameter to store values to
 * @values: the values to store into the new parameters
 *
 * Packs NULL-terminated list of strings @values into @params under the
 * key @name.
 *
 * Returns 0 on success, -1 on error.
 */
int
virTypedParamsAddStringList(virTypedParameterPtr *params,
                            int *nparams,
                            int *maxparams,
                            const char *name,
                            const char **values)
{
    size_t i;
    int rv = -1;

    if (!values)
        return 0;

    for (i = 0; values[i]; i++) {
        if ((rv = virTypedParamsAddString(params, nparams, maxparams,
                                          name, values[i])) < 0)
            break;
    }

    return rv;
}
Example #2
0
int
adminClientGetInfo(virNetServerClientPtr client,
                   virTypedParameterPtr *params,
                   int *nparams,
                   unsigned int flags)
{
    int ret = -1;
    int maxparams = 0;
    bool readonly;
    char *sock_addr = NULL;
    const char *attr = NULL;
    virTypedParameterPtr tmpparams = NULL;
    virIdentityPtr identity = NULL;

    virCheckFlags(0, -1);

    if (virNetServerClientGetInfo(client, &readonly,
                                  &sock_addr, &identity) < 0)
        goto cleanup;

    if (virTypedParamsAddBoolean(&tmpparams, nparams, &maxparams,
                                 VIR_CLIENT_INFO_READONLY,
                                 readonly) < 0)
        goto cleanup;

    if (virIdentityGetSASLUserName(identity, &attr) < 0 ||
        (attr &&
         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                 VIR_CLIENT_INFO_SASL_USER_NAME,
                                 attr) < 0))
        goto cleanup;

    if (!virNetServerClientIsLocal(client)) {
        if (virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                    VIR_CLIENT_INFO_SOCKET_ADDR,
                                    sock_addr) < 0)
            goto cleanup;

        if (virIdentityGetX509DName(identity, &attr) < 0 ||
            (attr &&
             virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                     VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME,
                                     attr) < 0))
            goto cleanup;
    } else {
        pid_t pid;
        uid_t uid;
        gid_t gid;
        if (virIdentityGetUNIXUserID(identity, &uid) < 0 ||
            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
                                 VIR_CLIENT_INFO_UNIX_USER_ID, uid) < 0)
            goto cleanup;

        if (virIdentityGetUNIXUserName(identity, &attr) < 0 ||
            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                    VIR_CLIENT_INFO_UNIX_USER_NAME,
                                    attr) < 0)
            goto cleanup;

        if (virIdentityGetUNIXGroupID(identity, &gid) < 0 ||
            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
                                 VIR_CLIENT_INFO_UNIX_GROUP_ID, gid) < 0)
            goto cleanup;

        if (virIdentityGetUNIXGroupName(identity, &attr) < 0 ||
            virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                    VIR_CLIENT_INFO_UNIX_GROUP_NAME,
                                    attr) < 0)
            goto cleanup;

        if (virIdentityGetUNIXProcessID(identity, &pid) < 0 ||
            virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
                                 VIR_CLIENT_INFO_UNIX_PROCESS_ID, pid) < 0)
            goto cleanup;
    }

    if (virIdentityGetSELinuxContext(identity, &attr) < 0 ||
        (attr &&
         virTypedParamsAddString(&tmpparams, nparams, &maxparams,
                                VIR_CLIENT_INFO_SELINUX_CONTEXT, attr) < 0))
        goto cleanup;

    *params = tmpparams;
    tmpparams = NULL;
    ret = 0;

 cleanup:
    virObjectUnref(identity);
    VIR_FREE(sock_addr);
    return ret;
}