tubttyaid.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  IBM/3270 Driver -- Copyright (C) 2000 UTS Global LLC
  3.  *
  4.  *  tubttyaid.c -- Linemode Attention-ID functionality
  5.  *
  6.  *
  7.  *
  8.  *
  9.  *
  10.  *  Author:  Richard Hitt
  11.  */
  12. #include "tubio.h"
  13. #define PA1_STR "^C"
  14. #define PF3_STR "^D"
  15. #define PF9_STR "33j"
  16. #define PF10_STR "33k"
  17. #define PF11_STR "33j"
  18. /* other AID-key default strings */
  19. aid_t aidtab[64] = {
  20. /* 00         */ { 0, 0 },
  21. /* C1 = PF13  */ { TA_DOSTRING, 0 },
  22. /* C2 = PF14  */ { TA_DOSTRING, 0 },
  23. /* C3 = PF15  */ { TA_DOSTRING, 0 },
  24. /* C4 = PF16  */ { TA_DOSTRING, 0 },
  25. /* C5 = PF17  */ { TA_DOSTRING, 0 },
  26. /* C6 = PF18  */ { TA_DOSTRING, 0 },
  27. /* C7 = PF19  */ { TA_DOSTRING, 0 },
  28. /* C8 = PF20  */ { TA_DOSTRING, 0 },
  29. /* C9 = PF21  */ { TA_DOSTRING, 0 },
  30. /* 4A = PF22  */ { TA_DOSTRING, 0 },
  31. /* 4B = PF23  */ { TA_DOSTRING, 0 },
  32. /* 4C = PF24  */ { TA_DOSTRING, 0 },
  33. /* 0D         */ { 0, 0 },
  34. /* 0E         */ { 0, 0 },
  35. /* 0F         */ { 0, 0 },
  36. /* 10         */ { 0, 0 },
  37. /* 11         */ { 0, 0 },
  38. /* 12         */ { 0, 0 },
  39. /* 13         */ { 0, 0 },
  40. /* 14         */ { 0, 0 },
  41. /* 15         */ { 0, 0 },
  42. /* 16         */ { 0, 0 },
  43. /* 17         */ { 0, 0 },
  44. /* 18         */ { 0, 0 },
  45. /* 19         */ { 0, 0 },
  46. /* 1A         */ { 0, 0 },
  47. /* 1B         */ { 0, 0 },
  48. /* 1C         */ { 0, 0 },
  49. /* 1D         */ { 0, 0 },
  50. /* 1E         */ { 0, 0 },
  51. /* 1F         */ { 0, 0 },
  52. /* 60 = NoAID */ { 0, 0 },
  53. /* 21         */ { 0, 0 },
  54. /* 22         */ { 0, 0 },
  55. /* 23         */ { 0, 0 },
  56. /* 24         */ { 0, 0 },
  57. /* 25         */ { 0, 0 },
  58. /* E6 = OpRdr */ { 0, 0 },
  59. /* E7 = MSRdr */ { 0, 0 },
  60. /* E8 = NoAID */ { 0, 0 },
  61. /* 29         */ { 0, 0 },
  62. /* 2A         */ { 0, 0 },
  63. /* 6B =  PA3  */        { TA_SHORTREAD, 0 },
  64. /* 6C =  PA1  */        { TA_SHORTREAD | TA_DOSTRING, PA1_STR },
  65. /* 6D = CLEAR */        { TA_SHORTREAD | TA_CLEARKEY, 0 },
  66. /* 6E =  PA2  */        { TA_SHORTREAD | TA_CLEARLOG, 0 },
  67. /* 2F         */ { 0, 0 },
  68. /* F0 = TstRq */        { 0, 0 },
  69. /* F1 =  PF1  */ { TA_DOSTRING, 0 },
  70. /* F2 =  PF2  */ { TA_DOSTRING, 0 },
  71. /* F3 =  PF3  */        { TA_DOSTRING, PF3_STR },
  72. /* F4 =  PF4  */ { TA_DOSTRING, 0 },
  73. /* F5 =  PF5  */ { TA_DOSTRING, 0 },
  74. /* F6 =  PF6  */ { TA_DOSTRING, 0 },
  75. /* F7 =  PF7  */ { TA_DOSTRING, 0 },
  76. /* F8 =  PF8  */ { TA_DOSTRING, 0 },
  77. /* F9 =  PF9  */        { TA_DOSTRING, PF9_STR },
  78. /* 7A = PF10  */        { TA_DOSTRING, PF10_STR },
  79. /* 7B = PF11  */        { TA_DOSTRING, PF11_STR },
  80. /* 7C = PF12  */ { TA_DOSTRING, 0 },
  81. /* 7D = ENTER */        { TA_DOENTER, 0 },
  82. /* 7E = Pen   */        { 0, 0 },
  83. /* 3F         */ { 0, 0 },
  84. };
  85. int
  86. tty3270_aid_init(tub_t *tubp)
  87. {
  88. memcpy(tubp->tty_aid, aidtab, sizeof aidtab);
  89. tubp->tty_aidinit = 1;
  90. return 0;
  91. }
  92. void
  93. tty3270_aid_fini(tub_t *tubp)
  94. {
  95. int i;
  96. char *sp;
  97. if (tubp->tty_aidinit == 0)
  98. return;
  99. for (i = 0; i < 64; i++) {
  100. if ((sp = tubp->tty_aid[i].string) == NULL)
  101. continue;
  102. if (sp == aidtab[i].string)
  103. continue;
  104. kfree(sp);
  105. }
  106. tubp->tty_aidinit = 0;
  107. }
  108. void
  109. tty3270_aid_reinit(tub_t *tubp)
  110. {
  111. tty3270_aid_fini(tubp);
  112. tty3270_aid_init(tubp);
  113. }
  114. int
  115. tty3270_aid_get(tub_t *tubp, int aid, int *aidflags, char **aidstring)
  116. {
  117. aid_t *ap;
  118. ap = AIDENTRY(aid, tubp);
  119. *aidflags = ap->aid;
  120. *aidstring = ap->string;
  121. return 0;
  122. }
  123. /*
  124.  * tty3270_aid_set() -- write_proc extension
  125.  * Parse written string as an AID name.  Return 0 if it's not.
  126.  * Otherwise absorb the string and return count or -error.
  127.  */
  128. int
  129. tty3270_aid_set(tub_t *tubp, char *buf, int count)
  130. {
  131. char name[8];
  132. char *sp;
  133. int aidn, aidx;
  134. aid_t *ap;
  135. int len;
  136. char *pfp;
  137. if (tubp->tty_aidinit == 0)
  138. return 0;
  139. if (count < 3)          /* If AID-key name too short */
  140. return 0;
  141. name[0] = buf[0] < 0x60? buf[0]: (buf[0] & 0x5f);
  142. name[1] = buf[1] < 0x60? buf[1]: (buf[1] & 0x5f);
  143. if (name[0] == 'P' && name[1] == 'F') {
  144. aidn = simple_strtoul(buf+2, &sp, 10);
  145. if (aidn < 1 || aidn > 24)
  146. return 0;
  147. aidx = aidn > 12? aidn - 12: aidn + 0x30;
  148. ap = &tubp->tty_aid[aidx];
  149. } else if (name[0] == 'P' && name[1] == 'A') {
  150. aidn = simple_strtoul(buf+2, &sp, 10);
  151. if (aidn < 1 || aidn > 3)
  152. return 0;
  153. switch(aidn) {
  154. case 1:  aidx = 0x2c; break;
  155. case 2:  aidx = 0x2e; break;
  156. case 3:  aidx = 0x2b; break;
  157. default:  aidx = 0; break;
  158. }
  159. ap = &tubp->tty_aid[aidx];
  160. } else {
  161. return 0;
  162. }
  163. if (*sp == '') {
  164. tubp->tty_showaidx = ap - tubp->tty_aid;
  165. return count;
  166. } else if (*sp == '=') {
  167. len = strlen(++sp);
  168. if (len == 0) {
  169. if (ap->string != NULL &&
  170.     ap->string != aidtab[aidx].string)
  171. kfree(ap->string);
  172. ap->string = aidtab[aidx].string;
  173. ap->aid = aidtab[aidx].aid;
  174. return count;
  175. }
  176. if ((pfp = kmalloc(len + 1, GFP_KERNEL)) == NULL)
  177. return -ENOMEM;
  178. if (ap->string != NULL &&
  179.     ap->string != aidtab[aidx].string)
  180. kfree(ap->string);
  181. if (sp[len - 1] == 'n') {
  182. ap->aid = TA_DOSTRING;
  183. sp[len - 1] = '';
  184. len--;
  185. } else {
  186. ap->aid = TA_DOSTRINGD;
  187. }
  188. memcpy(pfp, sp, len + 1);
  189. ap->string = pfp;
  190. return count;
  191. } else {
  192. return -EINVAL;
  193. }
  194. }