Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/XRDP/libipm/   (X11 Server Version 0.10.6.1©)  Datei vom 7.6.2026 mit Größe 11 kB image not shown  

Quelle  libipm.h

  Sprache: C
 

/**
 * Copyright (C) 2022 Matt Burt, all xrdp contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


/**
 * @file    libipm/libipm.h
 * @brief   Inter-Process Messaging building and parsing - public declarations
 *
 * The functions in this file are inspired by the D-Bus type system
 * (see https://dbus.freedesktop.org/doc/dbus-specification.html),
 * and the sd-bus library API.
 */


#if !defined(LIBIPM_H)
#define LIBIPM_H

#include "arch.h"
#include "libipm_facilities.h"

struct trans;

/**
 * Fixed-size block descriptor for sending blocks of data using libipm
 *
 * Use with the type code 'B'
 *
 * See the descriptions of libipm_msg_out_append() and libipm_msg_in_parse()
 * for instructions on how to use this type.
 */

struct libipm_fsb
{
    void *data;
    unsigned int datalen;
};

/**
 * Status code for library calls
 *
 * These are mainly intended so that the test suite can check the expected
 * codepath has been followed.
 *
 * Wrappers around libipm may assume success is 0, and anything else
 * is an error.
 */

enum libipm_status
{
    E_LI_SUCCESS = 0,
    E_LI_PROGRAM_ERROR, /***< Programming error */
    E_LI_NO_MEMORY, /***< Memory allocation failure */
    E_LI_UNSUPPORTED_TYPE, /***< Specified type code is unsupported */
    E_LI_UNIMPLEMENTED_TYPE, /***< Specified type code is unimplemented */
    E_LI_UNEXPECTED_TYPE, /***< Encountered unexpected type on input */
    E_LI_BUFFER_OVERFLOW, /***< End of buffer reached unexpectedly */
    E_LI_TOO_MANY_FDS, /***< Too many file descriptors encountered */
    E_LI_BAD_VALUE, /***< Specified (or incoming) value is out of range */
    E_LI_BAD_HEADER, /***< Bad incoming message header */
    E_LI_TRANSPORT_ERROR /***< Error detected at the transport level */
};

/* Flags values for libipm_[set/clear]_flags() */

/**
 * Input buffer contains sensitive information and must be
 * erased by libipm_msg_in_reset(). The flag is one-shot, and
 * is cleared after use.
 *
 * There is no corresponding flag for the output buffer -
 * use libipm_msg_out_erase() explicitly
 */

#define LIBIPM_E_MSG_IN_ERASE_AFTER_USE (1u<<0)

/**
 * Prepare a standard 'struct trans' for use with libipm
 *
 * @param trans libipm transport
 * @param facility Facility number from libipm_facilities.h
 * @param msgno_to_str Function to turn a message number into a string
 * @return != 0 for error.
 *
 * The msgno_to_str() function is used for error logging. If the routine
 * is not specified, or the routine returns NULL, a numeric code is
 * logged instead.
 */

enum libipm_status
libipm_init_trans(struct trans *trans,
                  enum libipm_facility facility,
                  const char *(*msgno_to_str)(unsigned short msgno));

/**
 * Set the flag(s) specified for the transport
 * @param trans libipm transport
 * @param flags flags to set. Multiple flags should be or'd together.
 */

void
libipm_set_flags(struct trans *trans, unsigned int flags);


/**
 * Clear the flag(s) specified for the transport
 * @param trans libipm transport
 * @param flags flags to clear. Multiple flags should be or'd together.
 */

void
libipm_clear_flags(struct trans *trans, unsigned int flags);


/**
 * Change the facility number for the transport
 * @param trans libipm transport
 * @param old_facility old transport facility
 * @param new_facility new transport facility
 *
 * This call is required if a libipm transport changes a facility number.
 * This can be used to implement switches from one functional server state to
 * another.
 *
 * The caller must be aware of the previous facility to change the facility.
 * In the event of a mismatch, a message is logged and no action is taken.
 */

void
libipm_change_facility(struct trans *trans,
                       enum libipm_facility old_facility,
                       enum libipm_facility new_facility);


/**
 * Initialise an output message
 *
 * @param trans libipm transport
 * @param msgno message number
 * @param format a description of any arguments to add to the buffer, or
 *               NULL if no arguments are to be added at this time.
 *
 * See libipm_msg_out_append() for details of the format string. The format
 * string is followed immediately by the arguments it describes */

enum libipm_status
libipm_msg_out_init(struct trans *trans, unsigned short msgno,
                    const char *format, ...);

/**
 * Append more arguments to an output message
 *
 * @param trans libipm transport
 * @param format a description of any arguments to add to the buffer.
 * @param != 0 if an error occurs
 *
 * The format string is followed immediately by the arguments it
 * describes. The format string may contain these characters (from the
 * D-Bus type system):-
 *
 * Char | C Type  | Description
 * ---- |------   | -----------
 *   y  |uint8_t  | Unsigned 8-bit integer
 *   b  |int      | Boolean value (see below)
 *   n  |int16_t  | Signed (two's complement) 16-bit integer
 *   q  |uint16_t | Unsigned 16-bit integer
 *   i  |int32_t  | Signed (two's complement) 32-bit integer
 *   u  |uint32_t | Unsigned 32-bit integer
 *   x  |int64_t  | Signed (two's complement) 64-bit integer
 *   t  |uint64_t | Unsigned 64-bit integer
 *   s  |char *   | NULL-terminated string
 *   h  |int      | File descriptor
 *   d  |  -      | (reserved)
 *   o  |  -      | (reserved)
 *   g  |  -      | (reserved)
 *
 * For the 'b' type, only values 0 and 1 are allowed. Other values
 * generate an error.
 *
 * The 'h' type can only be used where the underlying transport is a
 * UNIX domain socket.
 *
 *  The following additions to the D-Bus type system are also supported:-
 *
 * Char |C Type                    | Description
 * -----|------                    | -----------
 *   B  |const struct libipm_fsb * | Fixed-size block pointer
 *
 * For the 'B' type, pass in the address of a descriptor containing the
 * address and size of the object. The object is copied to the output
 * stream, along with its length.
 */

enum libipm_status
libipm_msg_out_append(struct trans *trans, const char *format, ...);

/**
 * Marks a message as complete and ready for transmission
 *
 * @param trans libipm transport
 */

void
libipm_msg_out_mark_end(struct trans *trans);

/**
 * Convenience sending function
 *
 * Constructs a simple message and sends it immediately using
 * libipm_msg_out_init() / libipm_msg_out_mark_end() and
 * trans_force_write()
 *
 * @param trans libipm transport
 * @param msgno message number
 * @param format a description of any arguments to add to the buffer, or
 *               NULL if no arguments are to be added at this time.
 *
 * See libipm_msg_out_append() for details of the format string. The format
 * string is followed immediately by the arguments it describes
 */

enum libipm_status
libipm_msg_out_simple_send(struct trans *trans, unsigned short msgno,
                           const char *format, ...);

/**
 * Erase (rather than just ignore) the contents of an output buffer
 *
 * Use after sending a message containing data which should not be
 * kept in memory (e.g. passwords)`
 * @param trans libipm transport
 */

void
libipm_msg_out_erase(struct trans *trans);

/**
 * Checks a transport to see if a complete libipm message is
 * available for parsing
 *
 * @param trans libipm transport
 * @param[out] available != 0 if a complete message is available
 * @return != 0 for error
 *
 * When 'available' becomes set, the buffer is guaranteed to
 * be in a parseable state.
 *
 * The results of calling this function after starting to parse a message
 * and before calling libipm_msg_in_reset() are undefined.
 */

enum libipm_status
libipm_msg_in_check_available(struct trans *trans, int *available);

/**
 * Waits on a single transport for a libipm message to be available for
 * parsing
 *
 * @param trans libipm transport
 * @return != 0 for error
 *
 * While the call is active, data-in callbacks for the transport are
 * disabled.
 *
 * The results of calling this function after starting to parse a message
 * and before calling libipm_msg_in_reset() are undefined.
 *
 * Only use this call if you have nothing to do until a message
 * arrives on the transport. If you have other transports to service, use
 * libipm_msg_in_check_available()
 */

enum libipm_status
libipm_msg_in_wait_available(struct trans *trans);

/**
 * Get the message number for a message in the input buffer.
 *
 * @param trans libipm transport
 * @return message number in the buffer
 *
 * The results of calling this routine after a call to
 * libipm_msg_in_reset() and before a successful call to
 * libipm_msg_in_check_available() (or libipm_msg_wait_available())
 * are undefined.
 */

unsigned short
libipm_msg_in_get_msgno(const struct trans *trans);

/**
 * Returns a letter corresponding to the next available type in the
 * input stream.
 *
 * @param trans libipm transport
 * @return letter of the type, '\0' for end of message, or '?' for
 *          an unrecognised type
 */

char
libipm_msg_in_peek_type(struct trans *trans);

/**
 * Reads arguments from an input message
 *
 * @param trans libipm transport
 * @param format a description of the arguments to read from the buffer.
 * @param != 0 if an error occurs
 *
 * The format string is followed immediately by the arguments it
 * describes. The format string may contain these characters (from the
 * D-Bus type system):-
 *
 * Char | C Type     | Description
 * ---- | ------     | -----------
 *   y  | uint8_t *  | Unsigned 8-bit integer
 *   b  | int *      | Boolean value (0 or 1 only)
 *   n  | int16_t *  | Signed (two's complement) 16-bit integer
 *   q  | uint16_t * | Unsigned 16-bit integer
 *   i  | int32_t *  | Signed (two's complement) 32-bit integer
 *   u  | uint32_t * | Unsigned 32-bit integer
 *   x  | int64_t *  | Signed (two's complement) 64-bit integer
 *   t  | uint64_t * | Unsigned 64-bit integer
 *   s  | char **    | NULL-terminated string
 *   h  | int *      | File descriptor
 *   d  |   -        | (reserved)
 *   o  |   -        | (reserved)
 *   g  |   -        | (reserved)
 *
 *  The following additions to the D-Bus type system are also supported:-
 *
 * Char | C Type                    | Description
 * -----| ------                    | -----------
 *   B  | const struct libipm_fsb * | Fixed-size block pointer
 *
 * For the 's' type, a pointer into the string in the input buffer is
 * returned. This pointer will only be valid until the next call to
 * libipm_msg_in_reset()
 *
 * The 'h' type can only be used where the underlying transport is a
 * UNIX domain socket.
 *
 * For the 'B' type, pass in the address of an initialised descriptor
 * containing the address and size of the object to copy the data
 * to. The size in the descriptor must match the size of the object
 * on-the-wire. Unlike 's', the data is copied out of the input buffer.
 *
 */

enum libipm_status
libipm_msg_in_parse(struct trans *trans, const char *format, ...);

/**
 * Resets a message buffer ready to receive the next message
 *
 * If the LIBIPM_E_MSG_IN_ERASE_AFTER_USE flag is set for the transport,
 * the entire buffer is erased, and the flag is cleared
 *
 * Any file descriptors received from the other end but not parsed
 * by the application are closed.
 *
 * @param trans libipm transport
 */

void
libipm_msg_in_reset(struct trans *trans);


#endif /* LIBIPM_H */

Messung V0.5 in Prozent
C=93 H=93 G=92

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet am  2026-07-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.