gensio_control(3)

gensio_control ๐Ÿ’– (part 1 of 3, bestie, we're doing this)

okay so this is from the Library Functions Manual, and it's literally all about gensio_control โ€” performing gensio-specific actions. Sit down, grab a strawberry drink ๐Ÿ“, we're going in.


โœจ NAME โœจ

gensio_control โ€” Perform gensio-specific actions. yes that's the whole name section, short and iconic ๐Ÿ’…


๐ŸŒธ SYNOPSIS ๐ŸŒธ

lowkey a whole buffet of function signatures, so here they all are, verbatim, no cap:

#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 ๐Ÿฆ‹

okay so gensio_control performs a gensio-specific operation on the gensio (when depth is 0) or on one of its children (depth > 0). main character energy, one function to rule the whole stack ๐Ÿ‘‘

If depth is GENSIO_CONTROL_DEPTH_ALL, it calls all the children with the data. In that case, GE_NOTSUP errors coming back from individual gensios get ignored (they're not the vibe), but it will stop at the first error besides that. periodt.

If depth is GENSIO_CONTROL_DEPTH_FIRST, it returns on the first gensio that doesn't return GE_NOTSUP. And if nothing handled it at all? It returns GE_NOTFOUND. ๐Ÿ’€

If you specify a depth >= 0, and depth is greater than the number of gensios in the stack, this will return GE_NOTFOUND. That's actually so useful, because it means you can tell whether you reached the bottom of the stack. slay.

Most controls use normal strings for configuration, and a control will be like that unless otherwise specified. Some controls let you pass binary information through. iykyk.

If get is GENSIO_CONTROL_GET (which is true), it attempts to fetch the option. You cannot use GENSIO_CONTROL_DEPTH_ALL with a fetch. To fetch an option, you must pass in data that's long enough to hold the output, and set datalen to the number of bytes available in data for the output. It returns the length of the string (like strlen, so not counting the terminating nil) or the binary data in datalen.

An operation with get set to GENSIO_CONTROL_SET (which is false) is a set operation โ€” it sets values or controls in the gensio. For string values, datalen is not used in a put operation, and it's not used for determining the length of the input string in data either; it must be a nil terminated string. For binary values, datalen must be provided. no skipping that one bestie ๐Ÿ™ˆ

All normal controls fetch data immediately and do not block. instant gratification, we love that for us โœจ

gensio_acontrol does a control that is asynchronous โ€” meaning it is not finished when the function returns. If it returns zero, the done callback gets 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. one at a time, bestie.

gensio_acontrol_s does an asynchronous control too, but it waits until the operation completes using an os function waiter. patient queen behavior ๐ŸŒธ

The timeout values on the acontrol functions are just a hint to the code โ€” it may or may not have any effect. It's 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 at all, since those operations are immediate. And it's ignored for ipmisol. so basically: vibes, mostly ๐Ÿ˜ญ

A get operation is always idempotent โ€” it won't change anything, so multiple calls won't have any effect on the state of the system. A get operation may or may not use information passed in data, and it returns information in the data field. ๐Ÿ’œ

If the output doesn't fit in a get operation, datalen gets 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 is honestly so handy: you can use it to probe 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. chef's kiss ๐Ÿ‘‘

gensio control operations in option depend on the particular gensio. Some are documented below, but there may be other controls available. See the gensio documentation in gensio(5) for details. bestie there's always more lore ๐Ÿ“š


GENSIO_CONTROL_NODELAY

Sets the enable/disable for any NAGLE type algorithms. For a put, the data should be the string "1" to disable delay, or "0" to enable delay. The return value from a get is a string "1" or "0". simple, clean, iconic ๐Ÿ’…

GENSIO_CONTROL_STREAMS

Returns 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

Requests that a break be sent over the line (primarily for telnet). go off, break ๐Ÿ’ฅ

GENSIO_CONTROL_GET_PEER_CERT_NAME

Returns 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. versatile queen ๐Ÿ‘‘

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

  • fetch by index โ€” just pass in a number in the data, like "0", and it will fetch the value at that index.
  • 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 call 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 a GE_NOTFOUND at the end. that's it, that's the loop ๐Ÿ”ฅ

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. keep track of those bestie ๐Ÿ’€

GENSIO_CONTROL_CERT_AUTH

Sets the certificate authority file to the string in data. If it ends in /, it's assumed to be a directory; otherwise it's 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). timing is everything, bestie โฐ

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. so don't go looking for it elsewhere ๐Ÿคซ

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. two factors, two events, we love a secure queen ๐Ÿ”

GENSIO_CONTROL_SERVICE

On a client, sets the service data passed by the gensio to the server. On a server, it sets 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. anything goes โœจ

GENSIO_CONTROL_CERT

Gets the full certificate in text form sent from the other end. ๐Ÿ“œ

GENSIO_CONTROL_CERT_FINGERPRINT

Gets the fingerprint for the certificate from the other end. ๐Ÿ’…

GENSIO_CONTROL_ENVIRONMENT

Sets the environment pointer for an exec. For pty and stdio connecter gensios. The data is a pointer to an argv array (char * const envp[]). yes bestie, envp, not argv, watch the spelling ๐ŸŽ€

GENSIO_CONTROL_ARGS

Sets the arguments for an exec. For pty and stdio connecter gensios. The data is a pointer to an argv array (char * const argv[]). and this one is argv. cute twins ๐Ÿซถ

GENSIO_CONTROL_MAX_WRITE_PACKET

On a packet gensio, returns 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). all or nothing, main character energy ๐Ÿ‘‘

GENSIO_CONTROL_EXIT_CODE

On stdio connectors and pty gensios, this is the exit code of the process that ran. This is only valid after close has completed. An integer string is returned. don't peek early, bestie โš ๏ธ

GENSIO_CONTROL_KILL_TASK

Attempts to terminate the task. The passed in string is converted (strtol) to an integer; if it's non-zero, a forced kill (kill -9) is done, otherwise a normal terminate is done. yes, kill -9 is the dramatic one. ๐Ÿ’€

GENSIO_CONTROL_WAIT_TASK

On stdio connectors and pty gensios, does 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. not yet, come back later ๐ŸŒธ

GENSIO_CONTROL_ADD_MCAST

On UDP/AX25 gensios, adds a multicast/UI address that the gensio will receive packets on. come through ๐Ÿ“ก

GENSIO_CONTROL_DEL_MCAST

On UDP/AX25 gensios, deletes a multicast/UI address that the gensio will receive packets on. bye bestie ๐Ÿ‘‹

GENSIO_CONTROL_GET_MCAST

On AX25 gensios, returns the given UI address. The data string passed in should be the string representation of a 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. index carefully, bestie ๐Ÿงš

GENSIO_CONTROL_MCAST_LOOP

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

  • GENSIO_CONTROL_MCAST_TTL โ€” sets the multicast time-to-live bestie ๐Ÿ’ซ. Takes/returns a string integer, so like "1" not 1. Default is 1, which means your multicast is staying in the local network, no wandering off ๐Ÿ . Bump this value up and you're increasing the number of hops over multicast routers that a send packet will traverse. More hops, more reach, periodt.
  • GENSIO_CONTROL_LADDR โ€” returns the local address for the connection ๐Ÿ“. Only for network connections or sound devices, okay?

For network devices: since a single gensio may have more than one local address, this control is how you tell it which one you want. The data string you pass in should be the string representation of a number (like one created with snprintf()) for the particular index you're fetching. If you specify a number larger than the number of open listen sockets, GE_NOTFOUND comes back at you ๐Ÿ˜ญ. The return data is a string holding the address.

Note that a single fetched string may contain more than one address โ€” these get 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_ADD_LADDR โ€” for an AX25 gensio, adds the given listen address to the addresses that will accept connections for the gensio โœจ.
  • GENSIO_CONTROL_DEL_LADDR โ€” for an AX25 gensio, deletes the given listen address from the addresses that will accept connections for the gensio ๐Ÿ’…. Heads up: this is the address string, not the instance number.
  • GENSIO_CONTROL_RADDR โ€” like GENSIO_CONTROL_LADDR but it 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 โ€” returns the binary remote address for the given gensio ๐Ÿฆ‹. Only implemented for network gensios and pty.
  • GENSIO_CONTROL_LPORT โ€” returns the local port for the connection ๐Ÿ”Œ. Only for network connections. Super useful when you pass in "0" for the port and let the OS choose โ€” this is how you find out the actual port that got chosen ๐Ÿ‘‘.
  • GENSIO_CONTROL_CLOSE_OUTPUT โ€” closes writing to the gensio, but leaves reading alone ๐Ÿ™ˆ. Only for stdio gensios; it lets you close stdin to the subprogram without messing with the subprogram's stdout.
  • GENSIO_CONTROL_CONNECT_ADDRESS_STR โ€” returns the address the connection was made to ๐Ÿ“ฎ. For SCTP. gensio_raddr_to_str() returns all the remote addresses in SCTP's current state, but this one returns the addresses that the original connectx was done to.
  • GENSIO_CONTROL_REMOTE_ID โ€” returns some sort of remote id for whatever 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 โ€” returns 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 โ€” returns 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 is 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 it's set to non-zero (a normal string like "1" passed in), extra fields get added to the auxdata in received packets. Those fields 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) enables it ๐Ÿ”ฅ.
Fr fr, only set this on the gensio you're directly communicating with โ€” it's used between some gensios, so don't just yeet it everywhere.
  • 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 don't have to be given โ€” if there are less than 4 values, pixel values are ignored and set to zero. datalen is ignored.
  • GENSIO_CONTROL_START_DIR โ€” for pty and stdio gensios (the ones that start another program), this makes the new program 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.

For ax25, this is the number of pending sent frames. If you pass in a "0", it counts frames for the current connection. If you pass in "1", it counts frames for all connections.

For network gensios, this is the number of unacked bytes in the transmit queue, or the number of bytes in the receive queue, on the local side.

  • GENSIO_CONTROL_DRAIN_TIMEOUT โ€” set or get the drain timeout for the gensio โณ. This is the same as the drain_timeout parameter given when a gensio is created. It doesn't have any meaning for gensios that don't queue output data in them, but for the ones that do, this sets the time (in milliseconds) that the gensio will wait for the data to drain before shutting down with pending data. Set this to a negative value and it'll wait forever, which is the default โ™พ๏ธ. Though not really forever โ€” some lower layer is going to time out and shut the connection down before you reach this.
  • GENSIO_CONTROL_IN_ANTENNA โ€” for a radio, the receive antenna name ๐Ÿ“ก. This is a string name.
  • GENSIO_CONTROL_OUT_ANTENNA โ€” for a radio, the transmit antenna name ๐Ÿ“ก. This is a string name.
  • GENSIO_CONTROL_IN_GAIN โ€” for a radio, the receive gain. A double float as a string. Passing in "auto" enables AGC โœจ.
  • GENSIO_CONTROL_OUT_GAIN โ€” for a radio, the transmit gain. A double float as a string. Passing in "auto" enables AGC โœจ.
  • GENSIO_CONTROL_FREQUENCY โ€” for a radio, the both frequencies ๐Ÿ“ป. For a get, this returns the in frequency. If you set this on the fsk gensio, it will adjust the frequencies in its child gensio to match what it does โ€” see the documentation for the fsk gensio for details ๐Ÿ‘‘. A double float as a string. Returns the input frequency.
  • GENSIO_CONTROL_IN_FREQUENCY โ€” for a radio, the receive frequency. A double float as a string ๐Ÿ“ป.
  • GENSIO_CONTROL_OUT_FREQUENCY โ€” for a radio, the transmit frequency. A double float as a string ๐Ÿ“ป.
  • GENSIO_CONTROL_IN_FREQ_ADJ โ€” for a radio, add an offset to the set input frequency ๐ŸŽ›๏ธ. This is so a modulator can move the frequency a bit to get the frequency it wants and still let something else control the radio frequency. A double float as a string.
  • GENSIO_CONTROL_OUT_FREQ_ADJ โ€” like the above, for the output frequency.
  • GENSIO_CONTROL_IN_FREQ_CORR โ€” sets the frequency correction for the main oscillator, a double float as a string โš™๏ธ. This is in parts-per-million.
  • GENSIO_CONTROL_OUT_FREQ_CORR โ€” like the above, for the output frequency.
  • GENSIO_CONTROL_IN_IQ_BALANCE โ€” sets the IQ balance, two float values separated by a ',' in a string, first is I and second is Q โš–๏ธ. This is a value from 0 to 1. Passing in "auto" enables automatic IQ balance.
  • GENSIO_CONTROL_OUT_IQ_BALANCE โ€” like the above, for the output.
  • GENSIO_CONTROL_IN_DC_OFFSET โ€” sets the DC offset, two float values separated by a ',' in a string, first is I and second is Q โš–๏ธ. This is a value from 0 to 1. Passing in "auto" enables automatic DC offset.
  • GENSIO_CONTROL_OUT_DC_OFFSET โ€” like the above, for the output.
  • GENSIO_CONTROL_IN_BANDWIDTH โ€” for a radio, the receive bandwidth ๐ŸŒˆ. A double float as a string.
  • GENSIO_CONTROL_OUT_BANDWIDTH โ€” for a radio, the transmit bandwidth ๐ŸŒˆ. A double float as a string.
  • GENSIO_CONTROL_IN_CHANNEL โ€” for a radio, the receive channel ๐Ÿ“บ. An integer as a string. Read only.
  • GENSIO_CONTROL_OUT_CHANNEL โ€” for a radio, the transmit channel ๐Ÿ“บ. An integer as a string. Read only.

๐ŸŽ€ 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 โ€” okay bestie, this one enables or disables the DTR line on a serial port. The value is one of "on" or "off". Wanna know how string/integer conversions work? Check GENSIO_ACONTROL_SER_SBREAK, no cap. ๐Ÿ’…
  • GENSIO_ACONTROL_SER_RTS โ€” same vibe, different line: enables or disables the RTS line on a serial port. One of "on" or "off". For the string/integer conversion tea, see GENSIO_ACONTROL_SER_SBREAK. โœจ
  • GENSIO_ACONTROL_SER_CTS โ€” enables or disables the CTS line on a serial port. One of "on" or "off". ipmisol only. For string/integer conversions, check GENSIO_ACONTROL_SER_SBREAK. ๐ŸŽ€
  • GENSIO_ACONTROL_SER_DCD_DSR โ€” enables or disables the DCD and DTR lines on a serial port. One of "on" or "off". ipmisol only. For string/integer conversions, see GENSIO_ACONTROL_SER_SBREAK. ๐Ÿฆ‹
  • GENSIO_ACONTROL_SER_RI โ€” enables or disables the RI line on a serial port. One of "on" or "off". ipmisol only. For string/integer conversions, see GENSIO_ACONTROL_SER_SBREAK. ๐ŸŒธ
  • GENSIO_ACONTROL_SER_SIGNATURE โ€” fetches or reports the rfc2217 signature for a serial port. This is an arbitrary string. telnet only. ๐Ÿซถ
  • GENSIO_ACONTROL_SER_FLUSH โ€” sends a flush to the other end and gets the response. Simple, iconic, periodt. ๐Ÿ’…

โœจ 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_ACONTROL_SER_SET_MODEMSTATE_MASK โ€” set the modemstate mask on the other end and get the response. Values to or together are: GENSIO_SER_MODEMSTATE_CTS, GENSIO_SER_MODEMSTATE_DSR, GENSIO_SER_MODEMSTATE_RI, GENSIO_SER_MODEMSTATE_CD. ๐Ÿ‘‘

When you set the modemstate mask, it should always send the current modemstate up. No cap.

  • GENSIO_ACONTROL_SER_SET_LINESTATE_MASK โ€” set the linestate mask on the other end and get the response. 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. ๐ŸŒˆ

The RFC2217 spec talks about sending the linestate mask back, but that really doesn't make any sense. These are events, not states. So currently that's not done, but it may change in the future. ๐Ÿ’€


๐Ÿ’– SENDING STATE STATUS TO THE OTHER END ๐Ÿ’–

If you are a telnet server, you can use these to send modemstate and linestate information to the remote end. Main character energy fr fr.

  • GENSIO_CONTROL_SER_SEND_MODEMSTATE โ€” send a modemstate message to the other end. In addition to the ones listed for GENSIO_CONTROL_SER_AMODEMSTATE_MASK, you also have bits that tell if the value changed from the last report: GENSIO_SER_MODEMSTATE_CTS_CHANGED, GENSIO_SER_MODEMSTATE_DSR_CHANGED, GENSIO_SER_MODEMSTATE_RI_CHANGED, GENSIO_SER_MODEMSTATE_CD_CHANGED. ๐ŸŽ€
  • GENSIO_CONTROL_SER_SEND_LINESTATE โ€” send a linestate message to the other end. โœจ

๐ŸŒˆ OTHER SERIAL PORT OPERATIONS ๐ŸŒˆ

This is a set of other operations that can be performed on a serial port. Lowkey random, highkey useful. ๐Ÿฆ‹

  • GENSIO_CONTROL_SER_FLOWCONTROL_STATE โ€” that's it, bestie. No description given, just the name. Iconic minimalism. ๐Ÿ’…
  • 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. Slay.


๐Ÿ‘‘ SEE ALSO ๐Ÿ‘‘

gensio_err(3), gensio(5)


That's the whole page, bestie. This manual page is from 27 Feb 2019, for gensio_control(3). Obsessed. ๐Ÿ’–

๐Ÿ“ฆ where this page comes from