Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/include/linux/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 10 kB image not shown  

Quelle  tty_ldisc.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_TTY_LDISC_H
#define _LINUX_TTY_LDISC_H

struct tty_struct;

#include <linux/fs.h>
#include <linux/wait.h>
#include <linux/atomic.h>
#include <linux/list.h>
#include <linux/lockdep.h>
#include <linux/seq_file.h>

/*
 * the semaphore definition
 */

struct ld_semaphore {
 atomic_long_t  count;
 raw_spinlock_t  wait_lock;
 unsigned int  wait_readers;
 struct list_head read_wait;
 struct list_head write_wait;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
 struct lockdep_map dep_map;
#endif
};

void __init_ldsem(struct ld_semaphore *sem, const char *name,
    struct lock_class_key *key);

#define init_ldsem(sem)      \
do {        \
 static struct lock_class_key __key;   \
        \
 __init_ldsem((sem), #sem, &__key);   \
while (0)


int ldsem_down_read(struct ld_semaphore *sem, long timeout);
int ldsem_down_read_trylock(struct ld_semaphore *sem);
int ldsem_down_write(struct ld_semaphore *sem, long timeout);
void ldsem_up_read(struct ld_semaphore *sem);
void ldsem_up_write(struct ld_semaphore *sem);

#ifdef CONFIG_DEBUG_LOCK_ALLOC
int ldsem_down_read_nested(struct ld_semaphore *sem, int subclass,
  long timeout);
int ldsem_down_write_nested(struct ld_semaphore *sem, int subclass,
  long timeout);
#else
define ldsem_down_read_nested(sem, subclass, timeout)  \
  ldsem_down_read(sem, timeout)
define ldsem_down_write_nested(sem, subclass, timeout) \
  ldsem_down_write(sem, timeout)
#endif

/**
 * struct tty_ldisc_ops - ldisc operations
 *
 * @name: name of this ldisc rendered in /proc/tty/ldiscs
 * @num: ``N_*`` number (%N_TTY, %N_HDLC, ...) reserved to this ldisc
 *
 * @open: [TTY] ``int ()(struct tty_struct *tty)``
 *
 * This function is called when the line discipline is associated with the
 * @tty. No other call into the line discipline for this tty will occur
 * until it completes successfully. It should initialize any state needed
 * by the ldisc, and set @tty->receive_room to the maximum amount of data
 * the line discipline is willing to accept from the driver with a single
 * call to @receive_buf(). Returning an error will prevent the ldisc from
 * being attached.
 *
 * Optional. Can sleep.
 *
 * @close: [TTY] ``void ()(struct tty_struct *tty)``
 *
 * This function is called when the line discipline is being shutdown,
 * either because the @tty is being closed or because the @tty is being
 * changed to use a new line discipline. At the point of execution no
 * further users will enter the ldisc code for this tty.
 *
 * Optional. Can sleep.
 *
 * @flush_buffer: [TTY] ``void ()(struct tty_struct *tty)``
 *
 * This function instructs the line discipline to clear its buffers of any
 * input characters it may have queued to be delivered to the user mode
 * process. It may be called at any point between open and close.
 *
 * Optional.
 *
 * @read: [TTY] ``ssize_t ()(struct tty_struct *tty, struct file *file, u8 *buf,
 * size_t nr)``
 *
 * This function is called when the user requests to read from the @tty.
 * The line discipline will return whatever characters it has buffered up
 * for the user. If this function is not defined, the user will receive
 * an %EIO error. Multiple read calls may occur in parallel and the ldisc
 * must deal with serialization issues.
 *
 * Optional: %EIO unless provided. Can sleep.
 *
 * @write: [TTY] ``ssize_t ()(struct tty_struct *tty, struct file *file,
 *  const u8 *buf, size_t nr)``
 *
 * This function is called when the user requests to write to the @tty.
 * The line discipline will deliver the characters to the low-level tty
 * device for transmission, optionally performing some processing on the
 * characters first. If this function is not defined, the user will
 * receive an %EIO error.
 *
 * Optional: %EIO unless provided. Can sleep.
 *
 * @ioctl: [TTY] ``int ()(struct tty_struct *tty, unsigned int cmd,
 * unsigned long arg)``
 *
 * This function is called when the user requests an ioctl which is not
 * handled by the tty layer or the low-level tty driver. It is intended
 * for ioctls which affect line discpline operation.  Note that the search
 * order for ioctls is (1) tty layer, (2) tty low-level driver, (3) line
 * discpline. So a low-level driver can "grab" an ioctl request before
 * the line discpline has a chance to see it.
 *
 * Optional.
 *
 * @compat_ioctl: [TTY] ``int ()(struct tty_struct *tty, unsigned int cmd,
 * unsigned long arg)``
 *
 * Process ioctl calls from 32-bit process on 64-bit system.
 *
 * Note that only ioctls that are neither "pointer to compatible
 * structure" nor tty-generic.  Something private that takes an integer or
 * a pointer to wordsize-sensitive structure belongs here, but most of
 * ldiscs will happily leave it %NULL.
 *
 * Optional.
 *
 * @set_termios: [TTY] ``void ()(struct tty_struct *tty, const struct ktermios *old)``
 *
 * This function notifies the line discpline that a change has been made
 * to the termios structure.
 *
 * Optional.
 *
 * @poll: [TTY] ``int ()(struct tty_struct *tty, struct file *file,
 *   struct poll_table_struct *wait)``
 *
 * This function is called when a user attempts to select/poll on a @tty
 * device. It is solely the responsibility of the line discipline to
 * handle poll requests.
 *
 * Optional.
 *
 * @hangup: [TTY] ``void ()(struct tty_struct *tty)``
 *
 * Called on a hangup. Tells the discipline that it should cease I/O to
 * the tty driver. The driver should seek to perform this action quickly
 * but should wait until any pending driver I/O is completed. No further
 * calls into the ldisc code will occur.
 *
 * Optional. Can sleep.
 *
 * @receive_buf: [DRV] ``void ()(struct tty_struct *tty, const u8 *cp,
 *        const u8 *fp, size_t count)``
 *
 * This function is called by the low-level tty driver to send characters
 * received by the hardware to the line discpline for processing. @cp is
 * a pointer to the buffer of input character received by the device. @fp
 * is a pointer to an array of flag bytes which indicate whether a
 * character was received with a parity error, etc. @fp may be %NULL to
 * indicate all data received is %TTY_NORMAL.
 *
 * Optional.
 *
 * @write_wakeup: [DRV] ``void ()(struct tty_struct *tty)``
 *
 * This function is called by the low-level tty driver to signal that line
 * discpline should try to send more characters to the low-level driver
 * for transmission. If the line discpline does not have any more data to
 * send, it can just return. If the line discipline does have some data to
 * send, please arise a tasklet or workqueue to do the real data transfer.
 * Do not send data in this hook, it may lead to a deadlock.
 *
 * Optional.
 *
 * @dcd_change: [DRV] ``void ()(struct tty_struct *tty, bool active)``
 *
 * Tells the discipline that the DCD pin has changed its status. Used
 * exclusively by the %N_PPS (Pulse-Per-Second) line discipline.
 *
 * Optional.
 *
 * @receive_buf2: [DRV] ``ssize_t ()(struct tty_struct *tty, const u8 *cp,
 * const u8 *fp, size_t count)``
 *
 * This function is called by the low-level tty driver to send characters
 * received by the hardware to the line discpline for processing. @cp is a
 * pointer to the buffer of input character received by the device.  @fp
 * is a pointer to an array of flag bytes which indicate whether a
 * character was received with a parity error, etc. @fp may be %NULL to
 * indicate all data received is %TTY_NORMAL. If assigned, prefer this
 * function for automatic flow control.
 *
 * Optional.
 *
 * @lookahead_buf: [DRV] ``void ()(struct tty_struct *tty, const u8 *cp,
 *  const u8 *fp, size_t count)``
 *
 * This function is called by the low-level tty driver for characters
 * not eaten by ->receive_buf() or ->receive_buf2(). It is useful for
 * processing high-priority characters such as software flow-control
 * characters that could otherwise get stuck into the intermediate
 * buffer until tty has room to receive them. Ldisc must be able to
 * handle later a ->receive_buf() or ->receive_buf2() call for the
 * same characters (e.g. by skipping the actions for high-priority
 * characters already handled by ->lookahead_buf()).
 *
 * Optional.
 *
 * @owner: module containting this ldisc (for reference counting)
 *
 * This structure defines the interface between the tty line discipline
 * implementation and the tty routines. The above routines can be defined.
 * Unless noted otherwise, they are optional, and can be filled in with a %NULL
 * pointer.
 *
 * Hooks marked [TTY] are invoked from the TTY core, the [DRV] ones from the
 * tty_driver side.
 */

struct tty_ldisc_ops {
 char *name;
 int num;

 /*
 * The following routines are called from above.
 */

 int (*open)(struct tty_struct *tty);
 void (*close)(struct tty_struct *tty);
 void (*flush_buffer)(struct tty_struct *tty);
 ssize_t (*read)(struct tty_struct *tty, struct file *file, u8 *buf,
   size_t nr, void **cookie, unsigned long offset);
 ssize_t (*write)(struct tty_struct *tty, struct file *file,
    const u8 *buf, size_t nr);
 int (*ioctl)(struct tty_struct *tty, unsigned int cmd,
   unsigned long arg);
 int (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd,
   unsigned long arg);
 void (*set_termios)(struct tty_struct *tty, const struct ktermios *old);
 __poll_t (*poll)(struct tty_struct *tty, struct file *file,
        struct poll_table_struct *wait);
 void (*hangup)(struct tty_struct *tty);

 /*
 * The following routines are called from below.
 */

 void (*receive_buf)(struct tty_struct *tty, const u8 *cp,
          const u8 *fp, size_t count);
 void (*write_wakeup)(struct tty_struct *tty);
 void (*dcd_change)(struct tty_struct *tty, bool active);
 size_t (*receive_buf2)(struct tty_struct *tty, const u8 *cp,
    const u8 *fp, size_t count);
 void (*lookahead_buf)(struct tty_struct *tty, const u8 *cp,
     const u8 *fp, size_t count);

 struct  module *owner;
};

struct tty_ldisc {
 struct tty_ldisc_ops *ops;
 struct tty_struct *tty;
};

#define MODULE_ALIAS_LDISC(ldisc) \
 MODULE_ALIAS("tty-ldisc-" __stringify(ldisc))

extern const struct seq_operations tty_ldiscs_seq_ops;

struct tty_ldisc *tty_ldisc_ref(struct tty_struct *);
void tty_ldisc_deref(struct tty_ldisc *);
struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *);

void tty_ldisc_flush(struct tty_struct *tty);

int tty_register_ldisc(struct tty_ldisc_ops *new_ldisc);
void tty_unregister_ldisc(struct tty_ldisc_ops *ldisc);
int tty_set_ldisc(struct tty_struct *tty, int disc);

#endif /* _LINUX_TTY_LDISC_H */

97%


¤ Dauer der Verarbeitung: 0.16 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

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 ist noch experimentell.