patch-2.4.4 linux/drivers/s390/char/tubttyaid.c
Next file: linux/drivers/s390/char/tubttybld.c
Previous file: linux/drivers/s390/char/tubtty.c
Back to the patch index
Back to the overall index
- Lines: 206
- Date:
Wed Apr 11 19:02:28 2001
- Orig file:
v2.4.3/linux/drivers/s390/char/tubttyaid.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.3/linux/drivers/s390/char/tubttyaid.c linux/drivers/s390/char/tubttyaid.c
@@ -0,0 +1,205 @@
+/*
+ * IBM/3270 Driver -- Copyright (C) 2000 UTS Global LLC
+ *
+ * tubttyaid.c -- Linemode Attention-ID functionality
+ *
+ *
+ *
+ *
+ *
+ * Author: Richard Hitt
+ */
+#include "tubio.h"
+
+#define PA1_STR "^C"
+#define PF3_STR "^D"
+#define PF9_STR "\033j"
+#define PF10_STR "\033k"
+#define PF11_STR "\033j"
+/* other AID-key default strings */
+
+aid_t aidtab[64] = {
+/* 00 */ { 0, 0 },
+/* C1 = PF13 */ { TA_DOSTRING, 0 },
+/* C2 = PF14 */ { TA_DOSTRING, 0 },
+/* C3 = PF15 */ { TA_DOSTRING, 0 },
+/* C4 = PF16 */ { TA_DOSTRING, 0 },
+/* C5 = PF17 */ { TA_DOSTRING, 0 },
+/* C6 = PF18 */ { TA_DOSTRING, 0 },
+/* C7 = PF19 */ { TA_DOSTRING, 0 },
+/* C8 = PF20 */ { TA_DOSTRING, 0 },
+/* C9 = PF21 */ { TA_DOSTRING, 0 },
+/* 4A = PF22 */ { TA_DOSTRING, 0 },
+/* 4B = PF23 */ { TA_DOSTRING, 0 },
+/* 4C = PF24 */ { TA_DOSTRING, 0 },
+/* 0D */ { 0, 0 },
+/* 0E */ { 0, 0 },
+/* 0F */ { 0, 0 },
+/* 10 */ { 0, 0 },
+/* 11 */ { 0, 0 },
+/* 12 */ { 0, 0 },
+/* 13 */ { 0, 0 },
+/* 14 */ { 0, 0 },
+/* 15 */ { 0, 0 },
+/* 16 */ { 0, 0 },
+/* 17 */ { 0, 0 },
+/* 18 */ { 0, 0 },
+/* 19 */ { 0, 0 },
+/* 1A */ { 0, 0 },
+/* 1B */ { 0, 0 },
+/* 1C */ { 0, 0 },
+/* 1D */ { 0, 0 },
+/* 1E */ { 0, 0 },
+/* 1F */ { 0, 0 },
+/* 60 = NoAID */ { 0, 0 },
+/* 21 */ { 0, 0 },
+/* 22 */ { 0, 0 },
+/* 23 */ { 0, 0 },
+/* 24 */ { 0, 0 },
+/* 25 */ { 0, 0 },
+/* E6 = OpRdr */ { 0, 0 },
+/* E7 = MSRdr */ { 0, 0 },
+/* E8 = NoAID */ { 0, 0 },
+/* 29 */ { 0, 0 },
+/* 2A */ { 0, 0 },
+/* 6B = PA3 */ { TA_SHORTREAD, 0 },
+/* 6C = PA1 */ { TA_SHORTREAD | TA_DOSTRING, PA1_STR },
+/* 6D = CLEAR */ { TA_SHORTREAD | TA_CLEARKEY, 0 },
+/* 6E = PA2 */ { TA_SHORTREAD | TA_CLEARLOG, 0 },
+/* 2F */ { 0, 0 },
+/* F0 = TstRq */ { 0, 0 },
+/* F1 = PF1 */ { TA_DOSTRING, 0 },
+/* F2 = PF2 */ { TA_DOSTRING, 0 },
+/* F3 = PF3 */ { TA_DOSTRING, PF3_STR },
+/* F4 = PF4 */ { TA_DOSTRING, 0 },
+/* F5 = PF5 */ { TA_DOSTRING, 0 },
+/* F6 = PF6 */ { TA_DOSTRING, 0 },
+/* F7 = PF7 */ { TA_DOSTRING, 0 },
+/* F8 = PF8 */ { TA_DOSTRING, 0 },
+/* F9 = PF9 */ { TA_DOSTRING, PF9_STR },
+/* 7A = PF10 */ { TA_DOSTRING, PF10_STR },
+/* 7B = PF11 */ { TA_DOSTRING, PF11_STR },
+/* 7C = PF12 */ { TA_DOSTRING, 0 },
+/* 7D = ENTER */ { TA_DOENTER, 0 },
+/* 7E = Pen */ { 0, 0 },
+/* 3F */ { 0, 0 },
+};
+
+int
+tty3270_aid_init(tub_t *tubp)
+{
+ memcpy(tubp->tty_aid, aidtab, sizeof aidtab);
+ tubp->tty_aidinit = 1;
+ return 0;
+}
+
+void
+tty3270_aid_fini(tub_t *tubp)
+{
+ int i;
+ char *sp;
+
+ if (tubp->tty_aidinit == 0)
+ return;
+ for (i = 0; i < 64; i++) {
+ if ((sp = tubp->tty_aid[i].string) == NULL)
+ continue;
+ if (sp == aidtab[i].string)
+ continue;
+ kfree(sp);
+ }
+ tubp->tty_aidinit = 0;
+}
+
+void
+tty3270_aid_reinit(tub_t *tubp)
+{
+ tty3270_aid_fini(tubp);
+ tty3270_aid_init(tubp);
+}
+
+int
+tty3270_aid_get(tub_t *tubp, int aid, int *aidflags, char **aidstring)
+{
+ aid_t *ap;
+
+ ap = AIDENTRY(aid, tubp);
+ *aidflags = ap->aid;
+ *aidstring = ap->string;
+ return 0;
+}
+
+/*
+ * tty3270_aid_set() -- write_proc extension
+ * Parse written string as an AID name. Return 0 if it's not.
+ * Otherwise absorb the string and return count or -error.
+ */
+int
+tty3270_aid_set(tub_t *tubp, char *buf, int count)
+{
+ char name[8];
+ char *sp;
+ int aidn, aidx;
+ aid_t *ap;
+ int len;
+ char *pfp;
+
+ if (tubp->tty_aidinit == 0)
+ return 0;
+ if (count < 3) /* If AID-key name too short */
+ return 0;
+ name[0] = buf[0] < 0x60? buf[0]: (buf[0] & 0x5f);
+ name[1] = buf[1] < 0x60? buf[1]: (buf[1] & 0x5f);
+ if (name[0] == 'P' && name[1] == 'F') {
+ aidn = simple_strtoul(buf+2, &sp, 10);
+ if (aidn < 1 || aidn > 24)
+ return 0;
+ aidx = aidn > 12? aidn - 12: aidn + 0x30;
+ ap = &tubp->tty_aid[aidx];
+ } else if (name[0] == 'P' && name[1] == 'A') {
+ aidn = simple_strtoul(buf+2, &sp, 10);
+ if (aidn < 1 || aidn > 3)
+ return 0;
+ switch(aidn) {
+ case 1: aidx = 0x2c; break;
+ case 2: aidx = 0x2e; break;
+ case 3: aidx = 0x2b; break;
+ default: aidx = 0; break;
+ }
+ ap = &tubp->tty_aid[aidx];
+ } else {
+ return 0;
+ }
+
+ if (*sp == '\0') {
+ tubp->tty_showaidx = ap - tubp->tty_aid;
+ return count;
+ } else if (*sp == '=') {
+ len = strlen(++sp);
+ if (len == 0) {
+ if (ap->string != NULL &&
+ ap->string != aidtab[aidx].string)
+ kfree(ap->string);
+ ap->string = aidtab[aidx].string;
+ ap->aid = aidtab[aidx].aid;
+ return count;
+ }
+ if ((pfp = kmalloc(len + 1, GFP_KERNEL)) == NULL)
+ return -ENOMEM;
+ if (ap->string != NULL &&
+ ap->string != aidtab[aidx].string)
+ kfree(ap->string);
+ if (sp[len - 1] == '\n') {
+ ap->aid = TA_DOSTRING;
+ sp[len - 1] = '\0';
+ len--;
+ } else {
+ ap->aid = TA_DOSTRINGD;
+ }
+ memcpy(pfp, sp, len + 1);
+ ap->string = pfp;
+ return count;
+ } else {
+ return -EINVAL;
+ }
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)