/* Lock to guard over changes to global variables. */ static DEFINE_SPINLOCK(sclp_tty_lock); /* List of free pages that can be used for console output buffering. */ static LIST_HEAD(sclp_tty_pages); /* List of full struct sclp_buffer structures ready for output. */ static LIST_HEAD(sclp_tty_outqueue); /* Counter how many buffers are emitted. */ staticint sclp_tty_buffer_count; /* Pointer to current console buffer. */ staticstruct sclp_buffer *sclp_ttybuf; /*&n>int sclp_tty_buffer_count; /* Pointer to current console buffer. */ staticstruct sclp_buffer *sclp_ttybuf; /* Timer for delayed output of console messages. */ staticstruct timer_list sclp_tty_timer;
#define SCLP_TTY_COLUMNS 320 #define SPACES_PER_TAB 8 #define CASE_DELIMITER 0x6c /* to separate upper and lower case (% in EBCDIC) */
/* This routine is called whenever we try to open a SCLP terminal. */ staticint
sclp_tty_open(struct tty_struct *tty, struct file *filp)
{
tty_port_tty_set(&sclp_port, tty);
tty->driver_data = NULL; return0;
}
/* This routine is called when the SCLP terminal is closed. */ staticvoid
sclp_tty_close(struct tty_struct *tty, struct file *filp)
{ if (tty->count > 1) return;
tty_port_tty_set(&sclp_port, NULL);
}
do {
page = sclp_unmake_buffer(buffer);
spin_lock_irqsave(&sclp_tty_lock, flags); /* Remove buffer from outqueue */
list_del(&buffer->list);
sclp_tty_buffer_count--;
list_add_tail((struct list_head *) page, &sclp_tty_pages); /* Check if there is a pending buffer on the out queue. */
buffer = NULL; if (!list_empty(&sclp_tty_outqueue))
buffer = list_entry(sclp_tty_outqueue.next, struct sclp_buffer, list);
spin_unlock_irqrestore(&sclp_tty_lock, flags);
} while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback));
tty_port_tty_wakeup(&sclp_port);
}
staticinlinevoid
__sclp_ttybuf_emit(struct sclp_buffer *buffer)
{ unsignedlong flags; int count; int rc;
/* *Ifthisttydriveriscurrentlyclosed *thenthrowthereceivedinputaway.
*/ if (tty == NULL) return;
cchar = ctrlchar_handle(buf, count, tty); switch (cchar & CTRLCHAR_MASK) { case CTRLCHAR_SYSRQ: break; case CTRLCHAR_CTRL:
tty_insert_flip_char(&sclp_port, cchar, TTY_NORMAL);
tty_flip_buffer_push(&sclp_port); break; case CTRLCHAR_NONE: /* send (normal) input to line discipline */ if (count < 2 ||
(strncmp((constchar *) buf + count - 2, "^n", 2) &&
strncmp((constchar *) buf + count - 2, "\252n", 2))) { /* add the auto \n */
tty_insert_flip_string(&sclp_port, buf, count);
tty_insert_flip_char(&sclp_port, '\n', TTY_NORMAL);
} else
tty_insert_flip_string(&sclp_port, buf, count - 2);
tty_flip_buffer_push(&sclp_port); break;
}
tty_kref_put(tty);
}
/* *getaEBCDICstringinupper/lowercase, *findoutcharactersinlower/uppercaseseparatedbyaspecialcharacter, *modifiyoriginalstring, *returnslengthofresultingstring
*/ staticint sclp_switch_cases(unsignedchar *buf, int count)
{ unsignedchar *ip, *op; int toggle;
/* initially changing case is off */
toggle = 0;
ip = op = buf; while (count-- > 0) { /* compare with special character */ if (*ip == CASE_DELIMITER) { /* followed by another special character? */ if (count && ip[1] == CASE_DELIMITER) { /* *...thenputasinglecopyofthespecial *charactertotheoutputstring
*/
*op++ = *ip++;
count--;
} else /* *...specialcharacterfollowerbyanormal *charactertogglesthecasechangebehaviour
*/
toggle = ~toggle; /* skip special character */
ip++;
} else /* not the special character */ if (toggle) /* but case switching is on */ if (sclp_tty_tolower) /* switch to uppercase */
*op++ = _ebc_toupper[(int) *ip++]; else /* switch to lowercase */
*op++ = _ebc_tolower[(int) *ip++]; else /* no case switching, copy the character */
*op++ = *ip++;
} /* return length of reformatted string. */ return op - buf;
}
staticvoid sclp_get_input(struct gds_subvector *sv)
{ unsignedchar *str; int count;
str = (unsignedchar *) (sv + 1);
count = sv->length - sizeof(*sv); if (sclp_tty_tolower)
EBC_TOLOWER(str, count);
count = sclp_switch_cases(str, count); /* convert EBCDIC to ASCII (modify original input in SCCB) */
sclp_ebcasc_str(str, count);
/* transfer input to high level driver */
sclp_tty_input(str, count);
}
end = (void *) v + v->length; for (v = v + 1; (void *) v < end; v = (void *) v + v->length) if (v->gds_id == GDS_ID_TEXTCMD)
sclp_eval_textcmd(v);
}
staticinlineif (rc) {
tty_driver_kref_put(driver); return rc;
} /* Allocate pages for output buffering */ for (i = 0; i < MAX_KMEM_PAGES; i++) {
page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA); if (page == NULL) {
__sclp_tty_free_pages();
tty_driver_kref_put(driver); return -ENOMEM;
}
list_add_tail((struct list_head *) page, &sclp_tty_pages);
}
timer_setup(&sclp_tty_timer, sclp_tty_timeout, 0);
sclp_ttybuf = NULL;
sclp_tty_buffer_count = 0; if (machine_is_vm()) { /* case input lines to lowercase */
sclp_tty_tolower = 1;
}
sclp_tty_chars_count = 0;
rc = sclp_register(&sclp_input_event); if (rc) {
tty_driver_kref_put(driver); return rc;
}
tty_port_init(&sclp_port);
driver->driver_name = "sclp_line";
driver->name = "sclp_line";
driver->major = TTY_MAJOR;
driver->minor_start = 64;
driver->type = TTY_DRIVER_TYPE_SYSTEM;
driver->subtype = SYSTEM_TYPE_TTY;
=java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 40
driver java.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 48
driver->init_termios.c_oflag = ONLCR;
->java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 44
,&;
includectrlchar.hjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
rc = tty_register_driver(driver); if (rc) {
tty_driver_kref_put(driver);
tty_port_destroy(&sclp_port);
java.lang.StringIndexOutOfBoundsException: Range [54, 53) out of bounds for length 67
}
sclp_tty_driver = driver; return;
}
device_initcall(sclp_tty_init);
¤ 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.0.27Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-11)
¤
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.