Provided by: libgensio-dev_2.8.2-6.1build1_amd64 bug

NAME

       gensio_control - Perform gensio-specific actions

SYNOPSIS

       #include <gensio/gensio.h>

       int gensio_control(struct gensio *io, int depth, bool get,
                           unsigned int option,
                           char *data, gensiods *datalen);

       typedef void (*gensio_control_done)(struct gensio *io, int err,
                           const char *buf, gensiods len,
                           void *cb_data);

       int gensio_acontrol(struct gensio *io, int depth, bool get,
                           unsigned int option,
                           char *data, gensiods datalen,
                           gensio_control_done done, void *cb_data,
                           gensio_time *timeout);

       int gensio_acontrol_s(struct gensio *io, int depth, bool get,
                           unsigned int option,
                           char *data, gensiods *datalen,
                           gensio_time *timeout);

       int gensio_acontrol_s_intr(struct gensio *io, int depth, bool get,
                           unsigned int option,
                           char *data, gensiods *datalen,
                           gensio_time *timeout);

       const char *gensio_parity_to_str(unsigned int ival);

       int gensio_str_to_parity(char *sval);

       const char *gensio_flowcontrol_to_str(unsigned int ival);

       int gensio_str_to_flowcontrol(char *sval);

       const char *gensio_onoff_to_str(unsigned int ival);

       int gensio_str_to_onoff(char *sval);

DESCRIPTION

       gensio_control  performs a gensio-specific operation on the gensio (if depth is 0) or one of its children
       ( depth > 0). If depth is GENSIO_CONTROL_DEPTH_ALL, then call all the children with the data.   GE_NOTSUP
       error  returns  from  individual  gensios  are  ignored in that case, but it will stop at the first error
       besides that.  If depth is GENSIO_CONTROL_DEPTH_FIRST, it will return on the first  gensio  that  doesn't
       return GE_NOTSUP.  It returns GE_NOTFOUND if nothing handled it.

       If  you  specify  a  depth  >= 0, and depth is greater than the number of gensios in the stack, this will
       return GE_NOTFOUND.  This way you can know if you reached the bottom of the stack.

       Most controls use normal strings  for  configuration,  a  control  will  be  this  way  unless  othersise
       specified.  Some controls allow binary information to be passed.

       If   get   is   GENSIO_CONTROL_GET   (true),   attempt   to   fetch   the   option.    You   cannot   use
       GENSIO_CONTROL_DEPTH_ALL with a fetch.  To fetch an option, you must pass in data long enough to hold the
       output  and  set  datalen  to  the  number of bytes available in data for the output.  It will return the
       length of the string (like strlen, not including the terminating nil) or binary data in datalen.

       An operation with get set to GENSIO_CONTROL_SET (false) is  a  set  operation,  it  will  set  values  or
       controls in the gensio.  For string values, datalen is not used in a put operation or for determining the
       length of the input string in data, it must be a nil terminated string.  For binary values, datalen  must
       be provided.

       All normal controls fetch data immediately and do not block.

       gensio_acontrol  does  a  control that is asynchronous, meaning that it is not finished when the function
       returns.  If it returns zero, the done callback will  be  called  with  the  result  when  the  operation
       completes.   All  asynchronous  control options start with GENSIO_ACONTROL_xxx.  Asynchronous controls do
       not allow GENSIO_CONTROL_DEPTH_ALL, they can only be called on a single gensio in the stack.

       gensio_acontrol_s does an asynchronous control, but waits until  the  operation  completes  using  an  os
       function waiter.

       The  timeout  values  on the acontrol functions is a hint to the code, it may or may not have any effect.
       It is not necessarily updated to the remaining time, either.  For telnet, this updates the  default  time
       to  wait for a result.  For serialdev it has no effect, as those operations are immediate.  It is ignored
       for ipmisol.

       A get operation is alway indepotent (it won't change anything, so multiple calls will not have any effect
       on  the state of the system).  A get operation may or may not use information passed in data, and returns
       information in the data field.

       If the output does not fit in a get operation, datalen is updated to where it would have been if  it  had
       enough  bytes  (one  less than the total number of bytes required for string controls), but the output in
       data is truncated (and nil terminated if possible for string controls).  This can be used to probe to see
       how long a buffer is required by passing in a zero *datalen, and then allocating *datalen (+ 1 for string
       gensios) and calling the function again with that data.

       gensio control operations in option depend on the particular gensio.   Below  some  are  documented,  but
       there may be other controls available.  See the gensio documentation in gensio(5) for details.

   GENSIO_CONTROL_NODELAY
       Set the enable/disable for any NAGLE type algorithms.  For put the data should be a string "1" to disable
       delay, or "0" to enable delay.  Return value from a get is a string "1" or "0".

   GENSIO_CONTROL_STREAMS
       Return information about incoming and outgoing streams  for  the  gensio.   This  is  read(get)-only  and
       returns the value in the data in the form "instream=<n>,ostream=<n>".  Used by SCTP.

   GENSIO_CONTROL_SEND_BREAK
       Request that a break be sent over the line (primarily for telnet).

   GENSIO_CONTROL_GET_PEER_CERT_NAME
       Return  the  object  from the certificate from the remote end.  This is primarily for SSL and certauth so
       the application can validate the certificate's common  name,  but  it  can  fetch  any  object  from  the
       certificate.

       There are two ways to use this interface: fetch by index or fetch by object type.

       To fetch by index, just pass in a number in the data, like "0" and it will fetch the value at that index.

       To  fetch  by object type, pass in a number and the object type separated by a comma.  The object type to
       fetch is SN (short name) or LN (long name) descriptor per /usr/include/openssl/object.h.   Like  "CN"  or
       "commonName".   The  index  should  be one less than the start search, you should use -1, for instance to
       fetch the first index.

       The data returned is in the form: "<index>,<sn>,<value>".  Where sn is the short name.

       In fetch by object type mode, there may be more than one of an object in a certificate, so this interface
       can  handle  that.   just  pass in the index returned by the first into the second call and it will start
       after that index.  For instance, to fetch the first common name, do  (with  error  checking  removed  for
       clarity):

              strcpy(data, "-1,CN");
              gensio_control(io, 0, true, data, &len)

       Say it returns "3,CN,MyName.org"  You would use

              strcpy(data, "3,CN");
              gensio_control(io, 0, true, data, &len)

       to get the next common name, which might be "4,CN,MyName2.org".  You get an GE_NOTFOUND at the end.

       Returns  GE_NOCERT  if  there  is no remote certificate, GE_CERTINVAL if the passed in object name is not
       valid, and GE_NOTFOUND if the object was not available in the certificate.

   GENSIO_CONTROL_CERT_AUTH
       Set the certificate authority file to the string in data.  If it ends in '/',  it  is  assumed  to  be  a
       directory,  otherwise  it  is  assumed to be a file.  This generally must be done before authorization is
       done, generally before  open  or  in  the  GENSIO_EVENT_PRECERT_VERIFY  event  (see  gensio_event(3)  for
       details).

   GENSIO_CONTROL_USERNAME
       Get/set  the  username  for  the  gensio,  generally  the username sent from the client end on a certauth
       gensio.  This is always a string.

   GENSIO_CONTROL_PASSWORD
       Get/set the password for the gensio, generally the password sent  from  the  client  end  on  a  certauth
       gensio.    This  is  always  a  string.   On  the  server  side  this  will  only  be  available  in  the
       GENSIO_EVENT_PASSWORD_VERIFY event. and is cleared outside of that.

   GENSIO_CONTROL_2FA
       Get/set the 2-factor auth data for the gensio, generally the data sent from the client end on a  certauth
       gensio.   This  is  non-nil  terminated  binary  data,  generally.   On the server side this will only be
       available in the GENSIO_EVENT_PASSWORD_VERIFY event or the GENSIO_2FA_VERIFY event and is cleared outside
       of that.

   GENSIO_CONTROL_SERVICE
       On  a  client, set the service data passed by the gensio to the server.  On a server, et the service sent
       from the gensio client, generally available on a certauth server.  Returns GE_DATAMISSING  if  a  service
       was not sent.

       This is a binary control, so arbitrary data can be passed in the service.

   GENSIO_CONTROL_CERT
       Get the full certificate in text form sent from the other end.

   GENSIO_CONTROL_CERT_FINGERPRINT
       Get the fingerprint for the certificate from the other end.

   GENSIO_CONTROL_ENVIRONMENT
       Set  the environment pointer for an exec.  For pty and stdio connecter gensios.  The data is a pointer to
       an argv array (char * const envp[])

   GENSIO_CONTROL_ARGS
       Set the arguments for an exec.  For pty and stdio connecter gensios.  The data is a pointer  to  an  argv
       array (char * const argv[])

   GENSIO_CONTROL_MAX_WRITE_PACKET
       On  a  packet  gensio, return the maximum packet size that can be sent.  Any write of this amount or less
       will be sent as a single message that will be delivered as one read on the other end, or it will  not  be
       sent at all (zero-byte send count).

   GENSIO_CONTROL_EXIT_CODE
       On  a  stdio connectors and pty gensios, the exit code of the process that ran.  This is only valid after
       close has completed.  An integer string is returned.

   GENSIO_CONTROL_KILL_TASK
       Attempt to terminate the task.  The passed in string is converted (strtol) to an integer, if if  it  non-
       zero, a forced kill (kill -9) is done, otherwise a normal terminate is done.

   GENSIO_CONTROL_WAIT_TASK
       On  a  stdio connectors and pty gensios, do a waitpid on the process.  If it has closed, this will return
       success and the exit code in the string.  Otherwise it will return GE_NOTREADY.

   GENSIO_CONTROL_ADD_MCAST
       On UDP connections, add a multicast address that the socket will receive packets on.

   GENSIO_CONTROL_DEL_MCAST
       On UDP connections, delete a multicast address that the socket will receive packets on.

   GENSIO_CONTROL_MCAST_LOOP
       On UDP connections, sets whether multicast packets sent on the  socket  will  be  received  by  the  same
       machine.  Takes/returns string boolean "true" or "false".  Defaults to false.

   GENSIO_CONTROL_MCAST_TTL
       Sets  the  multicast  time-to-live.   Takes/returns a string integer. The default is 1, meaning multicast
       stays in the local network.  Increasing this value increases the number of hops over multicast routers  a
       send packet will traverse.

   GENSIO_CONTROL_LADDR
       Return the local address for the connection.  Only for network connections or sound devices.

       For  network devices, since a single gensio may have more than one local address, this control provides a
       means to tell which one.  The data string passed in should be the string representation of a  the  number
       (like  created  with  snprintf())  for  the  particular index you want to fetch.  If you specify a number
       larger than the number of open listen sockets, GE_NOTFOUND is returned.  The  return  data  is  a  string
       holding the address.

       Note  that  a  single  fetched  string  may  contain  more  than one address.  These will be separated by
       semicolons.  In some cases addresses may change dynamically (like with SCTP), so you get a single set  of
       addresses.

       For  sound devices, pass in "in" or "out" in the string to get the full card number or name that uniquely
       identifies the sound card.

   GENSIO_CONTROL_RADDR
       Like GENSIO_CONTROL_LADDR but gets the remote addresses on a gensio.  The gensio may  need  to  be  open.
       This  is  only  implemented  on  bottom-level  gensios,  like  serialdev, network interfaces, echo, file,
       ipmisol, etc.

   GENSIO_CONTROL_RADDR_BIN
       Return the binary remote address for the given gensio.  Only implemented for network gensios and pty.

   GENSIO_CONTROL_LPORT
       Return the local port for the connection.  Only for network connections.  This is useful if you  pass  in
       "0" for the port to let the OS chose; you can get the actual port chosen.

   GENSIO_CONTROL_CLOSE_OUTPUT
       Close  writing to the gensio, but leave reading along.  This is only for stdio gensios; it lets you close
       stdin to the subprogram without affecting the subprogram's stdout.

   GENSIO_CONTROL_CONNECT_ADDRESS_STR
       Return the address the connection was made to.  For SCTP.  gensio_raddr_to_str() returns all  the  remote
       addresses  in  SCTP's  current state.  This will return the addresses that the original connectx was done
       to.

   GENSIO_CONTROL_REMOTE_ID
       Return some sort of remote id for what is on the other end of the connection.  Not implemented  for  most
       gensios, only for getting the pid on a pty and stdio and the file descriptor on serialdev.

   GENSIO_CONTROL_AUX_DATA
       Return  auxiliary  sent  on  the  connection.   On  certauth,  this will be sent to the remote end and be
       available for them.

   GENSIO_CONTROL_REM_AUX_DATA
       Return auxiliary received from the other end of the connection.  On certauth, this will be received  from
       the remote end.

   GENSIO_CONTROL_IOD
       Used  to  get  the IOD pointer for the gensio as a raw pointer.  For gensios that have more than one IOD,
       the string you pass in will be a string number representing which IOD, "0" for the first (stdin), "1" for
       the second (stdout), and "2" for the third, (stderr).

   GENSIO_CONTROL_EXTRAINFO
       This  enables  extra  info  to  be returned on a received UDP packet.  If this is set to non-zero (normal
       string like "1" passed in), extra fields will be added to the auxdata in received packets.   These  field
       are:  "daddr:<address>"  with  the  destination  address from the packet and "ifidx:<n>" with the integer
       interface index the packet was received on.

   GENSIO_CONTROL_ENABLE_OOB
       Out of band (OOB) data is disabled by default on all gensios and setting this to non-zero (normal  string
       like  "1"  passed  in) will enable it.  Note that you should only set this on the gensio you are directly
       communicating with, it is used between some gensios.

   GENSIO_CONTROL_WIN_SIZE
       For pty gensios, sets the window size of the virtual window.  The value is  a  string  with  four  values
       separated by ":".  The first two are the number of rows and number of columns.  The second two are number
       of horizontal pixels and number of vertical pixels.  The pixel values are currently ignored  by  windows.
       pixel  values do not have to be given, if there are less than 4 values, pixels values are ignored and set
       to zero.  datalen is ignored.

   GENSIO_CONTROL_START_DIR
       For pty and stdio gensios (that start another program), this will cause the new program  to  run  in  the
       given directory instead of the current directory.

   GENSIO_CONTROL_IN_RATE , GENSIO_CONTROL_OUT_RATE
       For sound gensios, return the sample rate for the gensio for input or output.

   GENSIO_CONTROL_IN_BUFSIZE , GENSIO_CONTROL_OUTBUFSIZE
       For  sound  gensios, return the buffer size in bytes for input our output.  The data will be delivered to
       upper layer in chunks of this size.

   GENSIO_CONTROL_IN_NR_CHANS , GENSIO_CONTROL_OUT_NR_CHANS
       For sound gensios, return the number of channels for the interface for input or output.

   GENSIO_CONTROL_IN_FORMAT , GENSIO_CONTROL_OUT_FORMAT
       For sound gensios, return the format of the user data.  Like "float", "int16be", etc.

   GENSIO_CONTROL_DRAIN_COUNT
       The amount of data left to be transmitted.  For sound, this is in frames.

   SERIAL PORT CONTROLS
       The following set various serial port values.

       On the client these set the value or request the value from the other end.  When getting the  data  value
       is not used.  When setting the data value is a string with a number or setting.  The response in the done
       callback reports a string with the set value (which may be different than the  requested  value)  in  the
       same format as the request.

       On the server these are used to respond to a client event.  The done callback is ignored.

       GENSIO_ACONTROL_SER_BAUD
       is  the  baud  rate as a number.  For instance, setting to "1200" sets 1200 baud.  Not all gensio support
       all baud rates.

       GENSIO_ACONTROL_SER_DATASIZE
       is the datasize, a number from "5" to "8".  Not all gensio support all data sizes.

       GENSIO_ACONTROL_SER_PARITY
       sets the parity, one of "none", "odd", "even", "mark" or "space".  You can use  gensio_parity_to_str  and
       gensio_str_to_parity to convert between the string and numeric values.  gensio_parity_to_str returns NULL
       if the number isn't value, gensio_str_to_parity returns -1 if the string is not valid.

       GENSIO_ACONTROL_SER_STOPBITS
       sets the number of stop bits, "1", or "2".

       GENSIO_ACONTROL_SER_FLOWCONTROL
       sets the flow control type, one of "none", "xonxoff", or "rtscts".  You can use gensio_flowcontrol_to_str
       and    gensio_str_to_flowcontrol    to    convert    between    the    string    and    numeric   values.
       gensio_flowcontrol_to_str returns NULL if the number isn't value, gensio_str_to_flowcontrol returns -1 if
       the string is not valid.

       GENSIO_ACONTROL_SER_IFLOWCONTROL
       sets  the input flow state, one of "none", "dcd", "dtr", or "dsr".  You use the same conversion functions
       as GENSIO_ACONTROL_SER_FLOWCONTROL for converting between strings and integers.

       GENSIO_ACONTROL_SER_SBREAK
       Enables or disables the break condition  on  a  serial  port.   One  of  "on"  or  "off".   You  can  use
       gensio_onoff_to_str   and   gensio_str_to_onoff  to  convert  between  the  string  and  numeric  values.
       gensio_onoff_to_str returns NULL if the number isn't value, gensio_str_to_onoff returns -1 if the  string
       is not valid.

       GENSIO_ACONTROL_SER_DTR
       Enables or disables the DTR line on a serial port.  One of "on" or "off".  See GENSIO_ACONTROL_SER_SBREAK
       for string/integer conversions.

       GENSIO_ACONTROL_SER_RTS
       Enables or disables the RTS line on a serial port.  One of "on" or "off".  See GENSIO_ACONTROL_SER_SBREAK
       for string/integer conversions.

       GENSIO_ACONTROL_SER_CTS
       Enables  or  disables  the  CTS  line  on  a  serial  port.   One  of  "on" or "off".  ipmisol only.  See
       GENSIO_ACONTROL_SER_SBREAK for string/integer conversions.

       GENSIO_ACONTROL_SER_DCD_DSR
       Enables or disables the DCD and DTR lines on a serial port.  One of "on" or "off".   ipmisol  only.   See
       GENSIO_ACONTROL_SER_SBREAK for string/integer conversions.

       GENSIO_ACONTROL_SER_RI
       Enables  or  disables  the  RI  line  on  a  serial  port.   One  of  "on"  or "off".  ipmisol only.  See
       GENSIO_ACONTROL_SER_SBREAK for string/integer conversions.

       GENSIO_ACONTROL_SER_SIGNATURE
       Fetches or reports the rfc2217 signature for a serial port.  This is an arbitrary string.  telnet only.

   SERIAL PORT REPORT MASKS
       These set (on the client) the mask used to monitor various lines on a serial ports.  The bits set will be
       the  ones  reported in the corresponding events.  These are numbers in strings, you bitwise or the values
       together.

       GENSIO_CONTROL_SER_MODEMSTATE
       sets the modem control lines that are reported.  Values to or  together  are:  GENSIO_SER_MODEMSTATE_CTS,
       GENSIO_SER_MODEMSTATE_DSR, GENSIO_SER_MODEMSTATE_RI, GENSIO_SER_MODEMSTATE_CD.

       GENSIO_CONTROL_SER_LINESTATE
       sets    the    line    states    (errors)    that   are   reported.    Values   to   or   together   are:
       GENSIO_SER_LINESTATE_DATA_READY,    GENSIO_SER_LINESTATE_OVERRUN_ERR,    GENSIO_SER_LINESTATE_PARITY_ERR,
       GENSIO_SER_LINESTATE_FRAMING_ERR,    GENSIO_SER_LINESTATE_BREAK,    GENSIO_SER_LINESTATE_XMIT_HOLD_EMPTY,
       GENSIO_SER_LINESTATE_XMIT_SHIFT_EMPTY, GENSIO_SER_LINESTATE_TIMEOUT_ERR.

   OTHER SERIAL PORT OPERATIONS
       This is a set of other operations that can be performed on a serial port.

       GENSIO_CONTROL_SER_FLOWCONTROL_STATE

       GENSIO_CONTROL_SER_FLUSH
       requests a flush of the input or output queues, values are "recv", "xmit", or "both".

       GENSIO_CONTROL_SER_SEND_BREAK
       requests a serial break (of arbitrary length) be sent.  The value is not used.

RETURN VALUES

       Zero is returned on success, or a gensio error on failure.

SEE ALSO

       gensio_err(3), gensio(5)

                                                   27 Feb 2019                                 gensio_control(3)