## value

value — Simplified interface to GValue types used in libuser entities.

## Synopsis

    #define             LU_VALUE_INVALID_ID
    char*               lu_value_strdup                     (const GValue *value);
    gboolean            lu_value_init_set_attr_from_string  (GValue *value,
                                                             const char *attr,
                                                             const char *string,
                                                             lu_error_t **error);
    void                lu_value_init_set_id                (GValue *value,
                                                             id_t id);
    id_t                lu_value_get_id                     (const GValue *value);
    int                 lu_values_equal                     (const GValue *a,
                                                             const GValue *b);

## Description

Libuser entities store attribute values as GValue, which allows representing any possible data type. Only a few types are needed in practice; the only types applications should hard-code are `G_TYPE_LONG` and `G_TYPE_STRING` (`G_TYPE_STRING` can usually be used as a fallback for other number types).

The only currently used data types that are not conveniently supported using the above types are uid_t and gid_t (which can be together represented in id_t), because they can support values outside of the range of glong. Helper functions are provided to convert values between id_t and GValue, even if the value is stored using `G_TYPE_STRING`. The GValue types used for storing id_t values are an internal implementation detail of libuser and applications should not rely on them.

Values of each attribute are expected to have a specific type, documented in the documentation of the specific attribute name. Using other types (e.g. using `G_TYPE_STRING` for `LU_UIDNUMBER`) is not allowed and results in undefined behavior.. You can use `lu_value_strdup()` and `lu_value_init_set_attr_from_string()` for conversion between strings and values appropriate for a specific attribute.

## Details

### LU_VALUE_INVALID_ID

    #define LU_VALUE_INVALID_ID ((id_t)-1)

An id_t value that matches no valid user or group ID.

### lu_value_strdup ()

    char*               lu_value_strdup                     (const GValue *value);

Converts `value`, of any type used by libuser, to a string. Preferable to hard-coding checks for expected value types.

`value` : | value
Returns : | string, should be freed by `g_free()`

### lu_value_init_set_attr_from_string ()

    gboolean            lu_value_init_set_attr_from_string  (GValue *value,
                                                             const char *attr,
                                                             const char *string,
                                                             lu_error_t **error);

Initializes a zero-filled (uninitialized) `value` for storing a value of attribute `attr` and sets it to the contents of `string`. To see whether a specific type is used for an attribute, see the documentation of that attribute.

`value` : | GValue
`attr` : | attribute name
`string` : | the string to convert
`error` : | filled with a lu_error if an error occurs, or `NULL` if `attr` is unknown
Returns : | `TRUE` on success, `FALSE` on error or if `attr` is unknown

### lu_value_init_set_id ()

    void                lu_value_init_set_id                (GValue *value,
                                                             id_t id);

Initializes a zero-filled (uninitialized) `value` with an unspecified type and sets it to `id`.

`value` : | GValue
`id` : | user or group ID.

### lu_value_get_id ()

    id_t                lu_value_get_id                     (const GValue *value);

Get the contents of `value`. `value` should be initialized by `lu_value_init_set_id()` or use `G_TYPE_LONG` or `G_TYPE_STRING`.

If `value` does not contain a valid id_t value, `LU_VALUE_INVALID_ID` is returned.

`value` : | GValue
Returns : | ID value or `LU_VALUE_INVALID_ID`

### lu_values_equal ()

    int                 lu_values_equal                     (const GValue *a,
                                                             const GValue *b);

Check whether `a` and `b` have the same type and value.

`a` : | GValue
`b` : | GValue
Returns : | TRUE if `a` and `b` have the same type and value