---
name: "libgenders"
section: "3"
platform: "linux"
package: "libgenders0-dev"
version: "1.27-3-3.1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/libgenders"
---

# libgenders(3)

a library of functions to parse and retrieve genders data

## NAME

libgenders - a library of functions to parse and retrieve genders data

## SYNOPSIS

**#include \<genders.h\>**

**genders\_t genders\_handle\_create(void);**

**int genders\_handle\_destroy(genders\_t handle);**

**int genders\_load\_data(genders\_t handle, const char \*filename);**

**int genders\_errnum(genders\_t handle);**

**char \*genders\_strerror(int errnum);**

**char \*genders\_errormsg(genders\_t handle);**

**void genders\_perror(genders\_t handle, const char \*msg);**

**int genders\_getnumnodes(genders\_t handle);**

**int genders\_getnumattrs(genders\_t handle);**

**int genders\_getmaxattrs(genders\_t handle);**

**int genders\_getmaxnodelen(genders\_t handle);**

**int genders\_getmaxattrlen(genders\_t handle);**

**int genders\_getmaxvallen(genders\_t handle);**

**int genders\_nodelist\_create(genders\_t handle, char \*\*\*nodelist);**

**int genders\_nodelist\_clear(genders\_t handle, char \*\*nodelist);**

**int genders\_nodelist\_destroy(genders\_t handle, char \*\*nodelist);**

**int genders\_attrlist\_create(genders\_t handle, char \*\*\*attrlist);**

**int genders\_attrlist\_clear(genders\_t handle, char \*\*attrlist);**

**int genders\_attrlist\_destroy(genders\_t handle, char \*\*attrlist);**

**int genders\_vallist\_create(genders\_t handle, char \*\*\*vallist);**

**int genders\_vallist\_clear(genders\_t handle, char \*\*vallist);**

**int genders\_vallist\_destroy(genders\_t handle, char \*\*vallist);**

**int genders\_getnodename(genders\_t handle, char \*node, int len);**

**int genders\_getnodes(genders\_t handle, char \*nodes\[\], int len, const char \*attr, const char \*val);**

**int genders\_getattr(genders\_t handle, char \*attrs\[\], char \*vals\[\], int len, const char \*node);**

**int genders\_getattr\_all(genders\_t handle, char \*attrs\[\], int len);**

**int genders\_testattr(genders\_t handle, const char \*node, const char \*attr, char \*val, int len);**

**int genders\_testattrval(genders\_t handle, const char \*node, const char \*attr, const char \*val);**

**int genders\_isnode(genders\_t handle, const char \*node);**

**int genders\_isattr(genders\_t handle, const char \*attr);**

**int genders\_isattrval(genders\_t handle, const char \*attr, const char \*val);**

**int genders\_index\_attrvals(genders\_t handle, const char \*attr);**

**int genders\_query(genders\_t handle, char \*nodes\[\], int len, const char \*query);**

**int genders\_testquery(genders\_t handle, const char \*node, const char \*query);**

**int genders\_parse(genders\_t handle, const char \*filename, FILE \*stream);**\

## DESCRIPTION

The genders library functions are a set of functions used to parse and retrieve data from a genders file.  For API details, please see the individual manpages for each of the functions above, or read the comments written in /usr/include/genders.h.\

## GENDERS FILE FORMAT

Each line of the genders file has one of the following formats.  See the section HOST RANGES below for information on host range formatting.

     nodename                attr\[=value\],attr\[=value\],...\
      nodename1,nodename2,... attr\[=value\],attr\[=value\],...\
      nodenames\[A-B\]          attr\[=value\],attr\[=value\],...

The nodename(s) are the shortened hostnames of a node.  This is followed by any number of spaces or tabs, and then the comma-separated list of attributes, each of which can optionally have a value.  The substitution string "%n" can be used in an attribute value to represent the nodename.  Nodenames can be listed on multiple lines, so a node's attributes can be specified on multiple lines.  However, no single node may have duplicate attributes.

There must be no spaces embedded in the attribute list and there is no provision for continuation lines.  Commas and equal characters are special and cannot appear in attribute names or their values. Comments are prefixed with the hash chracter (#) and can appear anywhere in the file.  The active genders file is typically found at /etc/genders or /admin/etc/genders.

Here is an example genders file from a small 16-node linux cluster:

     \# slc cluster genders file\
      slci,slcj,slc\[0-15\]  eth2=e%n,cluster=slc,all\
      slci                 passwdhost                 \
      slci,slcj            management\
      slc\[1-15\]            compute

## HOST RANGES

As noted in sections above, the genders database accepts ranges of nodenames in the general form: prefix\[n-m,l-k,...\], where n \< m and l \< k, etc., as an alternative to explicit lists of nodenames.

This range syntax is meant only as a convenience on clusters with a prefixNN naming convention and specification of ranges should not be considered necessary -- the list foo1,foo9 could be specified as such, or by the range foo\[1,9\].

Some examples of range usage follow:

foo01,foo02,foo03,foo04,foo05:    foo\[01-05\]

foo3,foo7,foo9,foo11:             foo\[3,7,9-11\]

fooi,fooj,foo0,foo1,foo2:         fooi,fooj,foo\[0-2\]

## FILES

/usr/include/genders.h

/etc/genders

## SEE ALSO

Libgenders(3), [Genders(3)](/Genders/3.md), [genders\_handle\_create(3)](/genders_handle_create/3.md), [genders\_handle\_destroy(3)](/genders_handle_destroy/3.md), [genders\_load\_data(3)](/genders_load_data/3.md), [genders\_errnum(3)](/genders_errnum/3.md), [genders\_strerror(3)](/genders_strerror/3.md), [genders\_errormsg(3)](/genders_errormsg/3.md), [genders\_perror(3)](/genders_perror/3.md), [genders\_getnumnodes(3)](/genders_getnumnodes/3.md), [genders\_getnumattrs(3)](/genders_getnumattrs/3.md), [genders\_getmaxattrs(3)](/genders_getmaxattrs/3.md), [genders\_getmaxnodelen(3)](/genders_getmaxnodelen/3.md), [genders\_getmaxattrlen(3)](/genders_getmaxattrlen/3.md), [genders\_getmaxvallen(3)](/genders_getmaxvallen/3.md), [genders\_nodelist\_create(3)](/genders_nodelist_create/3.md), [genders\_nodelist\_clear(3)](/genders_nodelist_clear/3.md), [genders\_nodelist\_destroy(3)](/genders_nodelist_destroy/3.md), [genders\_attrlist\_create(3)](/genders_attrlist_create/3.md), [genders\_attrlist\_clear(3)](/genders_attrlist_clear/3.md), [genders\_attrlist\_destroy(3)](/genders_attrlist_destroy/3.md), [genders\_vallist\_create(3)](/genders_vallist_create/3.md), [genders\_vallist\_clear(3)](/genders_vallist_clear/3.md), [genders\_vallist\_destroy(3)](/genders_vallist_destroy/3.md), [genders\_getnodename(3)](/genders_getnodename/3.md), [genders\_getnodes(3)](/genders_getnodes/3.md), [genders\_getattr(3)](/genders_getattr/3.md), [genders\_getattr\_all(3)](/genders_getattr_all/3.md), [genders\_testattr(3)](/genders_testattr/3.md), [genders\_testattrval(3)](/genders_testattrval/3.md), genders\_testnode(3), genders\_index\_nodes(3), genders\_index\_attrs(3), [genders\_index\_attrvals(3)](/genders_index_attrvals/3.md), [genders\_query(3)](/genders_query/3.md), [genders\_testquery(3)](/genders_testquery/3.md), [genders\_parse(3)](/genders_parse/3.md)
