home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / misc / portpm.txt < prev    next >
Text File  |  2020-01-01  |  235KB  |  6,019 lines

  1. .op
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9. KK    KK    EEEEEEEE  RRRRRRRR   MM     MM  IIII  TTTTTTTTTT
  10. KK   KK     EE        RR     RR  MMM   MMM   II       TT
  11. KK  KK      EE        RR     RR  MMMM MMMM   II       TT
  12. KK KKKK     EEEEEE    RRRRRRRR   MM MMM MM   II       TT
  13. KKKK  KK    EE        RR   RR    MM  M  MM   II       TT
  14. KK     KK   EE        RR    RR   MM     MM   II       TT
  15. KK      KK  EEEEEEEE  RR     RR  MM     MM  IIII      TT
  16.  
  17. ____________________________________________________________
  18. ____________________________________________________________
  19.  
  20. MM     MM   AAAAAA   NN     NN  UU     UU   AAAAAA   LL
  21. MMM    MM  AA    AA  NNN    NN  UU     UU  AA    AA  LL
  22. MMMM MMMM  AA    AA  NNNN   NN  UU     UU  AA    AA  LL
  23. MM MMM MM  AA    AA  NN NN  NN  UU     UU  AA    AA  LL
  24. MM  M  MM  AAAAAAAA  NN  NN NN  UU     UU  AAAAAAAA  LL
  25. MM     MM  AA    AA  NN   NNNN  UU     UU  AA    AA  LL
  26. MM     MM  AA    AA  NN     NN   UUUUUUU   AA    AA  LLLLLLL
  27.  
  28.  
  29.                  DDDDDDDDD    OOOOOO
  30.                    DD    DD  OO    OO
  31.                    DD    DD  OO    OO
  32.                    DD    DD  OO    OO
  33.                    DD    DD  OO    OO
  34.                    DD    DD  OO    OO
  35.                  DDDDDDDDD    OOOOOO 
  36.  
  37.  
  38. PPPPP  RRRRR   OOOO  TTTTTT  OOOO   CCCC  OOOO  LL     OOOO 
  39. PP  PP RR  RR OO  OO   TT   OO  OO CC    OO  OO LL    OO  OO
  40. PP  PP RR  RR OO  OO   TT   OO  OO CC    OO  OO LL    OO  OO
  41. PPPPP  RRRRR  OO  OO   TT   OO  OO CC    OO  OO LL    OO  OO
  42. PP     RR R   OO  OO   TT   OO  OO CC    OO  OO LL    OO  OO
  43. PP     RR RR  OO  OO   TT   OO  OO CC    OO  OO LL    OO  OO
  44. PP     RR  RR  OOOO    TT    OOOO   CCCC  OOOO  LLLLL  OOOO 
  45.  
  46.  
  47. ____________________________________________________________
  48. ____________________________________________________________
  49.  
  50. TELEBRAS   *    Quinta Edic,a~o  *  Brasi'lia, setembro de 1986 
  51. .pa
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.                  MANUAL DO PROTOCOLO KERMIT
  71.  
  72.                        Quinta Edic,a~o
  73.  
  74.                        Frank da Cruz
  75.     Columbia University Center for Computing Activities
  76.                     New York, NY, 10027
  77.  
  78.             Copyright (C) 1981, 1982, 1983, 1984
  79.   Trustees of Columbia University in the City of New York
  80.  
  81.             Traduc,a~o de J. Ricardo B. Ghirlanda
  82.        Telecomunicac,o~es Brasileiras S. A. - TELEBRAS
  83.                     Brasi'lia - DF, 1986
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.      E' permitida e, mesmo, incentivada, a co'pia e divulgac,a~o 
  105. de  qualquer  parte  deste manual,  desde que para  fins  na~o 
  106. comerciais.
  107. .foKERMIT: Manual do Protocolo                                 i
  108.                        I' N  D  I  C  E
  109.                        ----------------
  110.  
  111.  
  112.  
  113.     Prefa'cio da Quarta Edic,a~o...........................   1
  114.     Quinta Edic,a~o.......................................   2
  115.     Mais algumas palavras...............................   2
  116.     Agradecimentos......................................   2
  117.     Aviso...............................................   3
  118.  
  119. .cp4
  120.  1. Introduc,a~o..........................................   4
  121. .cp3
  122.     1.1. Cena'rio........................................   4
  123. .cp3
  124.     1.2. Visa~o Geral....................................   4
  125.  
  126. .cp4
  127.  2. Definic,o~es..........................................   6
  128. .cp3
  129.     2.1. Terminologia Geral.............................   6
  130. .cp3
  131.     2.2. Nu'meros........................................   7
  132. .cp3
  133.     2.3. Conjunto de Caracteres.........................   7
  134. .cp3
  135.     2.4. Func,o~es de Conversa~o...........................   8
  136. .cp3
  137.     2.5. Jarga~o do Protocolo............................   8
  138.  
  139. .cp4
  140.  3. Requisitos de sistema...............................  10
  141.  
  142. .cp4
  143.  4. Texto Impri'mivel VERSUS Dados Bina'rios..............  12
  144. .cp3
  145.     4.1. Arquivos de Texto Imprimi'vel...................  12
  146. .cp3
  147.     4.2. Arquivos Bina'rios..............................  13
  148.  
  149. .cp4
  150.  5. Transfere^ncia de Arquivos...........................  14
  151. .cp3
  152.     5.1. Condicionando o Terminal.......................  15
  153. .cp3
  154.     5.2. Timeouts, NAKs e Retries.......................  15
  155. .cp3
  156.     5.3. Erros..........................................  16
  157. .cp3
  158.     5.4. Heuri'stica.....................................  17
  159. .cp3
  160.     5.5. Nomes de Arquivos..............................  18
  161. .cp3
  162.     5.6. Robustez.......................................  19
  163. .cp3
  164.     5.7. Controle de Fluxo..............................  19
  165. .cp3
  166.     5.8. Tabela de Estados do Protocolo KERMIT Ba'sico...  20
  167.  
  168. .cp4
  169.  6. Formato dos Pacotes.................................  23
  170. .cp3
  171.     6.1. Campos.........................................  23
  172. .cp3
  173.     6.2. Terminador.....................................  24
  174. .cp3
  175.     6.3. Outros dados inter-pacotes.....................  25
  176. .cp3
  177.     6.4. Codificac,a~o, Prefixac,a~o, Checagem de Bloco.....  25
  178.  
  179. .cp4
  180.  7. Conexa~o Inicial.....................................  27
  181.  
  182. .cp4
  183.  8. Facilidades Opcionais...............................  32
  184. .cp3
  185.     8.1. Prefixac,a~o de oitavo bit e
  186.          contador de repetic,o~es.........................  32
  187. .cp3
  188.     8.2. Operac,a~o de SERVER (Servidor)..................  34
  189.          8.2.1. Comandos SERVER.........................  35
  190.          8.2.2. Temporizac,a~o............................  37
  191.          8.2.3. O Comando "R"...........................  37
  192.          8.2.4. Respostas Curtas e Respostas Longas.....  38
  193.          8.2.5. Comandos SERVER Adicionais..............  38
  194. .foKERMIT: Manual do Protocolo                                ii
  195.          8.2.6. Comandos de Host........................  41
  196.          8.2.7. Trocando para^metros antes
  197.                 de comandos SERVER......................  41
  198. .cp3
  199.     8.3. Tipos alternativos de checagem de bloco........  42
  200. .cp3
  201.     8.4. Interrompendo uma transfere^ncia de arquivo.....  44
  202. .cp3
  203.     8.5. Transmitindo atributos de arquivos.............  45
  204. .cp3
  205.     8.6. Tabela de estados do Protocolo KERMIT Avanc,ado.  52
  206.  
  207. .cp4
  208.  9. Comandos KERMIT.....................................  58
  209. .cp3
  210.     9.1. Comandos Ba'sicos...............................  58
  211. .cp3
  212.     9.2. Comandos de gere^ncia do programa...............  58
  213. .cp3
  214.     9.3. Comandos de emulac,a~o de terminal...............  59
  215. .cp3
  216.     9.4. Comandos em modo-usua'rio especiais.............  59
  217. .cp3
  218.     9.5. Comandos cujo objeto deve ser especificado.....  60
  219. .cp3
  220.     9.6. O comando SET..................................  62
  221. .cp3
  222.     9.7. Macros (o comando DEFINE)......................  64
  223.  
  224. .cp4
  225. 10. Emulac,a~o de terminal................................  65
  226.  
  227. .cp4
  228. 11. Escrevendo um programa KERMIT.......................  68
  229. .cp3
  230.     11.1. Organizac,a~o do programa.......................  68
  231. .cp3
  232.     11.2. Linguagem de programac,a~o......................  71
  233. .cp3
  234.     11.3. Documentac,a~o..................................  71
  235. .cp3
  236.     11.4. Bootstrapping.................................  72
  237.  
  238.  
  239. .cp6
  240. A P E N D I C E S
  241. -----------------
  242.  
  243. .cp4
  244.  A. Formato e Tipos dos Pacotes.........................  73
  245.  
  246. .cp4
  247.  B. Relac,a~o das Facilidades.............................  74
  248.  
  249. .cp4
  250.  C. Problemas na~o resolvidos............................  76
  251.  
  252. .cp4
  253.  D. Um programa KERMIT..................................  79
  254.  
  255. .cp4
  256.  E. O conjunto de caracteres ASCII (ANSI X3.4-1968)..... 104
  257. .pa
  258. .foKERMIT: Manual do Protocolo                               iii
  259.               I'N D I C E    DE    F I G U R A S
  260.               ----------------------------------
  261.  
  262.  
  263.  
  264. .cp3
  265.  2-1: Caracteres Mneumo^nicos ASCII:..........................   7
  266.  
  267. .cp3
  268.  5-1: Estados de Transmissa~o.................................  21
  269.  5-2: Estados de Recepc,a~o....................................  22
  270.  5-3: Estados Comuns a Transmitir e Receber..................  22
  271. .pa
  272. .foKERMIT: Manual do Protocolo                                 #
  273. .pn1
  274.                            Prefa'cio da Quarta Edic,a~o
  275.  
  276.       A  quarta  edic,a~o  (novembro  de  1983)  do  Manual  do 
  277. Protocolo Kermit incorpora algumas novas ide'ias que cresceram 
  278. de  nossa  experie^ncia  em  tentar  implementar  algumas  das 
  279. facilidades descritas em edic,o~es anteriores,  particularmente 
  280. func,o~es  USER/SERVER.  Isto  inclui um mecanismo que  permite 
  281. interromper transfere^ncias em batch sem traumas, tanto para o 
  282. arquivo  corrente  quanto  para  o  conjunto  total  de   uma 
  283. transfere^ncia  em  batch;  uma "ma'scara de  capacidade";  uma 
  284. extensa~o  do  protocolo  para  a  passagem  de  atributos  de 
  285. arquivo.  Ale'm disso,  nu'meros sa~o escritos em forma decimal, 
  286. ao  inve's  de octal,  que costumava confundir a  maioria  dos 
  287. leitores.     Tambe'm    foram    feitas     mudanc,as,     por 
  288. incompatibilidades,  em a'reas de menos releva^ncia, onde ainda 
  289. na~o houvesse acontecido alguma implementac,a~o; isso inclui:
  290.  
  291. - o  formato e a interpretac,a~o dos operandos dos comandos  de 
  292.   um SERVER;
  293.  
  294. - uso  dos  campos  reservados 10-11 do  pacote  SEND-INIT  e       
  295.   adic,a~o   de novos campos reservados.
  296.  
  297.       A  maior  parte  do material restante foi  reescrito  e 
  298. reorganizado  e muito material novo  acrescentado,  inclusive 
  299. uma  sec,a~o  recomendando um vocabula'rio para  documentac,a~o  e 
  300. comandos.
  301.  
  302.       As  edic,o~es  pre'vias deste manual  tentaram  definir  a 
  303. "Versa~o  3" do protocolo;  esta edic,a~o abandona tal conceito. 
  304. Uma  vez  que  o  desenvolvimento do  KERMIT  e'  uma  tarefa 
  305. desorganizada,  desordenada e distribui'da,  na~o  ha' forma  de 
  306. impor   que   implementadores   de  KERMIT   incluam   certas 
  307. capacidades  em suas verso~es.  Porisso nesta edic,a~o  tentamos 
  308. definir o funcionamento ba'sico do KERMIT e,  enta~o, descrever 
  309. va'rias func,o~es opcionais.
  310.  
  311.       O  princi'pio  chave  e' que  qualquer  implementac,a~o  de 
  312. KERMIT     deveria    funcionar    com    qualquer     outra, 
  313. independentemente  qua~o  avanc,ada  seja  uma  delas  ou  qua~o 
  314. primitiva  seja  a outra.  A ma'scara de capacidade  e  outros 
  315. campos SEND-INIT tentam promover tal princi'pio.
  316. .pa
  317.                             Quinta Edic,a~o
  318.  
  319.        A  Quinta  Edic,a~o  (marc,o de  1984)  tenta  esclarecer 
  320. alguns   pontos  que  ficaram  ambi'guos  na  Quarta   Edic,a~o, 
  321. particularmente   a  respeito  de  quando  e  como   e'  feito 
  322. codificac,a~o de prefixo (e quando na~o  e') e acerca de mudanc,as 
  323. de  tipos  de checagem de blocos.  Para  o  armazenamento  de 
  324. arquivos   e' sugerido um mecanismo na Sec,a~o de Atributos onde 
  325. diversos  deles foram rearranjados e acrescentados (isto  na~o 
  326. deve  fazer  mal  algum,   ja' que ningue'm   ate'  hoje  tentou 
  327. implementar Pacote de Atributo).  E' fornecida uma tabela  de 
  328. estado do protocolo mais completa,  incluindo algumas adic,o~es 
  329. na colec,a~o de tipos de pacotes.
  330.  
  331.                        Mais algumas palavras...
  332.  
  333.       Antes  de  se decidir por escrever uma nova  versa~o  de 
  334. KERMIT,  por favor,  tenha em mente que,  por filosofia,  ele 
  335. nunca  foi  nem jamais deve vir a ser um  produto  comercial, 
  336. vendido  por  lucro.  Sua  meta   e'  promover  comunicac,a~o  e 
  337. compartilhamento   e  o  KERMIT  deve,   ele   pro'prio,   ser 
  338. compartilhado,  na~o  vendido.  Mi'dia  e custos de  reproduc,a~o 
  339. podem ser recuperados se desejado mas o lucro na~o deve ser  o 
  340. motivo. Vendedores de softwares comerciais, no entanto, podem 
  341. pedir permissa~o para incluir o KERMIT com (ou dentro de) seus 
  342. programas,   desde   que  certas  condic,o~es  sejam   aceitas, 
  343. inclusive  que os cre'ditos pelo protocolo devem ser dados   a` 
  344. CUCCA  e o prec,o do produto na~o crescer substancialmente alem 
  345. de  custos  de mi'dia e reproduc,a~o pela  inclusa~o  do  KERMIT. 
  346. Entre  em  contato com o KERMIT GROUP se voce tiver  qualquer 
  347. du'vida a respeito disso.  De qualquer forma,  implementadores 
  348. de KERMIT em potencial devem fazer isso,  porque algue'm  pode 
  349. ja'  ter feito ou comec,ado a fazer a mesma coisa.
  350.  
  351.       O  KERMIT  e' distribui'do pela Universidade de  Columbia 
  352. em  fita magne'tica.  As instruc,o~es completas sobre a forma de 
  353. fazer  o seu pedido podem ser encontradas no Guia do Usua'rio. 
  354. Consultas diretas podem ser feitas para:
  355.  
  356.       KERMIT DISTRIBUTION
  357.       COLUMBIA UNIVERSITY CENTER FOR COMPUTING ACTIVITIES
  358.       7TH FLOOR, WATSON LABORATORY
  359.       612 WEST 115TH STREET
  360.       NEW YORK, NY    10025
  361.  
  362.  
  363.                        Agradecimentos
  364.  
  365.       Frank  da Cruz e Bill Catchings desenharam o  Protocolo 
  366. KERMIT  Ba'sico  na  Universidade de  Columbia  em  1981.  Por 
  367. ide'ias, procuraram em alguns dos modelos ANSI (X3.57, X3.66), 
  368. o modelo OSI da ISO, alguns "protocolos assi'ncronos" do mundo 
  369. real  (incluindo  o DIALNET PROJECT  de  Stanford,  o  TTYFTP 
  370. PROJECT de Utah),  assim como a transfere^ncia de arquivos nas 
  371. redes tradicionais como (DECNET e ARPANET).
  372.  
  373.       O   Bill   escreveu  os  dois  primeiros  programas   a 
  374. implementarem o protocolo,  um para o DEC-20,  outro para  um 
  375. microcomputador sob CP/M-80 e,  no processo,  definiu a maior 
  376. parte dos detalhes e a heuri'stica necessa'rios num processo de 
  377. transfere^ncia de arquivos.  Enquanto isso Daphne Tzoar e Vace 
  378. Kundakci,   tambe'm   da  Columbia,   definiram  os   detalhes 
  379. adicionais para comunicac,a~o com um I.B.M.
  380. ..@iIBM
  381.  
  382.       Muito  cre'dito  tambe'm  deve ir para  Bernie  Eiben  da 
  383. Digital  Equipment  Corporation por haver promovido o uso  do 
  384. KERMIT e por acrescentar diversas novas maneiras de como  ele 
  385. poderia  ser  operado  e  para  Nick Bush e  Bob  McQueen  do 
  386. Stevens Institute of Technology,  pelas muitas  contribuic,o~es 
  387. a`s   partes  "avanc,adas" do protocolo e para  outros  grandes 
  388. implementadores de KERMIT.
  389.  
  390.       Agradecemos  a`s  muitas pessoas que,  por todo o mundo, 
  391. contribuiram com novas implementac,o~es de KERMIT, que ajudaram 
  392. na  distribuic,a~o  do  KERMIT  atrave's  de  va'rios  Grupos  de 
  393. Usua'rios  e   a`queles que contribuiram para  a  qualidade  do 
  394. protocolo   e  suas  muitas  implementac,o~es  ao  reportar  ou 
  395. eliminar  problemas,  criticar  o desenho  ou  sugerir  novas 
  396. facilidades.
  397.  
  398.  
  399.                             Aviso
  400.  
  401.       Nenhuma  garantia  do  software  nem  da  perfeic,a~o  da 
  402. documentac,a~o   aqui   apresentada   pode  ser   expressa   ou 
  403. implicitamente  dada,  nem os autores nem a  Universidade  de 
  404. Columbia  se  responsabilizam por quaisquer danos que  possam 
  405. advir  de  erros  de software ou  documentac,a~o,  nem  do  uso 
  406. destes.
  407. .pa
  408. ..@adu
  409.  1.  Introduc,a~o
  410. .heIntroduc,a~o
  411.  
  412.       Este  manual descreve o protocolo  KERMIT.  Assume  que 
  413. voce  compreenda o propo'sito e a operac,a~o das facilidades  do 
  414. KERMIT  de  transfere^ncia de arquivos,  descrita no  Guia  do 
  415. Usua'rio,  bem  como a terminologia ba'sica de  comunicac,a~o  de 
  416. dados e programac,a~o de computadores.
  417.  
  418.  
  419. .cp3
  420. ..@bd
  421. 1.1. Cena'rio
  422. ..@iambiente
  423. ..@icenario
  424.       O  protocolo  KERMIT de transfere^ncia  de  arquivos   e' 
  425. direcionado   a`queles ambientes onde aparecem diversos  tipos 
  426. de computadores (micros,  computadores pessoais,  estac,o~es de 
  427. trabalho,    computadores   de   laborato'rio,   sistemas   de 
  428. timesharing)  fornecidos por diversos fabricantes.  Tudo  que 
  429. esses  sistemas  te^m que ter em comum  e' a facilidade  de  se 
  430. comunicarem serialmente em ASCII.
  431.  
  432. ..@iIBM
  433.       Originalmente o KERMIT foi desenhado na Universidade de 
  434. Columbia  pela  necessidade de se transferir  arquivos  entre 
  435. nossos  computadores de grande porte (DECSYSTEM-20 e IBM-370) 
  436. e  va'rios  microcomputadores.   Aconteceu  que  as   diversas 
  437. caracteri'sticas  desses tres tipos de sistemas resultaram num 
  438. desenho  que era gene'rico o suficiente para atender  a  quase 
  439. qualquer sistema.  O sistema IBM,  em particular,  prepondera 
  440. sobre a maioria das formas de comunicac,a~o de computadores.
  441.  
  442.  
  443. .cp3
  444. ..@bd
  445. 1.2.  Visa~o Geral
  446.  
  447. ..@ivisao geral
  448. ..@ifilosofia do protocolo
  449. ..@iprotocolo, visao geral
  450.       O  protocolo  KERMIT  e' especificamente projetado  para 
  451. transmissa~o    de   caracteres   atrave's   de    linhas    de 
  452. telecomunicac,a~o (diz-se "orientado para caracter"). O projeto 
  453. faz  concesso~es   a`s  restric,o~es e peculiaridades do  meio  e 
  454. requisitos  de diversos ambientes operacionais  (buferizac,a~o, 
  455. duplex,  paridade,  conjunto  de caracteres,  organizac,a~o  de 
  456. arquivos etc.).  O protocolo e' obedecido por Programas KERMIT 
  457. em  cada ponta da conexa~o serial que trocam  "pacotes"  entre 
  458. si;  o  transmissor  manda  nomes de  arquivos,  conteu'dos  e 
  459. informac,o~es  de  controle;  o  receptor  acusa  (positiva  ou 
  460. negativamente) a chegada de cada pacote.
  461.  
  462.       Os  pacotes  tem  um  desenho  padra~o,  mais  ou  menos 
  463. mantendo  as  filosofias  ANSI e  ISO,  com  os  campos  mais 
  464. exteriores  usados  pelos  manuseadores  da  conexa~o  para  a 
  465. verificac,a~o  da integridade dos dados,  os pro'ximos indicando 
  466. continuidade e, centralmente, os dados a ni'vel de aplicac,a~o.
  467.  
  468.       As  conexo~es  entre  sistemas  sa~o  estabelecidas  pelo 
  469. pro'prio usua'rio.  Num caso ti'pico, o usua'rio, com o KERMIT no 
  470. microcomputador,  entra em modo de emulac,a~o de  terminal,  se 
  471. conecta  a  um computador hospedeiro remoto (normalmente  por 
  472. discagem),  faz o LOGIN,  chama o KERMIT de  la' e, enta~o,  da' 
  473. os  comandos  para  que o KERMIT  do  hospedeiro  comece  uma 
  474. transfere^ncia  de arquivo;  "escapa" de volta para o micro  e 
  475. comanda   o   KERMIT  do  micro  para  fazer  sua  parte   da 
  476. transfere^ncia.  A transfere^ncia de arquivos pode ser feita um 
  477. por vez ou em grupos.
  478.  
  479.       O KERMIT ba'sico prove^ apenas transfere^ncia de  arquivos 
  480. e somente para arquivos sequenciais, embora o protocolo tente 
  481. permitir   a  transfere^ncia  de  va'rios  tipos  de   arquivos 
  482. sequenciais. Tambe'm se espera que as implementac,o~es de KERMIT 
  483. em  microcomputadores possibilitem emulac,a~o de  terminal,  de 
  484. forma a facilitar a conexa~o inicial.
  485.  
  486.       Implementac,o~es  mais  avanc,adas simplificam a  vida  do 
  487. usua'rio  ao  permitir que o KERMIT do  computador  hospedeiro 
  488. trabalhe  em  modo "SERVER" (servidor),  que pode  transferir 
  489. arquivos   nas  duas  direc,o~es  sob  comando  do  KERMIT   do 
  490. microcomputador,  em  modo "USER" (usua'rio local).  O  SERVER 
  491. pode,  tambe'm,  acrescentar  funcionalidade  adicional,  como 
  492. gere^ncia  de  arquivos,  correio e por   ai'  a  fora.  Outras 
  493. facilidades  existem,  inclusive  uma variedade de  tipos  de 
  494. checagem  de blocos,  um mecanismo para passar 8 bits atrave's 
  495. de linhas de comunicac,a~o de 7 bits, maneiras de comprimir uma 
  496. seque^ncia de caracteres repetidos etc.
  497.  
  498.       Conforme  as  redes  locais  forem  se  tornando   mais 
  499. populares,  baratas  e padronizadas,  a demanda pelo KERMIT e 
  500. protocolos similares  podera' decair mas nunca  deixara' de ter 
  501. seu espac,o.  Diferentemente das redes fixas,  o KERMIT  da' ao 
  502. usua'rio  comum o poder de estabelecer conexo~es seguras  entre 
  503. dois  computadores,  a  prova  de  erros.  Sempre   havera'  a 
  504. eventual necessidade de uma conexa~o a longa distancia...
  505. .pa
  506. .heDefinic,o~es
  507.  
  508. ..@adu
  509. 2.  Definic,o~es
  510. ..@idefinicoes
  511. ..@bd
  512. 2.1.  Terminologia Geral
  513.  
  514. ..@iterminologia
  515. ..@iTTY
  516.  
  517. TTY
  518.      Esta   e'  uma terminologia usada  normalmente  para  um 
  519.      equipamento  conectado a um computador via uma linha de 
  520.      telecomunicac,a~o serial.  Tal equipamento em geral  e' um 
  521.      terminal ASCII mas pode ser um microcomputador ou mesmo 
  522.      um computador de grande porte,  multi-usua'rio, emulando 
  523.      um terminal ASCII. A maioria dos computadores dispo~e de 
  524.      hardware (conectores RS-232 e UARTS) e software (device 
  525.      drivers)  capazes de suportar conexo~es TTY;   isto e'  o 
  526.      que  torna os protocolos de transfere^ncia  de  arquivos 
  527.      orientados para TTY,  como o KERMIT,  possi'veis a baixo 
  528.      (ou, mesmo, nenhum) custo.
  529.  
  530. ..@ilocal
  531. LOCAL
  532.       Quando  duas  ma'quinas  sa~o conectadas,  a  "LOCAL"   e' 
  533.       aquela  com a qual voce interage diretamente,  na  qual 
  534.       voce  tem  o controle do terminal.  O KERMIT  LOCAL   e' 
  535.       aquele  que  roda na MA'QUINA  LOCAL.  Um  KERMIT  LOCAL 
  536.       sempre se comunica atrave's de um equipamento externo (a 
  537.       porta de comunicac,a~o do micro,  uma linha TTY associada 
  538.       etc.).
  539.  
  540. ..@iremoto
  541. REMOTO(A)
  542.       A  ma'quina REMOTA  e' a que  esta' na outra ponta de  uma 
  543.       conexa~o,  com  a qual voce interage atrave's da  ma'quina 
  544.       LOCAL.  O KERMIT REMOTO normalmente se comunica por seu 
  545.       pro'prio   "console",    "terminal   de   controle"   ou 
  546.       equipamento "padra~o de I/O".
  547.  
  548. ..@ihost
  549. HOST
  550.       Outro nome para "computador hospedeiro",  so' que, desta 
  551.       vez,   usando-se  o  termo  americano.  Normalmente  se 
  552.       referindo  a  um computador que pode ser um "lar"  para 
  553.       mu'ltiplos  usua'rios ou aplicac,o~es.  Tal termo deve  ser 
  554.       evitado  no  jarga~o  KERMIT,  a  menos  que  precedido, 
  555.       imediatamente,  por  "local" ou "remoto",  de  forma  a 
  556.       denotar de qual HOST se esta' falando.
  557.  
  558. ..@iservidor
  559. ..@iSERVER
  560. SERVER (ou SERVIDOR)
  561.       Uma  implementac,a~o  de KERMIT REMOTO capaz  de  aceitar 
  562.       comandos  em  pacote de um programa  KERMIT  local,  ao 
  563.       inve's de diretamente do usua'rio.
  564.  
  565. ..@iUSER
  566. ..@iusuario
  567. USER (ou usua'rio)
  568.       Adicionalmente  ao  sentido  normal (aquele  que  usa), 
  569.       "USER"   sera'  usado  neste  manual  quando  houver   a 
  570.       necessidade  de  se  referenciar a um  programa  KERMIT 
  571.       LOCAL, quando um KERMIT REMOTO estiver funcionando como 
  572.       SERVER.
  573. .cp3
  574. ..@bd
  575. 2.2.  Nu'meros
  576. ..@inumeros
  577. ..@ibases de numeracao
  578.  
  579.       Todos os nu'meros que aparecem no texto deste manual sa~o 
  580. expressos  em  notac,a~o  decimal (BASE 10),  a  menos  que  em 
  581. determinadas situac,o~es seja indicado diferentemente.
  582.  
  583.       Os  nu'meros sa~o sempre referenciados em termos de  suas 
  584. posic,o~es  numa palavra de computador.   Ja' que o KERMIT  pode 
  585. ser  implementado  em computadores com palavras  de  tamanhos 
  586. diferentes,  podemos  comec,ar numerando os BITs da  "direita" 
  587. (bit-0  e' o menos significativo).  Os BITs 0-5 sa~o os 6  BITs 
  588. menos  significativos;  se  todos estiverem em "1",  o  valor 
  589. seria 63.
  590.  
  591.       Uma falha especial na terminologia usual,  no  entanto, 
  592. se  refere ao bit de mais alta ordem de um  caracter,  quando 
  593. ele  deve ser transmitido por uma linha de comunicac,a~o,  como 
  594. sendo o "oitavo bit".  Mais propriamente ele  e' o bit 7,  uma 
  595. vez que comec,amos a contar do 0.  Referencias ao "oitavo bit" 
  596. sa~o  feitas em relac,a~o ao bit que uma transmissa~o  ASCII  usa 
  597. como  bit  de  paridade.  O  KERMIT ve^ se tal  bit  pode  ser 
  598. usurpado  para a transmissa~o de dados ou,  se  na~o,  se  pode 
  599. recorrer a ele para "prefixac,a~o de oitavo bit".
  600.  
  601.  
  602. .cp3
  603. ..@bd
  604. 2.3.  Conjunto de Caracteres
  605. ..@iconjunto de caracteres
  606. ..@icaracteres, mneumonicos
  607. ..@imneumonicos
  608.  
  609.       Todos   os   caracteres  sa~o  representados  em   ASCII 
  610. (American Standard Code for Information Interchange),  padra~o 
  611. ANSI X3.4-1968.  Todas as implementac,o~es de KERMIT transmitem 
  612. e  recebem  somente  caracteres  em  ASCII.  O  conjunto  dos 
  613. caracteres ASCII esta' listado no Ape^ndice E.
  614.  
  615.  
  616. .cp11
  617. ..@f
  618. Figura2-1: Caracteres Mneumo^nicos ASCII:
  619. =============================
  620.  
  621.       NOME                VALOR     CARACTER
  622.  
  623. NUL   nulo, morto            0      ^@
  624. SOH   start-of-header        1      ^A
  625. SP    espac,o                32      branco
  626. CR    carriage-return       13      ^M
  627. LF    line-feed             10      ^J
  628. CRLF  seque^ncia CR/LF
  629. DEL   delete, rubout       127
  630.  
  631.       E'  considerado um caracter de controle  qualquer  byte 
  632. cujos  7  bits menos significativos estejam na faixa 0-31  ou 
  633. igual  a 127.  Neste manual os caracteres de  controle  podem 
  634. estar escritos de diversas maneiras:
  635.  
  636. CONTROL-A
  637.       Denota   o  valor  "1",   comumente  referenciado  como 
  638.       "control A".
  639. .cp2
  640. CTRL-A
  641.       Abreviac,a~o  de  "CONTROL-A".  Um caracter  de  controle 
  642.       normalmente   e'  teclado em um  computador  mantendo-se 
  643.       apertada  a tecla marcada "CTRL" enquanto se  aperta  a 
  644.       tecla com o si'mbolo alfabe'tico correspondente,  no caso 
  645.       "A".
  646.  
  647. ^A
  648.       Esta  e' a notac,a~o dita "seta-para-cima" para o CONTROL. 
  649.       Muitos  computadores  "ecoam"  caracteres  de  controle 
  650.       desta forma.
  651.  
  652.  
  653.       E'  considerado um caracter ASCII imprimi'vel,  qualquer 
  654. caracter na faixa 32-126 (do espac,o ao til).
  655.  
  656.  
  657. .cp3
  658. ..@bd
  659. 2.4.  Func,o~es de Conversa~o
  660.  
  661. ..@iconversoes
  662. ..@ifuncoes de conversao
  663.       Diversas func,o~es de conversa~o sa~o u'teis na descric,a~o do 
  664. protocolo e no programa exemplo. A ma'quina onde roda o KERMIT 
  665. so'  precisa saber operar com dados inteiros;  sa~o func,o~es que 
  666. operam sobre o valor nume'rico de um caracter ASCII simples.
  667.  
  668. char(x) = x + 32
  669.       transforma o inteiro "x" (desde que esteja na faixa  0-
  670.       94)  num caracter ASCII imprimi'vel;  0 vira SP,  1 vira 
  671.       "!", 3 vira "#" etc.
  672.  
  673. unchar(x) = x - 32
  674.       transforma  o caracter "x" (desde que dentro  da  faixa 
  675.       imprimi'vel (SP-TIL) em um inteiro na faixa 0-94.
  676.  
  677. ctl(x) = x ou 64
  678.       mapeia   dentro  dos  caracteres  de  controle  e  suas 
  679.       representac,o~es imprimi'veis,  preservando o bit de  mais 
  680.       alta ordem. Se "x" for um caracter de controle, enta~o
  681.  
  682.                        x = ctl(ctl(x))
  683.  
  684.       ou  seja:  a mesma func,a~o  e' usada para "controlizar" e 
  685.       "descontrolizar".  E' assumido que o argumento seja  um 
  686.       caracter  de  controle de verdade (0 a 31 ou 127) ou  o 
  687.       resultado  da  aplicac,a~o  do "ctl" em  um  caracter  de 
  688.       controle  (i. e':  de 63 a 95).  A transformac,a~o  e'  uma 
  689.       transformac,a~o mneumo^nica (^A vira A e vice-versa).
  690.  
  691.  
  692. .cp3
  693. ..@bd
  694. 2.5.  Jarga~o do Protocolo
  695. ..@ijargao do protocolo
  696. ..@iprotocolo, jargao
  697.  
  698.       Um  pacote   e' uma seque^ncia de  caracteres  claramente 
  699. delimitada,  composta  de  "campos de controle" aninhados  em 
  700. torno dos dados; os campos de controle permitem a um programa 
  701. KERMIT  determinar se os dados foram transmitidos  correta  e 
  702. completamente.  Um  pacote   e'  a unidade de  transmissa~o  no 
  703. Protocolo KERMIT.
  704.  
  705.       "ACK"   e' "acknowledge"  ou  seja:  "conhecimento".  Um 
  706. pacote  que  e' mandado para acusar o recebimento de um  outro 
  707. pacote. Na~o deve ser confundido com o caracter ASCII "ACK".
  708.  
  709.       "NAK"     e'    "negative    acknowledge"    ou    seja: 
  710. "desconhecimento".  E'  um  pacote enviado para dizer que  um 
  711. outro  pacote recebido estava adulterado ou  incompleto,  que 
  712. foi  recebido um pacote errado ou que o pacote  esperado  na~o 
  713. foi  recebido.  Na~o deve ser confundido com o caracter  ASCII 
  714. "NACK".
  715.  
  716.       Um  TIMEOUT   e' um evento que pode ocorrer se  um  dado 
  717. esperado  na~o  chega  num  determinado  espac,o  de  tempo.  O 
  718. programa gerando o pedido de input pode ligar uma interrupc,a~o 
  719. por  tempo  para  sair de uma leitura sem resposta  e  ativar 
  720. procedimentos de recuperac,a~o.
  721. .pa
  722. .foKERMIT: Manual do Protocolo                                #
  723. .heRequisitos de Sistema
  724. ..@adu
  725. 3.  Requisitos de sistema
  726.  
  727. ..@iprotocolo, requisitos
  728. ..@irequisitos do protocolo
  729.       O protocolo KERMIT requer que:
  730.  
  731.     - o  HOST  possa  mandar  e  receber  caracteres   usando 
  732.       codificac,a~o ASCII atrave's de uma conexa~o fi'sica EIA RS-
  733.       232 privada ou discada;
  734.  
  735.     - todos  os  caracteres  imprimi'veis sejam  aceitos  como 
  736.       entrada  pelo  HOST  e  na~o  sejam  transformados   sob 
  737.       condic,a~o  alguma (caso sejam convertidos - para EBCDIC, 
  738.       por  exemplo  - o  programa KERMIT deve  ser  capaz  de 
  739.       reconstruir  o  pacote  na  forma  original,  antes  da 
  740.       transformac,a~o).    Similarmente,   qualquer   rede   ou 
  741.       equipamento   de  comunicac,a~o  interveniente   ("smart-
  742.       modems",    TELENET,   concentradores   de   terminais, 
  743.       seletores  de  porta  etc)  na~o  devem  transformar  ou 
  744.       "engolir" qualquer caracter ASCII imprimi'vel;
  745.         
  746.  
  747.     - um  caracter ASCII simples de controle possa passar  de 
  748.       um sistema para o outro sem transformac,a~o; tal caracter 
  749.       e'   usado para sincronismo de pacotes;  normalmente   e' 
  750.       CONTROL-A (SOH, ASCII 1) mas pode ser redefinido;
  751.  
  752.     - se  um HOST exigir um terminador de linha para  entrada 
  753.       de terminal,  tal terminador deve ser um u'nico caracter 
  754.       ASCII de controle, como CR or LF, distintos do caracter 
  755.       de sincronismo de pacotes;
  756.  
  757.     - ao   usar   um  terminal  de  controle  de  JOBs   para 
  758.       transfere^ncia de arquivos,  o sistema deve permitir que 
  759.       o programa KERMIT passe o terminal para o modo sem eco, 
  760.       comprimento  infinito  (sem wraparound ou  inserc,a~o  de 
  761.       CRLF  pelo  sistema operacional) e  sem  formatac,a~o  de 
  762.       caracteres   chegantes   ou   saintes   (por   exemplo: 
  763.       transformar  minu'sculas  em maiu'sculas,  caracteres  de 
  764.       controle em imprimi'veis etc.);  resumindo:  o  terminal 
  765.       deve   ser  colocado  em  modo  "bina'rio"  ou  "cru'"  e 
  766.       (tomara!) restaurado depois  a`s condic,o~es originais  de 
  767.       operac,a~o;
  768.  
  769.     - o  processador de entrada de terminal do HOST deva  ser 
  770.       capaz de receber uma "rajada" de 40 a 100 caracteres em 
  771.       velocidades  normais de transmissa~o;   este e' o tamanho 
  772.       ti'pico de um pacote.
  773.  
  774.       Note que a maior parte desses requisitos impugnam o uso 
  775. do KERMIT atrave's de conversores IBM-3270/ASCII.
  776.  
  777.  
  778.       O protocolo KERMIT na~o requer que:
  779.  
  780.     - a conexa~o seja feita em qualquer baud rate determinada;
  781.  
  782.     - o  sistema possa fazer XON/XOFF ou qualquer outro  tipo 
  783.       de controle de fluxo;  controle de fluxo (por  hardware 
  784.       ou  por  software)  pode ajudar mas na~o   e'  necessa'rio 
  785.       (veja sec,a~o "Contro^le de Fluxo");
  786.  
  787.     - o sistema seja capaz de operac,a~o full-duplex;  qualquer 
  788.       mistura de half e full duplex e' suportada;
  789.  
  790.     - que  o sistema possa transmitir ou receber bytes  de  8 
  791.       bits;  o KERMIT  tomara' vantagem das conexo~es de 8 bits 
  792.       para transmitir arquivos bina'rios;  se uma conexa~o de 8 
  793.       bits na~o for possi'vel, os arquivos bina'rios podem assim 
  794.       mesmo   ser  manuseados  utilizando-se  codificaca~o  de 
  795.       prefixo.
  796. .pa
  797. .heTexto Imprimi'vel VERSUS Dados Bina'rios
  798. ..@adu
  799. 4.  Texto Imprimi'vel VERSUS Dados Bina'rios
  800.  
  801. ..@idados, binarios
  802. ..@itexto, imprimivel
  803.       Para transmissa~o entre sistemas diferentes, os arquivos 
  804. devem  ser  associados  a`  uma  das  duas  categorias:  texto 
  805. imprimi'vel ou dados bina'rios.
  806.  
  807.       Um  texto imprimi'vel  e' aquele que pode  fazer  sentido 
  808. entre  sistemas diferentes (um documento,  um programa-fonte, 
  809. um texto etc.).   Ja' um arquivo bina'rio  e' aquele que na~o faz 
  810. (e  provavelmente  na~o  pode fazer)  sentido  entre  sistemas 
  811. diferentes (um programa executa'vel,  nu'meros armazenados  num 
  812. determinado formato interno etc.).  Em sistemas de bytes de 8 
  813. bits,  arquivos  ASCII  imprimi'veis te^m os bits de mais  alta 
  814. ordem  zerados   (ja'  que o ASCII  e' um  co'digo  de  7  bits) 
  815. enquanto  que arquivos bina'rios usam o bit de mais alta ordem 
  816. de  cada byte para dados (seu valor pode variar de byte  para 
  817. byte).
  818.  
  819. NOTA:   existem algumas excec,o~es, como sistemas que armazenam 
  820. arquivos de texto no chamado "ASCII negativo" ou arquivos  de 
  821. texto  produzidos  por processadores de texto que utilizam  o 
  822. bit  de mais alta ordem para indicar sublinhado,  negrito  ou 
  823. outras indicac,o~es.
  824.  
  825.       Muitos  computadores na~o tem como distinguir  um  texto 
  826. imprimi'vel de um arquivo bina'rio,  especialmente um que tenha 
  827. vindo de um sistema diferente. Porisso o usua'rio pode ter que 
  828. dar  comandos  expli'citos para o KERMIT de forma a fazer  com 
  829. que ele fac,a converso~es.
  830.  
  831.  
  832. .cp3
  833. ..@bd
  834. 4.1.  Arquivos de Texto Imprimi'vel
  835. ..@itexto, imprimivel
  836. ..@iarquivo, imprimivel
  837.  
  838.       A  principal  meta do KERMIT   e'  transformar  arquivos 
  839. contendo  textos imprimi'veis u'teis no sistema alvo depois  da 
  840. transfere^ncia.  Isto  exige  uma representac,a~o padra~o para  o 
  841. texto  durante  a transmissa~o.  O padra~o KERMIT   e'  simples: 
  842. caracteres  de  7  bits  com  "registros  lo'gicos"   (linhas) 
  843. delimitados  por CRLF's.  E' da responsabilidade dos sistemas 
  844. que  na~o armazenam arquivos imprimi'veis desta forma  executar 
  845. as  converso~es  necessa'rias  sobre  entradas  e  sai'das.  Por 
  846. exemplo:  ma'quinas  de  grande  porte  I.B.M.  podem  retirar 
  847. brancos  da  direita na sai'da e  acrescenta'-los de  volta  na 
  848. entrada; o UNIX  precedera' com um CR seu terminador normal de 
  849. registro,  um LF,  na sai'da e o  descartara' na entrada.  Ale'm 
  850. disso,  os grandes sistemas I.B.M.  devem fazer uma  traduc,a~o 
  851. EBCDIC/ASCII para arquivos de texto.
  852.  
  853.       Nenhuma  outra  conversa~o (p.e.:  expansa~o de  TAB)   e' 
  854. feita sobre arquivos de texto.  Foi preferido assim por causa 
  855. da  maneira  como  os arquivos de texto  sa~o  armazenados  na 
  856. maioria dos microcomputadores e em muitos outros sistemas. Na 
  857. maioria dos casos nenhuma transformac,a~o e' necessa'ria.
  858.  
  859. .cp3
  860. ..@bd
  861. 4.2.  Arquivos Bina'rios
  862.  
  863. ..@iarquivo, binario
  864.       Os  arquivos  bina'rios sa~o transmitidos como se  fossem 
  865. uma  mera  seque^ncia  de  caracteres.  A  diferenc,a  para  os 
  866. arquivos  imprimi'veis  e' que o status do oitavo bit deve  ser 
  867. mantido.  Quando  arquivos  bina'rios  sa~o  transmitidos  para 
  868. sistemas  diferentes,  o  objetivo maior  e'  que  possam  ser 
  869. trazidos  de  volta  ao sistema original (ou  a  um  similar) 
  870. intacto;  nenhuma conversa~o especial deve ser feita durante a 
  871. transmissa~o,  a  na~o ser aquela necessa'ria para que os  dados 
  872. possam passar pelo meio de transmissa~o.
  873.  
  874.       Para  arquivos  bina'rios,   a  transmissa~o a 8  bits  e' 
  875. permitida entre dois KERMITs desde que eles possam  controlar 
  876. o  valor  do  bit  de paridade e que  nenhum  equipamento  de 
  877. comunicc,a~o interveniente possa alterar este valor. Neste caso 
  878. o  oitavo  bit  de um caracter  transmitido   sera'  igual  ao 
  879. original,  depois  de  ter sido feito qualquer  prefixac,a~o de 
  880. controle.  Quando pelo menos um dos lados na~o puder controlar 
  881. o  bit de paridade,  um caracter especial de prefixo pode ser 
  882. inserido, como descrito abaixo.
  883.  
  884.       Sistemas que na~o armazenam dados bina'rios em bytes de 8 
  885. bits ou cuja palavra na~o tem um nu'mero de bits mu'ltiplo de  8 
  886. podem fabricar um mecanismo especial para transferir arquivos 
  887. bina'rios  em  "modo imagem".  Isto pode ser feito  dentro  do 
  888. protocolo   ba'sico   fazendo-se   com  que  os   dois   lados 
  889. implicitamente  concordem com um esquema de  compactac,a~o  dos 
  890. dados  em caracteres ASCII de 7 ou 8 bits ou enta~o podem  ser 
  891. opcionalmente  usadas facilidades e atributos de arquivo mais 
  892. flexi'veis. O primeiro me'todo  e' usado nas ma'quinas PDP-10, de 
  893. 36 bits por byte,  onde os textos sa~o armazenados em 5  bytes 
  894. de 7 bits por palavra; o valor do "bit i'mpar"  e' enviado como 
  895. o bit de paridade de cada quinta palavra.
  896. .pa
  897. .heTransfere^ncia de Arquivos
  898. ..@adu
  899. 5.  Transfere^ncia de Arquivos
  900. ..@iarquivo, transferencia
  901. ..@itransferencia de arquivos
  902.  
  903.       O  protocolo de transfere^ncia de arquivos acontece numa 
  904. transac,a~o.    Uma  transac,a~o e' uma troca de pacotes  comec,ando 
  905. com  um SEND-INIT (S) e terminando com um  BREAK-TRANSMISSION 
  906. (B) ou ERROR (E) e pode incluir a transfere^ncia de um ou mais 
  907. arquivos,  todos na mesma direc,a~o.  Uma transac,a~o tambe'm pode 
  908. ser  considerada  terminada  quando um dos  lados  parou  sem 
  909. enviar um pacote de erro. De forma a diminuir imprevistos, os 
  910. pacotes KERMIT nao conte'm caracteres de controle,  exceto  um 
  911. especialmente  designado  para marcar o ini'cio de um  pacote. 
  912. Exceto   pelo   marcador  de   pacote,   somente   caracteres 
  913. imprimi'veis   sa~o   transmitidos.   A  sequencia   a   seguir 
  914. caracteriza  a  operac,a~o KERMIT ba'sica;  o transmissor   e'  a 
  915. ma'quina que estiver mandando arquivos; o receptor  e' a que os 
  916. esta' recebendo.
  917.  
  918. 1.    O  transmissor  manda  um  pacote  SEND-INIT  (S)  para 
  919.       especificar  seus  para^metros (comprimento  do  pacote, 
  920.       timeout etc.; explicados abaixo).
  921.  
  922. 2.    O receptor envia um pacote ACK (Y),  com seus  pro'prios 
  923.       para^metros no campo de dados.
  924.  
  925. 3.    O  transmissor manda um FILE-HEADER (F),  com o nome do 
  926.       arquivo em seu campo de dados.
  927.  
  928. 4.    O receptor "ACKceita" o pacote F mandando um pacote ACK 
  929.       sem informaca~o em seu campo de dados (opcionalmente,  o 
  930.       campo  de  dados   podera' conter o nome sob  o  qual  o 
  931.       guardara' o arquivo que vai receber).
  932.  
  933. 5.    O transmissor envia o conteu'do do arquivo em pacotes do 
  934.       tipo "D". Qualquer caracter fora da faixa imprimi'vel  e' 
  935.       prefixado e substitui'do por um equivalente que o  seja. 
  936.       Cada  pacote  D  tem que ser aceito ("Y") antes  que  o 
  937.       pro'ximo possa ser transmitido.
  938.  
  939. 6.    Quando   todos  os  dados  do  arquivo   tiverem   sido 
  940.       transmitidos,   transmissor  manda um pacote de fim-de-
  941.       arquivo (Z).
  942.  
  943. 7.    O receptor informa que tudo bem com um pacote ACK (Y).
  944.  
  945. 8.    Caso haja outro arquivo a ser transmitido,  o  processo 
  946.       e' repetido a partir do passo 3.
  947.  
  948. 9.    Quando    na~o   existirem   mais   arquivos   a   serem 
  949.       transmitidos,  o transmissor envia um pacote de fim-de-
  950.       transmissa~o (B).
  951.  
  952. 10.   O receptor manda um ACK (Y). Isto encerra a transac,a~o e 
  953.       desmonta  a conexa~o lo'gica (a conexa~o fi'sica  permanece 
  954.       aberta).
  955.  
  956.  
  957.       Cada  pacote tem um nu'mero de seque^ncia,  que comec,a em 
  958. ZERO  com o SEND-INIT.  A validac,a~o (ACK ou NAK) tem o  mesmo 
  959. nu'mero do pacote sendo validado.  Uma vez que um pacote tenha 
  960. recebido um ACK, esse nu'mero e' incrementado de 1, mo'dulo 64.
  961.  
  962.       Se  o transmissor for remoto,  ele espera,  durante  um 
  963. certo  tempo  (algo  como  de  5  a  30  segundos)  antes  de 
  964. transmitir o SEND-INIT,  de forma a dar ao usua'rio tempo para 
  965. ESCapar  de volta ao KERMIT LOCAL e dizer a ele para  receber 
  966. arquivos.
  967.  
  968.  
  969. .cp3
  970. ..@bd
  971. 5.1.  Condicionando o Terminal
  972.  
  973. ..@iterminal, condicionando o -
  974. ..@icondicionando o terminal
  975.       Normalmente  o  KERMIT  e' usado com o  usua'rio  sentado 
  976. defronte  a um microcomputador conectado a um sistema  remoto 
  977. de  time-sharing,  atrave's  de uma porta  de  comunicac,a~o.  O 
  978. KERMIT remoto  esta' usando seu pro'prio "terminal de controle" 
  979. de  JOBs para transfere^ncia de arquivos.  Enquanto a porta do 
  980. micro  e' um mero equipamento, um terminal de controle de JOBs 
  981. de  um  computador  de  time-sharing   e'  qualquer  coisa  de 
  982. especial e frequentemente executa servic,os que  interfeririam 
  983. na  operac,a~o normal do KERMIT.  Tais servic,os incluem eco (em 
  984. sistemas  full-duplex),  marcac,a~o de linhas com  a  seque^ncia 
  985. CRLF  quando atingida a "largura" da tela do terminal,  pausa 
  986. no  "fim da tela",  avisos do sistema,  conversa~o  alfabe'tica 
  987. (minu'sculas  em maiu'sculas),  interpretac,a~o de caracteres  de 
  988. controle  etc.  Os programas KERMIT que rodam  em  mainframes 
  989. devem  estar  preparados para inibir tantos  desses  servic,os 
  990. quanto possi'vel antes de iniciar uma comunicac,a~o de pacotes e 
  991. restaura'-los   depois.  Inibir  tais servic,os  e'  normalmente 
  992. conhecido como "colocando o terminal em modo bina'rio".
  993.  
  994.       O  uso  do  KERMIT  de  equivalentes  imprimi'veis   dos 
  995. caracteres  de  controle,  comprimentos de pacotes  varia'vel, 
  996. marcadores  e  prefixos redefini'veis e tolera^ncia  de  deixar 
  997. aparecer   qualquer  caracter  entre  pacotes   sem   efeitos 
  998. adversos,   da'  uma boa margem de adaptabilidade para aqueles 
  999. sistemas que na~o permitem inibir algumas (ou qualquer) dessas 
  1000. facilidades.
  1001.  
  1002.  
  1003. .cp3
  1004. ..@bd
  1005. 5.2.  Timeouts, NAKs e Retries.
  1006.  
  1007. ..@itimeout
  1008. ..@iNAK
  1009. ..@iretransmissoes
  1010. ..@iretries
  1011. ..@itemporizacao
  1012.       Se  um  programa  KERMIT  for  capaz  de  preparar  uma 
  1013. interrupc,a~o por tempo ou um limite de tempo para um pedido de 
  1014. entrada,  deve fazer isto sempre que for tentar ler um pacote 
  1015. da linha,  ao transmitir ou receber arquivos. Lido um pacote, 
  1016. deve desligar o temporizador.
  1017.  
  1018.       Se   um  programa  KERMIT  for  capaz  de  ativar   uma 
  1019. interrupc,a~o  por tempo ou um limite de tempo em um pedido  de 
  1020. input,  deve  faze^-lo sempre que for tentar ler um pacote  da 
  1021. linha  de  comunicac,a~o,   na~o  importa  se  transmitindo   ou 
  1022. recebendo um arquivo.  Lido o pacote, o temporizador deve ser 
  1023. desativado.
  1024.  
  1025.       Se  o  transmissor entra em timeout esperando  um  ACK, 
  1026. deve retransmitir o mesmo pacote, repetindo este procedimento 
  1027. um  certo nu'mero de vezes  ate' um limite de tentativas ou ate' 
  1028. receber um ACK.  Se o receptor entra em timeout esperando  um 
  1029. pacote,  pode tanto mandar um pacote NAK pelo pacote esperado 
  1030. quanto um pacote ACK pelo u'ltimo pacote que tenha recebido.
  1031.  
  1032.       Se  um pacote do transmissor for danificado ou  perdido 
  1033. (o primeiro detetado por um checksum errado, o segundo por um 
  1034. nu'mero  de seque^ncia incrementado de mais de 1),  o  receptor 
  1035. manda um NAK pelo pacote adulterado ou perdido.  Se um ACK ou 
  1036. um  NAK do receptor for alterado ou perdido,  o transmissor o 
  1037. ignora;  em  tal  caso um dos dois lados entra em  timeout  e 
  1038. retransmite.
  1039.  
  1040.       Deve  ser  mantido um contador de retransmisso~es  e  um 
  1041. limite para ele,  normalmente deixado em torno de  5.  Quando 
  1042. quer  que um pacote seja retransmitido (por timeout ou NAK) o 
  1043. contador  e' incrementado.  Quando atinge seu limite,   ele  e' 
  1044. zerado e a transac,a~o encerrada.
  1045.  
  1046.       Se nenhum dos lados for capaz de trabalhar com timeout, 
  1047. uma facilidade de intervenc,a~o manual deve estar disponi'vel no 
  1048. KERMIT   local.   Tipicamente   isto   funciona   testando-se 
  1049. periodicamente o teclado; caso haja um input, CR por exemplo, 
  1050. o  programa  deve tomar o mesmo procedimento que  tomaria  em 
  1051. caso  de timeout.  O KERMIT local mante'm uma tela informativa 
  1052. que permite ao usua'rio detetar quando o tra'fego  para.  Neste 
  1053. ponto uma intervenc,a~o manual deve acabar com o trancamento.
  1054.  
  1055.       Sistemas  compartilhados  que  tendem  a  ficar  lentos 
  1056. quando pesadamente usados,  devem ajustar seus intervalos  de 
  1057. timeout  baseados  em  pacotes,  de  acordo com  a  carga  do 
  1058. sistema, de modo que uma transfere^ncia na~o falhe simplesmente 
  1059. porque o sistema esta' muito lento.
  1060.  
  1061.       Normalmente somente um dos lados deve estar trabalhando 
  1062. com   timeouts;   de  prefere^ncia  o  lado  que  tiver  maior 
  1063. conhecimento  do seu ambiente (carga do  sistema,  baud  rate 
  1064. etc),  de  modo  a otimizar o intervalo de timeout para  cada 
  1065. pacote.  Se os dois lados estiverem trabalhando com  timeout, 
  1066. seus  intervalos  devem  diferir  o  suficiente  para  evitar 
  1067. coliso~es.
  1068.  
  1069.  
  1070. .cp3
  1071. ..@bd
  1072.           5.3.  Erros
  1073.  
  1074. ..@ierros
  1075. ..@itransferencia, erros
  1076.       Durante  uma transferencia de arquivos,  o  transmissor 
  1077. pode  encontrar um  erro de I/O no disco ou o  receptor  pode 
  1078. tentar  gravar  em  um  disco  protegido  ou,  mesmo,  cheio. 
  1079. Qualquer condic,a~o adversa ao sucesso de uma transmissa~o de um 
  1080. arquivo   e'  chamada "erro fatal".  Erros  fatais  devem  ser 
  1081. detetados e a transmissa~o ser cancelada elegantemente, com as 
  1082. informac,o~es pertinentes dadas ao usua'rio.  Os pacotes de erro 
  1083. prove^em um mecanismo para atender tal premissa.
  1084.  
  1085.       Se acontece um erro fatal,  tanto no lado que transmite 
  1086. quanto no lado que recebe, o que encontrou o erro deve mandar 
  1087. um  pacote  (E)  de  erro.  O pacote  "E"  conte'm  uma  breve 
  1088. mensagem, textual, em seu campo de dados. Os dois lados devem 
  1089. estar preparados  para receber um pacote de erro  a  qualquer 
  1090. tempo  durante  a transac,a~o.  Neste caso os dois lados  devem 
  1091. parar  e voltar ao modo comando de usua'rio.  Um  SERVER  deve 
  1092. voltar  a  esperar  comandos  do USER,  que  deve  mostrar  a 
  1093. mensagem de erro na tela.
  1094.  
  1095.       Na~o  existe provisa~o para mandar mensagens de erros na~o 
  1096. fatais,  avisos ou outras informac,o~es durante uma  transac,a~o. 
  1097. Ate'   que  isto  seria possi'vel mas requereria que  ambos  os 
  1098. lados concordassem em usar a ativac,a~o de um bit na ma'scara de 
  1099. capacidade,  uma  vez  que antigos KERMITs  na~o  sabem  desta 
  1100. facilidade  e  poderiam entrar em estado de  erro  fatal.  De 
  1101. qualquer forma a utilidade de tal facilidade  e' questiona'vel, 
  1102. ja'  que ningue'm garante que o usua'rio vai estar presente para 
  1103. ler  tais mensagens nos momentos em que elas forem  emitidas; 
  1104. mesmo que sejam gravadas para posterior observac,a~o,  em algum 
  1105. tipo  de  "caixa  postal",   suas  significa^ncias  podem  ser 
  1106. diminui'das  conforme  for passando o tempo  ate'  serem  lidas 
  1107. pelo usua'rio. Veja a sec,a~o sobre robustez, abaixo.
  1108.  
  1109.  
  1110. .cp3
  1111. ..@bd
  1112. 5.4.  Heuri'stica
  1113. ..@iheuristica
  1114.  
  1115.       Durante  qualquer transac,a~o,  diversas heuri'sticas  sa~o 
  1116. u'teis:
  1117.  
  1118. 1.    Um  NAK  pelo pacote corrente  e' equivalente a  um  ACK 
  1119.       pelo pacote anterior (mo'dulo 64). Isto trata a situac,a~o 
  1120.       muito comum na qual um pacote  e' recebido com sucesso e 
  1121.       aceito  (ACK),  mas  o ACK  e' perdido.  O lado do  ACK, 
  1122.       enta~o, entra em timeout esperando pelo pro'ximo pacote e 
  1123.       manda  um  NAK por ele.  O lado que recebe o  NAK  pelo 
  1124.       pacote   n+1   ao  esperar  um  ACK  pelo   pacote   n, 
  1125.       simplesmente retransmite o pacote n+1.
  1126.  
  1127. 2.    Se  um pacote n chega mais de uma vez,  mande um ACK  e 
  1128.       dispense-o.  Isto pode acontecer quando o primeiro  ACK 
  1129.       se   perdeu.   Retransmitir  o  ACK   e'  necessa'rio   e 
  1130.       suficiente (na~o grave o pacote novamente!!!).
  1131.  
  1132. 3.    Ao abrir uma conexa~o,  esvazie todo o buffer de entrada 
  1133.       da  linha antes de tentar receber ou transmitir o  pri
  1134.       meiro  pacote.   Isto  e' especialmente importante se  o 
  1135.       outro lado estiver em modo recepc,a~o (ou agindo como  um 
  1136.       SERVER),  em cujo caso pode ter mandado NAKs perio'dicos 
  1137.       pelo  seu esperado pacote de comando ou  SEND-INIT.  Se 
  1138.       voce na~o faz isso, voce pode descobrir que existem NAKs 
  1139.       suficientes para impedir uma transfere^ncia:  voce manda 
  1140.       um SEND-INIT e le^ a resposta,   que e' um NAK  (ja' velho 
  1141.       no  buffer);  retransmite o SEND-INIT,  ganha um  outro 
  1142.       velho  NAK  e fica assim  ate' atingir o limite  de  re
  1143.       transmisso~es  e  desiste antes de conseguir o  ACK  que 
  1144.       estava  esperando depois de todos os velhos NAKs.  Se o 
  1145.       nu'mero  de NAKs for menor que o limite  de  retransmis
  1146.       so~es, enta~o cada pacote pode ser retransmitido diversas 
  1147.       vezes.
  1148.  
  1149.  
  1150. 4.    Da mesma forma, apo's ler um pacote, com sucesso ou na~o, 
  1151.       voce  deve limpar o buffer de entrada.  Na~o deve  haver 
  1152.       coisa alguma para voce  la', mesmo,  ja' que o outro lado 
  1153.       deve  normalmente esperar que voce envie sue pacote  de 
  1154.       resposta.  Deixar de limpar o buffer pode resultar numa 
  1155.       propagac,a~o  de  repetic,a~o  de um pacote devido  a  NAKs 
  1156.       empilhados.
  1157.  
  1158. Obs.: sob "Facilidades Opcionais", mais sobre heuri'stica...
  1159.  
  1160. .cp3
  1161. ..@bd
  1162. 5.5.  Nomes de Arquivos
  1163.  
  1164. ..@inomes de arquivos
  1165. ..@iarquivo, nomes de
  1166.       A  sintaxe para nomes de arquivos pode variar muito  de 
  1167. sistema para sistema. Para evitar problemas, sugere-se que os 
  1168. nomes  de  arquivos  sejam representados nos pacotes  (F)  de 
  1169. cabecalho de arquivo numa "forma normal",  por default,  isto 
  1170. e':   deve  haver  uma  opc,a~o para passar  por  cima  de  tais 
  1171. converso~es.
  1172.  
  1173. 1.    Apague    todos   os   atributos   e   pathnames    das 
  1174.       especificac,o~es  de arquivo.  O pacote de cabec,alho  na~o 
  1175.       deve  conter nomes de dispositivos ou  direto'rio,  caso 
  1176.       contra'rio  isto  pode fazer com que  o  receptor  tente 
  1177.       gravar o arquivo em uma area inacessi'vel ou inexistente 
  1178.       ou,  ainda,  resultar  em  um  nome  de  arquivo  muito 
  1179.       estranho.
  1180.  
  1181. 2.    Depois  de  retirados  quaisquer  adendos  do  nome  do 
  1182.       arquivo,   converta   o   que  sobrou  para   a   forma 
  1183.       "NOME.TIPO", sem restric,o~es quanto a comprimento, desde 
  1184.       que caiba no campo de dados do pacote "F" e:
  1185.  
  1186.       a) na~o inclua mais que um ponto
  1187.       b) use  somente  di'gitos e letras maiu'sculas no nome  e           
  1188.          tipo.
  1189.  
  1190.       Caracteres  especiais como "$",  "&",  "-",  "_"  etc., 
  1191. devem ser evitados,   ja' que provavelmente causara~o problemas 
  1192. no outro sistema.
  1193.  
  1194.       O  receptor,  claro,  na~o pode depender do  transmissor 
  1195. para seguir esta convenc,a~o e deve tomar certas precauc,o~es. No 
  1196. entanto,  ja' que a maioria dos sistemas trabalham com a noc,a~o 
  1197. de  nome  e tipo de arquivo,  esta convenc,a~o   permitira'  que 
  1198. esses  i'tens  sejam  expressos  de  uma  forma  que  sistemas 
  1199. diferentes possam compreender. Esta notac,a~o em particular foi 
  1200. adotada simplesmente por ser a mais comum.
  1201.  
  1202.       O  receptor  deve se preocupar com  o  comprimento  dos 
  1203. campos de nome e tipo em um nome de arquivo.  Se um deles for 
  1204. muito extenso, deve ser truncado. Se o resultado, truncado ou 
  1205. na~o,   e'  o  mesmo que algum arquivo  ja' existente  na  mesma 
  1206. a'rea,  o receptor deve ser capaz de evitar gravar por cima do 
  1207. arquivo mais antigo.
  1208.  
  1209.       As implementac,o~es de KERMIT que, por default, convertem 
  1210. as  especificac,o~es de arquivos para uma forma  normal,  devem 
  1211. ter  uma opc,a~o para deixar de lado esta facilidade.   Isto  e' 
  1212. mais u'til ao se transferir arquivos entre sistemas similares, 
  1213. talvez  usado  em conjunc,a~o com o modo "imagem"  de  arquivo. 
  1214. Isto pode permitir,  por exemplo, um sistema UNIX mandar para 
  1215. outro toda uma a'rvore de direto'rio.
  1216.  
  1217.  
  1218. .cp3
  1219. ..@bd
  1220. 5.6.  Robustez
  1221.  
  1222. ..@iprotocolo, robustez
  1223. ..@irobustez
  1224.       Uma   grande  facilidade  do  protocolo  KERMIT   e'   a 
  1225. habilidade de transferir mu'ltiplos arquivos.  Se um KERMIT em 
  1226. particular  pode,  realmente,  ou  na~o fazer isto depende  da 
  1227. capacidade  do  programa  e do sistema  operacional  do  host 
  1228. (qualquer programa KERMIT pode receber arquivos mu'ltiplos).
  1229.  
  1230.       Se   um  programa  KERMIT  pode   transmitir   arquivos 
  1231. mu'ltiplos,  deve  tomar  todo  cuidado para  mandar  o  grupo 
  1232. especificado  inteiro.  Se ele falha em enviar um arquivo  em 
  1233. particular, na~o deve encerrar o batch inteiro mas, sim, ir ao 
  1234. pro'ximo  e  proceder  ate' que uma tentativa seja  feita  para 
  1235. mandar cada um dos arquivos do grupo.
  1236.  
  1237.       Operar nesta robusta forma,  no entanto,   da' chance ao 
  1238. aparecimento de um problema: o usua'rio deve ser notificado de 
  1239. uma  falha em transmitir algum arquivo.   Infelizmente na~o  e' 
  1240. suficiente  dar uma mensagem na tela,   ja' que o usua'rio pode 
  1241. na~o  estar  fisicamente presente.  Uma melhor  soluc,a~o  seria 
  1242. fazer com que o transmissor tivesse um "log" opcional,  com o 
  1243. nome  de cada arquivo para o qual foi feita uma  tentativa  e 
  1244. informando  se  a tentativa teve e^xito e,  se na~o,  a  raza~o. 
  1245. Auxi'lios  adicionais para robustecer mais um programa  KERMIT 
  1246. esta~o  descritos  na  sec,a~o  sobre  facilidades   adicionais, 
  1247. abaixo.
  1248.  
  1249.  
  1250. .cp3
  1251. ..@bd
  1252. 5.7.  Controle de Fluxo
  1253.  
  1254. ..@iXON/XOFF
  1255. ..@icontrole de fluxo
  1256. ..@ifluxo, controle de
  1257.       Em  conexo~es full-duplex,  controles de fluxo  XON/XOFF 
  1258. podem,  geralmente,  ser  usadas em conjunc,a~o com uma  trans
  1259. fere^ncia de arquivo via KERMIT,  sem efeitos colaterais. Isto 
  1260. e'  porque XOFF's  sa~o mandados na direc,a~o oposta ao fluxo dos 
  1261. pacotes,  de forma que na~o interfirira~o com os pacotes,  pro
  1262. priamente.  XON/XOFF's, porisso, na~o precisam estar definidos 
  1263. em um programa KERMIT mas podem, por outro lado, ser utiliza
  1264. dos pelo host.  Se o host prove^ esta possibilidade,  ela deve 
  1265. ser utilizada.  Se os dois lados puderem responder aos sinais 
  1266. XON/XOFF,  enta~o poderemos evitar os estouros de buffer e  as 
  1267. onerosas retransmisso~es que isso implica.
  1268.  
  1269.       Acautele-se,  pore'm,  com a seguinte situac,a~o: o KERMIT 
  1270. remoto   esta'  mandando NAKs perio'dicos,  o sistema local  os 
  1271. esta'   bufferizando a ni'vel de sistema operacional (porque  o 
  1272. usua'rio  na~o iniciou ainda o ponto final da transfere^ncia  de 
  1273. arquivos);  o  buffer de linha local fica lotado,  o  sistema 
  1274. local manda XOFF, o remoto comec,a a  bufferiza'-los, o usua'rio 
  1275. finalmente  inicia o ponto final da  transfere^ncia,  limpa  o 
  1276. buffer,  o  sistema operacional local manda XON e,  enta~o  os 
  1277. NAKs  bufferizados remotamente aparecem,  causando o problema 
  1278. descrito acima dos ecos de pacotes, apesar do buffer limpo no 
  1279. sistema local.
  1280.  
  1281.       Tambe'm  podem ser empregados os controles de fluxo  via 
  1282. sinais de modem, quando disponi'veis.
  1283.  
  1284.  
  1285. .cp3
  1286. ..@bd
  1287. 5.8.  Tabela de Estados do Protocolo KERMIT Ba'sico
  1288.  
  1289. ..@iestados do protocolo
  1290. ..@iprotocolo, estados
  1291.       O  protocolo KERMIT pode ser descrito como um  conjunto 
  1292. de  estados,  transic,o~es  e regras que dizem o que  fazer  ao 
  1293. acontecer  uma mudanc,a de um estado para outro.  Mudanc,as  de 
  1294. estado  ocorrem dependendo do  tipo de pacotes que sa~o trans
  1295. mitidos  ou  recebidos ou de erros  que  possam  ocorrer.  Os 
  1296. pacotes sempre va~o para frente e para tra's;  o transmissor de 
  1297. um  arquivo sempre manda pacotes de dados de algum tipo (ini
  1298. cializac,a~o,  cabec,alho,  dados)  e o receptor sempre  devolve 
  1299. pacotes ACK ou NAK.
  1300.  
  1301.       Ao  entrar em um dado estado,  um certo tipo de  pacote 
  1302. esta'  sendo transmitido ou esperado  (isto e' mostrado no tope 
  1303. da descric,a~o daquele estado).  Como resultado da ac,a~o, va'rias 
  1304. respostas  podem  aparecer.  Elas sa~o mostradas na coluna  de 
  1305. eventos.  Para cada evento, uma ac,a~o apropriada  e' tomada e o 
  1306. protocolo entra em um novo estado.
  1307.  
  1308.       A  tabela  a  seguir especifica a  operac,a~o  ba'sica  do 
  1309. KERMIT.  Por  simplicidade,  as condic,o~es de erro e  timeouts 
  1310. foram omitidas mas a ac,a~o  esta' como descrita  acima.  Opera
  1311. c,o~es  de  SERVER e algumas das facilidades  avanc,adas  tambe'm 
  1312. foram  omitidas.  A tabela total de estados sera' mostrada  no 
  1313. capi'tulo "Facilidades Opcionais".
  1314. .pa
  1315. ..@f
  1316. Figura 5-1: Estados de Transmissa~o
  1317. ==================================
  1318.  
  1319.                                                          Novo
  1320. Est. Evento                Ac,a~o                          Est.
  1321. ===  ===================== ============================= ====
  1322.  
  1323. **** Manda pacote SEND-INIT ****
  1324. S   recebe NAK ou mal ACK  nenhuma                       S
  1325.     recebe bom ACK         prepara parms., abre arq.     SF
  1326.     outros                 nenhuma                       A
  1327.  
  1328. **** Manda pacote de cabec,alho de arquivo ****
  1329. SF  recebe NAK ou mal ACK  nenhuma                       SF
  1330.     recebe bom ACK         enche buffer ou dados de arq. SD
  1331.     outros                 nenhuma                       A
  1332.  
  1333. **** Manda pacote de dados de arquivo ****
  1334. SD  recebe NAK ou mal ACK  nenhuma                       SD
  1335.     recebe bom ACK         enche buffer ou dados de arq. SD
  1336.     fim de arquivo         nenhuma                       SZ
  1337.     outros                 nenhuma                       A
  1338.  
  1339. **** Manda pacote de fim de arquivo ****
  1340. SZ  recebe NAK ou mal ACK  nenhuma                       SZ
  1341.     recebe bom ACK         pega proximo arq. a enviar    SF
  1342.     na~o mais arquivos      nenhuma                       SB
  1343.     outros                 nenhuma                       A
  1344.  
  1345. **** Manda pacote de break (EOT) ****
  1346. SB  recebe NAK ou mal ACK  nenhuma                       SB
  1347.     recebe bom ACK         nenhuma                       C
  1348.     outros                 nenhuma                       A
  1349. .pa
  1350. ..@f
  1351. Figura 5-2: Estados de Recepc,a~o
  1352. ===============================
  1353.  
  1354.                                                          Novo
  1355. Est. Evento                Ac,a~o                          Est.
  1356. ===  ===================== ============================= ====
  1357.  
  1358. **** Espera por pacote SEND-INIT ****
  1359. R   recebe SEND-INIT       ACK c/ para^metros locais      RF
  1360.     outros                 nenhuma                       A
  1361.  
  1362. **** Espera por pacote de Cabec,alho de Arquivo ****
  1363. RF  recebe SEND-INIT       ACK c/ para^metros locais
  1364.                            ACK pre'vio foi perdido        RF
  1365.     recebe SEND-EOF        ACK (prev. foi perdido)       RF
  1366.     recebe BREAK           ACK                           C
  1367.     recebe cab.arq.        abre arq., ACK                RD
  1368.     outros                 nenhuma                       A
  1369.  
  1370. **** Espera por pacote de dados de arquivo ****
  1371. RD  rec.pac.anterior(D,F)  ACK de novo                   RD
  1372.     recebe EOF             ACK, fecha o arquivo.         RF
  1373.     recebe dados bons      grava, ACK                    RD
  1374.     outros                 nenhuma                       A
  1375.  
  1376.  
  1377. ..@f
  1378. Figura 5-3: Estados Comuns a Transmitir e Receber
  1379. =================================================
  1380.  
  1381.                                                          Novo
  1382. Est. Evento                Ac,a~o                          Est.
  1383. ===  ===================== ============================= ====
  1384.  
  1385. C    (envio completado)                                  ini'cio
  1386. A    ("abortar")                                         ini'cio
  1387. .pa
  1388. .heFormato dos Pacotes
  1389. ..@adu
  1390. 6.  Formato dos Pacotes
  1391. ..@ipacote, formato
  1392. ..@iformato do pacote
  1393. ..@bd
  1394. 6.1.  Campos
  1395.  
  1396. ..@icampos do pacote
  1397. ..@ipacote, campos
  1398.       O  protocolo KERMIT  e' construi'do em torno da troca  de 
  1399. pacotes no seguinte formato:
  1400.  
  1401. +------+-----+-----+------+------+-------+
  1402. | mark | len | seq | type | data | check |
  1403. +------+-----+-----+------+------+-------+
  1404.  
  1405. onde todos os campos consistem de caracteres ASCII. Os campos 
  1406. sa~o os seguintes:
  1407.  
  1408. .cp2
  1409. MARK (marca)
  1410.       E'  o  caracter  de sincronismo que marca o  ini'cio  do 
  1411.       pacote.  Deve ser, normalmente, um CTRL-A, mas pode ser 
  1412.       redefinido.
  1413.  
  1414. .cp2
  1415. LEN (comprimento)
  1416.       Nu'mero  de caracteres ASCII dentro do pacote que  segue 
  1417.       este campo.  Em outras palavras:  comprimento do pacote 
  1418.       menos dois.   Uma vez que este nu'mero e' transformado em 
  1419.       um  u'nico  caracter  atrave'z  da  func,a~o  "char()",  os 
  1420.       contadores  de caracteres em um pacote podem valer de 0 
  1421.       a  94,  sendo  96  o tamanho ma'ximo  de  um  pacote.  O 
  1422.       comprimento na~o inclui os caracteres de fim-de-linha ou 
  1423.       de preenchimento,  que esta~o fora do pacote e esta~o  la' 
  1424.       estritamente  para benefi'cio do sistema operacional  ou 
  1425.       do equipamento de comunicac,a~o MAS INCLUI OS  CARACTERES 
  1426.       DE CHECAGEM DE BLOCO.
  1427.  
  1428. .cp2
  1429. SEQ (seque^ncia)
  1430.       O  nu'mero de seque^ncia do pacote,  mo'dulo 64 (ou  seja: 
  1431.       varia  de 0 a 63).  Estes contadores,  ao atingirem 63, 
  1432.       voltam a 0 (viram zero a cada 64 pacotes).
  1433.  
  1434. .cp2
  1435. TYPE (tipo)
  1436.       E'  o  pro'prio  tipo  do  pacote,  com  uma  letra.  Os 
  1437.       seguintes tipos de pacotes sa~o exigidos:
  1438.  
  1439.                       D    pacote de dados
  1440.                       Y    aceito (ACK)
  1441.                       N    na~o aceito (NAK)
  1442.                       S    SEND-INIT (troca de para^metros)
  1443.                       B    break na transmissa~o (EOT)
  1444.                       F    cabec,alho de arquivo
  1445.                       Z    fim de arquivo (EOF)
  1446.                       E    erro
  1447.                       T    reservado para uso interno
  1448.  
  1449.       O pacote NAK somente  e' usado para indicar que o pacote 
  1450.       esperado  na~o  foi corretamente  recebido,  nunca  para 
  1451.       suprir  outros  tipos  de informac,a~o,  como  recusa  em 
  1452.       executar um servic,o pedido. O pacote NAK tem sempre seu 
  1453.       campo   de  dados  vazio.    O  pacote  "T"   e'   usado 
  1454.       internamente  por muitos programas KERMIT para  indicar 
  1455.       que ocorreu um timeout.
  1456.  
  1457. .cp2
  1458. DATA (dados)
  1459.       E' o "conteu'do" do pacote, se algum conteu'do for neces
  1460.       sa'rio  naquele tipo de pacote,  interpretado de  acordo 
  1461.       com  o  tipo de pacote.  Carateres de  controle  (bytes 
  1462.       cujos  7 bits de mais baixa ordem estiverem na faixa de 
  1463.       controle  ASCII  0-31  ou 127) sa~o  prefixados  por  um 
  1464.       caracter      especial,      geralmente      "#"      e 
  1465.       "descontrolificados" via ctl(). Uma seque^ncia prefixada 
  1466.       na~o  pode  ser  quebrada de um  pacote  para  o  outro. 
  1467.       Registros   lo'gicos   em   arquivos   imprimi'veis   sa~o 
  1468.       delimitados  com CRLFs,  devidamente prefixados  (e.g.: 
  1469.       #M#J).   Registros   lo'gicos   na~o  sa~o   obrigados   a 
  1470.       corresponderem  a  pacotes.   Quaisquer  caracteres  de 
  1471.       prefixac,a~o  sa~o  inclui'dos no contador.  A  codificac,a~o 
  1472.       opcional para 8 bits e para caracteres repetidos  sera~o 
  1473.       descritas posteriormente.
  1474.  
  1475. CHECK (checagem de bloco)
  1476.       E'  a checagem de bloco dos caracteres no pacote  entre 
  1477.       (mas  na~o  incluindo) a marca e o check.  O check  para 
  1478.       cada  pacote e' computado por ambos os lados e devem ser 
  1479.       iguais se  e' que o pacote deve ser aceito.  Um checksum 
  1480.       aritme'tico  de  um u'nico caracter  e' o check  normal  e 
  1481.       exigido.  De forma a todos os bits de cada caracter  de 
  1482.       dado  contribui'rem para tal ca'lculo,  os bits 6 e 7  do 
  1483.       valor  final  sa~o somados  a` quantidade  formada  pelos 
  1484.       bits  de 0 a 5.  Assim,  se S for a soma aritme'tica dos 
  1485.       caracteres ASCII, enta~o
  1486.  
  1487.            check = char((s + ((s and 192)/64)) and 63).
  1488.  
  1489.             Este   e'  o ca'lculo default e  todos  os  KERMITs 
  1490.       devem   ser  capazes  de  executa'-lo.    Outros   tipos 
  1491.       opcionais de ca'lculo sera~o descritos mais tarde.
  1492.  
  1493.             O  check de bloco  e' baseado nos valores ASCII de 
  1494.       todos os caracteres no pacote, inclusive caracteres  de 
  1495.       controle e caracteres de prefixac,a~o. Sistemas na~o-ASCII 
  1496.       devem traduzir para ASCII antes de fazer os ca'lculos de 
  1497.       check.
  1498.  
  1499.  
  1500. .cp3
  1501. ..@bd
  1502. 6.2.  Terminador
  1503.  
  1504. ..@iterminador
  1505. ..@iCR
  1506. ..@iterminador, CR
  1507.       Qualquer terminador de linha exigido pelo sistema  pode 
  1508. ser  inclui'do no pacote;  costuma ser o CR.  Terminadores  de 
  1509. linha  na~o sa~o considerados parte do pacote e na~o sa~o inclui'
  1510. dos no contador de check. Na~o sa~o necessa'rios para o protoco
  1511. lo e sa~o invisi'veis para ele,   ja' que qualquer caracter pode 
  1512. aparecer entre pacotes. Se um host na~o puder receber um u'nico 
  1513. caracter de uma linha TTY,  enta~o um terminador  sera'  neces
  1514. sa'rio  para transmitir para tal host.  O terminador pode  ser 
  1515. especificado no ini'cio da conexa~o.
  1516.  
  1517.       Algumas   implementac,o~es  de  KERMIT  tambe'm   usam   o 
  1518. terminador por uma outra raza~o:  velocidade.  Alguns sistemas 
  1519. na~o   sa~o  ra'pidos  o  suficiente  para  pegar  um  pacote  e 
  1520. decodifica'-lo   caracter  a  caracter  sob  velocidades  mais 
  1521. altas;  Recebendo  "cegamente"  todos os caracteres  entre  a 
  1522. marca  e  o EOL,  sa~o capazes de absorver os  caracteres  que 
  1523. chegam a` toda velocidade e, enta~o, processa'-los calmamente.
  1524. ..@iEOL
  1525. ..@iterminador, EOL
  1526.  
  1527.  
  1528. .cp3
  1529. ..@bd
  1530. 6.3.  Outros dados inter-pacotes.
  1531. ..@idados inter-pacotes
  1532. ..@ipacote, dados inter-pacote
  1533.  
  1534.       O espac,o entre pacotes pode ser utilizado para qualquer 
  1535. propo'sito  desejado.  Caracteres  de  handshaking  podem  ser 
  1536. necessa'rios em certas conexo~es,  outras podem exigir controle 
  1537. de  tela,  outras  ainda seque^ncias para  manter  os  pacotes 
  1538. fluindo.
  1539.  
  1540.  
  1541. .cp3
  1542. ..@bd
  1543. 6.4.  Codificac,a~o, Prefixac,a~o, Checagem de Bloco
  1544.  
  1545. ..@icontrole, campos
  1546. ..@icampos de controle
  1547. ..@icodificacao
  1548. ..@ipacote, codificacao
  1549. ..@iprefixacao
  1550. ..@ipacote, prefixacao
  1551. ..@ibloco, checagem de
  1552. ..@ichecagem de bloco
  1553.       Mark,  len,  seq,  type e check sa~o campos de controle. 
  1554. Sa~o sempre campos de um u'nico caracter literal,  exceto que o 
  1555. campo  check pode ser expandido por um ou dois caracteres  de 
  1556. check  adicionais.   Cada campo de controle e' codificado pela 
  1557. char() ou tomado literalmente mas nunca prefixados. Os campos 
  1558. de controle nunca conte'm dados de 8 bits.
  1559.  
  1560.       Os  campos  de  dados  (data)  conte'm  uma  cadeia   de 
  1561. caracteres   onde   quaisquer  caracteres  de  controle   sa~o 
  1562. codificados  imprimivelmente  e precedidos  pelo  prefixo  de 
  1563. controle.  A  decisa~o  de  prefixar um caracter  desta  forma 
  1564. depende  de seus 7 bits menos significativos terem  um  valor 
  1565. dentro  da  faixa  ASCII  de  controle  (0-31  ou  127).   Os 
  1566. caracteres de prefixo que aparecem nos dados devem ser,  eles 
  1567. mesmos,    precedidos   pelo   prefixo   de   controle   mas, 
  1568. diferentemente  dos caracteres de controle,  eles retem  seus 
  1569. valores literais no pacote.
  1570.  
  1571.       O tratamento do bit mais significativo ("oitavo") de um 
  1572. byte de dados e' o seguinte:
  1573.  
  1574. *     se  o canal de comunicac,a~o permite 8 bits por caracter, 
  1575.       enta~o  o  valor original do oitavo bit   e'  mantido  no 
  1576.       caracter   de   prefixo;    por   exemplo:    um   byte 
  1577.       correspondendo a um CTRL-A com o oitavo bit ligado,   e' 
  1578.       transmitido  como um prefixo de  controle,  normalmente 
  1579.       "#",  com  o oitavo bit desligado,  seguido por ctl(^A) 
  1580.       com o oitavo bit ligado; em notac,a~o bina'ria seria
  1581.  
  1582.                      00100110  10000001
  1583.  
  1584. neste  caso,  o  oitavo  bit entra em todos  os  ca'lculos  de 
  1585. checagem de bloco;
  1586.  
  1587.  
  1588. *     se  o  canal  de comunicac,a~o ou  um  dos  hosts  exigem 
  1589.       paridade  em cada caracter e ambos os lados sa~o capazes 
  1590.       de prefixac,a~o de 8 bits, enta~o o oitavo bit  sera' usado 
  1591.       para  paridade e na~o deve ser inclui'do na  checagem  de 
  1592.       bloco;  prefixac,a~o de oitavo bit  e' uma opc,a~o que  esta' 
  1593.       descrita em mais detalhes na sec,a~o 8, abaixo;
  1594.  
  1595. *     se  se  estiver usando paridade mas na~o  prefixac,a~o  de 
  1596.       oitavo bit, o valor do oitavo bit de cada byte de dados 
  1597.       sera'   perdido    e   arquivos   bina'rios   na~o   sera~o 
  1598.       transmitidos corretamente;  novamente, o oitavo bit na~o 
  1599.       entra na checagem de bloco.
  1600.  
  1601.       Os campos de dados de todos os pacotes esta~o sujeitos a 
  1602. codificac,a~o  prefixada,  exceto nos pacotes "S",  "I" e "A" e 
  1603. seus ACKs (veja adiante).
  1604. .pa
  1605. .heConexa~o Inicial
  1606. ..@adu
  1607. 7. Conexa~o Inicial
  1608. ..@iconexao inicial
  1609.        A  conexa~o inicial ocorre quando o usua'rio iniciou  um 
  1610. programa KERMIT nas duas pontas da conexa~o fi'sica.  Um KERMIT 
  1611. foi ativado para transferir um arquivo e o outro para recebe-
  1612. lo.
  1613.  
  1614.       O  KERMIT  receptor espera por um pacote  SEND-INIT  do 
  1615. KERMIT transmissor.  Na~o importa se o KERMIT transmissor  foi 
  1616. iniciado  antes  ou depois do KERMIT receptor  (se  antes,  o 
  1617. pacote  SEND-INIT deve ser retransmitido periodicamente   ate' 
  1618. que  o KERMIT receptor o aceite).  O campo de dados do pacote 
  1619. SEND-INIT  e' opcional;  campos posteriores podem ser omitidos 
  1620. (ou  deixados  em branco,  isto e':   contendo  espac,os)  para 
  1621. aceitar ou especificar valores default.
  1622.  
  1623.       O pacote SEND-INIT conte'm uma string de informac,o~es  de 
  1624. configurac,a~o  no seu campo de dados.  O receptor manda um ACK 
  1625. pelo  SEND-INIT,  cujo  campo de dados conte'm  seus  pro'prios 
  1626. para^metros de configurac,a~o.  O campo de dados do SEND-INIT  e 
  1627. do  ACK  pelo  SEND-INIT  sa~o  literais  ou  seja:    na~o  ha' 
  1628. codificac,a~o  de  prefixo.   Isto e' porque as duas partes  na~o 
  1629. saberiam fazer codificac,a~o de prefixo  ate' depois da troca de 
  1630. dados de configurac,a~o.
  1631.  
  1632.       E' importante notar que campos recentemente  inventados 
  1633. sa~o  acrescentados  a`  direita,   de  forma  que  os  antigos 
  1634. KERMITs,  que  na~o tem co'digo para lidar com os novos campos, 
  1635. podem agir como se eles simplesmente na~o existissem. Por esta 
  1636. raza~o  o  valor default para  qualquer  campo,  indicado  por 
  1637. branco,  deve resultar no comportamento anterior  a` definic,a~o 
  1638. ou inclusa~o do novo campo.
  1639.  
  1640.  
  1641.   1      2      3      4      5     6     
  1642. +------+------+------+------+-----+------+   
  1643. | MAXL | TIME | NPAD | PADC | EOL | QCTL |
  1644. +------+------+------+------+-----+------+
  1645.                                       
  1646.                                  7      8      9      10...  
  1647.                                 +------+------+------+------        
  1648.                                 | QBIN | CHKT | REPT | CAPAS        
  1649.                                 +------+------+------+-------       
  1650.                            
  1651.       Os campos sa~o os seguintes (a primeira pessoa,  "eu", e 
  1652. a segunda, "voce", sa~o usadas para distinguir os dois lados). 
  1653. Os  campos  sa~o  codificados  "imprimivelmente"  usando-se  a 
  1654. func,a~o char(), a menos que indicado de forma diferente.
  1655.  
  1656. .cp2
  1657. 1. MAXL
  1658.       E'  o comprimento do maior pacote que eu quero receber, 
  1659.       um nu'mero ate' 94.   Voce responde com o ma'ximo que quer 
  1660.       receber.  Isto  permite que os sistemas se adaptem  aos 
  1661.       seus  tamanhos  de buffer ou  a`s condic,o~es do  meio  de 
  1662.       transmissa~o.
  1663.  
  1664. .cp2
  1665. 2. TIME
  1666.       Nu'mero  de segundos depois dos quais eu quero que  voce 
  1667.       me  coloque em timeout ou esperar um pacote  meu.  Voce 
  1668.       responde com a quantidade de tempo que eu devo  esperar 
  1669.       pacotes  de  voce.  Isto permite que ambos os lados  se 
  1670.       acomodem a diferentes velocidades de linha ou a  outros 
  1671.       fatores  que possam causar problemas de tempo.  Somente 
  1672.       um dos lados precisa trabalhar com timeout.  Se os dois 
  1673.       lados  o  fazzem,  os tempos de timeout na~o  devem  ser 
  1674.       pro'ximos.
  1675.  
  1676. .cp2
  1677. 3. NPAD
  1678.       O  nu'mero de caracteres de preenchimento que  eu  quero 
  1679.       que  precedam  cada  pacote  que  chegue  a  mim;  voce 
  1680.       responde da mesma forma.  Preenchimento e' necessa'rio ao 
  1681.       se  trabalhar  em sistemas half-duplex que precisam  de 
  1682.       algum  tempo  para inverter a direc,a~o  da  transmissa~o, 
  1683.       embora   na  pra'tica  tal  situac,a~o  seja   normalmente 
  1684.       manuseada por um mecanismo de handshaking.
  1685.  
  1686. .cp2
  1687. 4. PADC
  1688.       E'   o  caracter  de  controle  que  eu  preciso   para 
  1689.       preenchimento,  se for o caso, transformado pela func,a~o 
  1690.       ctl()  (na~o chr())  para torna'-la imprimi'vel.  Voce  me 
  1691.       responde com o seu.   Normalmente e' o NUL (ASCII 0) mas 
  1692.       alguns sistemas usam o DEL (127).  Este campo deve  ser 
  1693.       ignorado se o valor de NPAD for zero.
  1694.  
  1695. .cp2
  1696. 5. EOL
  1697.          O  caracter  que eu preciso para terminar um  pacote 
  1698.       que chega, se algum. Voce responde com o seu. A maioria 
  1699.       dos sistemas que exigem um terminador de linha para  um 
  1700.       input de terminal aceitam CR para tal propo'sito.  (note 
  1701.       que,   ja' que na~o ha' forma de se especificar que  o EOL 
  1702.       na~o  deve ser enviado,   e' melhor usar ctl() para  este 
  1703.       campo, ao inve's de char() mas agora e' muito tarde...).
  1704.  
  1705. .cp2
  1706. 6. QCTL (VERBATIM)
  1707.       O  caracter  imprimi'vel  que eu vou  usar  para  marcar 
  1708.       caracteres  de controle.  Normalmente e,  por  default, 
  1709.       "#". Voce responde com o que voce vai usar.
  1710.  
  1711.       Os  campos  a seguir esta~o relacionados com  o  uso  de 
  1712. facilidades  opcionais  do  protocolo  KERMIT,  descritas  no 
  1713. capi'tulo "Facilidades Opcionais".
  1714.  
  1715. .cp2
  1716. 7. QBIN (VERBATIM)
  1717.       O  caracter  imprimi'vel  que eu vou  usar  para  marcar 
  1718.       caracteres  que  tenham  o  oitavo  bit  ligado,   para 
  1719.       transmitir  arquivos bina'rios quando o bit de  paridade 
  1720.       na~o  puder ser usado para dados.   Ja' que este tipo  de 
  1721.       marcac,a~o  aumenta  o  overhead,  tanto  de  transmissa~o 
  1722.       quanto de processamento,  normalmente deve ser evitado. 
  1723.       O  caracter de marcac,a~o deve estar na faixa ASCII 33-62 
  1724.       ("!"  a  ">") ou 96-126 ("@" a "^")  mas  diferente  do 
  1725.       caracter  que marca caracteres de controle.  Este campo 
  1726.       e' interpretado da seguinte maneira:
  1727.  
  1728.       Y    eu  concordo com marcac,a~o do oitavo  bit  se  voce 
  1729.            pedir
  1730.       N    na~o farei marcac,a~o do oitavo bit
  1731.       &    (ou qualquer outro caracter na faixa 33-62 ou  96-
  1732.            126):  eu  quero fazer marcac,a~o do oitavo bit  com 
  1733.            este  caracter (isto  sera' feito se o outro KERMIT 
  1734.            colocar um Y neste campo ou responder com o  mesmo 
  1735.            caracter  de  prefixac,a~o,   como  &);  o  caracter 
  1736.            prefixo de marcac,a~o recomendado  e' "&"
  1737.            qualquer  outra coisa:  na~o  sera' feita a marcac,a~o 
  1738.            do oitavo     bit.
  1739.  
  1740.             Note  que este esquema permite que qualquer  lado 
  1741.       inicie o pedido e que a ordem na~o importa. Por exemplo: 
  1742.       um  micro capaz de se comunicar em  8 bits  normalmente 
  1743.       usara'   um "Y" neste campo,  enquanto um mainframe  que 
  1744.       usa  paridade  sempre  usara' um "&".  Na~o  importa quem 
  1745.       manda   primeiro:   esta  combinac,a~o   resultara'   numa 
  1746.       "eleic,a~o" da marcac,a~o do oitavo bit.
  1747.  
  1748. .cp2
  1749. 8. CHKT
  1750.       Tipo de checagem,  o me'todo para detec,a~o de  erros.  E' 
  1751.       "1"  para  checksum de um caracter (o me'todo  normal  e 
  1752.       exigido),   "2"   para  checksum  de  dois   caracteres 
  1753.       (opcional) e "3" para checksum CRC-CCITT (opcional). Se 
  1754.       voce  responde  concordando,  o me'todo designado   sera' 
  1755.       usado; sena~o sera' o checksum de um so' caracter.
  1756.  
  1757. .cp2
  1758. 9. REPT
  1759.       E'  o prefixo que quero usar para indicar  um  caracter 
  1760.       repetido.  Pode  ser  qualquer caracter  imprimi'vel  na 
  1761.       faixa  ASCII 33-62 ou 96-126 mas diferente dos prefixos 
  1762.       de oitavo bit e de controle. Espac,o (32) indica que na~o 
  1763.       deve  ser  executado  o processamento  de  contagem  de 
  1764.       repetic,o~es.   Til   ("~")    e'  o  prefixo   normal   e 
  1765.       recomendado.  Se voce na~o responde identicamente,  esta 
  1766.       facilidade na~o  sera' usada. Grupos de pelo menos 3 ou 4 
  1767.       caracteres   identicos  podem  ser  transmitidos   mais 
  1768.       eficientemente  usando-se  um contador  de  repetic,o~es, 
  1769.       embora uma implementac,a~o individual possa preferir usar 
  1770.       um princi'pio diferente.
  1771.  
  1772. 10-?. CAPAS
  1773.       Ma'scara  de bits,  onde cada bit ligado representa  uma 
  1774.       capacidade do KERMIT.  Cada caracter contem um campo de 
  1775.       6 bits (transformado pela func,a~o char()),  cujo bit  de 
  1776.       mais baixa ordem estara' ligado se a este se segue outro 
  1777.       byte  de capacidades e  desligado se este for o u'ltimo. 
  1778.       Ate'  agora as capacidades definidas sa~o as seguintes:
  1779.  
  1780. .cp3
  1781.       #1  reservada
  1782.       #2  reservada
  1783.       #3  habilidade  em  receber  pacotes  "A"  (atrib.   de 
  1784.           arquivos).
  1785.  
  1786. .cp7
  1787.             O  byte  de capacidades  ate'  agora  definido  se 
  1788.       apresenta assim:
  1789.  
  1790.                  BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
  1791.                 +----+----+----+----+----+----+
  1792.                 | #1 | #2 | #3 | -- | -- |  0 |
  1793.                 +----+----+----+----+----+----+
  1794.  
  1795.             Se todas estas capacidades estiverem "ligadas", o 
  1796.       valor  do byte seria 70 (octal).  Quando as capacidades 
  1797.       4,  5  e 6 sa~o acrescentadas,  a ma'scara de  capacidade 
  1798.       fica assim:
  1799.  
  1800.                  BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
  1801.                 +----+----+----+----+----+----+
  1802.                 | #1 | #2 | #3 | #4 | #5 |  1 |
  1803.                 +----+----+----+----+----+----+
  1804.  
  1805.                  BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
  1806.                 +----+----+----+----+----+----+
  1807.                 | #6 | -- | -- | -- | -- |  0 |
  1808.                 +----+----+----+----+----+----+
  1809.  
  1810.       Pro'ximos 4: campos reservados
  1811.            Instalac,o~es que queiram acrescentar seus  pro'prios 
  1812.       para^metros  a`  negociac,a~o do ini'cio da  conexa~o,  devem 
  1813.       comec,ar  no  quinto  campo  depois do  u'ltimo  byte  de 
  1814.       capacidade.  Qualquer campo no meio pode ser deixado em 
  1815.       branco (isto  e': podem conter o caracter SP, "espac,o"). 
  1816.       Estes  campos  esta~o reservados para  futuro  uso  pelo 
  1817.       protocolo KERMIT.
  1818.  
  1819.       Os  prefixos  de controle,  oitavo bit e  de  repetic,a~o 
  1820. devem ser distintos entre si.
  1821.  
  1822.       O  KERMIT receptor responde com um pacote ACK ("Y")  no 
  1823. mesmo formato para indicar suas pro'prias prefere^ncias, opc,o~es 
  1824. e  para^metros.  O  ACK na~o precisa conter o mesmo  nu'mero  de 
  1825. campos  como  o SEND-INIT.  Deste ponto,  os  dois  programas 
  1826. KERMIT  esta~o configurados para se comunicarem  ate' o fim  da 
  1827. transac,a~o.  No caso de se usar a marcac,a~o do oitavo  bit,  um 
  1828. dos  lados  deve  informar o caracter a ser usado e  o  outro 
  1829. concordar  com um "Y" no mesmo campo mas a ordem em que  isto 
  1830. ocorre na~o importa.  Da mesma forma para os checksums:  se um 
  1831. dos lados pede o de dois caracteres e o outro diz "1" (ou na~o 
  1832. diz)  o jeito  e' usar "1",   ja' que na~o se pode  esperar  que 
  1833. todas as implementac,o~es trabalhem com dois bytes em checksums 
  1834. e/ou  CRCs.  E  para contadores de repetic,a~o:  se o campo  de 
  1835. repetic,a~o do SEND-INIT e do ACK na~o concordam entre  si,  na~o 
  1836. havera' o processo.
  1837.  
  1838.       Todos os campos do SEND-INIT sa~o opcionais.  O campo de 
  1839. dados  pode  ser deixado completamente em  branco.  Da  mesma 
  1840. forma,   campos   intervenientes  podem  ter  seus   defaults 
  1841. acionados  pelo  fato  de  serem  deixados  em   branco.   As 
  1842. implementac,o~es  de  KERMIT  devem saber o  que  fazer  nesses 
  1843. casos,  principalmente  aplicar os defaults  apropriados.  Os 
  1844. defaults sa~o os seguintes:
  1845.  
  1846. .cp9
  1847. MAXL = 80
  1848. NPAD = 0, sem preenchimento
  1849. PADC = 0 (NUL)
  1850. EOL  = CR
  1851. QCTL = o caracter "#"
  1852. QBIN = nenhum, na~o faz marcac,a~o do oitavo bit
  1853. CHKT = "1" (checksum de um caracter)
  1854. REPT = na~o
  1855. MASK = tudo zero (sem capacidades especiais)
  1856.  
  1857.       Na~o   existem  negociac,o~es  prolongadas  na   seque^ncia 
  1858. inicial  de conexa~o:  existe apenas um SEND-INIT e um ACK  de 
  1859. resposta; tudo deve ser acionado nesta troca.
  1860.  
  1861.       O  primeiro  SEND-INIT  pode  na~o passar  se  o  KERMIT 
  1862. transmissor  assumir coisas erradas acerca do  receptor.  Por 
  1863. exemplo,  o receptor pode exigir alguma paridade,  algum tipo 
  1864. de  preenchimento,  handshaking  ou um EOL especial para  que 
  1865. consiga ler o pacote SEND-INIT. Por esta raza~o, deve haver um 
  1866. modo  do usua'rio especificar o que quer que  seja  necessa'rio 
  1867. para conseguir fazer passar o primeiro pacote.
  1868.  
  1869.       Na~o  e' provido um campo de paridade no pacote SEND-INIT 
  1870. porque poderia na~o ser u'til,  va'lido.  Se o transmissor exige 
  1871. um  certo  tipo de paridade,  tambe'm o  estara' utilizando  (e 
  1872. mandando).  Se o receptor na~o souber disto de antema~o,  antes 
  1873. de  receber  o SEND-INIT,  ele na~o  sera' capaz de  receber  o 
  1874. pacote SEND-INIT.
  1875. .pa
  1876. .heFacilidades Opcionais
  1877. ..@adu
  1878. 8.  Facilidades Opcionais
  1879.  
  1880. ..@ifacilidades opcionais
  1881. ..@iopcionais, facilidades
  1882.       Discutimos,   nas   sec,o~es  anteriores,   as  operac,o~es 
  1883. ba'sicas,  exigidas para qualquer implementac,a~o de KERMIT. Nas 
  1884. pro'ximas   sec,o~es  discutiremos  as   facilidades   avanc,adas 
  1885. opcionais.
  1886.  
  1887.  
  1888. ..@bd
  1889. 8.1.  Prefixac,a~o de oitavo bit e contador de repetic,o~es
  1890.  
  1891. ..@iprefixacao de oitavo bit
  1892. ..@irepeticoes, contador
  1893. ..@ioitavo bit, prefixacao
  1894. ..@icontador de repeticoes
  1895.       A  marcac,a~o  de caracteres de controle  e'  obrigato'ria. 
  1896. Ale'm  disto,   a  prefixac,a~o  tambe'm  pode  ser  usada   para 
  1897. quantidades  de 8 bits ou contadores de repetic,a~o,  quando os 
  1898. dois programas KERMIT concordam em faze^-lo. Uma prefixac,a~o de 
  1899. oitavo bit pode permitir que dados bina'rios passem atrave's de 
  1900. links  fi'sicos  de  7  bits.   Prefixac,a~o  de  contadores  de 
  1901. repetic,a~o  podem  melhorar  dramaticamente  o  throughput  de 
  1902. certos  tipos  de  arquivo;   arquivos  bina'rios   (programas 
  1903. executa'veis particularmente) e textos estruturados (colunares 
  1904. ou   altamente   identados)   tendem   a   ser   os   maiores 
  1905. beneficia'rios.
  1906.  
  1907.       Quando  mais de um tipo de prefixac,a~o  esta' em  efeito, 
  1908. um  u'nico caracter de dados pode ser precedido por mais de um 
  1909. caracter de prefixac,a~o. Um receptor nunca  fara' qualquer tipo 
  1910. de  prefixac,a~o,   ja' que a prefixac,a~o  so' ocorre no campo  de 
  1911. dados  e o receptor  so' responde com ACKs ou NAKs com  campos 
  1912. de dados vazios ou especiais.  O processamento de  contadores 
  1913. de  repetic,a~o  so' pode ser requisitado pelo transmissor e  so' 
  1914. sera'  utilizado pelo transmissor se o receptor  concordar.  A 
  1915. prefixac,a~o de oitavo bit  e' um caso especial,  porque seu uso 
  1916. normalmente na~o  e' desejado,  ja' que aumenta muito o overhead 
  1917. tanto na transmissa~o quanto na recepc,a~o.  No entanto, uma vez 
  1918. que   e' o u'nico mecanismo direto para transmissa~o de arquivos 
  1919. bina'rios  disponi'vel  aos sistemas que usurpam o  oitavo  bit 
  1920. para paridade,  um receptor deve ser capaz de pedir ao trans
  1921. missor que fac,a a marcac,a~o do oitavo bit,   ja' que a  maioria 
  1922. dos transmissores normalmente na~o o fara~o por default.
  1923.  
  1924.       O  prefixo de repetic,a~o  e' imediatamente seguido por um 
  1925. caracter (1 byte) de contador,  codificado via func,a~o char(). 
  1926. seguido  pelo  pro'prio caracter (talvez prefixado por  marca
  1927. dores de controle ou de oitavo bit, como explicado abaixo). O 
  1928. contador de repetic,o~es pode expressar valores de 0 a  94.  Se 
  1929. um  caracter aparece mais de 94 vezes em uma linha,  deve ser 
  1930. "cortado"  em 94,  emitido com todos os prefixos  apropriados 
  1931. assim por diante ate' que todos tenham sido transmitidos.
  1932.  
  1933. .cp 14
  1934.            representac,a~o  com contador de
  1935. caracter   marcada        repetic,o~es para 6
  1936.  
  1937.       A         A         ^(A       ("(" e' ASCII 40-32=6)
  1938.       ^A        #A        ^(#A
  1939.       'A        &A        ^(&A
  1940.       '^A       &#A       ^(&#A
  1941.       #         ##        ^(##
  1942.       '#        &##       ^(&##
  1943.       &         #&        ^(#&
  1944.       '&        &#&       ^(&#&
  1945.       ^         #^        ^(#^
  1946.       '^        &#^       ^(&#^
  1947.       NUL       #@        ^^#@^:#@  (120 NULs)
  1948.  
  1949.       A representa qualquer caracter imprimi'vel
  1950.       ^A qualquer caracter de controle
  1951.       'X qualquer caracter com o oitavo bit ligado
  1952.       # e' usado para marcar caracteres de controle
  1953.       & marca caracteres cujo oitavo bit esta' ligado
  1954.  
  1955.       O contador de repetic,o~es deve sempre preceder  qualquer 
  1956. outro caracter de prefixac,a~o;   e' tomado literalmente (depois 
  1957. de  ter sido transformado pela unchar().  Por exemplo:  "#" e 
  1958. "&"  seguindo  imediatamente  um  "^"  denota  contadores  de 
  1959. repetic,a~o,  na~o  caracteres  de oito bits ou de  controle.  O 
  1960. caracter de marcac,a~o de controle "#" cerca mais  proximamente 
  1961. o caracter de dados, enta~o o prefixo para oito bits e,  ai', o 
  1962. contador de repetic,o~es. Em outras palavras a ordem e':
  1963.  
  1964.                 prefixo de repetic,a~o e contador
  1965.                 marca de oito bits
  1966.                 marca de controle
  1967.                 caracter de dado.
  1968.  
  1969.       Como ilustrac,a~o, note que &#A na~o e' equivalente a #&A.
  1970.  
  1971.       Quando  o bit de paridade  esta' disponi'vel para  dados, 
  1972. na~o  deve ser utilizada a marcac,a~o de oitavo bit e  o  oitavo 
  1973. bit  do caracter prefixado  tera' o mesmo valor do oitavo  bit 
  1974. do byte original de dados. Neste caso, a tabela fica assim:
  1975.  
  1976. .cp 14
  1977.            representac,a~o  com contador de
  1978. caracter   marcada        repetic,o~es para 6
  1979.  
  1980.       'A        'A        ^('A
  1981.       '^A       #'A       ^(#'A
  1982.       '#        #'#       ^(#'#
  1983.       '&        '&        ^('&
  1984.  
  1985.       Note  que,  desde que na~o se  esta' fazendo marcac,a~o  de 
  1986. oitavo  bit,  "&"  na~o  esta' sendo usado como um caracter  de 
  1987. prefixac,a~o de oitavo bit, porisso na~o precisa ser marcado com 
  1988. "#". Note, tambe'm, que o oitavo bit  esta' ligado no argumento 
  1989. final  da seque^ncia de repetic,a~o,  na~o importando qua~o  longa 
  1990. seja e na~o em algum dos caracteres de prefixac,a~o.
  1991.  
  1992.       Lembre-se, finalmente, das seguintes regras:
  1993.  
  1994. - seque^ncias prefixadas na~o podem ser quebradas de um  pacote 
  1995. para outro
  1996.  
  1997. - os  prefixos para controle,  oitavo  bit  e  contadores  de 
  1998. repetic,a~o devem ser diferentes entre si
  1999.  
  2000. - os  campos  de dados de todos os pacotes devem passar  pelo 
  2001. mecanismo de codificac,a~o de prefixos,  menos os pacotes  "S", 
  2002. "I" e "A" e os ACKs para eles.
  2003.  
  2004.       Na  primeira  regra  acima,   note  que  uma  seque^ncia 
  2005. prefixada  significa  um  u'nico  caracter  e  todos  os  seus 
  2006. prefixos,  como ^%&#X,  na~o uma seque^ncia como #M#J,  que sa~o 
  2007. duas seque^ncias prefixadas.
  2008.  
  2009.  
  2010. ..@bd
  2011. 8.2.  Operac,a~o de SERVER (Servidor)
  2012. ..@iSERVER, operacao
  2013. ..@iservidor
  2014. ..@ioperacao de SERVER
  2015.       Um SERVER  e' um programa KERMIT rodando remotamente sem 
  2016. um "interface com o usua'rio". Todos os comandos para o KERMIT 
  2017. SERVER  chegam em pacotes do KERMIT LOCAL.  A operac,a~o de  um 
  2018. KERMIT  SERVER   e' muito mais conveniente do que  a  operac,a~o 
  2019. ba'sica,   ja' que o usua'rio na~o precisa interagir  diretamente 
  2020. com  o programa KERMIT remoto uma vez que o tenha acionado em 
  2021. modo SERVER e,  dai' em diante, na~o manda mais comandos SEND e 
  2022. RECEIVE complementares, dos dois lados, para conseguir que um 
  2023. arquivo seja transferido.  Ao inve's disso,  um u'nico  comando 
  2024. (SEND  ou  GET)  no  KERMIT local  basta.  Os  SERVERs  podem 
  2025. oferecer  tambe'm  servic,os  que na~o os  de  transfere^ncia  de 
  2026. arquivos.
  2027.  
  2028.       Entre  transac,o~es,  um  KERMIT  SERVER  espera  pacotes 
  2029. contendo comandos de SERVER.  O nu'mero de seque^ncia de pacote 
  2030. sempre  volta a 0 depois de uma transac,a~o.  Um KERMIT  SERVER 
  2031. esperando comando deve ficar procurando um pacote 0 e pacotes 
  2032. de comando mandados para um SERVER devem ser tambe'm 0. Certos 
  2033. comandos de SERVER resultara~o numa troca de diversos pacotes. 
  2034. Tais operac,o~es se processam exatamente como uma transfere^ncia 
  2035. de arquivo.
  2036.  
  2037.       Um  programa KERMIT SERVER,  esperando por um pacote de 
  2038. comando  e' dito "em espera de comando SERVER".  Uma vez posto 
  2039. neste estado,  o SERVER nunca deve  deixa'-lo  ate' receber  um 
  2040. pacote  comandando-o para tal.  Isto significa que depois que 
  2041. qualquer  transac,a~o  termina,   normalmente  ou  por   alguma 
  2042. condic,a~o de erro, o SERVER deve voltar ao estado de espera de 
  2043. comando SERVER.  Enquanto em espera,  um SERVER pode resolver 
  2044. mandar  NAKs perio'dicos pelo pacote 0,  o esperado pacote  de 
  2045. comando.  Uma  vez que o usua'rio pode ter se desconectado  do 
  2046. SERVER  por longos peri'odos de tempo (horas),  os  intervalos 
  2047. entre  os  NAKs devem ser significativamente  maiores  que  o 
  2048. tempo normal de timeout (digamos: 30-60 segundos, ao inve's de 
  2049. 5-10).  Os NAKs perio'dicos sa~o u'teis para quebrar um deadlock 
  2050. que  ocorreria se um programa local na~o fosse capaz de entrar 
  2051. em  timeout e mandar um comando que se  perdesse.  Por  outro 
  2052. lado  podem  causar  problemas para KERMITs  locais  que  na~o 
  2053. possam  limpar  seus  buffers de input ou para  sistemas  que 
  2054. fazem cegamente XON/XOFF, forc,ando os NAKs a ficarem bufferi
  2055. zados no host do SERVER e serem soltos de repente,  em massa, 
  2056. quando chegar um XON. Por esta raza~o os SERVERs devem ter uma 
  2057. opc,a~o  para  preparar  um intervalo para  "acordar"  ou  para 
  2058. desabilita'-lo de uma vez.
  2059.  
  2060.       A  operac,a~o  de  SERVER deve ser implementada  em  dois 
  2061. lugares:  no  SERVER,  propriamente, e em  qualquer  programa 
  2062. KERMIT que venha a se comunicar com ele. O SERVER tem que ter 
  2063. co'digo  para ler comandos SERVER de pacotes e para  responde^-
  2064. los.  O USER KERMIT deve ter co'digo para analisar comandos do 
  2065. usua'rio relacionados com o SERVER, formar pacotes de comandos 
  2066. para o SERVER,  transmiti-los e manusear as respostas a  tais 
  2067. comandos.
  2068.  
  2069.  
  2070. ..@cd
  2071. 8.2.1.  Comandos SERVER
  2072. ..@iSERVER, comandos
  2073.  
  2074.       Os comandos SERVER esta~o relacionados abaixo. Nem todos 
  2075. eles  foram implementados e alguns podem nunca chegar a se^-lo 
  2076. mas seus usos devem ser reservados. Embora a operac,a~o em modo 
  2077. SERVER seja opcional, certos comandos devem ser implementados 
  2078. em todos os SERVERs.  Isto inclui os comandos SEND-INIT  (S), 
  2079. RECEIVE-INIT (R) e GENERIC LOGOUT (GL) e/ou FINISH (GF). Se o 
  2080. SERVER  recebe  um  comando  que  na~o  entende  ou  na~o  pode 
  2081. executar,  deve  responder com um pacote de erro (E) contendo 
  2082. uma  mensagem  como "UNIMPLEMENTED  SERVER  COMMAND  (comando 
  2083. SERVER  na~o  implementado)" e ambos os lados devem  voltar  o 
  2084. nu'mero de seque^ncia de pacote para 0 e o SERVER permanecer em 
  2085. espera por comando.  So' um comando GL ou GF pode encerrar uma 
  2086. operac,a~o de SERVER.
  2087.  
  2088. .cp 20
  2089.       Os comandos KERMIT sa~o os seguintes:
  2090.  
  2091. S - SEND-INITIATE (troca para^metros; o SERVER espera arquivo)
  2092. R - RECEIVE-INITIATE (pede ao SERVER arquivos especificados)
  2093. I - INITIALIZE (troca para^metros)
  2094. X - TEXT-HEADER  (Permite transferencia de texto para a  tela 
  2095.     do  usua'rio em resposta a um comando gene'rico ou do host. 
  2096.     Isto  funciona  exatamente  como  uma  transfere^ncia   de 
  2097.     arquivo  exceto  que  o "equipamento de destino"   e'  uma 
  2098.     tela,  ao inve's de um arquivo.  Os campos de dados  podem 
  2099.     conter  um nome de arquivo,  um ti'tulo ou outro cabec,alho 
  2100.     qualquer.)
  2101. C - Comando de host. O campo de dados conte'm uma seque^ncia de     
  2102.     caracteres  a  ser  executada pelo host como  um  comando     
  2103.     direto.
  2104. K - Comando KERMIT.  O campo de dados conte'm uma seque^ncia de     
  2105.     caracteres  na  linguagem  interativa  do  KERMIT  SERVER     
  2106.     (normalmente  um  comando SET) a ser  executada  como  se     
  2107.     houvesse sido digitada a ni'vel de comando.
  2108. G  - Comando KERMIT gene'rico.  Um u'nico caracter no campo  de 
  2109.     dados (possivelmente seguido de operandos,  mostrados  em 
  2110.     chaves, campos opcionais, tambe'm em colchetes) especifica 
  2111.     o comando:
  2112.  
  2113.     I LOGIN {[*user[*password[*conta]]]}
  2114.     C CWD, CHANGE WORKING DIRECTORY {[*directory[*password]]}
  2115.     L LOGOUT, BYE
  2116.     F FINISH ("derruba" o SERVER mas na~o da' LOGOUT)
  2117.     D DIRECTORY {[*especificac,a~o-de-arquivo]}
  2118.     U DISK USAGE QUERY {[*area]}
  2119.     E ERASE (DELETE) {*especificac,a~o-de-arquivo}
  2120.     T TYPE {*especificac,a~o-de-arquivo}
  2121.     R RENAME {*nome-antigo*nome-novo}
  2122.     K COPY {*fonte*destino}
  2123.     W quem esta' no ar? (FINGER) {[*ident-do-usua'rio]}
  2124.     W quem esta' no ar? (FINGER) {[*NETWORK HOST[*opc,o~es]]}
  2125.     M mensagem curta {*destinata'rio*texto}
  2126.     H HELP {[*to'pico]}
  2127.     Q SERVER STATUS QUERY
  2128.     P programa {*[espec.arq] [*comandos]}
  2129.     J JOURNAL {*comando[*argumento]}
  2130.     V varia'vel [*comando[*argumento*argumento]]}
  2131.  
  2132.       Note que a codificac,a~o do comprimento do campo  e' usada 
  2133. dentro  do campo de dados mas na~o dentro dos campos de  dados 
  2134. de outros pacotes como S, I, R, X, K e C.
  2135.  
  2136.       Um asterisco (*), como usado acima, representa um campo 
  2137. de comprimento de um u'nico caracter,  codificado via  char(), 
  2138. para  o operando que o segue;  assim,  comprimentos de 0 a 94 
  2139. podem ser especificados; isto permite que operandos mu'ltiplos 
  2140. sejam claramente delimitados a despeito de seus conteu'dos.
  2141.  
  2142.       Todos  os comandos SERVER que mandam argumentos em seus 
  2143. campos de dados devem passar pelo mecanismo de codificac,a~o de 
  2144. prefixos.   Assim  se  um  caracter  de  dados  ou  campo  de 
  2145. comprimento acontece de corresponder a um caracter de prefixo 
  2146. ativo, ele pro'prio deve ser prefixado. O comprimento do campo 
  2147. denota o comprimento do campo antes da codificac,a~o de prefixo 
  2148. e  (ainda bem!) depois da decodificac,a~o.  Por  exemplo,  para 
  2149. mandar  um  comando  gene'rico  com  dois  campos,   "ABC"   e 
  2150. "ZZZZZZZZ", primeiro cada campo seria prefixado por char() de 
  2151. seu  comprimento,   neste  caso  char(3)  e  char(8),   dando 
  2152. "#ABC(ZZZZZZZZ".  Mas "#" e' o caracter de prefixo de controle 
  2153. normal,   dai'  deve  repetir  o  prefixo (se  o  contador  de 
  2154. repetic,o~es  estiver  ativo),  de  modo  que  o  resultado  da 
  2155. codificac,a~o  seja  "##ABC(~(Z" (assumindo que  o  prefixo  de 
  2156. repetic,a~o  seja  til - "~").  O receptor decodifica de  volta 
  2157. para  o "#ABC(ZZZZZZZZ" original antes de tentar  extrair  os 
  2158. dois campos.
  2159.  
  2160.       Uma  vez que um comando gene'rico deve caber em um u'nico 
  2161. pacote,  o  programa que manda o comando se assegura que cabe 
  2162. mesmo  e  na~o inclui campos de comprimento que  apontam  para 
  2163. depois do fim do pacote.  Os SERVERs,  no entanto,  devem ser 
  2164. defensivos e na~o tentar processar qualquer caracter depois do 
  2165. campo de dados,  mesmo se o campo de comprimento do argumento 
  2166. o leve a fazer isso.
  2167.  
  2168.  
  2169. ..@cd
  2170. 8.2.2.  Temporizac,a~o
  2171. ..@itemporizacao
  2172.  
  2173.       O  KERMIT  na~o  prove^ um  mecanismo  para  suspender  e 
  2174. continuar uma transac,a~o.  Isto significa que um texto mandado 
  2175. para  a  tela do usua'rio na~o deve ser "congelado" por  longos 
  2176. peri'odos  (i. e':  na~o mais que o peri'odo de timeout  vezes  o 
  2177. limite de tentativas).
  2178.  
  2179.       Entre  transac,o~es,  quando  o SERVER na~o  tem  servic,os 
  2180. pendentes,  pode mandar NAKs perio'dicos (sempre com checksums 
  2181. do tipo 1) para evitar um deadlock no caso de um comando seja 
  2182. mandado  para ele e perdido.  Tais NAKs podem se empilhar  no 
  2183. buffer  de  input do KERMIT USER (se ele tiver um),  assim  o 
  2184. KERMIT USER deve estar preparado para "limpar" seu buffer  de 
  2185. input  antes  de mandar um comando para um  SERVER.  Enquanto 
  2186. isso,  os  SERVERs devem reconhecer que alguns  sistemas  na~o 
  2187. permitem que, por programa, se fac,a isto (ou, quando o fazem, 
  2188. o  processo pode ser atrapalhado pelo firmware de controle de 
  2189. fluxo do sistema) e,  enta~o, ter um jeito de deixar de mandar 
  2190. (ou diminuir o ri'tmo de) os NAKs de espera de comando.
  2191.  
  2192.  
  2193. ..@cd
  2194. 8.2.3.  O Comando "R"
  2195. ..@icomando, R
  2196.  
  2197.       O pacote R,  geralmente mandado por um programa  KERMIT 
  2198. local cujo usua'rio teclou um comando GET,  diz ao SERVER para 
  2199. mandar  os arquivos especificados por nome no campo de  dados 
  2200. do  pacote  R.   Ja' que na~o podemos assumir que dois  KERMITs 
  2201. estejam  rodando  em sistemas semelhantes,  o  KERMIT  (USER) 
  2202. local deve encarar a especificac,a~o do arquivo como uma cadeia 
  2203. de  caracteres  e deixar o SERVER  analisa'-la.  Se  o  SERVER 
  2204. puder abir e ler o arquivo especificado,  ele o transmite  um 
  2205. pacote  SEND-INIT (S) (na~o um ACK !) para o USER e completa a 
  2206. transac,a~o de transmissa~o de arquivo, como ja' descrito.
  2207.  
  2208.       Se  o SERVER na~o pode mandar o arquivo,  deve responder 
  2209. com  um pacote de erro (E) contendo a raza~o,  como "FILE  NOT 
  2210. FOUND  (arquivo  na~o  encontrado)" ou "READ  ACCESS  REQUIRED 
  2211. (exigido acesso para leitura)".
  2212.  
  2213.  
  2214. ..@cd
  2215. 8.2.4.  Respostas Curtas e Respostas Longas
  2216.  
  2217. ..@irespostas curtas e longas
  2218.       Qualquer  pedido feito a um SERVER pode ser  respondido 
  2219. de duas formas e qualquer USER KERMIT que faz tal pedido deve 
  2220. estar preparado para qualquer uma delas:
  2221.  
  2222. * Uma resposta curta.  Consiste em um simples pacote ACK, que 
  2223. pode  conter  texto em seu campo de  dados.  Por  exemplo,  o 
  2224. usua'rio  pode  pedir  informac,o~es sobre espac,o  em  disco  ao 
  2225. SERVER  e ele responder com uma curta cadeia de caracteres no 
  2226. campo  de dados de seu pacote de ACK,  como "12K  BYTES  FREE 
  2227. (12K  bytes  disponi'veis)".  O USER KERMIT deve mostrar  este 
  2228. texto em sua tela.
  2229.  
  2230. *  Uma resposta longa.  Funciona como uma transfere^ncia de um 
  2231. arquivo  (e  em  alguns casos pode se  tratar  disso  mesmo). 
  2232. Comec,a com um dos seguintes:
  2233.  
  2234.       *  um  pacote  "F" de cabec,alho  de  arquivo  (seguido, 
  2235.          opcionalmente, por um ou mais pacotes de atributos, 
  2236.          discutidos mais tarde);
  2237.  
  2238.       *  um pacote "X" de cabec,alho de texto;
  2239.  
  2240.       *  um pacote "S" (SEND-INIT)  seguido por um pacote "X" 
  2241.          ou "F";
  2242.  
  2243.       Depois  do  pacote X ou F vem um nu'mero  arbitra'rio  de 
  2244. pacotes de dados ("D") e,  enta~o, um pacote "Z" (END-OF-FILE) 
  2245. e,  finalmente, um pacote "B" (BREAK-TRANSMISSION), como para 
  2246. uma transfere^ncia normal de um arquivo.
  2247.  
  2248.  
  2249. ..@cd
  2250. 8.2.5.  Comandos SERVER Adicionais
  2251. ..@iSERVER, comandos adicionais
  2252. ..@icomandos SERVER adicionais
  2253.  
  2254.       Os  comandos  SERVER  a  seguir pedem  ao  SERVER  para 
  2255. executar tarefas que na~o as de transmitir e receber arquivos. 
  2256. Quase todos eles sa~o passi'veis de respostas curtas ou longas. 
  2257. Por  exemplo,  o  comando ERASE gene'rico (GE) pode  gerar  um 
  2258. simples  ACK  ou uma rajada de pacotes contendo os  nomes  de 
  2259. todos os arquivos que ele apagou (ou na~o). Vejamos agora tais 
  2260. comandos  em mais detalhes,  os argumentos sa~o como  providos 
  2261. nos  comandos  teclados  para  o  USER  KERMIT  (sujeitos   a 
  2262. codificac,a~o  de  prefixo);  nenhuma transformac,a~o a  qualquer 
  2263. forma normal ou cano^nica  e' feita: nomes de arquivos e outros 
  2264. operandos esta~o na sintaxe do sistema host do SERVER.
  2265.  
  2266. I  LOGIN.  Para  uso  quando  um  KERMIT  SERVER   e'  mantido 
  2267. perpetuamente rodando numa linha dedicada.  Isto permite a um 
  2268. novo  usua'rio identificar-se perante o sistema do host.  Se o 
  2269. campo de dados estiver vazio,  ele remove a identificac,a~o  do 
  2270. usua'rio,  de forma que o pro'ximo na~o tenha acesso ao host com 
  2271. a  mesma  identificac,a~o.  Um SERVER dedicado como  este  deve 
  2272. provavelmente  desabilitar  os  comandos  gene'ricos  L  e  F, 
  2273. descritos abaixo.
  2274.  
  2275. L LOGOUT,  BYE. Este comando "derruba" o SERVER inteiramente, 
  2276. fazendo-o  encerrar seu pro'prio JOB.  Deve ser usado quando o 
  2277. SERVER foi iniciado manualmente pelo usua'rio que, enta~o, deve 
  2278. derruba'-lo remotamente.
  2279.  
  2280. F FINISH.   Isto e' para permitir que o usua'rio possa derrubar 
  2281. o  SERVER,  colocando  seu terminal de volta ao  modo  normal 
  2282. (diferente de bina'rio ou natural) e o JOB do SERVER devolvido 
  2283. ao ni'vel de comando de sistema,  ainda "logado",  de forma  a 
  2284. poder continuar seus afazeres no host.
  2285.  
  2286. C  CWD.  Este comando torna ativo o direto'rio ou a'rea default 
  2287. para  transfere^ncia  de  arquivos  no  host  do  SERVER.  Sem 
  2288. operandos, passa a ser a pro'pria a'rea default do usua'rio.
  2289.  
  2290. D DIRECTORY.  Manda uma listagem do direto'rio para o usua'rio. 
  2291. O USER KERMIT tanto pode  mostra'-la na tela quanto  armazena'-
  2292. -la em disco.  Normalmente  e' aceito algum tipo de designador 
  2293. de  grupos de arquivos para pedir que o SERVER  so'  liste  os 
  2294. nomes de arquivos cujos nomes satisfac,am a regra dada.
  2295.  
  2296. U DISK USAGE QUERY.  O SERVER responde com o total de  espac,o 
  2297. em  disco  usado  e livre em Kbytes (ou  outra  unidade,  que 
  2298. deveria ser especificada).
  2299.  
  2300. E  ERASE  (DELETE).  Apaga o arquivo ou o grupo  de  arquivos 
  2301. especificado.
  2302.  
  2303. T TYPE.  Manda o arquivo ou grupo deles, indicando (comec,ando 
  2304. com  um pacote X ao inve's de um F ou usando o atributo  TYPE) 
  2305. que o arquivo deve ser mandado para a tela e na~o armazenado.
  2306.  
  2307. R RENAME. Muda o nome do arquivo ou arquivos como indicado. A 
  2308. seque^ncia  de  caracteres indicando o novo nome  pode  conter 
  2309. outros  atributos,  como co'digo de  protec,a~o,  permitido  nas 
  2310. especificac,o~es de arquivo do host.
  2311.  
  2312. K  COPY.  Produz  uma co'pia do arquivo ou grupo  deles,  como 
  2313. indicado, deixando o(s) arquivo(s) fonte(s) intacto(s).
  2314.  
  2315. W WHO'S LOGGED IN?  (FINGER).  Sem argumentos, lista todos os 
  2316. usua'rios  usando  o  sistema  do  host  no  momento.  Se  for 
  2317. especificado   algum  argumento,   prove^   informac,o~es   mais 
  2318. detalhadas sobre o usua'rio ou host da rede especificado.
  2319.  
  2320. M SHORT MESSAGE.  Manda o bilhete (de um u'nico pacote) para a 
  2321. tela do usua'rio indicado.
  2322.  
  2323. P PROGRAM. Este comando tem dois argumentos: nome do programa 
  2324. [especif.arq.] e parametros para o programa. O primeiro campo 
  2325. e'   exigido  mas  pode ser deixado  nulo  (i. e':  comprimento 
  2326. zero).  Se  for nulo, o programa correntemente  carregado   e' 
  2327. alimentado   com  o  comando.   Se  na~o  nulo,   o   programa 
  2328. especificado   e'  carregado  e iniciado;  se  um  comando  de 
  2329. programa for dado,  e' passado para o programa que entrou como 
  2330. se  fosse um comando inicial (por exemplo,  como uma linha de 
  2331. argumentos em sistemas que aceitam tal conceito). Em qualquer 
  2332. um  dos  casos,  a sai'da do programa  e' mandada de  volta  em 
  2333. forma de respostas curtas ou longas, como ja' descrito.
  2334.  
  2335. J JOURNAL.  Este comando controla o "dia'rio" da transac,a~o  do 
  2336. SERVER. O campo de dados conte'm um dos seguintes:
  2337.  
  2338.       +    Comec,a a anotar a transac,a~o.  Se e' dado um nome de 
  2339.            arquivo,  fecha  qualquer  transac,a~o ora aberta  e 
  2340.            abre  o  arquivo especificado como o novo  LOG  de 
  2341.            transac,a~o. Se na~o existe LOG aberto nem  e' dado um 
  2342.            nome  de arquivo,  o SERVER deve abrir um  arquivo 
  2343.            com um nome default, como TRANSACTION.LOG.
  2344.  
  2345.       -    Para  de  anotar a transac,a~o mas na~o fecha  o  LOG 
  2346.            corrente.
  2347.  
  2348.       C    Para de anotar a transac,a~o e fecha o LOG corrente.
  2349.  
  2350.       S    Transmite o LOG. Se aberto, fecha-o primeiro.
  2351.  
  2352.           Anotar  uma transac,a~o  e' registrar o  progresso  de 
  2353.       transfere^ncias  de arquivos.  Deve conter entradas mos
  2354.       trando  o nome de cada arquivo  transferido,  quando  a 
  2355.       transfere^ncia comec,ou e quando acabou,  se terminou com 
  2356.       sucesso e, se na~o, por que.
  2357.  
  2358. V     Arma  ou inquire uma varia'vel.  O comando pode ser S ou 
  2359.       Q. O primeiro argumento  e' o nome da varia'vel. O segun
  2360.       do, se houver, e' seu valor.
  2361.  
  2362. S     Arma  o  valor  da varia'vel especificada  com  o  valor             
  2363.       especificado.   Se   o  valor  for  nulo,   elimina   a             
  2364.       varia'vel.  Se  ela na~o existe,  cria.  O  SERVER   deve             
  2365.       responder  com  um  ACK  cujo  campo  de  dados  conte'm             
  2366.       um  Y  para  indicar que a varia'vel  foi  preparada  ou             
  2367.       N,  caso  contra'rio;  um  campo  de  dados  vazio  vale             
  2368.       um Y.
  2369.  
  2370. Q     questiona  sobre  o  valor da  varia'vel  declarada.  Se            
  2371.       na~o  for  declarado um nome,  mostra o valor  de  todas            
  2372.       as  varia'veis  ativas.   O  SERVER  responde  com   uma            
  2373.       resposta  curta  ou  longa,  como  descrito  acima.  Se            
  2374.       a varia'vel na~o existe, volta um valor nulo.
  2375.  
  2376.       Os nomes das varia'veis sa~o cadeias de caracteres e  tem 
  2377. caracteres  como valores.  Podem ser esta'ticas ou  dina^micas. 
  2378. Por  exemplo,  um  SERVER  pode ter varia'veis  built-in  como 
  2379. "SYSTEM NAME",  que nunca mudam, ou outras como "MAIL STATUS" 
  2380. que,  quando  inquirida,  faz com que o SERVER busque  alguma 
  2381. corresponde^ncia para o usua'rio.
  2382.  
  2383.  
  2384. ..@cd
  2385. 8.2.6.  Comandos de Host
  2386. ..@ihost, comandos
  2387. ..@icomandos de host
  2388.  
  2389.       Sa~o  conceitualmente simples mas podem ser difi'ceis  de 
  2390. implementar em alguns sistemas. O pacote C contem um texto em 
  2391. seu  campo  de  dados  que  e'  simplesmente  passado  para  o 
  2392. processador  de  comandos  do  sistema  do  host  do  SERVER; 
  2393. qualquer  sai'da desse processador  e' mandada de volta para  o 
  2394. usua'rio no KERMIT em pacotes, em mensagens curtas ou longas.
  2395.  
  2396.       A  implementac,a~o  dessa facilidade sob  UNIX,  com  sua 
  2397. estrutura  processual em "fork" e seu redirecionamento de I/O 
  2398. via  "pipes",   e' muito natural.  Em outros sistemas pode  se 
  2399. tornar virtualmente impossi'vel.
  2400.  
  2401.  
  2402. ..@cd
  2403. 8.2.7. Trocando Para^metros Antes de Comandos SERVER
  2404. ..@iSERVER, trocando parms antes
  2405.  
  2406.       No   KERMIT  ba'sico,   a  troca  SEND-INIT  sempre    e' 
  2407. suficiente para configurar os dois lados entre si.  Por outro 
  2408. lado,  durante uma operac,a~o SERVER,  algumas operac,o~es  podem 
  2409. na~o  comec,ar com um pacote SEND-INIT.  Por exemplo,  quando o 
  2410. USER  manda um pacote R (pedindo para mandar um  arquivo),  o 
  2411. SERVER  escolhe que opc,a~o de checagem de bloco usar.  Ou se o 
  2412. usua'rio pede uma listagem do direto'rio, o SERVER na~o sabe que 
  2413. comprimento de pacote usar.
  2414.  
  2415.       A  soluc,a~o  e' o pacote "I" (INIT-INFO).  E'  exatamente 
  2416. como  um  pacote SEND-INIT e o ACK age  exatamente  da  mesma 
  2417. forma.  Entretanto,  a recepc,a~o de um pacote I na~o implica na 
  2418. transic,a~o para o status de transmissa~o de arquivo. A troca do 
  2419. pacote I simplesmente permite que os dois lados  ajeitem seus 
  2420. para^metros, preparando-se para a pro'xima transac,a~o.
  2421.  
  2422.       Um  SERVER em espera de comando deve ser capaz de rece
  2423. ber um pacote I e mandar um ACK por ele.  Um KERMIT USER,  no 
  2424. entanto,  na~o precisa mandar pacotes I;  neste caso, o SERVER 
  2425. assume  todos os valores default para o USER relacionados  na 
  2426. sec,a~o sobre prefixac,a~o,  neste capi'tulo, ou qualquer que seja 
  2427. o valor para o para^metro, armado por outro meio (por exemplo, 
  2428. comandos  SET teclados para o SERVER antes dele ser posto  em 
  2429. modo SERVER).
  2430.  
  2431. .cp5
  2432. ..@bd
  2433. 8.3.  Tipos alternativos de checagem de bloco
  2434. ..@itipos alternativos de checagem de bloco
  2435. ..@ichecagem de blocos, tipos alternativos
  2436. ..@ibloco, tipos alternativos de checagem
  2437.  
  2438.       Existem dois tipos opcionais de cheques de bloco:
  2439.  
  2440. TIPO 2
  2441. ======
  2442.       Um checksum de 2 caracteres baseado nos 12 bits de mais 
  2443. baixa  ordem da soma aritme'tica dos caracteres no pacote  (do 
  2444. campo  de  comprimento   ate' o u'ltimo caracter  do  campo  de 
  2445. dados, inclusives) como se segue:
  2446.  
  2447.                             1              2
  2448.             ---------+--------------+-------------+
  2449.                dados | char(B6-B11) | char(B0-B5) |
  2450.             ---------+--------------+-------------+
  2451.  
  2452.       Por  exemplo,  se  o  resultado de 16  bits for  154321 
  2453. (octal), os dois caracteres de checagem de bloco seriam "C1".
  2454.  
  2455.  
  2456. TIPO 3
  2457. ======
  2458.       Um CRC-CCITT de 3 caracteres de 16 bits.  O ca'lculo CRC 
  2459. trata os dados que opera como uma cadeia de bits com o bit de 
  2460. mais  baixa  ordem do primeiro caracter primeiro e o  bit  de 
  2461. mais  alta  ordem  do u'ltimo caracter  por  u'ltimo.  O  valor 
  2462. inicial do CRC  e' 0;  o CRC de 16 bits  e' o resto da  divisa~o 
  2463. da cadeia pelo polino^mio
  2464.  
  2465.                        16    12    5
  2466.                       X   + X   + X  + 1
  2467.  
  2468. (este ca'lculo,  na realidade,  pode ser feito um byte de cada 
  2469. vez, usando-se uma tabela simples e um algori'tmo de busca). O 
  2470. resultado  e' representado como tres caracteres imprimi'veis no 
  2471. fim do pacote, assim:
  2472.  
  2473.  
  2474.     ---------+---------------+--------------+--------------+
  2475.        dados | char(B12-B15) | char(B6-B11) | char (B0-B5) |
  2476.     ---------+---------------+--------------+--------------+
  2477.  
  2478.       Por  exemplo,  se  o resultado de 16  bits  for  154321 
  2479. (octal), enta~o o cheque de bloco de 3 caracteres seria "-C1". 
  2480. A   te'cnica   CRC   escolhida  aqui   concorda   com   muitas 
  2481. implementac,o~es de hardware (p.e. a instruc,a~o CRC do VAX). Uma 
  2482. refere^ncia  u'til  para  ca'lculos de CRC por tabela  pode  ser 
  2483. vista no artigo "BYTE-WISE CRC CALCULATIONS" de  Aram  Perez, 
  2484. na IEEE MICRO de junho de 1983, pa'gina 40.
  2485.  
  2486.       O  checksum  de  um u'nico caracter  se  provou  deveras 
  2487. adequado na pra'tica.  As outras opc,o~es  so' podem ser emprega
  2488. das   se os dois lados concordarem via troca de pacotes  INIT 
  2489. (S ou I). Os cheques de bloco de 2 ou 3 caracteres tambe'm  so' 
  2490. devem  ser empregados sob severas condic,o~es de rui'do de linha 
  2491. e adulterac,a~o de pacotes.
  2492.  
  2493.       Ja'   que  cheques dos tipos 2 e 3  sa~o  opcionais,  nem 
  2494. todos os KERMITs sa~o capazes de entende^-los. Por este motivo, 
  2495. uma comunicac,a~o deve comec,ar com o tipo 1. Se durante a troca 
  2496. de pacotes S ou I o uso dos tipos 2 ou 3 forem aceitos  pelos 
  2497. dois lados,  a mudanc,a  sera' levada a cabo somente depois que 
  2498. o  SEND-INIT  houver sido enviado e um ACK por ele  recebido, 
  2499. usando-se o tipo 1 de checagem de bloco. Isto significa que o 
  2500. primeiro pacote com checagem do tipo 2 ou 3 sempre  sera' um F 
  2501. ou  um X.  Depois de completada a transac,a~o,  ambos os  lados 
  2502. devem  voltar  ao tipo 1 (uma vez que nenhum dos  dois  lados 
  2503. pode saber se o outro parou e recomec,ou). A transac,a~o termina 
  2504. depois que um pacote B ou E foi transmitido e recebeu seu ACK 
  2505. ou  depois de haver ocorrido qualquer erro que  terminasse  a 
  2506. transac,a~o prematura ou anormalmente.
  2507.  
  2508.       Uma conseque^ncia desta regra   e' que se se vai usar  uma 
  2509. checagem de bloco do tipo 2 ou 3,  uma resposta longa mandada 
  2510. pelo  SERVER deve comec,ar com um pacote SEND-INIT (S),  mesmo 
  2511. se uma troca de pacote I  ja' ocorreu.  Se o tipo 1 esta' sendo 
  2512. empregado, o pacote S pode ser enviado e a transfere^ncia pode 
  2513. comec,ar com um pacote X ou F.
  2514.  
  2515.       Um SERVER que completou uma transac,a~o e  esta' esperando 
  2516. um  novo comando pode mandar NAKs perio'dicos por ele  (pacote 
  2517. 0). Tais NAKs devem ter cheques de bloco do tipo 1.
  2518.  
  2519.       O  uso  de  tipos alternados de cheques de  bloco  pode 
  2520. causar certas complicac,o~es.  Por exemplo,  se o SERVER recebe 
  2521. um  erro  "horri'vel"  (ta~o ruim que nem  consegue  mandar  um 
  2522. pacote  de erro) e reverte em espera de comando,  o  fato  de 
  2523. ficar mandando NAKs por pacote 0, usando cheque de bloco tipo 
  2524. 1,  enquanto  uma transfere^ncia usando tipo 2 ou 3 estava  em 
  2525. progresso,   fara'  com  que  nenhum dos lados seja  capaz  de 
  2526. entender  os pacotes do outro.  A comunicac,a~o pode  inclusive 
  2527. se estrangular se
  2528.  
  2529.       A  manda  um SEND-INIT pedindo cheque de bloco tipo  3, 
  2530.            por exemplo,
  2531.  
  2532.       B  ACK  o pedido,  passa para tipo 3 e  espera  por  um 
  2533.            pacote X ou F com cheque de bloco deste tipo mas o 
  2534.            ACK se perdeu; dai'...
  2535.  
  2536.       A retransmite o pacote S com tipo 1.
  2537.  
  2538.       Situac,o~es   como  esta  se  resolvera~o,   na  pior  das 
  2539. hipo'teses,  depois que os dois lados atinjam seus limites  de 
  2540. retransmisso~es mas podem ser retificadas antes atrave's do uso 
  2541. de duas heuri'sticas:
  2542.  
  2543. - a rotina de leitura de pacotes assume que se o pacote   e' S, 
  2544. enta~o o tipo de cheque de bloco e' o 1;
  2545.  
  2546. - um pacote NAK na~o tem conteu'do em seu campo de dados;   dai' 
  2547. o  tipo de cheque de bloco pode ser deduzido pela  rotina  de 
  2548. leitura  de pacotes pelo campo de comprimento de um  NAK;  de 
  2549. fato,   e'  o  valor do campo de comprimento menos 2;  um  NAK 
  2550. pode,  assim,  ser  encarado  com um tipo  de  "sincronizador 
  2551. universal".
  2552.  
  2553.       Estas  heuri'sticas  tendem  a  desvirtuar  a   natureza 
  2554. desenhada  do protocolo,  uma vez que a rotina de leitura  de 
  2555. pacotes  normalmente  na~o  deve se preocupar com  o  tipo  de 
  2556. pacote (que  e' de interesse do ni'vel de aplicac,a~o que chama a 
  2557. rotina  de leitura de pacotes).  Um desenho melhor teria cada 
  2558. pacote  inclui'do  como um indicador do tipo  de  seu  pro'prio 
  2559. cheque   de   bloco;   isto  deixaria  o  tipo  ser   trocado 
  2560. dinamicamente durante uma transac,a~o.   Mas e' muito tarde para 
  2561. isto, agora...
  2562.  
  2563.  
  2564. ..@bd
  2565. 8.4.  Interrompendo uma transfere^ncia de arquivo
  2566. ..@itransferencia, interrompendo
  2567. ..@iinterrompendo transferencia
  2568. ..@iarquivo, interrompendo transferencia
  2569.  
  2570.       Esta   sec,a~o  descreve  uma  facilidade   opcional   do 
  2571. protocolo  KERMIT que permite uma interrupc,a~o elegante de uma 
  2572. transfere^ncia  de arquivo.  Esta facilidade na~o se  relaciona 
  2573. com operac,a~o de SERVER.
  2574.  
  2575.       Para interromper o envio de um arquivo, mande um pacote 
  2576. EOF (Z) em lugar do pro'ximo pacote de dados,  incluindo um  D 
  2577. (que  significa  "dispense") no campo de  dados.  O  receptor 
  2578. manda  um  ACK pelo pacote Z,  normalmente,  mas na~o retem  o 
  2579. arquivo.  Isto  na~o  interfere  com os  antigos  KERMITs  que 
  2580. estiverem na recepc,a~o:  eles na~o inspecionam o campo de dados 
  2581. e  fecham  normalmente  o  arquivo.   O  mecanismo  pode  ser 
  2582. engatilhado teclando-se um caracter de interrupc,a~o no console 
  2583. do  programa  KERMIT transmissor.  Se um  grupo  de  arquivos 
  2584. (wildcard)   esta'  sendo mandado,   e' possivel pular  para  o 
  2585. pro'ximo  arquivo ou encerrar todo o batch.   O protocolo e'  o 
  2586. mesmo  em  qualquer  um  dos casos mas  a  ac,a~o  poderia  ser 
  2587. selecionada  por diferentes caracteres de  interrupc,a~o,  e.g. 
  2588. CTRL-X para passar para o pro'ximo arquivo, CTRL-Z para acabar 
  2589. de uma vez.
  2590.  
  2591.       Para  interromper  o receptor,  ponha um X no campo  de 
  2592. dados  de um ACK por um pacote de dados.  Para interromper  a 
  2593. recepc,a~o de todo um grupo de arquivos,  use um Z.  O  usua'rio 
  2594. pode  engatilhar  este  mecanismo  teclando  um  caracter  de 
  2595. interrupc,a~o,  digamos,  CTRL-X ou CTRL-Z, respectivamente, no 
  2596. console  do KERMIT receptor.  Um transmissor que conhec,a  tal 
  2597. facilidade,  ao  encontrar  um desses  co'digos,  agiria  como 
  2598. descrito  acima:  mandaria  um pacote Z com um co'digo  D;  um 
  2599. transmissor  que na~o implemente esta facilidade  simplesmente 
  2600. ignoraria os co'digos e continuaria transmitindo. Neste caso e 
  2601. se o usua'rio quizesse interromper todo o batch (ou somente um 
  2602. arquivo), o programa KERMIT receptor, depois de descobrir que 
  2603. o  transmissor  ignorou o co'digo X ou Z,  poderia  mandar  um 
  2604. pacote de erro (E) para parar a transfere^ncia.
  2605.  
  2606.       O  transmissor pode tambe'm decidir mandar um  pacote  Z 
  2607. contendo  o co'digo D quando descobre que o arquivo que   esta' 
  2608. transmitindo  na~o pode ser enviado correta ou  completamente. 
  2609. Por  exemplo,  depois  de haver mandado  corretamente  alguns 
  2610. pacotes,  aparece um erro de leitura; ou repara que o "oitavo 
  2611. bit"  de  um  dos bytes do arquivo de texto que   esta'  sendo 
  2612. transmitido   esta' ligado e na~o sa havia feito  proviso~es  de 
  2613. transmissa~o de oito bits.
  2614.  
  2615.  
  2616. ..@bd
  2617. 8.5.  Transmitindo atributos de arquivos
  2618. ..@iarquivo, transmitindo atributos
  2619. ..@iatributos
  2620. ..@itransmitindo atributos de arquivos
  2621.  
  2622.       O  pacote opcional de atributos (A) prove^ um  mecanismo 
  2623. para que o transmissor de um arquivo possa dar maiores infor
  2624. mac,o~es sobre ele.  Este pacote pode ser mandado se o receptor 
  2625. indicar  sua  capacidade  em processa'-lo,  ligando o  bit  de 
  2626. atributo  na ma'scara de capacidade.  Se os dois  lados  ligam 
  2627. este bit na ma'scara de capacidade,  o transmissor,  depois de 
  2628. mandar  o  nome  do  arquivo  no pacote F  e  receber  o  ACK 
  2629. correspondente, pode (mas na~o tem que) mandar um pacote A com 
  2630. informac,o~es de atributos do arquivo.
  2631.  
  2632.       Ligar  o bit de atributo na ma'scara de  capacidade  na~o 
  2633. indica suporte a qualquer atributo em particular, somente que 
  2634. o receptor esta' preparado para receber o pacote A.
  2635.  
  2636.       Os  atributos sa~o mandados no campo de dados do  pacote 
  2637. A.  Este  campo  consiste de 0 ou mais subcampos,  que  podem 
  2638. ocorrer  em  qualquer ordem.  Cada subcampo   e'  da  seguinte 
  2639. forma:
  2640.  
  2641.           +----------+-------------------+-------+
  2642.           | atributo | char(comprimento) | dados |
  2643.           +----------+-------------------+-------+
  2644.  
  2645. onde
  2646.  
  2647. atributo   e'   um  u'nico  caracter  imprimi'vel  diferente  de 
  2648.            espac,o,
  2649.  
  2650. comprimento  e'  o  comprimento dos caracteres de dados  (0  a 
  2651.            94), com 32 somado para produzir um u'nico caracter 
  2652.            imprimi'vel e
  2653.  
  2654. dados      e'   "comprimento"  caracteres  com  dados,   todos 
  2655.            imprimi'veis.
  2656.  
  2657.       Nenhuma prefixac,a~o ou marcac,a~o e' feita nesses dados.
  2658.  
  2659.       Mais  de  um pacote de atributos pode  ser  mandado.  A 
  2660. u'nica  exige^ncia   e' que todos os pacotes A para  um  arquivo 
  2661. devem seguir imediatamente seu pacote de cabec,alho de arquivo 
  2662. (F) e preceder o primeiro pacote de dados.
  2663.  
  2664.       Podem  existir  93 atributos diferentes,  um para  cada 
  2665. caracter   ASCII  imprimi'vel  diferente  de   espac,o.   Esta~o 
  2666. associados na ordem ASCII.
  2667.  
  2668. ! (ASCII 33)
  2669.            Comprimento. O campo de dados  da' o comprimento em 
  2670.            K (1024) bytes, como um nu'mero decimal imprimi'vel, 
  2671.            e.g.  "!#109".  Isto   permitira'  que  o  receptor 
  2672.            determine   com  antecede^ncia  se  existe   espac,o 
  2673.            suficiente  para  o  arquivo  e/ou  quanto   tempo 
  2674.            durara' a transfere^ncia.
  2675.  
  2676. " (ASCII 34)
  2677.            Tipo.   O   campo  de  dados  pode  conter   algum 
  2678.            indicador  da natureza do  arquivo.  Os  operandos 
  2679.            aparecem dentro de {chaves}, i'tens opcionais entre 
  2680.            [colchetes].
  2681.  
  2682.            A{[xx]} Texto ASCII,  na~o contendo quantidades com 
  2683.                   8 bits,  registros lo'gicos (linhas) delimi
  2684.                   tados pela seque^ncia de caracteres  (marca) 
  2685.                   de  controle [xx],  representada aqui  pela 
  2686.                   sua contraparte imprimi'vel (MJ = CRLF,  J = 
  2687.                   LF etc.). Por exemplo "AMJ" significa que o 
  2688.                   aparecimento  de  #M#J (a seque^ncia  normal 
  2689.                   CRLF  prefixada)  num pacote  de  dados  de 
  2690.                   arquivo indica o fim de um registro,  assu
  2691.                   mindo  que  o prefixo de controle  corrente 
  2692.                   seja "#".   Se [xx] for omitido, sera' assu
  2693.                   mido MJ.
  2694.  
  2695.            B{[xx]} Bina'rio.  [xx]  indica  de que  maneira  o 
  2696.                   arquivo e' bina'rio:
  2697.  
  2698.                   8     (default)  o arquivo  e' uma seque^ncia 
  2699.                         de  bytes de 8 bits,  que  devem  ser 
  2700.                         salvos como esta~o.  O oitavo bit pode 
  2701.                         ser mandado  nu' ou prefixado de acor
  2702.                         do  com a negociac,a~o SEND-INIT acerca 
  2703.                         da prefixac,a~o de oitavo bit.
  2704.  
  2705.                   36    O arquivo  esta' no formato PDP-11, no 
  2706.                         qual 5 dos 7 bits do byte ficam  numa 
  2707.                         palavra de 36 bits,  com o u'ltimo bit 
  2708.                         de  cada palavra representando o "bit 
  2709.                         de paridade" de cada quinto  caracter 
  2710.                         (talvez prefixado).
  2711.  
  2712.            D{x}   Move daqui para atributo de formato
  2713.  
  2714.            F{x}   Move daqui para atributo de formato
  2715.  
  2716.            I{[x]} Imagem.   O arquivo esta' sendo  transmitido 
  2717.                   exatamente  como representado no sistema de 
  2718.                   origem.    Para    uso    entre    sistemas 
  2719.                   semelhantes.  Existem [x] bits usa'veis  por 
  2720.                   caracter,  antes  de  uma  prefixac,a~o.  Por 
  2721.                   exemplo,  para  mandar dados bina'rios de um 
  2722.                   sistema  com  bytes de  9  bits,  pode  ser 
  2723.                   conveniente  mandar 3 caracteres de 6  bits 
  2724.                   para  cada  2  bytes de  9  bits.  O  valor 
  2725.                   default para [x] e' 8.
  2726.  
  2727. # (ASCII 35)
  2728.            Data    de   criac,a~o,    expressa    no    formato 
  2729.            "[yy]yymmdd[hh:mm[:ss]]  (formato  juliano  padra~o 
  2730.            ISO),  e.g.  850731 15:51.   A hora e' opcional; se 
  2731.            dada,   deve  estar  no  formato  "24  horas",  os 
  2732.            segundos podem ser omitidos e um u'nico espac,o deve 
  2733.            separar a hora da data.
  2734.  
  2735. $ (ASCII 36)
  2736.            Identificac,a~o do criador,  expressa numa cadeia de 
  2737.            caracteres de comprimento dado.
  2738.  
  2739. % (ASCII 37)
  2740.            Conta onde  sera' cobrado o arquivo,  expressa numa 
  2741.            cadeia de caracteres de comprimento dado.
  2742.  
  2743. & (ASCII 38)
  2744.            a'rea  onde o arquivo   sera'  armazenado,  expressa 
  2745.            numa cadeia de caracteres de comprimento dado.
  2746.  
  2747. ' (ASCII 39)
  2748.            Password  para  a a'rea descrita acima,  cadeia  de 
  2749.            caracteres.
  2750.  
  2751. ( (ASCII 40)
  2752.            Tamanho  do  bloco.  O  arquivo tem  ou  deve  ser 
  2753.            armazenado com o dado tamanho.
  2754.  
  2755. ) (ASCII 41)
  2756.            Acesso:
  2757.  
  2758.            N      Novo, o caso normal - cria um arquivo com o 
  2759.                   nome dado.
  2760.            S      SUPERSEDE  (OVERWRITE)  qualquer arquivo do 
  2761.                   mesmo nome.
  2762.            A      Acrescenta ao arquivo de nome dado.
  2763.  
  2764. * (ASCII 42)
  2765.            Codificac,a~o:
  2766.  
  2767.            A      ASCII,  codificac,a~o  normal,  com  qualquer 
  2768.                   prefixac,a~o necessa'ria.
  2769.            H      Codificac,a~o hexadecimal (em nibbles).
  2770.            E      EBCDIC  (mandado como se fosse  um  arquivo 
  2771.                   bina'rio).
  2772.            S      Conjunto  de caracteres SIXBIT (equivalente 
  2773.                   a 16).
  2774.            R      RADIX50.
  2775.            X      Encriptado.
  2776.            Q{x}   Codificac,a~o  Huffman  de   compressa~o.   Os 
  2777.                   primeiros x bytes do arquivo sa~o a chave.
  2778.  
  2779. + (ASCII 43)
  2780.            Disposic,a~o  (os  operandos  sa~o  especificados  na 
  2781.            sintaxe do sistema do host receptor):
  2782.  
  2783.            M{usua'rio(s)}    manda o arquivo como correio para 
  2784.                             o(s) usua'rio(s) especificado(s).
  2785.  
  2786.            O{destino}       manda  o  arquivo  como  mensagem 
  2787.                             longa   para   terminal  para   o 
  2788.                             destino  especificado  (terminal, 
  2789.                             JOB ou usua'rio).
  2790.  
  2791.            S{[opc,o~es]}      submete  o  arquivo como  um  JOB 
  2792.                             para  batch do  sistema,  com  as 
  2793.                             opc,o~es especificadas.
  2794.  
  2795.            P{[opc,o~es]}      imprime o arquivo numa impressora 
  2796.                             do   sistema,   com   as   opc,o~es 
  2797.                             especificadas (uma impressora  em 
  2798.                             particular, formula'rio etc.).
  2799.  
  2800.            T                Tecla o arquivo na tela.
  2801.  
  2802.            L{[aaa]}         Carrega  o arquivo na memo'ria  no 
  2803.                             enderec,o dado (opcional).
  2804.  
  2805.            X{[aaa]}         Carrega  o arquivo na memo'ria (no 
  2806.                             enderec,o dado) e executa-o.
  2807.  
  2808.            A                Armazena  o  arquivo;   salva   o 
  2809.                             arquivo  junto com os pacotes  de 
  2810.                             atributo  que  o  precederam,  de 
  2811.                             forma  a poderem ser mandados  de 
  2812.                             volta  ao sistema de  origem  com 
  2813.                             todos seus atributos intactos. Um 
  2814.                             arquivo  armazenado desta maneira 
  2815.                             pode ser marcado especialmente de 
  2816.                             forma que o KERMIT que o mande de 
  2817.                             volta reconhec,a as informac,o~es de 
  2818.                             atributo   como   distintas    do 
  2819.                             arquivo de dados.
  2820.  
  2821. , (ASCII 44)
  2822.            Protec,a~o.  Co'digo  de protec,a~o para o arquivo,  na 
  2823.            sintaxe  do  sistema  de  arquivos  do  host.  Sem 
  2824.            operandos,  armazena  de  acordo  com  a  protec,a~o 
  2825.            default  do  sistema para a  a'rea  designada  como 
  2826.            destino.
  2827.  
  2828.  
  2829. - (ASCII 45)
  2830.            Protec,a~o.  Co'digo  de  protec,a~o para o arquivo  em 
  2831.            relac,a~o  ao  "pu'blico"  ou  ao  "mundo",  expresso 
  2832.            geralmente em uma quantidade de 16  bits,  tornada 
  2833.            imprimi'vel  via  char(),  no  qual os bits  tem  o 
  2834.            seguinte significado:
  2835.  
  2836.            B0: acesso para leitura
  2837.            B1:    "     "  gravac,a~o
  2838.            B2:    "     "  execuc,a~o
  2839.            B3:    "     "  append
  2840.            B4:    "     "  apagar
  2841.            B5: listagem de direto'rio
  2842.  
  2843.                 Um  1 na posic,a~o do bit significa habilitar o 
  2844.            tipo de acesso correspondente,  um 0, proibir. Por 
  2845.            exemplo,  a letra E neste campo daria o acesso   a` 
  2846.            leitura,   execuc,a~o   e   listagem  do   direto'rio 
  2847.            (unchar("E") = 69-32 = 37 = 100101 bina'rio).
  2848.  
  2849.  . (ASCII 46)
  2850.            Ma'quina  e sistema operacional de origem.  E' u'til 
  2851.            em  conjunc,a~o  com  o atributo  de  disposic,a~o  do 
  2852.            arquivo.   Permite   que  um  arquivo,   uma   vez 
  2853.            armazenado,   seja  transferido  entre  diferentes 
  2854.            tipos  de  sistemas,   mantendo  seus  status   de 
  2855.            arquivo,   ate'  que se encontre em uma ma'quina com 
  2856.            as  caracteri'sticas certas  para  utiliza'-lo.   Os 
  2857.            sistemas  sa~o  denotados por co'digos;  o  primeiro 
  2858.            caracter   e'  o designador  maior  de  sistema,  o 
  2859.            segundo indica o modelo ou sistema operacional. Um 
  2860.            terceiro caracter pode ser acrescentado para fazer 
  2861.            maiores  distinc,o~es,   por  exemplo  a  versa~o  do 
  2862.            sistema operacional. Os sistemas abaixo na~o formam 
  2863.            uma   colec,a~o  completa;   muitos  mais  podem   e 
  2864.            provavelmente sera~o inclui'dos.
  2865.  
  2866.            A      Apple Microcomputers
  2867.                   1   Apple ][, DOS
  2868.                   2   Apple III
  2869.                   3   MacIntosh
  2870.                   4   Lisa
  2871.  
  2872.            B      Sperry (UNIVAC) Mainframes
  2873.                   1   Se'rie 1100, EXEC
  2874.  
  2875.            C      CDC Mainframes
  2876.                   1   Se'rie Cyber, NOS
  2877.  
  2878.            D      DEC Systems
  2879.                   1   DECSYSTEM-10/20, TOPS-10
  2880.                   2   DECSYSTEM-10/20, TOPS-20
  2881.                   3   DECSYSTEM-10/20, TENEX
  2882.                   4   DECSYSTEM-10/20, ITS
  2883.                   5   DECSYSTEM-10/20, WAITS
  2884.                   6   DECSYSTEM-10/20, MAXC
  2885.                   7   VAX-11, VMS
  2886.                   8   PDP-11, RSX-11
  2887.                   9   PDP-11, IAS
  2888.                   A   PDP-11, RSTS/E
  2889.                   B   PDP-11, RT-11
  2890.                   C   PROFESSIONAL-300, P/OS
  2891.                   D   WORD PROCESSOR (WPS ou DECMATE), WPS
  2892.  
  2893.            D      Honeywell Mainframes
  2894.                   1   Sistemas Multic
  2895.                   2   Se'rie DPS, CP-6
  2896.  
  2897.            F      Ma'quinas Data General
  2898.                   1   RDOS
  2899.                   2   AOS
  2900.  
  2901.            G      Ma'quinas Prime, PRIMOS
  2902.  
  2903.            H      Ma'quinas Hewlett-Packard
  2904.                   1   HP-1000, RTE
  2905.                   2   HP-3000, MPE
  2906.  
  2907.            I      I.B.M. Se'ries /370 e compati'veis
  2908.                   1   VM/CMS
  2909.                   2   MVS/TSO
  2910.                   3   DOS
  2911.                   4   MUSIC
  2912.                   5   GUTS
  2913.                   6   MTS
  2914.  
  2915.            J      Tandy Microcomputers, TRSDOS
  2916.  
  2917.            K      Atari Micros, DOS
  2918.  
  2919.            L-T    (reservado)
  2920.  
  2921.            U      Sistemas operacionais ou arquivos porta'veis
  2922.                   1   UNIX
  2923.                   2   Software Tools
  2924.                   3   CP/M-80
  2925.                   4   CP/M-86
  2926.                   5   CP/M-68K
  2927.                   6   MP/M
  2928.                   7   CP/M concorrente
  2929.                   8   MS-DOS
  2930.                   9   UCSD P-system
  2931.                   A   MUMPS
  2932. / (ASCII 47)
  2933.            Formato dos dados dentro dos pacotes.
  2934.  
  2935.            A{xxx}       Registros delimitados de  comprimento 
  2936.                         varia'vel,  terminados  pela seque^ncia 
  2937.                         de  caracteres {xx},  onde xx  e'  uma 
  2938.                         cadeia  de caracteres de um  ou  mais 
  2939.                         caracteres de controle,  representado 
  2940.                         aqui     por    seus     equivalentes 
  2941.                         imprimi'veis na~o prefixados,  e.g.  MJ 
  2942.                         para ^M^J (CRLF).
  2943.  
  2944.            D{x}         Registros    na~o    delimitados    de 
  2945.                         comprimento  varia'vel.  Cada registro 
  2946.                         lo'gico   comec,a  com  um   campo   de 
  2947.                         comprimento    de   {x}    caracteres 
  2948.                         decimais  ASCII  (similar ao  formato 
  2949.                         ANSI "D" de fita).  Por exemplo, "D$" 
  2950.                         indicaria campos de comprimento de  4 
  2951.                         di'gitos, como "0123".
  2952.  
  2953.            F{xxxx}      Registros    na~o    delimitados    de 
  2954.                         comprimento   fixo.   Cada   registro 
  2955.                         lo'gico tem {xxxx} bytes.
  2956.            
  2957.            R{x}         Para  transfere^ncias orientadas  para 
  2958.                         registros,  a ser empregado combinado 
  2959.                         com um dos formatos dados acima. Cada 
  2960.                         registro  comec,a (no caso do  formato 
  2961.                         D,  depois  co campo de  comprimento) 
  2962.                         com   um  campo  de  posic,a~o  de  {x} 
  2963.                         caracteres  indicando  a  posicao  do 
  2964.                         byte  dentro  do  arquivo  onde  este 
  2965.                         registro deve ser colocado.
  2966.  
  2967. 0 (ASCII 48)
  2968.            Para^metros  especiais dependentes de sistema  para 
  2969.            armazenar  o arquivo no sistema  de  origem,  para 
  2970.            especificac,a~o  de atributos exo'ticos na~o  cobertos 
  2971.            explicitamente  por  qualquer dos  descritores  de 
  2972.            atributos  do KERMIT.  Sa~o dados por uma cadeia de 
  2973.            caracteres  na pro'pria linguagem do  sistema,  por 
  2974.            exemplo uma lista de para^metros de uma DCB, usando 
  2975.            a Job Control Language IBM.
  2976.  
  2977. 1-@ (ASCII 49-64) (reservado)
  2978.  
  2979.       Outros  atributos podem ser imaginados e  acrescentados 
  2980. mais tarde,  se desejado. No entanto, dois pontos importantes 
  2981. devem ser observados:
  2982.  
  2983.     - O receptor pode na~o ter, absolutamente, forma alguma de 
  2984.       honrar, ou mesmo gravar, um dado atributo. Por exemplo, 
  2985.       o  CP/M-80  na~o  tem  lugar para data  de  criac,a~o  nem 
  2986.       identificac,a~o do criador em sua FCB; o DEC-20 na~o tem o 
  2987.       conceito de tamanho de bloco etc.
  2988.  
  2989.     - O receptor pode na~o ter forma de determinar os  valores 
  2990.       corretos   de   qualquer   dos   atributos.    Isto   e' 
  2991.       particularmente   verdade  ao  transmitir  arquivos  de 
  2992.       origem estrangeira.
  2993.  
  2994.  
  2995.       O  mecanismo do pacote A prove^ somente uma  maneira  de 
  2996. mandar  certas informac,o~es sobre um arquivo para o  receptor, 
  2997. sem  garantia  do  que pode ser feito por quem recebe  com  o 
  2998. arquivo.  Tal  informac,a~o pode ser conseguida diretamente  da 
  2999. entrada   no   direto'rio  do  arquivo   (FCB,FDB,   ...)   ou 
  3000. especificado via comando de usua'rio.
  3001.  
  3002.       O ACK pelo pacote A pode,  por sua vez, ter informac,o~es 
  3003. em  seu  campo  de  dados.  No  entanto,  nenhuma  negociac,a~o 
  3004. complicada  acerca  de atributos de arquivo pode  ter  lugar, 
  3005. porisso  o  resultado  li'quido  e' que o receptor  tanto  pode 
  3006. aceitar quanto recusar o arquivo.  Pode responder ao pacote A 
  3007. com um ACK contendo,  em seu campo de dados,  qualquer um dos 
  3008. co'digos a seguir:
  3009.  
  3010. <NULL>     (campo de dados vazio) Aceitei o arquivo;   va'  em 
  3011.            frente, transmita-o!
  3012.  
  3013. N{[xxx]}   Recusarei  o  arquivo  como  especificado,  na~o  o 
  3014.            transmita! [xxx]  e' uma cadeia de zero ou mais dos 
  3015.            caracteres   de  atributo  listados  acima,   para 
  3016.            especificar  quais aqueles estou rejeitando  (e.g. 
  3017.            "!"  significa  que  e' muito longo,  "&"  que  na~o 
  3018.            tenho acesso a` a'rea especificada etc.)
  3019.  
  3020. Y{[xxx]}   Concordo em receber o arquivo mas na~o posso honrar 
  3021.            os atributos [xxx],  de modo que armazena-lo-ei de 
  3022.            acordo com meus pro'prios defaults.
  3023.  
  3024. Y          (caso  degenerado  do  anterior,   equivalente  ao 
  3025.            <NULL>, acima.)
  3026.  
  3027.       Como  o receptor realmente responde,  e' uma decisa~o  de 
  3028. implementac,a~o.  Um  NAK  em resposta ao pacote  A  significa, 
  3029. claro, que o receptor na~o recebeu o "A" corretamente, na~o que 
  3030. se recuse a receber o arquivo.
  3031.  
  3032.  
  3033. ..@bd
  3034. 8.6.  Tabela de estados do Protocolo KERMIT Avanc,ado
  3035. ..@iestado, tabela avancada
  3036. ..@iprotocolo, estados avancados
  3037. ..@itabela dos estados do protocolo avancado
  3038.  
  3039.       A tabela simples apresentada anteriomente  e' suficiente 
  3040. para se implementar um KERMIT ba'sico.  A tabela de estados  a 
  3041. seguir  cobre  todo  o  protocolo  KERMIT,   incluindo  desde 
  3042. modo SERVER e comandos de transmissa~o  ate' KERMIT SERVER. Na~o 
  3043. inclui o manuseio do pacote A,  de atributos de arquivo. Note 
  3044. que  os estados cujos nomes comec,am com "SEND" sempre  mandam 
  3045. um pacote cada vez que entram (mesmo quando o estado anterior 
  3046. era  o mesmo).  Estados que comec,am com "REC" sempre  esperam 
  3047. por  um pacote a ser recebido  (ate' o limite para timeout)  e 
  3048. processa  o pacote recebido.  Estados cujos nomes na~o incluem 
  3049. "SEND"  ou  "REC"  na~o  processam  pacotes  diretamente;  Sa~o 
  3050. estados que executam alguma operac,a~o local e mudam para outro 
  3051. estado.
  3052.  
  3053.       O  estado inicial  e' determinado pelo comando do  usua'
  3054. rio.  Um comando "SERVER" entra em REC-SERVER-IDLE  (inativi
  3055. dade R/S).  Um comando "SEND" entra em SEND-INIT.  Um comando 
  3056. "RECEIVE" (a antiga versa~o na~o-SERVER,  na~o um comando "GET") 
  3057. entra  em REC-INIT.  Qualquer comando gene'rico,  o "GET" e  o 
  3058. "HOST"  entram tanto em SEND-SERVER-INIT quanto em  SEND-GEN-
  3059. CMD, dependendo da resposta esperada.
  3060.  
  3061.       Sob "MENS.REC." (mensagem recebida),  e' mostrado o tipo 
  3062. de  pacote  da mensagem que chega,  seguido pelo nu'mero  dele 
  3063. entre pare^nteses;  (n)  e' o pacote corrente,  (n-1) e (n+1) o 
  3064. pre'vio e pro'ximo pacote (mo'dulo 64), (0)  e' pacote 0. Seguin
  3065. do  o nu'mero do pacote pode aparecer uma barra e  uma  letra, 
  3066. indicando  algum sinal especial no campo de dados.  Por exem
  3067. plo,  Z(n)/D indica um pacote Z (EOF),  nu'mero sequencial  n, 
  3068. com um "D" em seu campo de dados.
  3069.  
  3070.       Sob "AC,A~O", "R+" significa que o contador de tentativas  
  3071. e'  incrementado e comparado com um limite.  Se tal limite for 
  3072. excedido,  um pacote de erro  e' mandado e o estado muda  para 
  3073. "ABORT".  "N+" quer dizer que o nu'mero de pacote  e' incremen
  3074. tado,  mo'dulo 64, e o contador de tentativas, R,  e' devolvido 
  3075. a zero.
  3076. .pa
  3077. ESTADO     MENS.REC.      AC,A~O                PROX.ESTADO
  3078. ======     =========      ====                ===========
  3079.  
  3080. REC-SERVER-IDLE -- SERVER esperando alguma mensagem
  3081.  
  3082.       Po~e N e R em 0
  3083.  
  3084.            I(0)           Manda ACK           REC-SERVER-IDLE
  3085.            S(0)           Processa parms,
  3086.                            ACK c/parms, N+    REC-FILE
  3087.            R(0)           Salva nome.arq.     SEND-INIT
  3088.  
  3089.            K, C, OR G(0)  Resposta curta:
  3090.                            ACK(0)/REPLY       REC-SERVER-IDLE
  3091.                           Resposta longa:
  3092.                            INIT necessario    SEND-INIT
  3093.                            INIT desnecessario,
  3094.                                 N+            OPEN-FILE
  3095.  
  3096.            TIMEOUT        Manda NAK(0)        REC-SERVER-IDLE
  3097.            outro          erro                REC-SERVER-IDLE
  3098.  
  3099.  
  3100. REC-INIT -- Entrada p/ comando RECEIVEde na~o-SERVER
  3101.  
  3102.       Po~e N e R em 0
  3103.  
  3104.            S(0)           Proces.parms, manda
  3105.                           ACK c/parms, N+     REC-FILE
  3106.            TIMEOUT        manda NAK(0),R+     REC-INIT
  3107.            outro          NAK                 ABORT
  3108.  
  3109.  
  3110. REC-FILE -- Busca mensagem de cabec,alho de arquivo ou de EOT
  3111.  
  3112.            F(N)           Abre arq., ACK, N+  REC-DATA
  3113.            X(N)           Prepara p/ mostrar
  3114.                            na tela,ACK, N+    REC-DATA
  3115.            B(N)           ACK                 COMPLETE
  3116.            S(N-1)         ACK c/ parms, R+    REC-FILE
  3117.            Z(N-1)         ACK, R+             REC-FILE
  3118.            TIMEOUT        NAK, R+             REC-FILE
  3119.            outro          NAK                 ABORT
  3120.  
  3121.  
  3122. REC-DATA -- Recebe dados ate' final de arquivo
  3123.  
  3124.            D(N)           Guarda dados,ACK,N+;
  3125.                            se quer interrup-
  3126.                            c,a~o,
  3127.                             inclua X ou Z 
  3128.                              no ACK           REC-DATA
  3129.            D(N-1)         Manda ACK,R+        REC-DATA
  3130.            Z(N)           Fecha arq.,ACK,N+   REC-FILE
  3131.            Z(N)/D         Abandona arq,ACK,N+ REC-FILE
  3132.            F(N-1)         Manda ACK,R+        REC-DATA
  3133.            X(N-1)         Manda ACK,R+        REC-DATA
  3134.            TIMEOUT        Manda ACK,R+        REC-DATA
  3135.            outro          Manda E             ABORT
  3136.  
  3137.  
  3138. SEND-INIT -- Entrada p/ comando SEND tambe'm
  3139.  
  3140.       Po~e N e R em 0, Manda S(0) com para^metros
  3141.  
  3142.            Y(0)           Processa parms,N+   OPEN-FILE
  3143.            N, TIMEOUT     R+                  SEND-INIT
  3144.            outro          R+                  SEND-INIT
  3145.  
  3146.  
  3147. OPEN-FILE -- Abre arquivo ou prepara texto para enviar
  3148.  
  3149.                                               SEND-FILE
  3150.  
  3151.  
  3152. SEND-FILE -- Manda cabec,alho ou arquivo de texto
  3153.  
  3154.       Manda F ou X(n)
  3155.  
  3156.            Y(N), N(N+1)   Pega prim.buffer
  3157.                            de dados,N+        SEND-DATA ou
  3158.                                                SEND-EOF se
  3159.                                                arq.vazio
  3160.                                                ou texto
  3161.            N, TIMEOUT     R+                  SEND-FILE
  3162.            outro                              ABORT
  3163.  
  3164.  
  3165. SEND-DATA -- Manda conteu'do de arquivo ou informac,a~o textual
  3166.  
  3167.       Manda D(n) com buffer corrente
  3168.  
  3169.            Y(N), N(N+1)   N+, Pega prox.buff  SEND-DATA ou
  3170.                                                SEND-EOF se
  3171.                                                no fim do
  3172.                                                arq. ou texto
  3173.            Y(N)/X ou Z    N+                  SEND-EOF
  3174.            N, TIMEOUT     R+                  SEND-DATA
  3175.            outro                              ABORT
  3176.  
  3177.  
  3178. SEND-EOF -- Manda indicador de fim de arquivo
  3179.  
  3180.       Manda Z(n); se interrompendo, manda Z(n)/D
  3181.            Y(N), N(N+1)   Abre prox.arq.,N+   SEND-FILE se
  3182.                                                mais ou
  3183.                                                SEND-BREAK se
  3184.                                                acabou ou se
  3185.                                                interrupc,a~o
  3186.                                                "Z".
  3187.            N,TIMEOUT      R+                  SEND-EOF
  3188.            outro                              ABORT
  3189.  
  3190.  
  3191. SEND-BREAK -- Fim de Transac,a~o (END OF TRANSACTION)
  3192.  
  3193.       Manda B(n)
  3194.  
  3195.            Y(N), N(0)                         COMPLETE
  3196.            N(N), TIMEOUT                      SEND-BREAK
  3197.            outro                              ABORT
  3198.  
  3199.  
  3200. SEND-SERVER-INIT  -- Entrada para comandos SERVER que esperam 
  3201.                      resposla longa.
  3202.  
  3203.       Manda I(0) com para^metros
  3204.  
  3205.            Y(0)           Processa parms.     SEND-GEN-CMD
  3206.            N, TIMEOUT     R+                  SEND-SERVER-INIT
  3207.            E              Usa parms. default  SEND-GEN-CMD
  3208.            outro                              ABORT
  3209.  
  3210.  
  3211. SEND-GEN-CMD  -- Entrada para comandos SERVER que esperam 
  3212.                  resposta curta (ACK)
  3213.  
  3214.       Manda G, R ou C(0)
  3215.  
  3216.            S(0)           Processa parms,
  3217.                            ACK c/parms, N+    REC-FILE
  3218.            X(1)           Prepara p/ teclar
  3219.                            no term., N+       REC-DATA
  3220.            Y(0)           Tecla dados no tty  COMPLETE
  3221.            N, TIMEOUT     R+                  SEND-GEN-CMD
  3222.            outro                              ABORT
  3223.  
  3224.  
  3225. COMPLETE -- Transac,a~o completada com sucesso
  3226.  
  3227.       Arma N e R em 0
  3228.       Se SERVER, restaura parms,              REC-SERVER-IDLE
  3229.       sena~o                                EXIT
  3230.  
  3231.  
  3232. ABORT -- Te'rmino prematuro de transac,a~o
  3233.  
  3234.       Restaura qualquer arquivo aberto, arma N e R em 0
  3235.  
  3236.       Se SERVER, restaura para^metros,      REC-SERVER-IDLE
  3237.       sena~o                                EXIT
  3238.  
  3239.  
  3240. EXIT/LOGOUT --termina ou executa "LOGOUT"
  3241.  
  3242.       Note  que  os comandos gene'ricos determinam  o  pro'ximo 
  3243. estado da seguinte maneira:
  3244.  
  3245. 1.    Se  o comando na~o for suportado,  um pacote de erro   e' 
  3246.       transmitido e o pro'ximo estado e' ABORT.
  3247.  
  3248.  
  3249. 2.    Se o comando gera uma resposta que pode caber no  campo 
  3250.       de  dados  de  um ACK,  um ACK  e' mandado com  o  texto 
  3251.       (marcado  como  se fizer necessa'rio) no  seu  campo  de 
  3252.       dados.
  3253.  
  3254. 3.    Se  o  comando  gera  uma resposta grande  ou  tem  que 
  3255.       transmitir um arquivo,  nada  e' mandado do estado  REC-
  3256.       SERVER-IDLE  e o pro'ximo estado  e' ou SEND-INIT (ou  se 
  3257.       na~o  foi  recebida mensagem I ou se deve ser  usado  um 
  3258.       tipo de checagem de bloco alternativo) ou OPEN-FILE (se 
  3259.       chegou  uma  mensagem I ou se deve usar a  checagem  de 
  3260.       bloco de um u'nico caracter).
  3261.  
  3262. 4.    Se  o  comando  e' LOGOUT,   e' mandado um ACK e  o  novo 
  3263.       estado e' LOGOUT.
  3264.  
  3265. 5.    Se o comando  e' EXIT,  e' mandado um ACK e o novo estado 
  3266.       e' EXIT.
  3267. .pa
  3268. .heComandos KERMIT
  3269. ..@adu
  3270. 9.  Comandos KERMIT
  3271. ..@icomandos KERMIT
  3272. ..@iKERMIT, comandos
  3273.  
  3274.       Sugerimos  os  comandos e termos KERMIT como  na  lista 
  3275. abaixo.   Na~o  e' intenc,a~o recomendar um estilo particular  de 
  3276. ana'lise   de  comandos,   somente  promover  um   vocabula'rio 
  3277. consistente,  tanto  em  documentac,a~o quanto na  escolha  dos 
  3278. nomes para os comandos.
  3279.  
  3280.  
  3281. ..@bd
  3282. 9.1.  Comandos Ba'sicos
  3283. ..@icomandos basicos
  3284. ..@icomando, SEND
  3285. ..@iSEND
  3286.  
  3287. SEND       Este  verbo diz ao programa KERMIT para mandar  um 
  3288.            ou  mais  arquivos  de sua  pro'pria  estrutura  de 
  3289.            arquivos.
  3290.  
  3291. ..@iRECEIVE
  3292. ..@icomando, RECEIVE
  3293. RECEIVE    Informa ao KERMIT para esperar um ou mais arquivos 
  3294.            que devem chegar.
  3295. ..@iGET
  3296. ..@icomando, GET
  3297.  
  3298. GET        Diz  a  um USER KERMIT para pedir que o SERVER  do 
  3299.            outro  lado da conexa~o mande um ou mais  arquivos. 
  3300.            Algumas  implementac,o~es  do  KERMIT  tem  comandos 
  3301.            separados de GET e RECEIVE;  outros usam o RECEIVE 
  3302.            para os dois propo'sitos, o que gera confusa~o.
  3303.  
  3304.       O  fato de se poder especificar nomes  diferentes  para 
  3305. arquivos  fonte  e  destino  pode  ser  u'til  e,   a`s  vezes, 
  3306. necessa'rio.   Porisso  esses  comandos  podem  ter  operandos 
  3307. opcionais [entre colchetes] como aparecem abaixo.
  3308.  
  3309. ..@iSEND
  3310. ..@icomando, SEND
  3311. SEND nome-local-fonte [nome-remoto-destino]
  3312.            Se  for inclui'da a especificac,a~o do arquivo em seu 
  3313.            destino,  ela   ira'  no  pacote  de  cabec,alho  de 
  3314.            arquivo, em lugar do nome local.
  3315.  
  3316. ..@iRECEIVE
  3317. ..@icomando, RECEIVE
  3318. RECEIVE [nome-local-de-destino]
  3319.            Se  a especificac,a~o do arquivo em seu  destino   e' 
  3320.            dada,  o arquivo chegante  sera' armazenado sob tal 
  3321.            nome,  ao inve's do que vier no pacote de cabec,alho 
  3322.            de arquivo.
  3323.  
  3324. ..@iGET
  3325. ..@icomando, GET
  3326. GET nome-fonte-remoto [nome-local-destino]
  3327.            Se  o  nome  local  for  especificado,  o  arquivo 
  3328.            chegante     sera'   armazenado   sob   tal   nome, 
  3329.            abandonando o nome que vier no pacote de cabec,alho 
  3330.            de arquivo.
  3331.  
  3332.       Na~o se deve usar nomes alternados se um grupo de arqui
  3333. vos estiver sendo transmitido ou recebido.
  3334.  
  3335.  
  3336. ..@bd
  3337. 9.2.  Comandos de gere^ncia do programa
  3338. ..@icomandos de gerencia do programa
  3339. ..@iprograma, comandos de gerencia
  3340. ..@igerencia, comandos de - do programa
  3341.  
  3342. ..@iEXIT
  3343. ..@icomando, EXIT
  3344. EXIT       Deixa  o programa KERMIT,  fazendo antes  qualquer 
  3345.            limpeza  que seja necessa'ria -- desassociando  pe
  3346.            rife'ricos, fechando arquivos etc.
  3347. ..@iQUIT
  3348. ..@icomando, QUIT
  3349. QUIT       Deixa o programa KERMIT,  sem fazer antes qualquer 
  3350.            arrumac,a~o,  de maneira a permitir alguma posterior 
  3351.            manipulac,a~o de arquivos e perife'ricos.
  3352.  
  3353. ..@iPUSH
  3354. ..@icomando, PUSH
  3355. PUSH       Preserva  o  atual  ambiente  KERMIT  e  entra  no 
  3356.            processador de comandos do sistema.
  3357.  
  3358. ..@iTAKE
  3359. ..@icomando, TAKE
  3360. TAKE       Le^  e  executa  comandos  KERMIT a  partir  de  um 
  3361.            arquivo local.
  3362.  
  3363. ..@iLOG
  3364. ..@icomando, LOG
  3365. LOG        Especifica  um arquivo de LOG para  transac,o~es  de 
  3366.            transfere^ncia   de  arquivos  ou  para  LOGGIN  de 
  3367.            sesso~es de terminal.
  3368.  
  3369.  
  3370. ..@bd
  3371. 9.3.  Comandos de emulac,a~o de terminal.
  3372. ..@icomandos de emulacao de terminal
  3373. ..@iterminal, comandos de emulacao
  3374. ..@iemulacao, comandos de - de terminal
  3375.  
  3376. ..@iCONNECT
  3377. ..@icomando, CONNECT
  3378. CONNECT    Este verbo,  va'lido somente para um KERMIT  local, 
  3379.            significa  entrar  no modo emulac,a~o  de  terminal; 
  3380.            cria  a  ilusa~o  de  ser um  terminal  do  sistema 
  3381.            remoto.   Prove^  um  "caracter  de  escape"   para 
  3382.            permitir que o usua'rio "volte" ao sistema local. O 
  3383.            caracter  de  escape,   quando  teclado,  pede  um 
  3384.            argumento  de um u'nico caracter;  sa~o sugeridos os 
  3385.            seguintes:
  3386.  
  3387.                   0 (zero) transmite um NUL
  3388.                   B transmite um BREAK
  3389.                   C encerra a emulac,a~o
  3390.                   P forc,a   a  entrada  no   processador   de 
  3391.                     comandos do sistema
  3392.                   Q encerra   o  logging  (se  estiver  sendo 
  3393.                     feito)
  3394.                   R reinicia (RESUME) o logging
  3395.                   S mostra o status da conexa~o
  3396.                   ? mostra  os  argumentos  va'lidos  para   o 
  3397.                     caracter de escape
  3398.                   (outro  caracter  de escape):  transmite  o 
  3399.                   pro'prio caracter de escape
  3400.  
  3401.                 Os equivalentes minu'sculos devem ser aceitos. 
  3402.            Se um argumento inva'lido for teclado, soar um bip.
  3403.  
  3404.       (veja, tambe'm, o comando SET.)
  3405.  
  3406.  
  3407. ..@bd
  3408. 9.4.  Comandos em modo-usua'rio especiais
  3409. ..@icomandos em modo-usuario especiais
  3410. ..@imodo-usuario, comandos especiais
  3411.  
  3412.       Tais comandos somente sa~o usados por USERs em SERVERs.
  3413.  
  3414. ..@icomando, BYE
  3415. ..@iBYE
  3416. BYE        Este  comando  manda uma mensagem  para  o  SERVER 
  3417.            remoto  para que ele se LOGOUT e,  apo's o  sucesso 
  3418.            desta operac,a~o, termina o programa KERMIT local.
  3419.  
  3420. ..@icomando, FINISH
  3421. ..@iFINISH
  3422. FINISH     Forc,a  o SERVER remoto a terminar sem encerrar seu 
  3423.            JOB,  deixando o KERMIT local em ni'vel de comando, 
  3424.            permitindo  que  o  usua'rio se  reconecte  ao  JOB 
  3425.            remoto.
  3426.  
  3427.  
  3428. ..@bd
  3429. 9.5.  Comandos cujo objeto deve ser especificado
  3430. ..@icomandos com objeto
  3431. ..@icomando, com objetos
  3432.  
  3433.       Algumas   implementac,o~es  do  KERMIT  incluem  diversos 
  3434. servic,os de gerenciamento de arquivos locais e comandos  para 
  3435. invoca'-los.  Por exemplo, uma implementac,a~o pode ter comandos 
  3436. que  permitam que voce tenha listagens de  direto'rio,  apague 
  3437. arquivos,   troque  de  discos  e  saiba  quanto  espac,o  tem 
  3438. disponi'vel sem que,  para isto,  tenha que sair e reiniciar o 
  3439. programa.  SERVERs remotos tambe'm podem prover tais servic,os. 
  3440. Um  USER  KERMIT pode ser capaz de distinguir entre  comandos 
  3441. direcionados  ao seu pro'prio sistema daqueles que  devem  ser 
  3442. repassados   para  o  sistema  remoto.   Quando  passi'vel  de 
  3443. confusa~o,  um comando pode ser prefixado por um dos "prefixos 
  3444. objeto":
  3445.  
  3446. ..@iREMOTE
  3447. ..@icomando, REMOTE
  3448. REMOTE     Pede que o SERVER remoto fac,a este servic,o.
  3449.  
  3450. ..@iLOCAL
  3451. ..@icomando, LOCAL
  3452. LOCAL      Faz o servic,o localmente.
  3453.  
  3454.       Se o "prefixo objeto" for omitido,  o comando deve  ser 
  3455. executado localmente. Os servic,os sa~o:
  3456.  
  3457. ..@iLOGIN
  3458. ..@icomando, LOGIN
  3459.  LOGIN      Deve    ser   empregado   no   seu   sentido    de 
  3460.             compartilhamento   de   tempo,   para  criar   uma 
  3461.             identificac,a~o ("JOB", "sessa~o", "acesso", "conta") 
  3462.             no sistema.
  3463.  
  3464. ..@iLOGOUT
  3465. ..@icomando, LOGOUT
  3466. LOGOUT     Para terminar uma sessa~o iniciada com LOGIN.
  3467.  
  3468. ..@iCOPY
  3469. ..@icomando, COPY
  3470. COPY       faz  uma co'pia do arquivo especificado com  o nome 
  3471.            dado.
  3472.  
  3473. ..@iCWD
  3474. ..@icomando, CWD
  3475. CWD        Muda  o direto'rio de trabalho.   Este e'  feio  mas 
  3476.            verbos  naturais  como CONNECT e ATTACH sa~o  muito 
  3477.            imprecisos.   CWD  e' o comando padra~o para  trans
  3478.            fere^ncia de arquivos na ARPANET para invocar  esta 
  3479.            func,a~o.
  3480.  
  3481. ..@iDIRECTORY
  3482. ..@icomando, DIRECTORY
  3483. DIRECTORY  Prove^  uma  lista de nomes e possivelmente  outros 
  3484.            atributos dos  arquivos no direto'rio  de  trabalho 
  3485.            corrente ou especificado.
  3486.  
  3487. ..@iDELETE
  3488. ..@icomando, DELETE
  3489. DELETE     Apaga o(s) arquivo(s) especificado(s).
  3490.  
  3491. ..@iERASE
  3492. ..@icomando, ERASE
  3493. ERASE      Poderia ser um sino^nimo para DELETE.
  3494.  
  3495.                 Na~o  parece  ser  bom  incluir  UNDELETE   ou 
  3496.            UNERASE  na lista padra~o:  a maioria dos  sistemas 
  3497.            na~o  suportam uma func,a~o como esta e na~o  se  deve 
  3498.            brincar com as expectativas de um usua'rio...
  3499.  
  3500. ..@iKERMIT
  3501. ..@icomando, KERMIT
  3502. KERMIT     Manda  um comando para o analisador de comandos do 
  3503.            SERVER remoto.
  3504.  
  3505. ..@iRENAME
  3506. ..@icomando, RENAME
  3507. RENAME     Muda o nome do arquivo especificado.
  3508.  
  3509. ..@iTYPE
  3510. ..@icomando, TYPE
  3511. TYPE       Mostra o conteu'do do arquivo especificado na  tela 
  3512.            do usua'rio.
  3513.  
  3514. ..@iSPACE
  3515. ..@icomando, SPACE
  3516. SPACE      Informa  quanto espac,o  esta' usado e quanto   esta' 
  3517.            disponi'vel   para  armazenamento  de  arquivos  no 
  3518.            direto'rio corrente ou especificado.
  3519.  
  3520. ..@iSUBMIT
  3521. ..@icomando, SUBMIT
  3522. SUBMIT     Submete o arquivo especificado para  processamento 
  3523.            em batch.
  3524.  
  3525. ..@iPRINT
  3526. ..@icomando, PRINT
  3527. PRINT      Imprime   o(s)  arquivo(s)  especificado(s)   numa 
  3528.            impressora.
  3529.  
  3530. ..@iMOUNT
  3531. ..@icomando, MOUNT
  3532. MOUNT      Pede a montagem de um disco, fita ou outro meio de 
  3533.            armazenamento de massa removi'vel.
  3534.  
  3535. ..@iWHO
  3536. ..@icomando, WHO
  3537. WHO        Mostra   quem   esta'  "logado"  (num  sistema   de 
  3538.            timesharing)  ou  da' informac,o~es a respeito de  um 
  3539.            determinado   usua'rio   ou  host  (numa  rede   de 
  3540.            computadores).
  3541.  
  3542. ..@iMAIL
  3543. ..@icomando, MAIL
  3544. MAIL       Manda   uma   corresponde^ncia   eletro^nica    para 
  3545.            determinado(s) usua'rio(s).
  3546.  
  3547. ..@iMESSAGE
  3548. ..@icomando, MESSAGE
  3549. MESSAGE    Manda  uma  mensagem  de terminal  (numa  rede  ou 
  3550.            sistema de timesharing).
  3551.  
  3552. ..@iHELP
  3553. ..@icomando, HELP
  3554. HELP       Da' breves informac,o~es sobre como usar o KERMIT.
  3555.  
  3556. ..@iSET
  3557. ..@icomando, SET
  3558. SET        Prepara   va'rios   para^metros   relacionados   com 
  3559.            depurac,a~o, transmissa~o, modo de arquivo etc.
  3560.  
  3561. ..@iSHOW
  3562. ..@icomando, SHOW
  3563. SHOW       Mostra   como  os  para^metros  esta~o   preparados, 
  3564.            potencialidades etc.
  3565.  
  3566. ..@iSTATISTICS
  3567. ..@icomando, STATISTICS
  3568. STATISTICS Da'   informac,o~es   acerca    da   performance   da 
  3569.            transfere^ncia  de  arquivos mais recente  -- tempo 
  3570.            decorrido,  baud rate efetivo, diversos contadores 
  3571.            etc.
  3572.  
  3573. ..@iHOST
  3574. ..@icomando, HOST
  3575. HOST       Repassa  a cadeia de caracteres (de comando)  dada 
  3576.            para  o host (local ou remoto)  especificado  para 
  3577.            execuc,a~o em sua pro'pria linguagem de comandos.
  3578.  
  3579. ..@iLOGGING
  3580. ..@icomando, LOGGING
  3581. LOGGING    Abre  ou  fecha um LOG remoto de transac,a~o  ou  de 
  3582.            depurac,a~o.
  3583.  
  3584. .cp 4
  3585. ..@bd
  3586. 9.6.  O comando SET
  3587. ..@icomando, SET
  3588. ..@iSET
  3589.  
  3590.       Deve  ser  provido  um comando SET para que  o  usua'rio 
  3591. possa adaptar uma conexa~o  a`s particularidades do caminho  da 
  3592. comunicac,a~o, ao sistema de arquivos local ou remoto etc. Aqui 
  3593. esta~o alguns para^metros passi'veis de alterac,a~o atrave's de um 
  3594. comando SET:
  3595.  
  3596. ..@iBLOCK-CHECK
  3597. BLOCK-CHECK
  3598.          Especifica  o  tipo  de checagem de  bloco  a  ser 
  3599.          utilizada:  checksum de um u'nico caracter, de dois 
  3600.          ou CRC de 3 caracteres.
  3601.  
  3602. ..@iDEBUGGING
  3603. DEBUGGING
  3604.            Mostra ou "LOGa" o tra'fego e nu'meros dos pacotes e 
  3605.            os  estados em que entra o  programa.  Muito  u'til 
  3606.            para depurar novas verso~es de KERMIT,  combinac,o~es 
  3607.            ine'ditas de KERMITs etc.
  3608.  
  3609. ..@iDELAY
  3610. DELAY
  3611.            Quantos  segundos  um KERMIT remoto  (na~o  SERVER) 
  3612.            deve  esperar antes de mandar o pacote  SEND-INIT, 
  3613.            para  dar tempo ao usua'rio para "escapar" de volta 
  3614.            ao KERMIT local e teclar um comando RECEIVE.
  3615.  
  3616. ..@iDUPLEX
  3617. DUPLEX
  3618.          Para emulac,a~o de terminal,  especifica full duplex 
  3619.          (eco remoto) ou half duplex (eco local).
  3620.  
  3621. ..@iEIGHT-BIT-PREFIXING
  3622. EIGHT-BIT-PREFIXING
  3623.          Ativa a prefixac,a~o de oitavo bit.
  3624.  
  3625. ..@iEND-OF-LINE
  3626. ..@iEOL
  3627. END-OF-LINE
  3628.          Especifica  qualquer terminador de linha que  deva 
  3629.          ser empregado depois de um pacote.
  3630.  
  3631. ..@iESCAPE
  3632. ESCAPE
  3633.          Informa  qual  caracter de escape deve  ser  usado 
  3634.          numa emulac,a~o de terminal.
  3635.  
  3636. ..@iarquivo, atributo
  3637. ..@iatributos de arquivos
  3638. ..@iFILES ATTRIBUTES
  3639. FILE ATTRIBUTES
  3640.          Quase todos os atributos listados antes (sec,a~o 8.5). 
  3641.          A necessidade mais comum  e' a de dizer ao KERMIT  se 
  3642.          o  arquivo a ser transmitido ou recebido e' texto  ou 
  3643.          bina'rio.
  3644.  
  3645. ..@iFLOW-CONTROL
  3646. ..@iXON/XOFF
  3647. ..@iDTR/CTS
  3648. ..@ifcontrole de fluxo
  3649. ..@ifluxo, controle de
  3650. FLOW-CONTROL
  3651.            Especifica o mecanismo de controle de fluxo para a 
  3652.            linha, como XON/XOFF, DTR/CTS etc. Permite acionar 
  3653.            ou retirar controle de fluxo, que  e' feito somente 
  3654.            em conexo~es full duplex.
  3655.  
  3656. ..@iHANDSHAHE
  3657. HANDSHAKE
  3658.            Especifica  qualquer negociac,a~o de acesso a`  linha 
  3659.            que  deva  ser empregada ou simulada  durante  uma 
  3660.            transfere^ncia de arquivo.  Por exemplo, um sistema 
  3661.            half duplex frequentemente precisa "virar a linha" 
  3662.            depois  de mandar um pacote,  de forma a  lhe  dar 
  3663.            permissa~o  para responder.  Um handshake comum   e' 
  3664.            XON (^Q); o usua'rio corrente da linha transmite um 
  3665.            XON quando termina de transmitir seus dados
  3666.  
  3667. ..@iLINE
  3668. LINE       Especifica  a  linha ou designador de  dispositivo 
  3669.            para a conexa~o. Para emprego em um programa KERMIT 
  3670.            que possa rodar tanto em modo local quanto remoto; 
  3671.            a  linha default  e' o terminal de  controle  (para 
  3672.            operac,a~o  remota).  Se  um dispositivo externo   e' 
  3673.            usado, presume-se operac,a~o local.
  3674.  
  3675. ..@iLOG
  3676. LOG        Informa  o  arquivo local onde guardar um  LOG  da 
  3677.            transac,a~o.   Podem  existir  LOGs  para  depurac,a~o 
  3678.            (tra'fego de pacotes,  transic,o~es de estado etc)  e 
  3679.            para  propo'sitos  de auditoria (registrar  nome  e 
  3680.            disposic,a~o de cada transfere^ncia de arquivo).
  3681.  
  3682. ..@iMARKER
  3683. MARKER     Muda  o  marcador  de ini'cio  de  pacote,  do  seu 
  3684.            default  SOH  (^A)  para algum outro  caracter  de 
  3685.            controle, no caso de um (ou ambos) os sistemas ter 
  3686.            problema em usar SOH para tal propo'sito.
  3687.  
  3688. ..@iPACKET-LENGTH
  3689. ..@ipacote, comprimento do
  3690. ..@icomprimento do pacote
  3691. PACKET-LENGTH
  3692.            O maior comprimento de um pacote.  Normalmente na~o 
  3693.            deve ser menor que 30 ou 40 e nunca maior que  96. 
  3694.            Pacotes  curtos  podem ser uma vantagem em  linhas 
  3695.            com muito rui'do;  eles reduzem a probabilidade  de 
  3696.            um  pacote ser corrompido,  bem como o overhead de 
  3697.            retransmisso~es quando acontece o erro.
  3698.  
  3699. ..@iPADDING
  3700. ..@ipreenchimento
  3701. PADDING
  3702.            O nu'mero de caracteres de preenchimento que  devem 
  3703.            ser  transmitidos antes de cada pacote e qual deve 
  3704.            ser tal caracter. Raramente necessa'rio.
  3705.  
  3706. ..@iPARITY
  3707. ..@iparidade
  3708. PARITY
  3709.            Especifica a paridade  (ODD,  EVEN,  MARK,  SPACE, 
  3710.            NONE) na conexa~o fi'sica.  Se diferente de NONE,  o 
  3711.            oitavo  bit  na~o  pode ser usado  para  transmitir 
  3712.            dados  e na~o pode ser usado por qualquer  dos  dos 
  3713.            lados no ca'lculo de checagem de bloco.
  3714.  
  3715. ..@iPAUSE
  3716. PAUSE
  3717.            Quantos  segundos  pausar  depois  de  receber  um 
  3718.            pacote e antes de mandar o pro'ximo.  Normalmente 0 
  3719.            mas  quando  um processador de comunicac,a~o  de  um 
  3720.            sistema   (front  end)   esta'  com  problemas   de 
  3721.            tra'fego,   uma  pequena pausa entre  pacotes  pode 
  3722.            ajudar;  grac,as  aos ce'us algo abaixo de 1 segundo 
  3723.            e' suficiente.
  3724. ..@iPREFIX
  3725. .cp 2
  3726. PREFIX
  3727.            Muda   o  prefixo  default  para   caracteres   de 
  3728.            controle,  caracteres  de  8 bits  ou  quantidades 
  3729.            repetidas.
  3730.  
  3731. ..@iPROMPT
  3732. PROMPT
  3733.            Troca  o  prompt  do programa.  E' u'til  ao  rodar 
  3734.            KERMIT  entre  dois sistemas com o  mesmo  prompt, 
  3735.            eliminando  a confusa~o acerca de qual dos  KERMITs 
  3736.            esta' falando com voce.
  3737.  
  3738. ..@iREPEAT-COUNT-PROCESSING
  3739. ..@icontador de repeticoes
  3740. REPEAT-COUNT-PROCESSING
  3741.            Muda o default para o processamento do contador de 
  3742.            repetic,o~es.  Normalmente   sera' feito se ambos  os 
  3743.            KERMITs concordarem com isto.
  3744.  
  3745. ..@iRETRY
  3746. ..@iretransmissoes
  3747. ..@ilimite de retransmissoes
  3748. RETRY
  3749.            Nu'mero  ma'ximo de tentativas em mandar ou  receber 
  3750.            um pacote antes de desistir. O nu'mero normal  e' em 
  3751.            torno  de 5 mas o usua'rio deve estar capacitado  a 
  3752.            ajusta'-lo  de acordo com as condic,o~es da linha,  a 
  3753.            carga nos sistemas etc.
  3754.  
  3755. ..@iTIMEOUT
  3756. TIMEOUT
  3757.            Especifica  a quantidade de tempo a ser dada  para 
  3758.            uma espera por um pacote.
  3759.  
  3760.  
  3761. ..@bd
  3762. 9.7.  Macros (o comando DEFINE)
  3763. ..@iDEFINE
  3764. ..@imacros
  3765. ..@icomando, DEFINE
  3766.  
  3767.       Ale'm  dos comandos SET individuais,  uma facilidade  de 
  3768. "macro  comandos"   e'  recomendada,   para  permitir  que  os 
  3769. usua'rios combinem as caracteri'sticas de determinados sistemas 
  3770. em um u'nico comando SET. Por exemplo:
  3771. ..@iUNIX
  3772. ..@iIBM
  3773. ..@iexemplo
  3774. ..@iparidade
  3775. ..@iTELENET
  3776. ..@ihandshake
  3777. ..@iDUPLEX
  3778. ..@iFULL
  3779. ..@iHALF
  3780. ..@iMARK
  3781.  
  3782.       DEFINE IBM = PARITY ODD, DUPLEX HALF, HANDSHAKE XON
  3783.       DEFINE UNIX = PARITY NONE, DUPLEX FULL
  3784.       DEFINE TELENET = PARITY MARK
  3785.  
  3786.       Isto   pode   ser  feito  provendo-se   um   analisador 
  3787. caprichado  para  comandos como este (que  podem  utilizar  o 
  3788. pro'prio  arquivo  de inicializac,a~o do KERMIT USER  durante  a 
  3789. inicializac,a~o  do programa) ou simplesmente escrito dentro da 
  3790. tabela do comando SET, no fonte do KERMIT.
  3791.  
  3792.       Feitas   estas  definic,o~es,   o  usua'rio   simplesmente 
  3793. teclaria  "SET UNIX" ou qualquer outra coisa,  que prepararia 
  3794. todo  o programa,  de uma so' vez,  para se comunicar  com  o 
  3795. sistema remoto.
  3796. .pa
  3797. .heEmulac,a~o de Terminal
  3798.  
  3799. ..@adu
  3800. 10.  Emulac,a~o de terminal
  3801. ..@iterminal
  3802. ..@iterminal, emulacao
  3803.  
  3804.       O  sistema  local  tem que ser capaz de  agir  como  um 
  3805. terminal,  de  modo  a permitir que o usua'rio se  conecte  ao 
  3806. sistema remoto, identifique-se la' e inicie o KERMIT remoto.
  3807.  
  3808.       Qualquer  programa  KERMIT  que  rode  localmente  deve 
  3809. prover emulac,a~o de terminal, para que o usua'rio na~o tenha que 
  3810. ficar  trocando de programas de forma a transferir arquivos e 
  3811. operar protocolo de terminal.   Nos sistemas menores  isto  e' 
  3812. particularmente  importante  por va'rias razo~es  (reiniciar  o 
  3813. programa  e  reentrar todos os comandos  SET  necessa'rios   e' 
  3814. muito  inconveniente  e  desperdic,a muito  tempo;  em  alguns 
  3815. micros,  entrar  e sair de emulac,a~o de terminal pode fazer  a 
  3816. portadora cair etc.).
  3817.  
  3818.       O KERMIT  so' precisa suprir uma emulac,a~o de teminal bem 
  3819. simples,    pe'-de-boi.  Na~o   ha'  a  necessidade  de  simular 
  3820. qualquer terminal particularmente "esperto". Uma simulac,a~o de 
  3821. qualquer terminal "burro"  e' suficiente para fazer o servic,o. 
  3822. E' bom ter uma emulac,a~o mais caprichada,  no entanto, para se 
  3823. tirar  vantagem  das capacidades de visualizac,a~o e edic,a~o  do 
  3824. sistema remoto. Em alguns casos o firmware do microcomputador 
  3825. cuidara'  disto.   Para  construir  uma emulac,a~o  de  um  tipo 
  3826. especial  de terminal no programa,  voce deve  interpretar  e 
  3827. agir  sobre  as  seque^ncias  de ESCAPE  conforme  elas  forem 
  3828. chegando na porta.
  3829.  
  3830.       Durante a emulac,a~o de terminal na~o  e' feita checagem de 
  3831. erros.  Esta'  "fora do protocolo";  os caracteres va~o  e  ve^m 
  3832. "nus". Sob este ponto de vista, emular um terminal atrave's do 
  3833. KERMIT na~o  e' melhor que usar, realmente, um terminal real.
  3834.  
  3835.       Algumas implementac,o~es de KERMIT podem permitir logar a 
  3836. emulac,a~o  de  terminal em um arquivo  local.  Tal  facilidade 
  3837. ajuda a "capturar" arquivos teclados remotamente, (lembre-se: 
  3838. sem correc,a~o ou checagem de erros). Quando existe tal facili
  3839. dade,   e'  deseja'vel  ter uma forma conveniente  de  ligar  e 
  3840. desligar a gravac,a~o do LOG.
  3841.  
  3842.       Se  o sistema local na~o prove^ controle de fluxo a ni'vel 
  3843. de  sistema (ou de firmware),  como XON/XOFF,  o programa  de 
  3844. emulac,a~o de terminal deve tentar  simula'-lo, especialmente se 
  3845. estiver sendo feito LOG.
  3846.  
  3847.       A  facilidade de emulac,a~o de terminal deve ser capaz de 
  3848. lidar  tanto  com  eco  local quanto  remoto  (full  ou  half 
  3849. duplex),  qualquer  handshake exigido,  bem  como  transmitir 
  3850. qualquer  paridade  exigida  pelo  lado  remoto  ou  meio  de 
  3851. comunicac,a~o.
  3852.  
  3853.       Os  emuladores de terminal funcionam amostrando  conti
  3854. nuamente tanto inputs da console do terminal local quanto  da 
  3855. linha  de comunicac,a~o.  As func,o~es simples de input e  output 
  3856. na~o sera~o suficientes, entretanto,  ja' que se voce pede input 
  3857. de  um determinado dispositivo na~o houver a  disponibilidade, 
  3858. geralmente  voce vai bloquear  ate' que  haja,  realmente,  um 
  3859. input  e durante este tempo  estara' perdendo inputs do  outro 
  3860. dispositivo.  Assim  voce tem que ter uma maneira de  "olhar" 
  3861. para  um lado e para o outro,  independentemente de haver  ou 
  3862. na~o  um input disponi'vel.  Diversos mecanismos sa~o comunmente 
  3863. usados:
  3864.  
  3865.      *     "Pular"  para frente e para  tra's,  continuamente, 
  3866.            entre  o  registrador  de status  da  porta  e  da 
  3867.            console,  checando  os bits de status em busca  de 
  3868.            input disponi'vel.  Isto  so'  e' pra'tico em sistemas 
  3869.            mono-usua'rio,  mono-processo,  onde  a CPU na~o tem 
  3870.            mais nada a fazer.
  3871.  
  3872.      *     Emitir  um pedido de input blocado normal  para  a 
  3873.            porta  mas  habilitando interrupc,a~o por  input  da 
  3874.            console ou vice-versa.
  3875.  
  3876.      *     Manusear  o  input  da porta em um processo  e  da 
  3877.            console em outro, paralelamente. O programa KERMIT 
  3878.            para  UNIX  listado  neste  manual  emprega   este 
  3879.            me'todo.
  3880.  
  3881.       Qualquer    input   da   porta   deve   ser   mostrado, 
  3882. imediatamente,  na tela.  Qualquer input da console deve ser, 
  3883. em seguida,  transmitido porta a fora.  Adicionalmente,  se a 
  3884. conexa~o for half duplex, o input da console deve ser mostrado 
  3885. na tela, tambe'm.
  3886.  
  3887.       O  co'digo  de emulac,a~o de terminal deve  examinar  cada 
  3888. caracter  da  console  para determinar se  e' o  "caracter  de 
  3889. escape".  Se  for,  deve  tomar  o pro'ximo  como  um  comando 
  3890. especial, que, enta~o, executa. Estes comandos foram descritos 
  3891. anteriormente, na sec,a~o 9.3.
  3892.  
  3893.       O  emulador  de terminal deve ser capaz  de  transmitir 
  3894. todos os caracteres ASCII,  do NUL ao DEL, e ser capaz tambe'm 
  3895. de  transmitir  um  sinal BREAK (na~o  e' um  caracter  mas  um 
  3896. "escape" de uma transmissa~o ASCII na qual um 0  e' colocado na 
  3897. linha  durante cerca de 1/4 de segundo,  a despeito  do  baud 
  3898. rate,  sem  bits  de framing).  O BREAK  e' importante  ao  se 
  3899. comunicar com va'rios sistemas, como mainframes da IBM.
  3900.  
  3901.       Finalmente,   a`s  vezes,   e' necessa'rio executar certas 
  3902. transformac,o~es no caracter CR que normalmente  e' teclado para 
  3903. terminar uma linha de input.  Alguns sistemas usam LF, EOT ou 
  3904. outro  caracter  para esta  func,a~o.  Para  complicar,  alguns 
  3905. equipamentos  de comunicac,a~o intervenientes  (particularmente 
  3906. redes  de  comutac,a~o  de pacotes  publicas)  podem  ter  seus 
  3907. pro'prios requisitos independentes. Assim, ao se usar o KERMIT 
  3908. para  se  comunicar atrave's,  digamos,  da TRANSPAC,  com  um 
  3909. sistema que emprega LF para fim-de-linha, pode ser necessa'ria 
  3910. a  transformac,a~o  do CR em LFCR (LF antes -- o CR  comanda  a 
  3911. rede para transmitir o pacote, que  contera' o LF e o host usa 
  3912. o  LF  para terminac,a~o).  O usua'rio deve ser  provido  de  um 
  3913. mecanismo  para  especificar esta transformac,a~o,  um  comando 
  3914. como "SET CR seque^ncia".
  3915. .pa
  3916. .heEscrevendo um programa KERMIT
  3917. ..@adu
  3918. 11.  Escrevendo um programa KERMIT
  3919. ..@iKERMIT, escrevendo um
  3920. ..@iprograma, escrevendo um KERMIT
  3921.  
  3922.       Antes  de escrever uma nova implementac,a~o de KERMIT  ou 
  3923. modificar  uma existente,  entre em contato com o  Centro  de 
  3924. Distribuic,a~o do KERMIT,  na Universidade de Colu'mbia, para se 
  3925. assegurar  que voce na~o  estara' duplicando o esforc,o de outra 
  3926. pessoa  e de que  tera' todo o material mais  atualizado  para 
  3927. trabalhar.   Caso   voce   realmente  escreva  ou   modifique 
  3928. significantemente  (ou  documente) um  programa  KERMIT,  por 
  3929. favor:  mande-o  de  volta  para  o  C.U.C.C.A.,  onde   sera' 
  3930. inclui'do  na distribuic,a~o padra~o do KERMIT e  outros  podera~o 
  3931. ser   beneficiados.   E'  somente  atrave's  desta  forma   de 
  3932. compartilhamento  que o KERMIT cresceu de seu modesto  ini'cio 
  3933. para a escala atual.
  3934.  
  3935.       As   sec,o~es   a  seguir  prove^em  algumas  "dicas"   de 
  3936. programac,a~o KERMIT.
  3937.  
  3938.  
  3939. ..@bd
  3940. 11.1.  Organizac,a~o do programa
  3941. ..@iprograma, organizacao
  3942. ..@iorganizacao do programa
  3943.  
  3944.       Uma implementac,a~o ba'sica de KERMIT pode usualmente  ser 
  3945. escrita  como sendo um programa relativamente pequeno,  auto-
  3946. contido  num u'nico fonte.  Entretanto  e' normal o caso de  um 
  3947. programa  que  foi  escrito para rodar em um  sistema,    ser 
  3948. adaptado para rodar em outros sistemas tambe'm.  Neste caso  e' 
  3949. melhor  evitar  ter  fontes  totalmente  divergentes,  porque 
  3950. quando  novas  facilidades  sa~o acrescentadas  (ou  problemas 
  3951. corrigidos)  em partes do programa independentes  de  sistema 
  3952. (i. e':   no  protocolo  em  si),  somente  uma  implementac,a~o 
  3953. colhera'  os  benefi'cios inicialmente,  enquanto que as outras 
  3954. exigira~o  ajustes  dolorosos,  propensos a erro(s)   ate'  que 
  3955. sejam levadas ao mesmo ni'vel.
  3956.  
  3957.       Assim,  se  houver alguma chance de um programa  KERMIT 
  3958. vir  a  rodar  em  mais de um  tipo  de  ma'quina  ou  sistema 
  3959. operacional ou,  ainda,  suportar mais de um tipo de porta ou 
  3960. modem  etc.,   e'  deseja'vel isolar as partes  dependentes  de 
  3961. sistema  de  uma forma a deixar as partes comuns  utiliza'veis 
  3962. pelas va'rias implementac,o~es. Existem diversos enfoques:
  3963.  
  3964.      1.    Suporte  em  tempo de  execuc,a~o.  Se  possi'vel,  o 
  3965.            programa  pode  inspecionar o  hardware  ou  pedir 
  3966.            para^metros   relevantes  sobre  o  sistema  e   se 
  3967.            configurar     dinamicamente    em    tempo     de 
  3968.            inicializac,a~o.   E'   a  forma  mais  difi'cil   de 
  3969.            implementar.
  3970.  
  3971.      2.    Compilac,a~o (montagem) condicional.  Se o nu'mero de 
  3972.            sistemas ou opc,o~es a serem suportados for pequeno, 
  3973.            a  parte do co'digo dependente de sistema pode  ser 
  3974.            inclui'do  em  rotinas compiladas  condicionalmente 
  3975.            (como IF IBMPC ...  ENDIF).  Como exemplo,  veja a 
  3976.            listagem de um KERMIT para UNIX fornecida com este 
  3977.            manual.   No   entanto,   conforme  o  nu'mero   de 
  3978.            depende^ncias de sistema a serem suportadas cresce, 
  3979.            este me'todo tende a se tornar canhestro e passi'vel 
  3980.            de  erros (instalar suporte para o sistema X  pode 
  3981.            tornar inva'lido o suporte para o sistema Y).
  3982.  
  3983.      3.    Composic,a~o  modular.  Quando existir a potenciali
  3984.            dade  de  um  grande nu'mero de opc,o~es  vir  a  ser 
  3985.            suportadas,   o  programa  deve  ser  quebrado  em 
  3986.            mo'dulos  separados,   com  convenc,o~es  de  chamada 
  3987.            simples e claramente especificadas.  Isto  permite 
  3988.            que  pessoas  com  novas opc,o~es de^em  seu  pro'prio 
  3989.            suporte  a  elas de forma  fa'cil,  sem  perigo  de 
  3990.            causar  mal  ao  suporte  existente.   Os  mo'dulos 
  3991.            sugeridos para um programa KERMIT sa~o:
  3992.  
  3993.                   -  manuseio  de  protocolo independente  de 
  3994.                      sistema:  troca de estado,  formac,a~o  de 
  3995.                      pacotes, codificac,a~o (prefixac,a~o), deco
  3996.                      dificac,a~o etc.
  3997.  
  3998.                   -  interface com o usua'rio: o analisador de 
  3999.                      comandos;   sendo  um  mo'dulo  separado, 
  4000.                      permite  inclusa~o  de  analisadores   de 
  4001.                      comando  de acordo com o gosto do  usua'
  4002.                      rio,  mimetizando o estilo do analisador 
  4003.                      de  comandos do host ou de algum aplica
  4004.                      tivo popular etc.
  4005.  
  4006.                   -  manuseio da tela:  este mo'dulo  conteria 
  4007.                      os co'digos de controle de tela,  rotinas 
  4008.                      de posicionamento do cursor etc.
  4009.  
  4010.                   -  manuseio da porta:  permite o suporte de 
  4011.                      va'rios hardwares de porta;  este  mo'dulo 
  4012.                      pode  definir a localizac,a~o do registra
  4013.                      dor de status da porta, o significado de 
  4014.                      seus bits e  dai' em diante e pode imple
  4015.                      mentar   as   func,o~es   de   receber   e 
  4016.                      transmitir caracteres pela porta
  4017.  
  4018.                   -  controle   de   modem:   deve   suportar 
  4019.                      qualquer  tipo  de modem  "inteligente", 
  4020.                      que  na~o  seja  meramente  uma  extensa~o 
  4021.                      transparente  da porta  de  comunicac,a~o; 
  4022.                      tais   modems  podem  aceitar   comandos 
  4023.                      especiais  para  executar  func,o~es  como 
  4024.                      discar,   rediscar   o  u'ltimo   nu'mero, 
  4025.                      desligar   etc.   e  podem  carecer   de 
  4026.                      inicializac,a~o  especial  (forc,ar  sinais 
  4027.                      como DTR, p.e.)
  4028.  
  4029.                   -  input  de  console:   este  mo'dulo  deve 
  4030.                      suprir  a func,a~o de pegar um caracter da 
  4031.                      console; ele saberia as localizac,o~es dos 
  4032.                      registradores de status e o  significado 
  4033.                      de seus bits,  estrutura de interrupc,a~o, 
  4034.                      conversa~o      tecla-caracter      etc., 
  4035.                      implementar   redefinic,o~es  de   teclas, 
  4036.                      macros de teclado, func,o~es programa'veis, 
  4037.                      controles expandidos, meta-func,o~es etc.
  4038.  
  4039.                   -  emulac,a~o de terminal:  este mo'dulo  deve 
  4040.                      interpretar   seque^ncias  de  escape  no 
  4041.                      fluxo  de caracteres que chegam  (obtido 
  4042.                      do  mo'dulo de I/O da porta) para o  tipo 
  4043.                      particular  de terminal sendo emulado  e 
  4044.                      interpreta'-lo    fazendo   os   "call's" 
  4045.                      apropriados  ao mo'dulo de I/O de tela  e 
  4046.                      mandaria   o  que  o  usua'rio   teclasse 
  4047.                      (obtido   do  mo'dulo  de   entrada   por 
  4048.                      console)  pela  porta serial  (novamente 
  4049.                      usando  o  mo'dulo de I/O  de  porta);  a 
  4050.                      ide'ia   e' poder trocar este  mo'dulo  por 
  4051.                      outros,  de  forma  a emular  diferentes 
  4052.                      tipos de terminais  (ANSI,  VT52,  ADM3A 
  4053.                      etc.)
  4054.  
  4055.                   -  I/O de arquivos:  conte'm todo o conheci
  4056.                      mento a respeito da estrutura de sistema 
  4057.                      de  arquivamento de host;  como abrir  e 
  4058.                      fechar arquivos,  operac,o~es de "pegar  o 
  4059.                      pro'ximo arquivo",  ler, gravar, determi
  4060.                      nar e alterar seus atributos, detectar o 
  4061.                      fim de um arquivo etc.;  prove^ tambe'm as 
  4062.                      func,o~es (incluindo a de bufferizac,a~o) de 
  4063.                      ler  um caracter de um arquivo e  grava'-
  4064.                      lo  em  outro;  este mo'dulo tambe'm  pode 
  4065.                      prover  servic,os  de  gerenciamento   de 
  4066.                      arquivos  em termos locais (listagens de 
  4067.                      direto'rio,   apagar,   renomear,  copiar 
  4068.                      etc.)
  4069.  
  4070.                   -  definic,o~es  e dados:  mo'dulos  separados 
  4071.                      podem   ser   tambe'm   guardados    para 
  4072.                      definic,o~es  de para^matros para tempo  de 
  4073.                      compilac,a~o  e  para dados  globais  para 
  4074.                      tempo de execuc,a~o.
  4075. .pa
  4076. ..@bd
  4077. 11.2.  Linguagem de programac,a~o
  4078. ..@iprogramacao, linguagem
  4079. ..@ilinguagem de programacao
  4080.  
  4081.       A  linguagem a ser usada para se escrever  um  programa 
  4082. KERMIT  e' qualquer coisa mais do que mera questa~o de gosto. A 
  4083. considerac,a~o prima'ria  e' que a linguagem escolhida deve dar a 
  4084. funcionalidade  e velocidade necessa'rias.  Por  exemplo,  uma 
  4085. implementac,a~o   do  BASIC  em  um  microcomputador  pode  na~o 
  4086. permitir  o tipo de acesso em baixo ni'vel  aos  registradores 
  4087. dos  dispositivos  necessa'rio em uma emulac,a~o de terminal  ou 
  4088. para  detetar input da console durante uma  transfere^ncia  de 
  4089. arquivo ou,  mesmo,  se pode fazer essas coisas, pode na~o ser 
  4090. capaz  de  rodar ra'pido o suficiente para manter a  linha  de 
  4091. comunicac,a~o na baud rate desejada.
  4092.  
  4093.       A  segunda considerac,a~o em escolher a linguagem  e'  sua 
  4094. portabilidade. Pode ser encarada de duas maneiras:
  4095.  
  4096.       1)   se   a  linguagem   e'  de  domi'nio  pu'blico   (ou, 
  4097.       equivalentemente, distribui'da sem o^nus como parte de um 
  4098.       sistema ba'sico) e
  4099.  
  4100.       2)  se e' bem  padronizada e de uso difundido em  va'rios 
  4101.       sistemas.
  4102.  
  4103.       Uma  linguagem porta'vel nesses dois sentidos  deve  ter 
  4104. prefere^ncia.
  4105.  
  4106.       Qualquer que seja a linguagem escolhida,  e' importante 
  4107. que  todas as linhas do programa fonte na~o excedam 80 carac
  4108. teres  (depois da expansa~o dos TABs).  Isto porque  material 
  4109. KERMIT  frequentemente  precisa ser transportado por  RJE  e 
  4110. outros links de comunicac,a~o que obedecem o formato "carta~o".
  4111.  
  4112.       E,  finalmente,  e' importante que os nomes de todos os 
  4113. arquivos  usados  na criac,a~o e suporte  de  uma  determinada 
  4114. implementac,a~o  do  KERMIT seja (possivelmente um subset)  da 
  4115. forma  NOME.TIPO,  onde NOME esta' limitado a 6 caracteres  e 
  4116. TIPO a 3;  onde o nome de cada arquivo comece com um prefixo 
  4117. comum de 2 ou 3 caracteres.  Isto e' assim para que todos  os 
  4118. arquivos   relacionados  ficara~o  agrupados  numa   listagem 
  4119. alfabe'tica  de direto'rio e tambe'm,  quando todas as centenas 
  4120. de  arquivos  relacionados  com o  KERMIT  fiquem  colocados 
  4121. juntos em uma fita, todos os nomes sera~o tanto legais quanto 
  4122. u'nicos,  especialmente  em sistemas (como o do  PDP-11)  com 
  4123. convenc,o~es restritivas de batismo de arquivos.
  4124.  
  4125.  
  4126. ..@bd
  4127. 11.3.  Documentac,a~o
  4128. ..@idocumentacao
  4129.  
  4130.       Um   programa   KERMIT  novo   deve   ser   pesadamente 
  4131. documentado.   Um   dos   pontos  altos  do  KERMIT  e'   sua 
  4132. documentac,a~o. Deve ser tanto a ni'vel de usua'rio (como usar o 
  4133. programa, quais comandos existem e porque etc., similarmente 
  4134. a`   documentac,a~o   presentemente  encontrada  no   "Guia   do 
  4135. Usua'rio"),  quanto  a  ni'vel  de  implementac,a~o  (descrevendo 
  4136. depende^ncias do sistema,  pontos para possi'vel adaptac,a~o para 
  4137. outros  sistemas  etc.).  Ale'm disso,  os pro'prios  programas 
  4138. devem  conter,  copiosamente,  comenta'rios.  Como o  programa 
  4139. fonte,  a  documentac,a~o  deve ser mantida no  limite  dos  80 
  4140. caracteres por linha.
  4141.  
  4142.       Se  possi'vel,  uma sec,a~o para a implementac,a~o deve  ser 
  4143. escrita  para  ser anexada ao Guia do Usua'rio  usando-se  a 
  4144. linguagem  de formatac,a~o do SCRIBE,  da Unilogic (subsets  do 
  4145. qual   podem   ser   encontrados  em  alguns   softwares   de 
  4146. processamento de texto para microcomputadores,  como  Perfect 
  4147. Writer,  ou  Final Word),  usando a mesma convenc,a~o geral das 
  4148. sec,o~es de implementac,a~o do EXISTIC, formato Scribe.
  4149.  
  4150.       Programas  KERMIT tambe'm devem conter um histo'rico  das 
  4151. reviso~es,  onde  cada  alterac,a~o e'  explicada  sucintamente, 
  4152. associada a um "nu'mero de edic,a~o", programador responsa'vel e 
  4153. lugar  e/ou  data.  As linhas ou sec,o~es editadas  devem  ser 
  4154. marcadas  com o nu'mero de edic,a~o correspondente e o programa 
  4155. KERMIT,  ao se iniciar, deve anunciar sua versa~o e nu'mero de 
  4156. edic,a~o,  de  forma que um usua'rio,  ao perceber um  defeito, 
  4157. possa se referir a essas informac,o~es.
  4158.  
  4159.       O  nu'mero da versa~o muda quando a funcionalidade  mudou 
  4160. suficientemente    para   requerer   maiores   reviso~es    na 
  4161. documentac,a~o.    O    nu'mero   de   edic,a~o    deve    crescer 
  4162. (monotonicamente,  na~o  relacionado  com o nu'mero da  versa~o) 
  4163. sempre que uma alterac~ao for feita no programa. Os nu'meros de 
  4164. edic,a~o sa~o muito importantes para a gere^ncia do fonte; depois 
  4165. de mandar para algue'm uma versa~o do, digamos, CP/M KERMIT-80, 
  4166. costumamos  receber  muitas co'pias dele de  volta,  cada  uma 
  4167. contendo  seu pro'prio conjunto de  mudanc,as,  que  precisamos 
  4168. reconciliar  de alguma maneira.  O uso dos nu'meros de  edic,a~o 
  4169. auxiliam muito esta tarefa.
  4170.  
  4171.  
  4172. ..@bd
  4173. 11.4.  Bootstrapping
  4174. ..@ibootstrapping
  4175.  
  4176.       Finalmente, deve ser dado um procedimento de bootstrap. 
  4177. O  KERMIT  geralmente e' distribui'do em fita  magne'tica  para 
  4178. grandes  instalac,o~es;  os usua'rios precisam de  maneiras  de 
  4179. "baixar"  as va'rias implementac,o~es para seus micros e outros 
  4180. sistemas  locais.   Um  procedimento  simples  de  bootstrap 
  4181. consistiria  de  instruc,o~es precisas de  como  conseguir  um 
  4182. co'pia "sem garantia" do programa. Talvez um simples, pequeno 
  4183. programa  possa  ser  escrito  para cada ponta  que  fac,a  o 
  4184. servic,o;  listagens e instruc,o~es podem ser dadas para que  o 
  4185. usua'rio digite e rode tais programas.
  4186. .pa
  4187. .heFormato e Tipos dos Pacotes
  4188. ..@x
  4189. ..@adu
  4190. A.  Formato e Tipos dos Pacotes
  4191. ..@ipacote, formato
  4192. ..@iformato dos pacotes
  4193. ..@ilayout dos pacotes
  4194.  
  4195. Layout de um pacote KERMIT:
  4196.  
  4197.            +------+-----+-----+------+------+-------+
  4198.            | mark | len | seq | type | data | check |
  4199.            +------+-----+-----+------+------+-------+
  4200.  
  4201. Layout do campo de dados do pacote SEND-INIT:
  4202.  
  4203. +------+------+------+------+-----+------+
  4204. | maxl | time | npad | padc | eol | qctl | ...
  4205. +------+------+------+------+-----+------+
  4206.                             +------+------+------+-------+
  4207.                        ...  | qbin | chkt | rept | capas |
  4208.                             +------+------+------+-------+
  4209.  
  4210. Tipos e subtipos de pacotes KERMIT (* = exigido):
  4211. ..@ipacote, tipos
  4212.  
  4213.     Y*    ACK (aceito)
  4214.     N*    NAK (na~o aceito)
  4215.     S*    SEND-INIT (troca de para^metros)
  4216.     I     INIT (troca de para^metros)
  4217.     F*    cabec,alho de arquivo
  4218.     A     atributos de arquivo
  4219.     D*    dados
  4220.     Z*    EOF (fim de arquivo)
  4221.     B*    EOT (interrupc,a~o da transmissa~o)
  4222.     E*    erro
  4223.     R     REC-INIT (pede arquivos especificados ao SERVER)
  4224.     C     comando para o host
  4225.     K     comando para o KERMIT
  4226.     T     reservado para uso interno
  4227.     G     comando KERMIT gene'rico; subcomandos:
  4228.  
  4229.           I    LOGIN/LOGOUT
  4230.           C    CWD (troca de direto'rio corrente)
  4231.           L    BYE
  4232.           F    FINISH
  4233.           D    DIRECTORY
  4234.           U    pergunta sobre uso de disco
  4235.           E    ERASE/DELETE
  4236.           T    TYPE
  4237.           R    RENAME
  4238.           K    COPY
  4239.           W    WHO? (quem esta' "logado"?)
  4240.           M    mensagem curta
  4241.           H    HELP
  4242.           Q    pergunta status do SERVER
  4243.           P    invoca programa
  4244.           J    controle de jornalizac,a~o
  4245.           V    varia'veis (inquire, arma)
  4246. .pa
  4247. .heRelac,a~o das Facilidades
  4248. ..@adu
  4249. B.  Relac,a~o das Facilidades
  4250. ..@irelacao das facilidades
  4251. ..@ifacilidades, relacao das
  4252.  
  4253.       Na~o  existe  uma escala linear verdadeira ao  longo  da 
  4254. qual  se mec,a uma implementac,a~o de KERMIT.  Uma implementac,a~o 
  4255. ba'sica,  mi'nima,  prove^ transfere^ncia de arquivos em ambas as 
  4256. direc,o~es  e,   para  microcomputadores  (PC's,  workstations, 
  4257. outros sistemas mono-usua'rio),  emulac,a~o de  terminal.  Mesmo 
  4258. dentro  desta estrutura podem haver variac,o~es.  Por  exemplo: 
  4259. pode  o  programa  mandar um grupo de arquivos  em  um  u'nico 
  4260. programa  ou deve emitir um comando para cada  arquivo?  Aqui 
  4261. esta'  uma lista de facilidades que podem  ser  apresentadas; 
  4262. para  qualquer  implementac,a~o de KERMIT a documentac,a~o  deve 
  4263. mostrar se a facilidade existe e como invoca'-la.
  4264.  
  4265.     - Grupos  de arquivos.  Pode mandar um grupo de  arquivos 
  4266.       com  um u'nico comando,  usando "wildcard"  ("coringa"), 
  4267.       modelo ou notac,a~o de lista? Pode, com sucesso, transmi
  4268.       tir  ou receber um grupo de arquivos de tipos  diferen
  4269.       tes?  Pode  recuperar-se  de um erro em um  arquivo  em 
  4270.       particular  e continuar com o pro'ximo?  Pode manter  um 
  4271.       LOG  dos  arquivos envolvidos,  mostrando o arranjo  de 
  4272.       cada um?
  4273.  
  4274.     - Nomes  de  arquivos.  Ele consegue evitar  destruir  um 
  4275.       arquivo local quando chega um novo arquivo com o  mesmo 
  4276.       nome?  Pode  converter  nomes de arquivo para/de  forma 
  4277.       "legal" ou "normal"?
  4278.  
  4279.     - Tipos  de  arquivos.  Arquivos  bina'rios  sa~o  ta~o  bem 
  4280.       transmitidos quanto os arquivos de texto?
  4281.  
  4282.     - Prefixac,a~o  de  oitavo bit.  Ele pode mandar e  receber 
  4283.       dados  de  8  bits  por um canal de  7  bits  usando  o 
  4284.       mecanismo de prefixac,a~o?
  4285.  
  4286.     - Processamento  do  contador  de  repetic,o~es.   Consegue 
  4287.       transmitir  e  receber dados com  caracteres  repetidos 
  4288.       substitui'dos por uma seque^ncia prefixada?
  4289.  
  4290.     - Emulac,a~o de terminal. Tem ele facilidade de emulac,a~o de 
  4291.       terminal?  Prove^  va'rias opc,o~es  de  comunicac,a~o,  como 
  4292.       selec,a~o de duplex,  paridade e handshake? Pode transmi
  4293.       tir  todos  os caracteres ASCII?  Transmite  um  BREAK? 
  4294.       Consegue  "logar"  uma sessa~o remota  localmente,  para 
  4295.       prover captura de arquivo sem teste de eventuais erros?
  4296.  
  4297.     - Opc,o~es de checagem de bloco. Ale'm do checksum ba'sico de 
  4298.       um u'nico caracter,  pode ser selecionado um CRC de 2 ou 
  4299.       3 caracteres?
  4300.  
  4301.     - SERVER  ba'sico.  Pode rodar em modo  SERVER,  aceitando 
  4302.       comandos para mandar ou receber arquivos ou terminar  a 
  4303.       si pro'prio?
  4304.     
  4305.     - SERVER  avanc,ado.  Aceita  comandos SERVER para  apagar 
  4306.       arquivos,  dar listagens de direto'rio, mandar mensagens 
  4307.       etc.?
  4308.  
  4309.     - Mandar comandos para um SERVER.  Consegue mandar mensa
  4310.       gens  para  um  SERVER e manusear  todas  as  possi'veis 
  4311.       respostas?
  4312.  
  4313.     - Comandos  de host.  E' capaz de analisar  e  transmitir 
  4314.       comandos para um host remoto? Se e' um SERVER, consegue 
  4315.       passar tais comandos para o processador de comandos do 
  4316.       host  e  devolver os resultados para o KERMIT  usua'rio 
  4317.       local?
  4318.  
  4319.     - Interromper transfere^ncias de arquivos. Pode ele inter
  4320.       romper  uma  transmissa~o  ou recepc,a~o  de  um  arquivo? 
  4321.       Consegue  responder a pedidos de interrupc,a~o vindos  do 
  4322.       outro lado?
  4323.  
  4324.     - Servic,os de gerenciamento de arquivos  locais.  Existem 
  4325.       comandos para dar listagens do direto'rio local,  apagar 
  4326.       arquivos locais etc.?
  4327.  
  4328.     - Atributos de arquivos. Ele consegue transmitir informa
  4329.       c,o~es  sobre  atributos de arquivos locais e  lidar  com 
  4330.       informac,o~es deste tipo que porventura cheguem? Disposi
  4331.       c,o~es  alternativas podem ser alteradas?  Arquivos podem 
  4332.       ser armazenados?
  4333.  
  4334.     - Capacidade de depurac,a~o.  O tra'fego de pacotes pode ser 
  4335.       "logado", examinado, refeito passo-a-passo?
  4336. .pa
  4337. .heProblemas na~o resolvidos
  4338. ..@adu
  4339. C.  Problemas na~o resolvidos
  4340. ..@iproblemas nao resolvidos
  4341.  
  4342.       O  KERMIT  na~o faz tudo.  Esta' aqui  uma  relac,a~o  das 
  4343. coisas que ele na~o faz ou poderia fazer melhor.
  4344.  
  4345.     - O KERMIT na~o pode ser utilizado atrave's de  emuladores 
  4346.       do   protocolo   IBM  3270.   Sa~o   equipamentos   que 
  4347.       possibilitam   terminais  ASCII  assi'ncronos  ou   PCs 
  4348.       comunicarem-se  com  mainframes  IBM  como  se  fossem 
  4349.       terminais  si'ncronos  de tela completa.  Os  problemas 
  4350.       incluem:
  4351.  
  4352.            a) o conversor de protocolo traduz de EBCDIC  para 
  4353.            ASCII  (isto e':  assume que esta' recebendo EBCDIC 
  4354.            quando se espera que o KERMIT esteja transmitindo 
  4355.            em  ASCII)  de  acordo  com  uma  tabela  interna 
  4356.            pro'pria,  que  pode  variar  de  instalac,a~o  para 
  4357.            instalac,a~o e nunca e' um mapeamento biuni'voco;
  4358.  
  4359.            b)  caracteres de controle na~o  imprimi'veis,  como 
  4360.            SOH, na~o podem ser transmitidos, de forma alguma;
  4361.  
  4362.            c)  o  conversor de protocolos busca  comandos  de 
  4363.            formatac,a~o  3270 e os traduz para  seque^ncias  ESC 
  4364.            para o terminal ASCII, possi'velmente modificando o 
  4365.            pacote de dados;
  4366.  
  4367.            d) o sistema IBM automaticamente pausa no final de 
  4368.            cada pa'gina cheia;
  4369.  
  4370.            e)  o conversor de protocolos pensa que sabe o que 
  4371.            esta' "na tela" e pode tentar otimizar; geralmente 
  4372.            na~o  se  sabe  exatamente como  um  conversor  de 
  4373.            protocolos  vai agir ou quanto pode diferir de um 
  4374.            outro;  apesar disto, pode ser possi'vel contornar 
  4375.            esses  problemas  se os KERMITs nas  duas  pontas 
  4376.            sejam   colocados  num  "modo   especial   3270", 
  4377.            "limparem   a   tela"   entre  dois   pacotes   e 
  4378.            concordarem  com alguma convenc,a~o  especial  para 
  4379.            delimitar pacote e traduzir dados.
  4380.  
  4381.     - Prefixac,a~o  de caracteres de controle.  Isto pode vir a 
  4382.       ficar bem caro para arquivos bina'rios ou outros  arqui
  4383.       vos cheios de caracteres de controle.  Pode ser uma boa 
  4384.       ide'ia  fazer com que cada host informe quais os  carac
  4385.       teres  que consegue receber sem prefixac,a~o.  Por  outro 
  4386.       lado,  o  tiro pode sair pela culatra,  quando os  dois 
  4387.       hosts  esta~o ligados atrave's de uma rede ou equipamento 
  4388.       que filtra caracteres de controle mesmo que nenhum  dos 
  4389.       dois hosts os filtre.  Em conexo~es diretas, sem fatores 
  4390.       desconhecidos,  no  entanto,  muitos caracteres de con
  4391.       trole podem ser transmitidos sem prefixac,a~o.
  4392.  
  4393.     - Quando  esta~o  sendo transmitidas longas seque^ncias  de 
  4394.       caracteres  dentro da faixa de controle,  a  prefixac,a~o 
  4395.       individual  de  cada  caracter  fica  onerosa.  Co'digos 
  4396.       "entra/sai"    podem   ser   aqui    empregados    mais 
  4397.       efetivamente. Idem para longas cadeias com o oitavo bit 
  4398.       ligado,  quando  se faria prefixac,a~o de oitavo  bit.  O 
  4399.       custo   seria   mais  um  conjunto  de  caracteres   de 
  4400.       prefixac,a~o  e  a complexidade associada  a`  formac,a~o  e 
  4401.       decodificac,a~o dos pacotes.
  4402.  
  4403.     - Em  algumas situac,o~es,  certos caracteres impri'veis na~o 
  4404.       conseguem passar pelo link de comunicac,a~o. Por exemplo: 
  4405.       um  SERVER terminal de uma rede pode reservar "@"  como 
  4406.       seu  caracter de "atenc,a~o".  Deve o protocolo  permitir 
  4407.       uma  forma de codificar tais caracteres para  traduc,a~o? 
  4408.       Um  conjunto de seque^ncias ESC defini'vel  pelo  usua'rio 
  4409.       poderia ser u'til neste caso.
  4410.  
  4411.     - Ironicamente,  alguns  sistemas  na~o se da~o bem com  os 
  4412.       pequenos tamanhos dos pacotes KERMIT. Sa~o, tipicamente, 
  4413.       os grandes sistemas que esperam se comunicar com termi
  4414.       nais em modo "bloco",  recebendo milhares de caracteres 
  4415.       de uma vez.  Tais sistemas acham o KERMIT  simplesmente 
  4416.       muito  caros de rodar.  Enquanto isso,  outros sistemas 
  4417.       que podem rodar KERMIT sem dificuldade,  acham sua per
  4418.       formance desapontadora (a eficie^ncia geralmente da'  um 
  4419.       jeito em cerca de 50 a 80 porcento, isto e': caracteres 
  4420.       de  dados  dividido pela velocidade de transmissa~o  da 
  4421.       linha,   em  caracteres  por  segundo).   Estes   dois 
  4422.       problemas  podem  ser  resolvidos  de  duas  maneiras: 
  4423.       permitir  a transmissa~o de pacotes mais longos  ou  de 
  4424.       pacotes de dados mu'ltiplos ponto-a-ponto.
  4425.  
  4426.            *  Sem mudar o formato ou a codificac,a~o dos campos 
  4427.               dos pacotes de controle,  pode ser possi'vel ter 
  4428.               pacotes    mais   longos,    reservando-se   os 
  4429.               comprimentos de 0,  1,  2 e 3 como co'digos para 
  4430.               nu'meros maiores como 200,  500,  1000, 2000. No 
  4431.               entanto,  quanto  maior for o pacote,  maior  a 
  4432.               probabilidade  de  ser  corrompido  e  maior  a 
  4433.               retransmissa~o, se  houver NAK.  Ale'm  disto,  a 
  4434.               adequac,a~o  da checagem de bloco de um  caracter 
  4435.               seria muito reduzida para pacotes  longos,  que 
  4436.               deveriam, por conseguinte, ser transmitidos com 
  4437.               checagem dos tipos 2 ou 3.
  4438.  
  4439.            *  Seria   possi'vel  extender  o  protocolo   para 
  4440.               permitir   transmissa~o  de  pacotes  de   dados 
  4441.               enquanto   ainda  estiverem  pendentes  ACKs  e 
  4442.               qualquer  ACK  poderia  valer  para  o   pacote 
  4443.               especi'fico  ou  para todos os  precedentes.  Um 
  4444.               limite para o nu'mero de ACKs pendentes  poderia 
  4445.               ser combinado;  o tamanho ma'ximo de tal "janela 
  4446.               varia'vel" teria que ser menor que 64,  que e' o 
  4447.               ponto onde o nu'mero de um pacote volta a  zero 
  4448.               e  a janela na~o poderia se extender ale'm de 63 
  4449.               sob  pena do KERMIT perder a noc,a~o de  quantas 
  4450.               vezes  64  pacotes  foram  transmitidos.   Uma 
  4451.               janela varia'vel de 8 e um tamanho de pacote de 
  4452.               95  teria  o mesmo efeito que pacotes  de  700 
  4453.               caracteres.   Um  NAK  poderia  exigir  que  o 
  4454.               transmissor repetisse tudo desde o pacote  que 
  4455.               recebeu o NAK.  Uma futura edic,a~o deste manual 
  4456.               podera'  incluir  uma especificac,a~o para  estas 
  4457.               janelas.
  4458. .pa
  4459. .heUm programa KERMIT
  4460. ..@adu
  4461. D.  Um programa KERMIT
  4462. ..@iprograma, fonte KERMIT em C
  4463. ..@ifonte de um KERMIT
  4464. ..@iKERMIT, fonte em C
  4465.  
  4466.       O que temos a seguir e' uma listagem de uma versa~o real 
  4467. de KERMIT,  escrita na linguagem C (Kernighan & Ritchie, The 
  4468. C Programming Language,  Prentice Hall, 1978). Foi desenhada 
  4469. para rodar sob diversas verso~es do sistema operacional UNIX. 
  4470. A  funcionalidade ba'sica do KERMIT esta' presente  mas  muito 
  4471. pouco  das  facilidades opcionais.  Somente o analisador  de 
  4472. comandos  mais  rudimentar (estilo UNIX)  esta'  presente.  O 
  4473. programa  ilustra muitas das considerac,o~es  descritas  neste 
  4474. manual,  com  respeito ao protocolo,  o desenho do  programa 
  4475. etc.
  4476.  
  4477.       Deve  ser enfatizado que e' uma implementac,a~o mi'nima do 
  4478. KERMIT. Qualquer um que for escrever um novo KERMIT a partir 
  4479. do  zero,  deve se sentir encorajado a consultar na fonte  a 
  4480. respeito das mais novas implementac,o~es avanc,adas como modelo 
  4481. (cheque,   no   Guia  de  Usua'rios  KERMIT,   a   lista   de 
  4482. implementac,o~es  de KERMIT e suas facilidades).  Embora  voce 
  4483. possa  na~o  entender  a linguagem em  que  foi  escrito,  os 
  4484. profusos comenta'rios podem ser u'teis.
  4485.  
  4486.       O programa a seguir usa notac,a~o decimal para nu'meros  e 
  4487. tochar() ao inve's de char() na conversa~o integer-caracter.
  4488.  
  4489.  
  4490. /*
  4491.  * K E R M I T   File Transfer Utility       
  4492.  * 
  4493.  * UNIX KERMIT, Columbia University, 1981, 1982, 1983
  4494.  * Bill Catchings,  Bob Cattani,  Chris Maio,
  4495.  *         Frank da Cruz, Alan Crosswell
  4496.  *
  4497.  * also:  Jim Guyton, Rand Corporation
  4498.  *        Walter Underwood, Ford Aerospace
  4499.  *
  4500.  * usage:  kermit c [lbe line baud escapechar] to connect   
  4501.  *         kermit s [d..ifbl line baud] file ...to send files
  4502.  *         kermit r [d..ifbl line baud] to receive files
  4503.  *
  4504.  * where  c=connect, s=send, r=receive,
  4505.  *        d=debug, i=image mode, f=no filename conversion,
  4506.  *        l=tty line, b=baud rate, e=escape char.
  4507.  *
  4508.  * for remote kermit, format is either:
  4509.  *            kermit r           to receive files
  4510.  *    or     kermit s files ... to send files     
  4511.  *
  4512.  */
  4513. /*
  4514.  * modification history:
  4515.  *
  4516.  * oct. 17  included fixes from Alan Croswell (CUCCA) 
  4517.  *                         for IBM_uts:
  4518.  * - change MYEOL character from \N to \R.
  4519.  * - change char to int in bufill so getc would return -1 on
  4520.  *   EOF instead of 255 (-1 truncated to 8 bits)
  4521.  * - added read() in rpack to eat the EOL character
  4522.  * - added fflush() call in printmsg to force the output
  4523.  * note: the last three changes are not conditionally 
  4524.  *       compiled since they should work equally well on any
  4525.  *       system.
  4526.  *
  4527.  * changed Berkeley 4.x conditional compilation flag from
  4528.  *              UNIX4X to UCB4X.
  4529.  * added support for error packets and cleaned up the printing
  4530.  *              routines.
  4531.  */
  4532.  
  4533. #include  <stdio.h>  /* definic,o~es standard UNIX */
  4534.  
  4535. /* Compilac,a~o condicional para sistemas/ma'quinas dif. */
  4536. /* Uma e so' uma das linhas abaixo pode ser 1 */
  4537.  
  4538. #define ucb4x   1    /* berkeley 4.x unix */
  4539. #define tops-20 0    /* tops-20 */
  4540. #define ibm_uts 0    /* amdahl uts em sistema IBM */
  4541. #define vax_vms 0    /* vax_vms (na~o implementada, ainda)*/
  4542.  
  4543. /* Compilac,a~o condicional para variantes UNIX */
  4544. /* Zero significa na~o compila; na~o-zero compila */
  4545.  
  4546. #if ucb4x
  4547.     #define v6_libs 0    /* na~o usa "retrofit libraries" */
  4548.     #define no_fionread 0 /* temos ioctl(fionread,...)
  4549.                               para flushinput() */
  4550.     #define no_tandem 0  /* temos disciplina XON/XOFF */
  4551. #endif
  4552.  
  4553. #if ibm_uts
  4554.     #define v6_libs 0    /* na~o usa "retrofit libraries" */
  4555.     #define no_fionread 1 /* na~o temos ioctl(fionread,...)
  4556.                                      para flushinput() */
  4557.     #define no_tandem 1      /* sem XON/XOFF */
  4558. #endif  
  4559.  
  4560. #if v6_libs
  4561.     #include <retrofit/sgtty.h>
  4562.     #include <retrofit/signal.h>
  4563.     #include <retrofit/setjmp.h>
  4564. #else
  4565.     /* #include <sgtty.h> */
  4566.     /* #include <signal.h> */
  4567.     /* #include <setjmp.h> */
  4568. #endif
  4569.  
  4570. #if no_tandem
  4571.     #define tandem 0 /* na~o suportada */
  4572. #endif
  4573.  
  4574. /* definic,a~o de si'mbolos */
  4575.  
  4576. #define maxpacksiz 94 /* maior tamanho para um pacote */
  4577. #define soh     1    /* start of header */
  4578. #define cr    13    /* carriage return */
  4579. #define sp    32    /* espac,o */
  4580. #define del    127   /* delete (rubout) */
  4581. #define escchr    '^'   /* escape default no CONNECT */ 
  4582. #define maxtry    10    /* numero de tentativas por pacote */
  4583. #define myquote '#'  /* caracter de marcac,a~o (quote ) */
  4584. #define mypad    0     /* nu'mero de carac.preenchimento */
  4585. #define mypchar 0    /* caracter preenchimento (null) */
  4586.  
  4587. #if ibm_uts
  4588.     #define myeol '\R' /* end-of-line para sistemas UTS */
  4589. #else
  4590.     #define myeol '\N' /* end-of-line */
  4591. #endif
  4592.  
  4593. #define mytime    10    /* segundos para me porem em timeout */
  4594. #define maxtim    60    /* timeout ma'ximo*/
  4595. #define mintim    2     /* timeout mi'nimo */
  4596.  
  4597. /* #define true -1 */ /* constantes boleanas */
  4598. /* #define false 0 */
  4599.  
  4600. /*  macros */
  4601.  
  4602. /*
  4603.  *  tochar:  converte  um caracter de  controle  em  caracter
  4604.  *           imprimi'vel, somando um espac,o.
  4605.  *
  4606.  *  unchar:  desfaz tochar.
  4607.  *
  4608.  *  ctl:     converte caracteres de controle para imprimi'vel
  4609.  *           e vice-versa,  trocando o bit de controle (isto
  4610.  *           e': ^A vira A e A vira ^A).
  4611.  */
  4612. #define tochar(ch)    ((ch) + ' ')
  4613. #define unchar(ch)    ((ch) - ' ')
  4614. #define ctl(ch)     ((ch) ^ 64 )
  4615.  
  4616.  
  4617. /* varia'veis globais */
  4618.  
  4619. int   size,     /* tamanho do dado presente */
  4620.       rpsiz,    /* maior tamanho de pacote recebido */
  4621.       spsiz,    /* maior tamanho de pacote transmitido */
  4622.       pad,      /* quanto mandar de preenchimento */
  4623.       timint,   /* timeout para host estrangeiro em TX */
  4624.       n,        /* nu'mero do pacote */
  4625.       numtry,   /* vezes que retransmiti este pacote */
  4626.       oldtry, /*vezes que pacote anterior foi retransmitido*/
  4627.       ttyfd,    /* fd de tty para I/O, 0 se remoto */
  4628.       remote,   /* -1 ==> sou KERMIT REMOTO */
  4629.       image,    /* -1 ==> modo 8 bits */
  4630.       debug,    /* ni'vel de sai'da de depurac,a~o */
  4631.                              /* 0 = nenhum */
  4632.       filnamcnv, /* -1 ==> converte nome arq. p/maiu'sc.*/
  4633.       filecount; /* nu'mero de arquivos deixados de TX */
  4634.  
  4635. char  state,    /* estado atual */
  4636.       padchar,  /* caracter de preenchimento a mandar */
  4637.       eol,      /* end-of-line a mandar */
  4638.       escchr,   /* caracter de escape num CONNECT */
  4639.       quote,    /* caracter de marcac,a~o que chega */
  4640.       **filelist, /* lista de arquivos a TX */
  4641.       *filnam,  /* nome do arquivo corrente */
  4642.       recpkt[maxpacksiz], /* buffer p/receber o pacote */
  4643.       packet[maxpacksiz]; /* buffer para o pacote */
  4644.  
  4645. file  *fp,      /* pointer para arquivo em disco atual */
  4646.       *log;     /* pointer para arquivo de LOG */
  4647.  
  4648. jmp_buf  env;   /* prt.do ambiente para "timeout longjump" */
  4649.  
  4650.  
  4651. /*
  4652.  *  m a i n 
  4653.  *
  4654.  *  main routine - analisa comandos e opc,o~es,
  4655.  *                 prepara a linha tty,
  4656.  *               e pula para a rotina apropriada.
  4657.  */
  4658.  
  4659. main(argc,argv)
  4660. int argc;  /* pointers de caracteres e contadores */
  4661. char **argv; /* argumentos de linha de comando */
  4662. {   
  4663.       char *ttyname, /* nome tty p/arg.linha */
  4664.            *cp;      /* pointer de caracter */
  4665.       int speed,     /* velocidade do tty */
  4666.            cflg, rflg, sflg; /*flags p/connect,receive,send*/
  4667.  
  4668.       struct sgttyb
  4669.            rawmode, /* controlando tty (raw mode) */
  4670.            cookedmode,    /* controlando tty (cooked mode) */
  4671.            ttymode; /* modo de linha tty em opc,a~o de linha */
  4672.  
  4673.       if (argc < 2) usage(); /* existe linha de comando? */
  4674.  
  4675.       cp = *++argv; argv++; argc -= 2; /* arma ptrs p/args */
  4676.  
  4677.  
  4678. /*  inicializa esses valores e torce p/que o primeiro  pacote
  4679.  *  passe numa boa... 
  4680.  */
  4681.  
  4682.       eol = cr; /* eol para pacotes saintes */
  4683.       quote = '#';
  4684.       pad = 0;  /* sem preenchimento */
  4685.       padchar = null; /* uso null se na~o se quer preench.*/
  4686.  
  4687.       speed = cflg = sflg = rflg = 0; /* desliga todos os
  4688.                                          flags de analise */
  4689.       ttyname = 0; /* o default e' modo remoto */
  4690.  
  4691. #if ucb4x /* default: mascarar em 7 bits, crlf */
  4692.       image = false;      /* maiu'sculas no que chegar
  4693.                              e nos nomes de arquivos */
  4694.       filnamcnv = true;   /* conversion for unix systems */
  4695. #else
  4696.       image = true;
  4697.       filnamcnv = false;
  4698. #endif
  4699.  
  4700.       escchr = escchr;    /* caracter default p/escape */
  4701.  
  4702.       while (( *cp) != null) /* analisa carac. no prim.arg.*/
  4703.            switch (*cp++)
  4704.            {
  4705.                 case 'C': cflg++; break; /* CONNECT */
  4706.                 case 'S': sflg++; break; /* SEND */
  4707.                 case 'R': rflg++; break; /* RECEIVE */
  4708.  
  4709.                 case 'D': /* increm. contador de depurac,a~o */
  4710.                      debug++; break;
  4711.  
  4712.                 case 'F': /* F = na~o faz conv.maiu'sc.*/
  4713.                      filnamcnv = false; /*em nomes de arq. */
  4714.                      break;
  4715.  
  4716.                 case 'I': /* modo imagem (8 bits) */
  4717.                      image = true; break;
  4718.                      /* (este e' o default p/ na~o-UNIX)*/
  4719.  
  4720.                 case 'L': /* L = linha tty a usar */
  4721.                      if (argc--) ttyname = *argv++;
  4722.                      else usage();
  4723.                      if (debug) 
  4724.            printf("Linha p/ host remoto: %s/n", ttyname );
  4725.                      break;
  4726.  
  4727.                 case 'E': /* E = caracter de escape */
  4728.                      if (argc--) escchr = **argv++; 
  4729.                      else usage();
  4730.                      if (debug)
  4731.                      printf("Escape = \"%c\"\n",escchr);
  4732.                      break;
  4733.  
  4734.                 case 'B': /* baud rate */
  4735. #if ucb4x 
  4736.                      if (argc--) speed = atoi(*argv++);
  4737.                      else usage();
  4738.                      if (debug)
  4739.            printf("Velocidade da linha p/ host: %d\n",speed);
  4740.                      break;
  4741. #else
  4742.            printmsg("Preparar velocidade so' sob UNIX.");
  4743.            exit(1);
  4744. #endif
  4745.       }
  4746.  
  4747. /*  fazendo a ana'lise */
  4748.  
  4749.       if ((cflg+sflg+rflg) != 1) /* so' pode 1 comando */
  4750.            usage();
  4751.  
  4752.       if (ttyname) /* se foi especificada linha, */
  4753.            {       /* opera em modo local */
  4754.                 ttyfd = open(ttyname,2); /* abre linha tty */
  4755.                 if (ttyfd < 0)
  4756.                 {
  4757.                      printmsg("%s nao abre.", ttyname);
  4758.                      exit(1);
  4759.                 }
  4760.                 remote = false;/* indica modo local */
  4761.            }
  4762.       else           /* linha nao especificada */
  4763.            {
  4764.                 ttyfd = 0;
  4765.                 remote = true;
  4766.            }
  4767.  
  4768.  
  4769. /* poe o tty certo no modo correto */
  4770.  
  4771.       if (remote)
  4772.            {
  4773.                 gtty(0,&cookedmode); /* salva modo corrente*/
  4774.                 gtty(0,&rawmode);
  4775.                 rawmode.sg_flags \= (raw\tandem);
  4776.                 rawmode.sg_flags &= ^(echo\crmod);
  4777.                 stty(0,&rawmode); /* poe tty em raw mode */
  4778.            }
  4779.       else /* local, usa linha associada */
  4780.            {
  4781.                 gtty(ttyfd,&ttymode);
  4782.                 ttymode.sg_flags \= (raw\tandem);
  4783.                 ttymode.sg_flags &= ^(echo\crmod);
  4784.  
  4785. #if ucb4x /* so' muda velocidade sob UNIX */
  4786.                 if (speed) /* usuario especificou veloc.? */
  4787.                 {
  4788.                      switch(speed)
  4789.                      {
  4790.                           case 110: speed = b110; break;
  4791.                           case 150: speed = b150; break;
  4792.                           case 300: speed = b300; break;
  4793.                           case 1200: speed = b1200; break;
  4794.                           case 2400: speed = b2400; break;
  4795.                           case 4800: speed = b4800; break;
  4796.                           case 9600; speed = b9600; break;
  4797.  
  4798.                      default:
  4799.                           printmsg("Velocidade errada.");
  4800.                           exit(1);
  4801.  
  4802.                      }    
  4803.                 ttymode.sg_ispeed = speed;
  4804.                 ttymode.sg_ospeed = speed;
  4805.                 }   
  4806. #endif /* ucb4x */
  4807.  
  4808.       stty(ttyfd,&ttymode); /* tty em in raw mode */
  4809.       }
  4810.  
  4811. /* tudo preparado, executa-se o comando dado. */
  4812.  
  4813.       if (debug)
  4814.       {
  4815.            printf("Nivel de depuracao: %d\n\n",debug);
  4816.  
  4817.            if (cflg) printf("Comando CONNECT\n\n");
  4818.            if (sflg) printf("Comando SEND\n\n");
  4819.            if (rflg) printf("Comando RECEIVE\n\n");
  4820.  
  4821.       }
  4822.  
  4823.       if (cflg) connect(); /* comando CONNECT */
  4824.  
  4825.       if (sflg)            /* comando SEND */
  4826.       {
  4827.            if (argc--) filnam = *argv++; /* pega arq. p/TX */
  4828.            else
  4829.            {
  4830.                 if (remote)
  4831.                      stty(0,cookedmode); /*restaura tty */
  4832.                 usage();                 /* e da' o erro */
  4833.            }
  4834.            fp = null; /* indica que ainda nao abriu arq. */
  4835.            filelist = argv; /* prep. resto da lista de arq.*/
  4836.            filecount = argc; /* num.arq.deixados de TX */
  4837.            if (sendw() == false) /* manda o(s) arq(s) */
  4838.                 printmsg("SEND falhou.");
  4839.            else
  4840.                 printmsg("Pronto.");
  4841.       }
  4842.  
  4843.       if (rflg) /* comando RECEIVE */
  4844.       {
  4845.            if (recsw() == false)/* recebe o(s) arq.(s) */
  4846.                 printmsg("RECEIVE falhou.");
  4847.            else
  4848.                 printmsg("Feito.");
  4849.       }
  4850.  
  4851.       if (remote) stty(0,&cookedmode);    /* restaura modos tty */
  4852. }
  4853.  
  4854.  
  4855. /* 
  4856.  *  s e n d s w 
  4857.  *
  4858.  *     E'  o  "switcher"  da tabela de  estados  para  mandar 
  4859.  * arquivos. Fica em "loop" ate' acabar ou acontecer um erro.
  4860.  *     As rotinas chamadas por ela sa^o responsa'veis  pelas 
  4861.  * mudanc,as na tabela.
  4862.  *
  4863.  */
  4864.  
  4865. sendsw()
  4866. {
  4867.     char sinit(), sfile(), sdata(), seof(), sbreak();
  4868.  
  4869.     state  = 'S';    /* este e' o estado inicial */
  4870.     n = 0;           /* inicializa nu'mero da mensagem */
  4871.     numtry = 0;      /* nenhuma retransm., ainda */
  4872.     while(true)      /* faz isto enquanto for necessa'rio */
  4873.     {
  4874.     if (debug) printf("Estado SENDSW: %c\n",state);
  4875.      switch(state)
  4876.     {
  4877.         case 'S': state = sinit(); break; /*send-init*/
  4878.         case 'F': state = sfile(); break; /*send-file*/
  4879.         case 'D': state = sdata(); break; /*send-data*/
  4880.         case 'Z': state = seof(); break; /*send-eof*/
  4881.         case 'B': state = sbreak(); break; /*send-break*/
  4882.         case 'C': return (true); /* completo */
  4883.         case 'A': return (false); /* "abort" */
  4884.         default:  return (false); /*desconhecido,falha*/
  4885.     }
  4886.     }
  4887. }
  4888.  
  4889.  
  4890. /*
  4891.  *  s i n i t 
  4892.  *
  4893.  *    SEND-INIT: manda os para^metros deste host e
  4894.  *               pega os do outro lado.
  4895.  *
  4896.  */
  4897.  
  4898. char sinit()
  4899. {
  4900.     int num, len; /* nu'mero e comprimento do pacote */
  4901.  
  4902.     if (numtry++ > maxtry) return('A'); /* se muitas */
  4903.                               /* retransmisso~es, desiste */
  4904.     spar(packet);         /* preenche pacote infos iniciais*/
  4905.  
  4906.     flushinput();         /* input pendente */
  4907.  
  4908.     spack('S',n,6,packet); /* manda umpacote S */
  4909.     switch(rpack(&len,&num,recpkt)) /* qual a resposta ? */
  4910.     {
  4911.     case 'N':    return(state); /* nak, tenta de novo */
  4912.     case 'Y':               /* ack */
  4913.         if (n !=num) /* se ack errado, fica no estado S */
  4914.             return(state); /* e tenta de novo */
  4915.         rpar(recpkt); /* pega infos do outro lado */
  4916.         if (eol == 0) eol = '\N'; /* checa e arma defaults */
  4917.         if (quote == 0) quote = '#';
  4918.         numtry = 0;    /* zera contador de retransm. */
  4919.         n = (n+1)%64; /* "pula" contador de pacotes */
  4920.         return('F'); /* ok, muda estado para F */
  4921.     case 'E':          /* chegou pacote de erro */
  4922.         prerrpkt(recpkt); /* imprime-o e */
  4923.         return('A');        /* aborta */
  4924.     case false: return(state); /* falha de RX, retenta */
  4925.     default: return('A'); /* qq. outra coisa, aborta */
  4926.     }   
  4927.   
  4928.  
  4929.  
  4930. /* 
  4931.  *  s f i l e 
  4932.  *
  4933.  *  manda cabec,alho de arquivo
  4934.  */
  4935.  
  4936. char sfile()
  4937. {
  4938.     int  num, len;   /* nu'mero do pacote, comprimento */
  4939.          char filnam1[50], /* nome de arquivo convertido */
  4940.          *newfilnam, /* pointer para arq. a transmitir */
  4941.          *cp;                /* char pointer */
  4942.     if (numtry++ > maxtry) return('A'); /* se muitas   */
  4943.                                  /* retransm., desiste */
  4944.     if (fp == null)  /* se ainda na~o aberto, */
  4945.     {   if (debug)
  4946.            printf("Abrindo %s para transmitir.\n",filnam);
  4947.     fp = fopen(filnam,"r"); /* abre o arquivo p/ ser TX */
  4948.     if (fp == null) /* se pointer de arq.furado, desiste*/
  4949.     {
  4950.         error("Nao da' p/ abrir %s", filnam);
  4951.         return('A');
  4952.     }
  4953.     }   
  4954.  
  4955.     strcpy(filnam1,filnam); /* copia nome do arquivo */
  4956.     newfilnam = cp = filnam1;
  4957.     while  (*cp != '\0') /* tira nomes do ini'cio do */
  4958.     if  (*cp++ == '/') /* direto'rio (ie. ate' u'ltimo) */
  4959.         newfilnam = cp;
  4960.  
  4961.     if (filnamcnv) /* converte p/maiu'sculas */
  4962.     for (cp = newfilnam; *cp != '\0'; cp++)
  4963.         if (*cp >= 'A' && *cp <= 'Z')
  4964.         *cp ^= 040;
  4965.  
  4966.     len = cp - newfilnam; /* computa compr.novo nome arq. */
  4967.  
  4968.     printmsg("Transmitindo %s como %s", filnam, newfilnam);
  4969.  
  4970.     spack('F',n,len,newfilnam); /* manda um pacote F */
  4971.     switch(rpack(&len,&num,recpkt)) /* qual a resposta? */
  4972.     {
  4973.     case 'N': /* nak: fica neste estado */
  4974.         num = (--num<0 ? 63:num); /* a menos que seja */
  4975.                      /* pelo pro'ximo pacote */
  4976.         if (n != num) /* que e' como ack */
  4977.         return(state); /* este pacote cai em... */
  4978.  
  4979.     case 'Y':            /* ack */
  4980.         if (n != num) return(state); /* se ack errado, */
  4981.                      /* fica no estado F */
  4982.               numtry = 0; /* zera contador de retransmisso~es */
  4983.         n = (n+1)%64; /* "vira contador de pacote */
  4984.         size = bufill(packet); /* pega prim.dado do arq.*/
  4985.         return('D'); /* muda estado para D */
  4986.     case 'E': /* Chegou pacote de erro */
  4987.         prerrpkt(recpkt); /* imprime-o e */
  4988.         return('A');      /* aborta      */
  4989.  
  4990.     case false: return(state); /* falha de RX: fica em F*/
  4991.  
  4992.     default: return('A'); /* qq. outra coisa, aborta */
  4993.     }   
  4994. }
  4995.  
  4996. /*
  4997.  *  s e o f
  4998.  *  
  4999.  *  manda end-of-file.
  5000.  */
  5001.  
  5002. char seof()
  5003. {
  5004.     int  num, len;        /* nu'mero e compr. do pacote */
  5005.     if (numtry++ > maxtry) return('A'); /* muitas = aborta */
  5006. spack('Z',n,0,packet); /* manda um pacote Z */
  5007. switch(rpack(&len,&num,recpkt)) /* qual foi a resposta ? */
  5008.     {
  5009.     case 'N': /* nak: fica neste estado */
  5010.         num = (--num<0 ? 63:num); /* a menos que seja um */
  5011.                      /* nak p/ pro'ximo pacote, */
  5012.     if (n != num) /* que e' como um ack para este estado */
  5013.         return(state);        /* cai em...*/
  5014.  
  5015.     case 'Y':                /* ack */
  5016.     if (n != num) return(state); /*se ack errado,segura*/
  5017.     numtry = 0; /* zera contador de retransmisso~es */
  5018.     n = (n+1)%64; /* e "vira" contador de pacote */
  5019.        if (debug)
  5020.            printf("Fechando arquivo de entrada %s, ",filnam);
  5021.     fclose(fp); /* fecha o arquivo de entrada */
  5022.     fp = null; /* arma flag = nenhum arquivo aberto */
  5023.     if (debug)
  5024.            printf("Buscando proximo arquivo...\n");
  5025.     if (gnxtfl() == false) /* nenhum outro arquivo a TX?*/
  5026.         return('B'); /* se na~o, break, eot, pronto! */
  5027.     if (debug)
  5028.            printf("   novo arquivo e' %s\n",filnam);
  5029.         return('F'); /* mais arquivos, estado vira F */
  5030.  
  5031.     case 'E': /* chegou pacote de erro  */
  5032.     prerrpkt(recpkt); /* imprime-o e */
  5033.     return('A');      /* aborta      */
  5034.  
  5035.     case false: return(state); /* falha de RX: fica em Z */
  5036.  
  5037.     default: return('A'); /* qq. outra coisa, aborta */
  5038.     }
  5039. }
  5040.  
  5041.  
  5042. /* 
  5043.  *  s b r e a k
  5044.  *
  5045.  *  manda break (eot)
  5046.  *
  5047.  */
  5048.  
  5049. char sbreak()
  5050. {
  5051.     int  num, len; /* nu'mero e comprimento do pacote */
  5052.     if (numtry++ > maxtry) return('A'); /* muitas=aborta */
  5053.  
  5054.     spack('B',n,0,packet); /* manda pacote B */
  5055.     switch (rpack(&len,&num,recpkt)) /* qual a resposta ? */
  5056.     {
  5057.        case 'N': /* nak: fica neste estado */
  5058.         num = (--num<0 ? 63:num); /* a menos que nak p/ */
  5059.                                      /* pacote anterior,   */
  5060.         if (n != num)             /* que e' como um ack */
  5061.         return(state);        /* p/este, dai' cai em*/
  5062.  
  5063.     case 'Y':            /* ack */
  5064.         if (n != num) return(state); /* ack errado=falha*/
  5065.         numtry = 0; /* zera contador de retransmisso~es */
  5066.         n = (n+1)%64; /* e "vira" o nu'mero do pacote */
  5067.              return('C'); /* estado vira completo */
  5068.  
  5069.     case 'E': /* chegou pacote de erro */
  5070.         prerrpkt(recpkt); /* imprime-o e */
  5071.         return('A');      /* aborta      */
  5072.  
  5073.     case false: return(state); /* falha de RX: fica em B*/
  5074.  
  5075.     default: return ('A'); /* qq.outra coisa: aborta */
  5076.    }
  5077. }
  5078.  
  5079.  
  5080. /*
  5081.  *  r e c s w 
  5082.  *
  5083.  *    Este e' o switcher da tabela de estados de RX de arq.
  5084.  *
  5085.  */
  5086.  
  5087. recsw()
  5088. {
  5089.     char  rinit(), rfile(), rdata(); /*usa estas procedures*/
  5090.  
  5091.     state = 'R'; /* receive-init e' o estado inicial */
  5092.     n = 0;       /* inicializa nu'mero da mensagem */
  5093.     numtry = 0;  /* nenhuma retransmissa~o ainda   */
  5094.  
  5095.     while(true)
  5096.     {
  5097.     if (debug)
  5098.            printf(" Estado recsw: %c\n",state);
  5099.     switch(state) /* faz ate' acabar */
  5100.     {
  5101.         case 'R':                     /* receive-init */
  5102.                 state = rinit();
  5103.                 break;
  5104.         case 'F':                     /* receive-file */
  5105.                 state = rfile();
  5106.                 break;
  5107.         case 'D':                     /* receive-data */
  5108.                 state = rdata();
  5109.                 break;
  5110.         case 'C': return(true);     /* estado completo */
  5111.         case 'A': return(false); /*estado de aborc,a~o */
  5112.     }
  5113.     }   
  5114. }
  5115.  
  5116.  
  5117. /*
  5118.  *  r i n i t 
  5119.  *
  5120.  *  recebe inicializac,a~o
  5121.  *
  5122.  */
  5123.  
  5124. char rinit()
  5125. {
  5126.     int  len, num; /* comprimento e nu'mero do pacote */
  5127.     if (numtry++ > maxtry) return('A'); /* muitas=aborta */
  5128.  
  5129.     switch(rpack(&len,&num,packet)) /* pega um pacote */
  5130.     {
  5131.     case 'S':            /* send-init */
  5132.         rpar(packet); /* pega o outro lado */
  5133.         spar(packet); /* enche pacote c/minhas infos de */
  5134.                          /* inicializac,a~o */
  5135.         spack('Y',n,6,packet); /* ack c/meus parms. */
  5136.         oldtry = numtry; /* salva cont.retransmisso~es */
  5137.         numtry = 0; /* inicializa novo contador */
  5138.         n = (n+1)%64; /* "vira" num.pacote */
  5139.    return('F'); /* entra em estado file-receive */
  5140.    
  5141.     case   'E': /* chegou pacote de erro */
  5142.         prerrpkt(recpkt); /* imprime-o e */
  5143.         return('A');        /* aborta */
  5144.  
  5145.     case false: /* na~o pegou pacote*/
  5146.         spack('N',n,0,0); /* retorna nak */
  5147.         return(state);    /* fica tentando */
  5148.  
  5149.     default: return('A'); /* qq.outro tipo aborta */
  5150.  
  5151.     }
  5152. }
  5153.  
  5154. /*
  5155.  *  r f i l e
  5156.  *
  5157.  *  recebe cabec,alho de arquivo
  5158.  *
  5159.  */
  5160.  
  5161. char rfile()
  5162. {
  5163.     int  num, len; /* nu'mero e comprimento do pacote */
  5164.     char filnam1[50]; /* guarda nome do arq. convertido */
  5165.    
  5166.     if (numtry++ > maxtry) return('A'); /* muitas=aborta */
  5167.  
  5168.     switch(rpack(&len,&num,packet)) /* pega um pacote */
  5169.     {
  5170.         case 'S': /* send-init, talvez nosso ack se perdeu */
  5171.         if (oldtry++ > maxtry)
  5172.                 return('A');        /* muitas=abort */
  5173.         if (num == ((n==0) ? 63:n-1)) /* pac.ant.mod 64?*/
  5174.         {                /* sim: ack de novo */
  5175.         spar(packet);          /* com nossos parms.*/
  5176.                                        /* de  send-init    */
  5177.         spack('Y',num,6,packet);
  5178.         numtry = 0; /* zera contador de retransm.*/
  5179.                return(state); /* fica neste estado */
  5180.         }
  5181.         else   return('A'); /* sem pacote pre'vio: aborta*/
  5182.  
  5183.     case 'Z':            /* end-of-file */
  5184.         if (oldtry++ > maxtry) return('A');
  5185.         if (num == ((n==0) ? 63:n-1)) /*pac.ant.mod 64 ?*/
  5186.         {                  /*sim: ack de novo*/
  5187.         spack('Y',num,0,0);    
  5188.         numtry = 0;
  5189.         return(state); /* fica este estado */
  5190.         }
  5191.         else return('A'); /* sem pac.anterior: aborta */
  5192.  
  5193.     case 'F':     /* file header (o que queri'amos) */
  5194.         if (num != n)
  5195.                 return('A'); /* o num.pacote deve estar OK!*/
  5196.         strcpy(filnam1,packet); /* copia o nome do arq. */
  5197.  
  5198.         if (filnamcnv) /* converte p/minu'sculas */
  5199.            for (filnam=filnam1; *filnam != '\0'; filnam++)
  5200.             if (*filnam >= 'A' && *filnam <= 'Z')
  5201.             *filnam \= 040;
  5202.  
  5203.         if ((fp=fopen(filnam1,"w"))==null) /*tenta abrir*/
  5204.                                               /* novo arq. */
  5205.         {
  5206.         error("nao da' p/criar %s",filnam1); /*se na~o*/
  5207.                                            /* da', desiste */
  5208.         return('A');
  5209.         }
  5210.         else                /* ok: da' mensagem */
  5211.         printmsg("Recebendo %s como %s",packet,filnam1);
  5212.         spack('Y',n,0,0); /* ack p/ cab.arq. */
  5213.         oldtry = numtry; /* Zera cont.retransm. */
  5214.         numtry = 0;            /* ... */
  5215.         n = (n+1)%64; /* "vira" num.pacote mod 64 */
  5216.         return('D');  /*  entra em estado de dados */
  5217.  
  5218.     case 'B':  /* interrompe transmissa~o (eot) */
  5219.         if (num != n)
  5220.                 return('A'); /* preciso #pacote certo aqui */
  5221.         spack('Y',n,0,0); /* diz OK */
  5222.         return('C');      /* vai p/estado completo */
  5223.  
  5224.     case 'E': /*  chegou pacote de erro  */
  5225.         prerrpkt(recpkt); /* imprime-o e */
  5226.         return('A');      /* aborta      */
  5227.  
  5228.     case false: /* na~o pegou pacote */
  5229.         spack('N',n,0,0);        /* devolve um nak */
  5230.         return(state);              /* fica tentando  */
  5231.  
  5232.     default: return('A'); /* qq.outro pacote: aborta */
  5233.     }
  5234. }
  5235.  
  5236. /*
  5237.  *  r d a t a 
  5238.  * 
  5239.  *  recebe dados
  5240.  * 
  5241.  */
  5242.  
  5243. char rdata()
  5244.     int num, len; /* nu'mero e comprimento do pacote */
  5245.     if (numtry++ > maxtry)
  5246.        return('A');  /* muitas = aborta */
  5247.  
  5248.     switch(rpack(&len,&num,packet)) /* pega pacote */
  5249.     {
  5250.     case 'D': /* pegou pacote de dados */
  5251.         if (num != n) /* pacote certo? */
  5252.         {                                  /* na~o */
  5253.         if (oldtry++ > maxtry)
  5254.             return('A'); /* muitas=aborta */
  5255.         if (num == ((n==0) ? 63:n-1))
  5256.                      /* sena~o checa nu'mero do pacote */
  5257.         {      /* pacote anterior de novo? */
  5258.             spack('Y',num,6,packet); /* sim: re-ack */
  5259.             numtry = 0; /* zera cont.retransm. */
  5260.             return(state); /* na~o grava dados */
  5261.         }
  5262.         else return('A'); /*desculpe: nu'mero errado.*/
  5263.         }
  5264.         /* pega dados c/nu'mero certo */
  5265.         bufemp(packet,len); /* grava os dados no arquivo*/
  5266.         spack('Y',n,0,0); /* ack p/pacote */
  5267.         oldtry = numtry; /* zera cont.retransm. */
  5268.          numtry = 0;    /* ... */
  5269.         n = (n+1)%64;  /* "vira" num.pacote */
  5270.         return('D'); /* permanece em estado de dados */
  5271.  
  5272.     case 'F'; /* pega cabec,alho de arquivo */
  5273.         if (oldtry++ > maxtry)
  5274.         return('A'); /* muitas=aborta */
  5275.         if (num == ((n==0) ? 63:n-1)) /*senao checa #pac*/
  5276.         {    /* era o pacote anterior */
  5277.         spack('Y',num,0,0);    /* ack de novo */
  5278.         numtry  = 0;         /* zera cont.retr. */
  5279.         return(state);         /* fica em est.dados*/
  5280.         }
  5281.         else return('A'); /* na~o pac.pre'vio: aborta */
  5282.  
  5283.     case 'Z':            /* end-of-file */
  5284.         if (num != n)
  5285.                 return('A'); /* deve ter num.pac certo */
  5286.         spack('Y',n,0,0);        /* ok: ack */
  5287.         fclose(fp);            /* fecha o arq. */
  5288.         n = (n+1)%64; /* "vira" #pacote */
  5289.         return('F'); /* volta estado recebe arq. */
  5290.  
  5291.     case 'E':  /* chegou pacote de erro */
  5292.         prerrpkt(recpkt); /* imprime-o e */
  5293.         return('A');        /* aborta */
  5294.   
  5295.     case false: /* na~o pegou pacote */
  5296.         spack('N',n,0,0);        /* retorna nak */
  5297.         return(state);        /* fica tentando*/
  5298.  
  5299.     default: return('A'); /* qq.outro pacote = aborta */
  5300.     }
  5301. }
  5302.  
  5303. /*
  5304.  *  c o n n e c t 
  5305.  *
  5306.  *     Estabelece  conexa~o  de terminal virtual  com  o  host 
  5307.  * remoto via linha tty.
  5308.  *
  5309.  */
  5310.  
  5311.  
  5312. connect()
  5313. {
  5314.     int  pid, /* guarda identificac,a~o da crianc,a */
  5315.       connected;  /* flag de conexa~o */
  5316.     char bel = '\07',
  5317.       c;
  5318.  
  5319.     struct sgttyb
  5320.         rawmode,    /* controlando tty, modo raw    */
  5321.         cookedmode; /* controlando tty, modo cooked */
  5322.  
  5323.     if (remote) /* nada a que conectar em remoto */
  5324.     {
  5325.     printmsg("nenhuma linha especificada para conexa~o.");
  5326.     return;
  5327.     }
  5328.  
  5329.     gtty(0,&cookedmode); /* salva modo corrente */
  5330.     gtty(0,&rawmode);
  5331.     rawmode.sg_flags \= (rawmode\tandem);
  5332.     rawmode.sg_flags &= ^(echo\crmod);
  5333.     stty(0,&rawmode); /* po~e tty em modo raw */
  5334.  
  5335.     pid  = fork(); /* comeca a "garfar" o que */
  5336.                    /* o host remoto "digitar" */
  5337.     if (pid) /* pai: manda teclas p/ host remoto */
  5338.     {
  5339.     printmsg("conectado...\r");
  5340.     connected = true; /* entra em modo conectado */
  5341.     while (connected)
  5342.     {
  5343.         read(0,&c,1); /* pega um caracter */
  5344.         if ((c&0177) == escchr) /* ve se caracter de esc*/
  5345.         {
  5346.         read(0,&c,1);
  5347.         if ((c&0177) == escchr)
  5348.             write(ttyfd,&c,1);
  5349.         else
  5350.         switch (c&0177)
  5351.         {
  5352.             case 'C':
  5353.             connected = false;
  5354.             write(0,"\r\n",2);
  5355.             break;
  5356.  
  5357.             case 'H':
  5358.             write(0,"\r\nyes,ainda estou aqui...\r\n",26);
  5359.             break;
  5360.  
  5361.             default:
  5362.             write(0,&bel,1);
  5363.             break;
  5364.         }    
  5365.         }   
  5366.         else
  5367.         {      /* se na~o caracter de escape, */
  5368.         write(ttyfd,&c,1);    /* transmite-o */
  5369.         c = null; /* nulifica-o (por que?) */
  5370.         }
  5371.     }
  5372.     kill(pid,9); /* pronto: mata a crianc,a */
  5373.     wait(0);     /* e queima-a */
  5374.     stty(0,&cookedmode); /* restaura modo tty */
  5375.     printmsg("disconectado.")    
  5376.     return; /* pronto */
  5377.     }
  5378.     else /* a crianc,a le^ do host remoto */
  5379.     {
  5380.     while(1) /* faz isto p/sempre */
  5381.     {
  5382.         read(ttyfd,&c,1);
  5383.         write(1,&c,1);
  5384.     }
  5385.     }
  5386. }
  5387.  
  5388.  
  5389. /* 
  5390.  *  utilita'rios kermit.
  5391.  */
  5392.  
  5393. clkint() /* timer interrupt handler */
  5394. {
  5395.     longjmp(env,true); /* manda rpack desistir */
  5396. }
  5397.  
  5398.  
  5399. /* 
  5400.  *  r p a c k
  5401.  *
  5402.  *  manda um pacote
  5403.  *
  5404.  */
  5405.  
  5406. spack(type,num,len,data)
  5407. char type, *data;
  5408. int num, len;
  5409. {
  5410.     int i; /* contador de loop de caracter */
  5411.     char chksum, buffer[100]; /* checksum, buffer de pacote*/
  5412.     register char *bufp; /* pointer do buffer */
  5413.  
  5414.     if  (debug>1) /* mostra pacote sainte */
  5415.     {
  5416.     if (data != null)
  5417.         data[len] = '\0'; /*termina dados c/nulo p/impr.*/
  5418.     printf("  tipo do spack: %c\n",type);
  5419.     printf("         numero:  %d\n",num);
  5420.     printf("    comprimento:  %d\n",len);
  5421.     if (data != null)
  5422.         printf("          dados: \"%s\"\n",data);
  5423.     }
  5424.  
  5425.     bufp = buffer; /* arma pointer do buffer */
  5426.     for (i=1; i<=pad; i++)
  5427.       write(ttyfd,&padchar,1); /* manda qq. preenchi/o */
  5428.  
  5429.     *bufp++ = soh; /* marcador de pacote (soh) = ASCII 1 */
  5430.     *bufp++ = tochar(len+3); /* manda o contador de carac. */
  5431.     chksum  = tochar(len+3); /* inicializa o checksum */
  5432.     *bufp++ = tochar(num);   /* numero do pacote */
  5433.     chksum += tochar(num);   /* atualiza o checksum */
  5434.     *bufp++ = type;          /* tipo do pacote */
  5435.     chksum += type;          /* atualiza o checksum */
  5436.  
  5437.     for (i=0; i<len; i++) /* loop para todos os caracteres */
  5438.     {
  5439.     *bufp++ = data[i]; /* pega um caracter */
  5440.     chksum += data[i]; /* atualiza o checksum */
  5441.     }
  5442.     chksum = (((chksum&0300) >> 6)+chksum)&077; 
  5443.            /* calcula checksum final */
  5444.     *bufp++ = tochar(chksum); /* po~e no pacote */
  5445.     *bufp  = eol; /* terminador de linha extra-packet */
  5446.     write(ttyfd,buffer,bufp-buffer+1; /* manda o pacote */
  5447. }
  5448.  
  5449. /*
  5450.  *  r p a c k
  5451.  *
  5452.  *  le^ um pacote
  5453.  */
  5454.  
  5455. rpack(len,num,data)
  5456. int *len, *num; /* nu'mero e comprimento do pacote */
  5457. char *data;     /* dados do pacote */
  5458. {
  5459.     int i, done; /* nu'mero carac. de dados, sai'da do loop */
  5460.     char t, /*  caracter de input corrente */
  5461.          type, /* tipo do pacote */
  5462.       cchksum, /*  nosso (do computador) checksum */
  5463.       rchksum; /*  checksum recebido do host */
  5464.  
  5465. #if ucb4x /* o tops-20 na~o manuseia timeouts... */
  5466.     if (setump(env))
  5467.       return false; /* atingiu timeout: falhou */
  5468.     signal(sigalrm,clkint); /* arma o timeout */
  5469.     if ((timint > maxtim) \\ (timint < mintim))
  5470.        timint = mytime;
  5471.     alarm(timint);
  5472. #endif /* ucb4x */
  5473.  
  5474.     while (t != soh) /* espera cabec.arquivo */
  5475.     {
  5476.     read(ttyfd,&t,1);
  5477.     t &= 0177; /* manuseia paridade */
  5478.     }
  5479.     done = false; /* recebeu soh, inicia loop */
  5480.     while  (!none) /* loop p/ conseguir um pacote */
  5481.     {
  5482.     read(ttyfd,&t,1); /* pega caracter */
  5483.     if (!image) t &= 0177;    /* trata paridade */
  5484.        if (t == soh) continue; /* resincroniza se soh */
  5485.      cchksum = t; /* inicializa o checksum */
  5486.     *len = unchar(t)-3; /* contador de caracteres */
  5487.  
  5488.     read(ttyfd,&t,1); /* pega caracter */
  5489.     if (!image) t &= 0177; /* trata paridade */
  5490.     if (t == soh) continue; /* resincroniza se soh */
  5491.     cchksum = cchksum + t; /* atualiza checksum */
  5492.     *num = unchar(t); /* nu'mero do pacote */
  5493.     read(ttyfd,&t,1); /* pega caracter */
  5494.     if (!image) t &= 0177; /* trata paridade */
  5495.     if (t == soh) continue; /* atualiza checksum */
  5496.     type = t; /* tipo do pacote */
  5497.  
  5498.     for (i=0; i<*len; i++) /* o pro'prio dado, se existir*/
  5499.     {    /* loop para contar caracteres */
  5500.         read(ttyfd,&t,1); /* pega caracter */
  5501.         if (!image) t &= 0177; /* manuseia paridade */
  5502.         if (t == soh) continue; /* resincroniza se soh */
  5503.         cchksum = cchksum + t; /* atualiza checksum */
  5504.         data[i] = t; /* inclui checksum no buffer */
  5505.     }   
  5506.     data[*len] = 0;    /* marca fim de dados */
  5507.  
  5508.     read(ttyfd,&t,1); /* pega u'ltimo caracter (checksum)*/
  5509.     rchksum = unchar(t); /* converte p/ numerico */
  5510.     read(ttyfd,&t,1); /* pega caracter de eol e joga */
  5511.     if (!image) t &= 0177; /* manuseia paridade */
  5512.     if (t == soh) continue; /* resincroniza se soh */
  5513.     done = true; /* pegou checksum, feito */
  5514.     }
  5515.  
  5516. #if ucb4x
  5517.     alarm(0);  /* desabilita o timer interrupt */
  5518. #endif
  5519.  
  5520.     if  (debug>1) /* mostra pacote chegante */
  5521.     {
  5522.     if (data != null)
  5523.         data[*len] = '\0'; /* encerra dado c/nulo p/impr*/
  5524.     printf("  tipo rpack: %c\n",type);
  5525.     printf("      numero:  %d\n",*num);
  5526.     printf(" comprimento:  %d\n",*len);
  5527.     if (data != null)
  5528.         printf("       dados: \"%s\"\n",data);
  5529.     }
  5530.     cchksum = 
  5531.       (((cchksum&0300) >> 6)+cchksum)&077; /*checksum final*/
  5532.  
  5533.     if (cchksum != rchksum) return(false);
  5534.  
  5535.     return(type); /* tudo bem; retorna tipo do pacote */
  5536. }
  5537.  
  5538. /*
  5539.  *  b u f i l l 
  5540.  *
  5541.  *      Pega   buffer  cheio  de  dados  do   arquivo   sendo
  5542.  * transmitido.
  5543.  *      So' e' feito controle de marcac,a~o;
  5544.  *      na~o sa~o manuseadas as prefixac,o~es de
  5545.  *              oitavo bit e
  5546.  *              contador de repetic,o~es.
  5547.  */
  5548.  
  5549. bufill(buffer)
  5550. char buffer[];                /* buffer */
  5551. {
  5552.     int i,        /* indice do loop  */
  5553.         t;        /* caracter lido do arquivo */
  5554.     char  t7;         /* versa~o 7-bit d'acima */
  5555.  
  5556.     i = 0;     /* inicializa pointer do buffer de dados */
  5557.     while((t = getc(fp)) != eof) /*pega pro'ximo caracter */
  5558.     {
  5559.     t7 = t & 0177; /* pega 7 bits de mais baixa ordem */
  5560.  
  5561.     if (t7 < sp \\ t7==del \\ t7==quote) 
  5562.            /* este caracter precisa manuseio especial? */
  5563.         if (t=='\n' && !image)
  5564.         {    /* faz mapeamento lf->crlf se !image */
  5565.         buffer[i++] = quote;
  5566.         buffer[i++] = ctl('\r');
  5567.          }
  5568.         buffer[i++] = quote; /* marca o caracter */
  5569.         if (t7 != quote)
  5570.         {
  5571.         t = ctl(t);     /* e descontrolifica-o */
  5572.         t7 = ctr(t7);
  5573.         }
  5574.     }
  5575.     if (image)
  5576.         buffer[i++] = t; /* deposita o pro'prio caracter */
  5577.     else
  5578.         buffer[i++] = t7;
  5579.  
  5580.     if (i >= spsiz-8) return(i); /* checa comprimento */
  5581.     }
  5582.     if  (i==0) return (eof); /*sobrevoa por aqui so' se eof*/
  5583.     return(i);  /* trata buffer parcial */
  5584. }
  5585.  
  5586. /*
  5587.  *  b u f e m p 
  5588.  *
  5589.  *  po~e dado do pacote chegante num pacote
  5590.  *
  5591.  */
  5592.  
  5593. bufemp(buffer,len)
  5594. char buffer[];                /* buffer */
  5595. int len;                /* comprimento */
  5596. {
  5597.     int i;                /* contador */
  5598.     char t;                /*guardador de carac*/
  5599.  
  5600.     for (i=0; i<len; i++) /* loop pelo campo de dados */
  5601.     {
  5602.     t = buffer[i];            /* pega caracter */
  5603.     if (t == myquote)        /*marca de controle?*/
  5604.     {                /* sim */
  5605.         t  =  buffer[++i]; /* pega caracter marcado */
  5606.         if ((t & 0177) != myquote)
  5607.            /* bits de mais baixa ordem batem c/carac.marc.?*/
  5608.         t = ctl(t); /* na~o: descontrolifica-o */
  5609.     }
  5610.     if (t==cr && !image)
  5611.            /* na~o passa cr se em modo imagem */
  5612.         continue;
  5613.  
  5614.     putc(t,fp);
  5615.     }
  5616. }
  5617.  
  5618.  
  5619. .foKERMIT: Manual do Protocolo                               #
  5620. /*
  5621.  *  g n x t f l
  5622.  *
  5623.  *    Pega pro'ximo arquivo de um grupo.
  5624.  */
  5625.  
  5626. gnxtfl()
  5627. {
  5628.     if (debug)
  5629.       printf(" gnxtfl: lista de arq. = \"%s\"\n",*filelist);
  5630.     filnam = *(filelist++);
  5631.     if (filecount-- == 0)
  5632.       return false; /* se na~o mais, falhou */
  5633.     else return true; /* sena~o: funcionou */
  5634. }
  5635.  
  5636. /*
  5637.  *  s p a r
  5638.  *
  5639.  *    Enche a matriz de dados c/meus para^metros de send-init
  5640.  *
  5641.  */
  5642.  
  5643. spar(data)
  5644. char data[];
  5645. {
  5646.     data[0] = tochar(maxpacksiz); /*maior pacote posso RX  */
  5647.     data[1] = tochar(mytime);  /* quando quero ser timeout */
  5648.     data[2] = tochar(mypad);     /* quanto preechi/o preciso */
  5649.     data[3] = ctl(mychar);    /* quero este carac.preench.*/
  5650.     data[4] = tochar(myeol);     /* eol que eu quero         */
  5651.     data[5] = myquote;      /* marcac,a~o que eu mando    */
  5652. }   
  5653.  
  5654. /*
  5655.  *  r p a r 
  5656.  *
  5657.  *    Pega os para^metros de send-init do outro host
  5658.  *
  5659.  */
  5660.  
  5661. rpar(data)
  5662. char data[];
  5663. {
  5664.     spsiz   = unchar(data[0]); /* maior pacote         */
  5665.     timint  = unchar(data[1]); /* quando timeout       */
  5666.     pad     = unchar(data[2]); /* quanto preenchimento */
  5667.     padchar = ctl(data[3]);    /* eol que devo mandar  */
  5668.     quote   = data[5];        /* marca que vira'      */
  5669. }
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675. /* 
  5676.  *  f l u s h i n p u t
  5677.  *
  5678.  *    Para o lixo com todo input pendente,  de forma a limpar 
  5679.  * NAKs porventura empilhados.
  5680.  *    (Implementado so' por causa do UNIX de Berkeley,  desta 
  5681.  * vez.)
  5682.  *
  5683.  */
  5684.  
  5685. #if ucb4x&(^no_fionread)
  5686. flushinput()
  5687. {
  5688.     long int count; /* nu'mero de bytes prontos para ler */
  5689.     long int i;     /* nu'mero de bytes para ler em loop */
  5690.  
  5691.     ioctl(ttyfd,fionread,&count); /*quantos bytes faltam ler*/
  5692.     if (!count)
  5693.       return; /* se zero, na~o precisa dispensar input    */
  5694.  
  5695.     while (count) /* loop ate' todos dispensados */
  5696.     {
  5697.     i = (count<sizeof(recpkt)) /* le min.do cont e */
  5698.         count : sizeof(recpkt); /* buffer de leitura */
  5699.     read(ttyfd, recpkt, i); /* le um monte, */
  5700.     count  -=  i; /*  subtrai do total a ler */
  5701.     }
  5702. }
  5703. #else
  5704. flushinput() /* versa~o nula p/ unix na~o-berkeley */
  5705. []
  5706. #endif /* ucb4x&(^fionread) */
  5707.  
  5708.  
  5709. /*
  5710.  *    Rotinas de impressa~o do KERMIT.
  5711.  *
  5712.  * usage -    imprime as opc,o~es da linha de comando,
  5713.  *            mostrando a sintaxe correta
  5714.  * printmsg - como printf com "kermit: " antes
  5715.  * error  -   como printmsg se kermit local;
  5716.  *            manda pacote de erro se remoto
  5717.  * prerrpkt - imprime o conteu'do do pacote de erro recebido
  5718.  *            do host remoto
  5719.  *
  5720.  */
  5721.  
  5722.  
  5723.  
  5724.  
  5725.  
  5726. /*
  5727.  *  u s a g e 
  5728.  *
  5729.  *    Imprime suma'rio do uso e termina
  5730.  *
  5731.  */
  5732.  
  5733. usage()
  5734. {
  5735. #if ucb4x
  5736. printf("uso: kermit c[lbe line baud esc.char] (connect mode)\n");
  5737. printf(" ou: kermit s[diflb line baud] file...(send mode)\n");
  5738. printf(" ou: kermit r[diflb line baud]           (receive mode)\n");
  5739. #else
  5740. printf("uso: kermit c[le line esc.char]       (connect mode)\n");
  5741. printf(" ou: kermit s[diflb line] file ...    (send mode)\n");
  5742. printf(" ou: kermit r[diflb line]             (receive mode)\n");
  5743. #endif
  5744.     exit(1);
  5745. }
  5746.  
  5747. /*
  5748.  *   p r i n t m s g
  5749.  *
  5750.  *    Imprime mensagem no output padra~o se na~o remoto.
  5751.  *
  5752.  */
  5753.  
  5754. /*varargs1*/
  5755. printmsg(fmt, a1, a2, a3, a4, a5)
  5756. char *fmt;
  5757. {
  5758.     if (!remote)
  5759.     {
  5760.     printf("kermit: ");
  5761.     printf(fmt,a1,a2,a3,a4,a5);
  5762.     printf("\n");
  5763.     fflush(stdout); /* forca output (uts precisa!) */
  5764.     }
  5765. }
  5766.  
  5767.  
  5768. /*
  5769.  *  e r r o r
  5770.  *
  5771.  *    Imprime mensagem de erro
  5772.  *
  5773.  *    Se local, imprime com printmsg.
  5774.  *    Se remoto, manda um pacote de erro com a mensagem.
  5775.  *
  5776.  */
  5777.  
  5778. /*varags1*/
  5779. error(fmt, a1, a2, a3, a4, a5)
  5780. char *fmt;
  5781. {
  5782.     char msg[80];
  5783.     int len;
  5784.  
  5785.     if (remote)
  5786.     {
  5787.     sprintf(msg,fmt,a1,a2,a3,a4,a5); /* tranf. em string*/
  5788.     len = strlen(msg);
  5789.     spack('e',n,len,msg); /* manda o pacote de erro */
  5790.     }
  5791.     else
  5792.     printmsg(fmt, a1, a2, a3, a4, a5);
  5793.  
  5794.     return;
  5795. }
  5796.  
  5797. /*
  5798.  *  p r e r r p k t
  5799.  *
  5800.  *     Imprime o conteu'do do pacote de erro recebido do  host 
  5801.  * remoto.
  5802.  *
  5803.  */
  5804. prerrpkt(msg)
  5805. char *msg;
  5806. {
  5807.  printf("KERMIT ABORTANDO C/MENSAGEM DO REMOTO:\n%s\n",msg);
  5808.  return;
  5809. }
  5810. .pa
  5811.      O conjunto de caracteres ASCII
  5812. ..@adu
  5813. E.  O conjunto de caracteres ASCII (ANSI X3.4-1968)
  5814. ..@iANSI
  5815. ..@iASCII
  5816. ..@icaracteres, ASCII
  5817.       Existem  128  caracteres no  alfabeto  ASCII  (American 
  5818. national  Standard Code for Information  Interchange).  Esta~o 
  5819. listados  em  ordem  de seus valores ASCII.  As  colunas  sa~o 
  5820. entituladas como
  5821.  
  5822. ASCII DEC  representac,a~o decimal (base 10)
  5823. ASCII OCT  representac,a~o octal (base 8)
  5824. ASCII HEX  representac,a~o hexadecimal (base 16)
  5825. EBCDIC HEX equivalente hexadecimal EBCDIC para as tabelas  de 
  5826.            convera~o do KERMIT
  5827. CHAR       representac,a~o gra'fica ou nome do caracter
  5828. OBS.       descric,a~o do caracter.
  5829.  
  5830.       O  primeiro  grupo  e'  constitui'do  de  caracteres  de 
  5831. controle na~o imprimi'veis.
  5832.  
  5833. ===ASCII=== =EBCDIC=
  5834. DEC OCT HEX HEX CHAR OBS.
  5835. 000 000  00 00  NUL  ^@, nulo, morto
  5836. 001 001  01 01  SOH  ^A, ini'cio de cabec,alho
  5837. 002 002  02 02  STX  ^B, ini'cio de texto
  5838. 003 003  03 03  ETX  ^C, fim de texto
  5839. 004 004  04 37  EOT  ^D, fim de transmissa~o
  5840. 005 005  05 2D  ENQ  ^E, consulta
  5841. 006 006  06 2E  ACK  ^F, reconhecimento
  5842. 007 007  07 2F  BEL  ^G, bell, bip, campainha
  5843. 008 010  08 16  BS   ^H, back-space
  5844. 009 011  09 05  HT   ^I, tabulac,a~o horizontal
  5845. 010 012  0A 25  LF   ^J, line-feed
  5846. 011 013  0B 0B  VT   ^K, tabulac,a~ vertical
  5847. 012 014  0C 0C  FF   ^L, alimentac,a~o de formula'rio
  5848. 013 015  0D 0D  CR   ^M, retorno de carro
  5849. 014 016  0E 0E  SO   ^N, shift-out (sai)
  5850. 015 017  0F 0F  SI   ^O, shift-in (entra)
  5851. 016 020  10 10  DLE  ^P, data link escape
  5852. 017 021  11 11  DC1  ^Q, device control 1 (XON)
  5853. 018 022  12 12  DC2  ^R, device control 2
  5854. 019 023  13 13  DC3  ^S, device control 3 (XOFF)
  5855. 020 024  14 3C  DC4  ^T, device control 4
  5856. 021 025  15 3D  NAK  ^U, na~o reconhecimento
  5857. 022 026  16 32  SYN  ^V, marca de sincronismo
  5858. 023 027  17 26  ETB  ^W, fim de transmissa~o de bloco
  5859. 024 030  18 18  CAN  ^X, cancela
  5860. 025 031  19 19  EM   ^Y, fim de mi'dia
  5861. 026 032  1A 3F  SUB  ^Z, substituto
  5862. 027 033  1B 27  ESC  ^[, escape, prefixo, altera modo
  5863. 028 034  1C 1C  FS   ^\, separador de arquivos
  5864. 029 035  1D 1D  GS   ^], separador de grupos
  5865. 030 036  1E 1E  RS   ^^, separador de registros
  5866. 031 037  1F 1F  US   ^_, separador de unidades
  5867.  
  5868.       Os quatro u'ltimos sa~o associados usualmente  a`s verso~es 
  5869. de  controle  de  barra-inversa,  abre-colchete,  circunflexo 
  5870. (seta-para-cima)  e  sublinhado,  respectivamente mas  alguns 
  5871. terminais na~o transmitem esses caracteres de controle. Os que 
  5872. seguem sa~o imprimi'veis.
  5873.  
  5874.   Primeiro, caracteres de pontuac,a~o:
  5875.  
  5876. ===ASCII=== =EBCDIC=
  5877. DEC OCT HEX HEX CHAR OBS.
  5878. 032 040  20 40  SP   espac,o, branco
  5879. 033 041  21 5A  !    ponto de exclamac,a~o
  5880. 034 042  22 7F  "    aspas
  5881. 035 043  23 7B  #    sustenido, jogo-da-velha, lasanha
  5882. 036 044  24 5B  $    do'lar
  5883. 037 045  25 6C  %    porcento
  5884. 038 046  26 50  &    "e"-comercial
  5885. 039 047  27 7D  '    apo'strofo, acento agudo
  5886. 040 050  28 4D  (    abre-pare^nteses
  5887. 041 051  29 5D  )    fecha-pare^nteses
  5888. 042 052  2A 5C  *    asterisco
  5889. 043 053  2B 4E  +    mais
  5890. 044 054  2C 6B  ,    vi'rgula
  5891. 045 055  2D 60  -    hi'fen, menos, trac,o
  5892. 046 056  2E 4B  .    ponto, pingo
  5893. 047 057  2F 61  /    barra
  5894.  
  5895. caracteres nume'ricos:
  5896.  
  5897. ===ASCII=== =EBCDIC=
  5898. DEC OCT HEX HEX CHAR OBS.
  5899. 048 060  30 F0  0    zero
  5900. 049 061  31 F1  1    um
  5901. 050 062  32 F2  2    dois
  5902. 051 063  33 F3  3    tres
  5903. 052 064  34 F4  4    quatro
  5904. 053 065  35 F5  5    cinco
  5905. 054 066  36 F6  6    seis
  5906. 055 067  37 F7  7    sete
  5907. 056 070  38 F8  8    oito
  5908. 057 071  39 F9  9    nove
  5909.  
  5910. mais caracteres de pontuac,a~o:
  5911.  
  5912. .cp10
  5913. ===ASCII=== =EBCDIC=
  5914. DEC OCT HEX HEX CHAR OBS.
  5915. 058 072  3A 7A  :    dois-pontos
  5916. 059 073  3B 5E  ;    ponto-e-vi'rgula
  5917. 060 074  3C 4C  <    menor-que
  5918. 061 075  3D 7E  =    igual
  5919. 062 076  3E 6E  >    maior-que
  5920. 063 077  3F 6F  ?    ponto de interrogac,a~o
  5921. 064 100  40 7C  @    arro^ba
  5922.  
  5923. .cp30
  5924. caracteres alfabe'ticos maiu'sculos (letras)
  5925.  
  5926. ===ASCII=== =EBCDIC=
  5927. DEC OCT HEX HEX CHAR OBS.
  5928. 065 101  41 C1  A
  5929. 066 102  42 C2  B
  5930. 067 103  43 C3  C
  5931. 068 104  44 C4  D
  5932. 069 105  45 C5  E
  5933. 070 106  46 C6  F
  5934. 071 107  47 C7  G
  5935. 072 110  48 C8  H
  5936. 073 111  49 C9  I
  5937. 074 112  4A D1  J
  5938. 075 113  4B D2  K
  5939. 076 114  4C D3  L
  5940. 077 115  4D D4  M
  5941. 078 116  4E D5  N
  5942. 079 117  4F D6  O
  5943. 080 120  50 D7  P
  5944. 081 121  51 D8  Q
  5945. 082 122  52 D9  R
  5946. 083 123  53 E2  S
  5947. 084 124  54 E3  T
  5948. 085 125  55 E4  U
  5949. 086 126  56 E5  V
  5950. 087 127  57 E6  W
  5951. 088 130  58 E7  X
  5952. 089 131  59 E8  Y
  5953. 090 132  5A E9  Z
  5954.  
  5955. .cp10
  5956.  
  5957. mais caracteres de pontuac,a~o:
  5958.  
  5959. ===ASCII=== =EBCDIC=
  5960. DEC OCT HEX HEX CHAR OBS.
  5961. 091 133  5B AD  [    abre-colchete
  5962. 092 134  5C E0  \    barra-inversa
  5963. 093 135  5D BD  ]    fecha-colchete
  5964. 094 136  5E 5F  ^    circunflexo, seta-para-cima
  5965. 095 137  5F 6D  _    sublinhado
  5966. 096 140  60 79  `    acento grave
  5967.  
  5968. .cp30
  5969. caracteres alfabe'ticos minu'sculos:
  5970.  
  5971. ===ASCII=== =EBCDIC=
  5972. DEC OCT HEX HEX CHAR OBS.
  5973. 097 141  61 81  a
  5974. 098 142  62 82  b
  5975. 099 143  63 83  c
  5976. 100 144  64 84  d
  5977. 101 145  65 85  e
  5978. 102 146  66 86  f
  5979. 103 147  67 87  g
  5980. 104 150  68 88  h
  5981. 105 151  69 89  i
  5982. 106 152  6A 91  j
  5983. 107 153  6B 92  k
  5984. 108 154  6C 93  l
  5985. 109 155  6D 94  m
  5986. 110 156  6E 95  n
  5987. 111 157  6F 96  o
  5988. 112 160  70 97  p
  5989. 113 161  71 98  q
  5990. 114 162  72 99  r
  5991. 115 163  73 A2  s
  5992. 116 164  74 A3  t
  5993. 117 165  75 A4  u
  5994. 118 166  76 A5  v
  5995. 119 167  77 A6  w
  5996. 120 170  78 A7  x
  5997. 121 171  79 A8  y
  5998. 122 172  7A A9  z
  5999.  
  6000. .cp8
  6001. mais caracteres de pontuac,a~o:
  6002.  
  6003. ===ASCII=== =EBCDIC=
  6004. DEC OCT HEX HEX CHAR OBS.
  6005. 123 173  7B C0  {    abre-chave
  6006. 124 174  7C 4F  |    barra-vertical
  6007. 125 175  7D D0  }    fecha-chave
  6008. 126 176  7E 7E  ~    til
  6009.  
  6010. .cp5
  6011. e, finalmente, mais um caracter na~o imprimi'vel:
  6012.  
  6013. ===ASCII=== =EBCDIC=
  6014. DEC OCT HEX HEX CHAR OBS.
  6015. 127 177  7F 07  DEL  delete, rubout.
  6016. .pa
  6017. 
  6018.