123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037 |
- The Kermit Project
- Columbia University
- 612 West 115th Street
- New York NY 10025 USA
- kermit@columbia.edu
- ...since 1981
- Supplement to Using C-Kermit, 2nd Edition
- For C-Kermit 7.0
- As of C-Kermit version: 7.0.196
- This file created: 8 February 2000
- This file last updated:
- Mon Aug 8 10:39:18 2011
- Authors: Frank da Cruz and Christine M. Gianone
- Address: The Kermit Project
- Columbia University
- 612 West 115th Street
- New York NY 10025-7799
- USA
- Fax: +1 (212) 662-6442
- E-Mail: kermit-support@columbia.edu
- Web: http://www.columbia.edu/kermit/
- Or: http://www.kermit-project.org/
- Or: http://www.columbia.nyc.ny.us/kermit/
- NOTICES
- This document:
- Copyright © 1997, 2000, Frank da Cruz and Christine M. Gianone.
- All rights reserved.
- Kermit 95:
- Copyright © 1995, 2000, Trustees of Columbia University in the
- City of New York. All rights reserved.
- C-Kermit:
- Copyright © 1985, 2000,
- Trustees of Columbia University in the City of New York. All
- rights reserved. See the C-KermitCOPYING.TXT file or the
- copyright text in theckcmai.c module for disclaimer and
- permissions.
- When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or SSL
- protocol are included:
- Portions Copyright © 1990, Massachusetts Institute of
- Technology.
- Portions Copyright © 1991, 1993 Regents of the University of
- California.
- Portions Copyright © 1991, 1992, 1993, 1994, 1995 by AT&T.
- Portions Copyright © 1997, Stanford University.
- Portions Copyright © 1995-1997, Eric Young <eay@cryptosoft.com>.
- For the full text of the third-party copyright notices, see
- Appendix V.
- WHAT IS IN THIS FILE
- This file lists changes made to C-Kermit since the second edition of
- the bookUsing C-Kermit was published and C-Kermit 6.0 was released
- in November 1996. Use this file as a supplement to the second edition
- of Using C-Kermit until the third edition is published some time in
- 2000. If the "most recent update" shown above is long ago, contact
- Columbia University to see if there is a newer release.
- For further information, also see theCKCBWR.TXT ("C-Kermit
- beware") file for hints, tips, tricks, restrictions, frequently asked
- questions, etc, plus the system-specific "beware file", e.g.
- CKUBWR.TXT for UNIX,CKVBWR.TXT for VMS, etc, and also any
- system-specific update files such as KERMIT95.HTM for Kermit 95 (in the
- DOCS\MANUAL\ subdirectory of your K95 directory).
- This Web-based copy of the C-Kermit 7.0 update notes supersedes the
- plain-text CKERMIT2.TXT file. All changes after 19 January 2000
- appear only here in the Web version. If you need an up-to-date
- plain-text copy, use your Web browser to save this page as plain
- text.
- ABOUT FILENAMES
- In this document, filenames are generally shown in uppercase, but on
- file systems with case-sensitive names such as UNIX, OS-9, and AOS/VS,
- lowercase names are used:ckubwr.txt,ckermit70.txt, etc.
- ADDITIONAL FILES
- Several other files accompany this new Kermit release:
- SECURITY.TXT
- Discussion of Kermit's new authentication and encryption
- features:
- +Plain-text version
- +HTML (hypertext) version
- IKSD.TXT
- How to install and manage an Internet Kermit Service Daemon.
- +Plain-text version
- +HTML (hypertext) version
- Also seecuiksd.htm for instructions for use.
- TELNET.TXT
- A thorough presentation of Kermit's new advanced Telnet features
- and controls.
- +Plain-text version
- +HTML (hypertext) version
- THE NEW C-KERMIT LICENSE
- The C-Kermit license was rewritten for version 7.0 to grant automatic
- permission to packagers of free operating-system distributions to
- include C-Kermit 7.0. Examples include Linux (GNU/Linux), FreeBSD,
- NetBSD, etc. The new license is in theCOPYING.TXT file, and is
- also displayed by C-Kermit itself when you give the VERSION or
- COPYRIGHT command. The new C-Kermit license does not apply to
- Kermit 95.
- ACKNOWLEDGMENTS
- Thanks to Jeff Altman, who joined the Kermit Project in 1995, for much
- of what you see in C-Kermit 7.0, especially in the networking and
- security areas, and his key role in designing and implementing the
- Internet Kermit Service Daemon. And special thanks to Lucas Hart for
- lots of help with the VMS version; to Peter Eichhorn for continuous
- testing on the full range of HP-UX versions and for a consolidated set
- of HP-UX makefile targets; and to Colin Allen, Mark Allen, Roger Allen,
- Ric Anderson, William Bader, Mitch Baker, Mitchell Bass, Nelson Beebe,
- Gerry Belanger, Jeff Bernsten, Mark Berryman, John Bigg, Volker
- Borchert, Jonathan Boswell, Tim Boyer, Frederick Bruckman, Kenneth
- Cochran, Jared Crapo, Bill Delaney, Igor Sobrado Delgado, Clarence
- Dold, Joe Doupnik, John Dunlap, Max Evarts, Patrick French, Carl
- Friedberg, Carl Friend, Hirofumi Fujii, Andrew Gabriel, Gabe Garza,
- Boyd Gerber, David Gerber, George Gilmer, Hunter Goatley, DJ Hagberg,
- Kevin Handy, Andy Harper, Randolph Herber, Sven Holström, Michal
- Jaegermann, Graham Jenkins, Dick Jones, Terry Kennedy, Robert D Keys,
- Nick Kisseberth, Igor Kovalenko, David Lane, Adam Laurie, Jeff
- Liebermann, Eric Lonvick, Hoi Wan Louis, Arthur Marsh, Gregorie Martin,
- Peter Mauzey, Dragan Milicic, Todd Miller, Christian Mondrup, Daniel
- Morato, Dat Nguyen, Herb Peyerl, Jean-Pierre Radley, Steve Rance,
- Stephen Riehm, Nigel Roles, Larry Rosenman, Jay S Rouman, David
- Sanderson, John Santos, Michael Schmitz, Steven Schultz, Bob Shair,
- Richard Shuford, Fred Smith, Michael Sokolov, Jim Spath, Peter Szell,
- Ted T'so, Brian Tillman, Linus Torvalds, Patrick Volkerding, Martin
- Vorländer, Steve Walton, Ken Weaverling, John Weekley, Martin Whitaker,
- Jim Whitby, Matt Willman, Joellen Windsor, Farrell Woods, and many
- others for binaries, hosting, reviews, suggestions, advice, bug
- reports, and all the rest over the 3+ year C-Kermit 7.0 development
- cycle. Thanks to Russ Nelson and the board of the Open Software
- Initiative (http://www.opensource.org) for their cooperation in
- developing the new C-Kermit license and to the proprietors of those
- free UNIX distributions that have incorporated C-Kermit 7.0 for their
- cooperation and support, especially FreeBSD's Jörg Wunsch.
- NOTE TO KERMIT 95 USERS
- Kermit 95 and C-Kermit share the same command and scripting language,
- the same Kermit file-transfer protocol implementation, and much else
- besides.
- Like the bookUsing C-Kermit, this file concentrates on the aspects
- of C-Kermit that are common to all versions: UNIX, VMS, Windows, OS/2,
- VOS, AOS/VS, etc. Please refer to your Kermit 95 documentation for
- information that is specific to Kermit 95.
- C-Kermit 7.0 corresponds to Kermit 95 1.1.19.
- C-KERMIT VERSIONS AND VERSION NUMBERS
- "C-Kermit" refers to all the many programs that are compiled in whole
- or in part from common C-language source code, comprising:
- * A Kermit file transfer protocol module
- * A command parser and script execution module
- * A modem-dialing module
- * A network support module
- * A character-set translation module.
- and several others. These "system-independent" modules are combined
- with system-dependent modules for each platform to provide the required
- input/output functions, and also in some cases overlaid with an
- alternative user interface, such as Macintosh Kermit's point-and-click
- interface, and in some cases also a terminal emulator, as Kermit 95.
- The C-Kermit version number started as 1.0, ... 3.0, 4.0, 4.1 and then
- (because of confusion at the time with Berkeley UNIX 4.2), 4B, 4C, and
- so on, with the specific edit number in parentheses, for example
- 4E(072) or 5A(188). This scheme was used through 5A(191), but now we
- have gone back to the traditional numbering scheme with decimal points:
- major.minor.edit; for example 7.0.196. Internal version numbers (the
- \v(version) variable), however, are compatible in C-Kermit 5A upwards.
- Meanwhile, C-Kermit derivatives for some platforms (Windows, Macintosh)
- might go through several releases while C-Kermit itself remains the
- same. These versions have their own platform-specific version numbers,
- such as Kermit 95 1.1.1, 1.1.2, and so on.
- C-Kermit Version History:
- 1.0 1981-1982 Command-line only, 4.2 BSD UNIX only
- 2.0 (*) (who remembers...)
- 3.0 May 1984 Command-line only, supports several platforms
- 4.0-4.1 Feb-Apr 1985 (*) First interactive and modular version
- 4C(050) May 1985
- 4D(060) April 1986
- 4E(066) August 1987 Long packets
- 4E(068) January 1988
- 4E(072) January 1989
- 4F(095) August 1989 (*) Attribute packets
- 5A(188) November 1992 Scripting, TCP/IP, sliding windows (1)
- 5A(189) September 1993 Control-char unprefixing
- 5A(190) October 1994 Recovery
- 5A(191) April 1995 OS/2 only
- 6.0.192 September 1996 Intelligent dialing, autodownload, lots more (2)
- 6.1.193 1997-98 (*) Development only
- 6.1.194 June 1998 K95 only - switches, directory recursion, more
- 7.0.195 August 1999 IKSD + more (CU only as K95 1.1.18-CU)
- 7.0.196 1 January 2000 Unicode, lots more
- (*) Never formally released (4.0 was a total rewrite)
- (1) Using C-Kermit, 1st Edition
- (2) Using C-Kermit, 2nd Edition
- CONTENTS
- I. C-KERMIT DOCUMENTATION
- II. NEW FEATURES
- (0) INCOMPATIBILITIES WITH PREVIOUS RELEASES
- (1) PROGRAM AND FILE MANAGEMENT AND COMMANDS
- 1.0. Bug fixes
- 1.1. Command Continuation
- 1.2. Editor Interface
- 1.3. Web Browser and FTP Interface
- 1.4. Command Editing
- 1.5. Command Switches
- 1.5.1. General Switch Syntax
- 1.5.2. Order and Effect of Switches
- 1.5.3. Distinguishing Switches from Other Fields
- 1.5.4. Standard File Selection Switches
- 1.5.5. Setting Preferences for Different Commands
- 1.6. Dates and Times
- 1.7. Partial Completion of Keywords
- 1.8. Command Recall
- 1.9. EXIT Messages
- 1.10. Managing Keyboard Interruptions
- 1.11. Taming the Wild Backslash -- Part Deux
- 1.11.1. Background
- 1.11.2. Kermit's Quoting Rules
- 1.11.3. Passing DOS Filenames from Kermit to Shell Commands
- 1.11.4. Using Variables to Hold DOS Filenames
- 1.11.5. Passing DOS Filenames as Parameters to Macros
- 1.11.6. Passing DOS File Names from Macro Parameters to
- the DOS Shell
- 1.11.7. Passing DOS Filenames to Kermit from the Shell
- 1.12. Debugging
- 1.13. Logs
- 1.14. Automatic File-Transfer Packet Recognition at
- the Command Prompt
- 1.15. The TYPE Command
- 1.16. The RESET Command
- 1.17. The COPY and RENAME Commands
- 1.18. The MANUAL Command
- 1.19. String and Filename Matching Patterns
- 1.20. Multiple Commands on One Line
- 1.21. What Do I Have?
- 1.22. Generalized File Input and Output
- 1.22.1. Why Another I/O System?
- 1.22.2. The FILE Command
- 1.22.3. FILE Command Examples
- 1.22.4. Channel Numbers
- 1.22.5. FILE Command Error Codes
- 1.22.6. File I/O Variables
- 1.22.7. File I/O Functions
- 1.22.8. File I/O Function Examples
- 1.23. The EXEC Command
- 1.24. Getting Keyword Lists with '?'
- (2) MAKING AND USING CONNECTIONS
- 2.0. SET LINE and SET HOST Command Switches
- 2.1. Dialing
- 2.1.1. The Dial Result Message
- 2.1.2. Long-Distance Dialing Changes
- 2.1.3. Forcing Long-Distance Dialing
- 2.1.4. Exchange-Specific Dialing Decisions
- 2.1.5. Cautions about Cheapest-First Dialing
- 2.1.6. Blind Dialing (Dialing with No Dialtone)
- 2.1.7. Trimming the Dialing Dialog
- 2.1.8. Controlling the Dialing Speed
- 2.1.9. Pretesting Phone Number Conversions
- 2.1.10. Greater Control over Partial Dialing
- 2.1.11. New DIAL-related Variables and Functions
- 2.1.12. Increased Flexibility of PBX Dialing
- 2.1.13. The DIAL macro - Last-Minute Phone Number Conversions
- 2.1.14. Automatic Tone/Pulse Dialing Selection
- 2.1.15. Dial-Modifier Variables
- 2.1.16. Giving Multiple Numbers to the DIAL Command
- 2.2. Modems
- 2.2.1. New Modem Types
- 2.2.2. New Modem Controls
- 2.3.TELNET and RLOGIN
- 2.3.0. Bug Fixes
- 2.3.1. Telnet Binary Mode Bug Adjustments
- 2.3.2. VMS UCX Telnet Port Bug Adjustment
- 2.3.3. Telnet New Environment Option
- 2.3.4. Telnet Location Option
- 2.3.5. Connecting to Raw TCP Sockets
- 2.3.6. Incoming TCP Connections
- 2.4. The EIGHTBIT Command
- 2.5. The Services Directory
- 2.6. Closing Connections
- 2.7. Using C-Kermit with External Communication Programs
- 2.7.0. C-Kermit over tn3270 and tn5250
- 2.7.1. C-Kermit over Telnet
- 2.7.2. C-Kermit over Rlogin
- 2.7.3. C-Kermit over Serial Communication Programs
- 2.7.4. C-Kermit over Secure Network Clients
- 2.7.4.1. SSH
- 2.7.4.2. SSL
- 2.7.4.3. SRP
- 2.7.4.4. SOCKS
- 2.7.4.5. Kerberos and SRP
- 2.8. Scripting Local Programs
- 2.9. X.25 Networking
- 2.9.1. IBM AIXLink/X.25 Network Provider Interface for AIX
- 2.9.2. HP-UX X.25
- 2.10. Additional Serial Port Controls
- 2.11. Getting Access to the Dialout Device
- 2.12. The Connection Log
- 2.13. Automatic Connection-Specific Flow Control Selection
- 2.14. Trapping Connection Establishment and Loss
- 2.15. Contacting Web Servers with the HTTP Command
- (3) TERMINAL CONNECTION
- 3.1. CONNECT Command Switches
- 3.2. Triggers
- 3.3. Transparent Printing
- 3.4. Binary and Text Session Logs
- (4) FILE TRANSFER AND MANAGEMENT
- 4.0. Bug Fixes, Minor Changes, and Clarifications
- 4.1. File-Transfer Filename Templates
- 4.1.1. Templates in the As-Name
- 4.1.2. Templates on the Command Line
- 4.1.3. Post-Transfer Renaming
- 4.2. File-Transfer Pipes and Filters
- 4.2.1. Introduction
- 4.2.1.1. Terminology
- 4.2.1.2. Notation
- 4.2.1.3. Security
- 4.2.2. Commands for Transferring from and to Pipes
- 4.2.2.1. Sending from a Command
- 4.2.2.2. Receiving to a Command
- 4.2.3. Using File-Transfer Filters
- 4.2.3.1. The SEND Filter
- 4.2.3.2. The RECEIVE Filter
- 4.2.4. Implicit Use of Pipes
- 4.2.5. Success and Failure of Piped Commands
- 4.2.6. Cautions about Using Pipes to Transfer Directory Trees
- 4.2.7. Pipes and Encryption
- 4.2.8. Commands and Functions Related to Pipes
- 4.2.8.1. The OPEN !READ and OPEN !WRITE Commands
- 4.2.8.2. The REDIRECT Command
- 4.2.8.3. Receiving Mail and Print Jobs
- 4.2.8.4. Pipe-Related Functions
- 4.3. Automatic Per-File Text/Binary Mode Switching
- 4.3.1. Exceptions
- 4.3.2. Overview
- 4.3.3. Commands
- 4.3.4. Examples
- 4.4. File Permissions
- 4.4.1. When ATTRIBUTES PROTECTION is OFF
- 4.4.1.1. Unix
- 4.4.1.2. VMS
- 4.4.2. When ATTRIBUTES PROTECTION is ON
- 4.4.2.1. System-Specific Permissions
- 4.4.2.1.1. UNIX
- 4.4.2.1.2. VMS
- 4.4.2.2. System-Independent Permissions
- 4.5. File Management Commands
- 4.5.1. The DIRECTORY Command
- 4.5.2. The CD and BACK Commands
- 4.5.2.1. Parsing Improvements
- 4.5.2.2. The CDPATH
- 4.5.3. Creating and Removing Directories
- 4.5.4. The DELETE and PURGE Commands
- 4.6. Starting the Remote Kermit Server Automatically
- 4.7. File-Transfer Command Switches
- 4.7.1. SEND Command Switches
- 4.7.2. GET Command Switches
- 4.7.3. RECEIVE Command Switches
- 4.8. Minor Kermit Protocol Improvements
- 4.8.1. Multiple Attribute Packets
- 4.8.2. Very Short Packets
- 4.9. Wildcard / File Group Expansion
- 4.9.1. In UNIX C-Kermit
- 4.9.2. In Kermit 95
- 4.9.3. In VMS, AOS/VS, OS-9, VOS, etc.
- 4.10. Additional Pathname Controls
- 4.11. Recursive SEND and GET: Transferring Directory Trees
- 4.11.1. Command-Line Options
- 4.11.2. The SEND /RECURSIVE Command
- 4.11.3. The GET /RECURSIVE Command
- 4.11.4. New and Changed File Functions
- 4.11.5. Moving Directory Trees Between Like Systems
- 4.11.6. Moving Directory Trees Between Unlike Systems
- 4.12. Where Did My File Go?
- 4.13. File Output Buffer Control
- 4.14. Improved Responsiveness
- 4.15. Doubling and Ignoring Characters for Transparency
- 4.16. New File-Transfer Display Formats
- 4.17. New Transaction Log Formats
- 4.17.1. The BRIEF Format
- 4.17.2. The FTP Format
- 4.18. Unprefixing NUL
- 4.19. Clear-Channel Protocol
- 4.20. Streaming Protocol
- 4.20.1. Commands for Streaming
- 4.20.2. Examples of Streaming
- 4.20.2.1. Streaming on Socket-to-Socket Connections
- 4.20.2.2. Streaming on Telnet Connections
- 4.20.2.3. Streaming with Limited Packet Length
- 4.20.2.4. Streaming on Dialup Connections
- 4.20.2.5. Streaming on X.25 Connections
- 4.20.3. Streaming - Preliminary Conclusions
- 4.21. The TRANSMIT Command
- 4.22. Coping with Faulty Kermit Implementations
- 4.22.1. Failure to Accept Modern Negotiation Strings
- 4.22.2. Failure to Negotiate 8th-bit Prefixing
- 4.22.3. Corrupt Files
- 4.22.4. Spurious Cancellations
- 4.22.5. Spurious Refusals
- 4.22.6. Failures during the Data Transfer Phase
- 4.22.7. Fractured Filenames
- 4.22.8. Bad File Dates
- 4.23. File Transfer Recovery
- 4.24. FILE COLLISION UPDATE Clarification
- 4.25. Autodownload Improvements
- (5) CLIENT / SERVER
- 5.0. Hints
- 5.1. New Command-Line Options
- 5.2. New Client Commands
- 5.3. New Server Capabilities
- 5.3.1. Creating and Removing Directories
- 5.3.2. Directory Listings
- 5.4. Syntax for Remote Filenames with Embedded Spaces
- 5.5. Automatic Orientation Messages upon Directory Change
- 5.6. New Server Controls
- 5.7. Timeouts during REMOTE HOST Command Execution
- (6) INTERNATIONAL CHARACTER SETS
- 6.0. ISO 8859-15 Latin Alphabet 9
- 6.1. The HP-Roman8 Character Set
- 6.2. Greek Character Sets
- 6.3. Additional Latin-2 Character Sets
- 6.4. Additional Cyrillic Character Sets
- 6.5. Automatic Character-Set Switching
- 6.6. Unicode
- 6.6.1. Overview of Unicode
- 6.6.2. UCS Byte Order
- 6.6.2. UCS Transformation Formats
- 6.6.3. Conformance Levels
- 6.6.4. Relationship of Unicode with Kermit's Other Character Sets
- 6.6.5. Kermit's Unicode Features
- 6.6.5.1. File Transfer
- 6.6.5.2. The TRANSLATE Command
- 6.6.5.3. Terminal Connection
- 6.6.5.4. The TRANSMIT Command
- 6.6.5.5. Summary of Kermit Unicode Commands
- 6.7. Client / Server Character-Set Switching
- (7) SCRIPT PROGRAMMING
- 7.0. Bug Fixes
- 7.1. The INPUT Command
- 7.1.1. INPUT Timeouts
- 7.1.2. New INPUT Controls
- 7.1.3. INPUT with Pattern Matching
- 7.1.4. The INPUT Match Result
- 7.2. New or Improved Built-In Variables
- 7.3. New or Improved Built-In Functions
- 7.4. New IF Conditions
- 7.5. Using More than Ten Macro Arguments
- 7.6. Clarification of Function Call Syntax
- 7.7. Autodownload during INPUT Command Execution
- 7.8. Built-in Help for Functions.
- 7.9. Variable Assignments
- 7.9.1. Assignment Operators
- 7.9.2. New Assignment Commands
- 7.10. Arrays
- 7.10.1. Array Initializers
- 7.10.2. Turning a String into an Array of Words
- 7.10.3. Arrays of Filenames
- 7.10.4. Automatic Arrays
- 7.10.5. Sorting Arrays
- 7.10.6. Displaying Arrays
- 7.10.7. Other Array Operations
- 7.10.8. Hints for Using Arrays
- 7.10.9. Do-It-Yourself Arrays
- 7.10.10. Associative Arrays
- 7.11. OUTPUT Command Improvements
- 7.12. Function and Variable Diagnostics
- 7.13. Return Value of Macros
- 7.14. The ASSERT, FAIL, and SUCCEED Commands.
- 7.15. Using Alarms
- 7.16. Passing Arguments to Command Files
- 7.17. Dialogs with Timed Responses
- 7.18. Increased Flexibility of SWITCH Case Labels
- 7.19. "Kerbang" Scripts
- 7.20. IF and XIF Statement Syntax
- 7.20.1. The IF/XIF Distinction
- 7.20.2. Boolean Expressions (The IF/WHILE Condition)
- 7.21. Screen Formatting and Cursor Control
- 7.22. Evaluating Arithmetic Expressions
- 7.23. Floating-Point Arithmetic
- 7.24. Tracing Script Execution
- 7.25. Compact Substring Notation
- 7.26. New WAIT Command Options
- 7.26.1. Waiting for Modem Signals
- 7.26.2. Waiting for File Events
- 7.27. Relaxed FOR and SWITCH Syntax
- (8) USING OTHER FILE TRANSFER PROTOCOLS
- (9) COMMAND-LINE OPTIONS
- 9.0. Extended-Format Command-Line Options
- 9.1. Command Line Personalities
- 9.2. Built-in Help for Command Line Options
- 9.3. New Command-Line Options
- (10) C-KERMIT AND G-KERMIT
- III. APPENDICES
- III.1. Character Set Tables
- III.1.1. The Hewlett Packard Roman8 Character Set
- III.1.2. Greek Character Sets
- III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet
- III.1.2.2. The ELOT 927 Character Set
- III.1.2.3. PC Code Page 869
- III.2. Updated Country Codes
- IV. ERRATA & CORRIGENDA: Corrections to "Using C-Kermit" 2nd Edition.
- V. ADDITIONAL COPYRIGHT NOTICES
- I. C-KERMIT DOCUMENTATION
- The user manual for C-Kermit is:
- Frank da Cruz and Christine M. Gianone, Using C-Kermit, Second
- Edition, Digital Press / Butterworth-Heinemann, Woburn, MA, 1997,
- 622 pages, ISBN 1-55558-164-1.
- The present document is a supplement to Using C-Kermit 2nd Ed, not a
- replacement for it.
- US single-copy price: $52.95; quantity discounts available. Available
- in bookstores or directly from Columbia University:
- The Kermit Project
- Columbia University
- 612 West 115th Street
- New York NY 10025-7799
- USA
- Telephone: +1 (212) 854-3703
- Fax: +1 (212) 662-6442
- Domestic and overseas orders accepted. Price: US $44.95 (US, Canada,
- and Mexico). Shipping: $4.00 within the USA; $15.00 to all other
- countries. Orders may be paid by MasterCard or Visa, or prepaid by
- check in US dollars. Add $65 bank fee for checks not drawn on a US
- bank. Do not include sales tax. Inquire about quantity discounts.
- You can also order by phone from the publisher, Digital Press /
- Butterworth-Heinemann, with MasterCard, Visa, or American Express:
- +1 800 366-2665 (Woburn, Massachusetts office for USA & Canada)
- +44 1865 314627 (Oxford, England distribution centre for UK & Europe)
- +61 03 9245 7111 (Melbourne, Vic, office for Australia & NZ)
- +65 356-1968 (Singapore office for Asia)
- +27 (31) 2683111 (Durban office for South Africa)
- AGerman-language edition of the First Edition is also available:
- Frank da Cruz and Christine M. Gianone, C-Kermit - Einführung und
- Referenz, Verlag Heinz Heise, Hannover, Germany (1994). ISBN
- 3-88229-023-4. Deutsch von Gisbert W. Selke. Price: DM 88,00. Verlag
- Heinz Heise GmbH & Co. KG, Helstorfer Strasse 7, D-30625 Hannover.
- Tel. +49 (05 11) 53 52-0, Fax. +49 (05 11) 53 52-1 29.
- TheKermit file transfer protocol is specified in:
- Frank da Cruz, Kermit, A File Transfer Protocol, Digital Press,
- Bedford, MA, 1987, 379 pages, ISBN 0-932376-88-6. US single-copy
- price: $39.95. Availability as above.
- News and articles about Kermit software and protocol are published
- periodically in the journal,Kermit News. Subscriptions are free;
- contact Columbia University at the address above.
- Online news about Kermit is published in the
- comp.protocols.kermit.announce andcomp.protocols.kermit.misc
- newsgroups.
- II. NEW FEATURES
- Support for the Bell Labs Plan 9 operating system was added to version
- 6.0 too late to be mentioned in the book (although it does appear on
- the cover).
- Specific changes and additions are grouped together by major topic,
- roughly corresponding to the chapters ofUsing C-Kermit.
- 0. INCOMPATIBILITIES WITH PREVIOUS RELEASES
- 1. C-Kermit 7.0 uses FAST Kermit protocol settings by default. This
- includes "unprefixing" of certain control characters. Because of
- this, file transfers that worked with previous releases might not
- work in the new release (but it is more likely that they will work,
- and much faster). If a transfer fails, you'll get a
- context-sensitive hint suggesting possible causes and cures.
- Usually SET PREFIXING ALL does the trick.
- 2. C-Kermit 7.0 transfers files in BINARY mode by default. To restore
- the previous behavior, put SET FILE TYPE TEXT in your C-Kermit
- initialization file.
- 3. No matter whether FILE TYPE is BINARY or TEXT by default, C-Kermit
- 7.0 now switches between text and binary mode automatically on a
- per-file basis according to various criteria, including (a) which
- kind of platform is on the other end of the connection (if known),
- (b) the version of Kermit on the other end, and (c) the file's name
- (see Section 4, especially 4.3). To disable this
- automatic switching and restore the earlier behavior, put SET
- TRANSFER MODE MANUAL in your C-Kermit initialization file. To
- disable automatic switching for a particular transfer, include a
- /TEXT or /BINARY switch with your SEND or GET command.
- 4. The RESEND and REGET commands automatically switch to binary mode;
- previously if RESEND or REGET were attempted when FILE TYPE was
- TEXT, these commands would fail immediately, with a message telling
- you they work only when the FILE TYPE is BINARY. Now they simply do
- this for you. See Section 4.23 for additional (important)
- information.
- 5. SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10 and
- 138) in case rlogin, ssh, or cu are "in the middle", since
- otherwise <LF>~ might appear in Kermit packets, and this would
- cause rlogin, ssh, or cu to disconnect, suspend, escape back, or
- otherwise wreck the file transfer. Xon and Xoff are now always
- prefixed too, even when Xon/Xoff flow control is not in effect,
- since unprefixing them has proven dangerous on TCP/IP connections.
- 6. In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built
- into C-Kermit itself rather than implemented by running an external
- command or program. The built-in command might not behave the way
- the platform-specific external one did, but many options are
- available for customization. Of course the underlying
- platform-specific command can still be accessed with "!", "@", or
- "RUN" wherever the installation does not forbid. In UNIX, the "ls"
- command can be accessed directly as "ls" in C-Kermit. See
- Section 4.5.1 for details.
- 7. SEND ? prints a list of switches rather than a list of filenames.
- If you want to see a list of filenames, use a (system-dependent)
- construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND
- []? (VMS), etc. See Sections 1.5 and4.7.1.
- 8. In UNIX, OS-9, and Kermit 95, the wildcard characters in previous
- versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and
- }, with dash used inside []'s to denote ranges and comma used
- inside {} to separate list elements. If you need to include any of
- these characters literally in a filename, precede each one with
- backslash (\). See Section 4.9.
- 9. SET QUIET { ON, OFF } is now on the command stack, just like SET
- INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458
- ofUsing C-Kermit, 2nd Edition. This allows any macro or
- command file to SET QUIET ON or OFF without worrying about saving
- and restoring the global QUIET value. For example, this lets you
- write a script that tries SET LINE on lots of devices until it
- finds one free without spewing out loads of error messages, and
- also without disturbing the global QUIET setting, whatever it was.
- 10. Because of the new "." operator (which introduces assignments),
- macros whose names begin with "." can not be invoked "by name".
- However, they still can be invoked with DO.
- 11. The syntax of the EVALUATE command has changed. SeeSection
- 7.9.2. To restore the previous syntax, use SET EVALUATE OLD.
- 12. The \v(directory) variable now includes the trailing directory
- separator; in previous releases it did not. This is to allow
- constructions such as:
- cd \v(dir)data.tmp
- to work across platforms that might have different directory
- notation, such as UNIX, Windows, and VMS.
- 13. Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and
- sticky. In C-Kermit 7.0, there is an array of default flow-control
- values for each kind of connection, that are applied automatically
- at SET LINE/PORT/HOST time. Thus a SET FLOW command given before
- SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can
- be guaranteed to have the desired effect only if given after the
- SET LINE/PORT/HOST command.
- 14. Character-set translation works differently in the TRANSMIT command
- when (a) the file character-set is not the same as the local end of
- the terminal character-set, or (b) when the terminal character-set
- is TRANSPARENT.
- 1. PROGRAM AND FILE MANAGEMENT AND COMMANDS
- 1.0. Bug Fixes
- The following patches were issued to correct bugs in C-Kermit 6.0.
- These are described in detail in the 6.0 PATCHES file. All of these
- fixes have been incorporated in C-Kermit 6.1 (never released except as
- K95 1.1.16-17) and 7.0.
- 0001 All UNIX C-Kermit mishandles timestamps on files before 1970
- 0002 Solaris 2.5++ Compilation error on Solaris 2.5 with Pro C
- 0003 All VMS CKERMIT.INI Fix for VMS
- 0004 VMS/VAX/UCX 2.0 C-Kermit 6.0 can't TELNET on VAX/VMS with UCX 2.0
- 0005 All C-Kermit Might Send Packets Outside Window
- 0006 All MOVE from SEND-LIST does not delete original files
- 0007 Solaris 2.5++ Higher serial speeds on Solaris 2.5
- 0008 All C-Kermit application file name can't contain spaces
- 0009 AT&T 7300 UNIXPC setuid and hardware flow-control problems
- 0010 Linux on Alpha Patch to make ckutio.c compile on Linux/Alpha
- 0011 OS-9/68000 2.4 Patch to make ck9con.c compile on OS-9/68000 2.4
- 0012 MW Coherent 4.2 Patches for successful build on Coherent 4.2
- 0013 SINIX-Y 5.43 "delay" variable conflicts with <sys/clock.h>
- 0014 VMS/VAX/CMU-IP Subject: Patches for VAX/VMS 5.x + CMU-IP
- 0015 All XECHO doesn't flush its output
- 0016 VMS CD and other directory operations might not work
- 0017 Linux 1.2.x++ Use standard POSIX interface for high serial speeds
- 0018 UNIX SET WILDCARD-EXPANSION SHELL dumps core
- 0019 All Hayes V.34 modem init string problem
- 0020 All READ command does not fail if file not open
- 0021 All Problems with long function arguments
- 0022 All Certain \function()s can misbehave
- 0023 All X MOD 0 crashes program
- 0024 All Internal bulletproofing for lower() function
- 0025 OpenBSD Real OpenBSD support for C-Kermit 6.0
- 0026 All Incorrect checks for macro/command-file nesting depth
- 0027 All ANSWER doesn't automatically CONNECT
- 0028 All Overzealous EXIT warning
- 0029 All OUTPUT doesn't echo when DUPLEX is HALF
- 0030 All Minor problems with REMOTE DIRECTORY/DELETE/etc
- 0031 All CHECK command broken
- 0032 All Problem with SET TRANSMIT ECHO
- 0033 UNIX, VMS, etc HELP SET SERVER says too much
- 0034 All READ and !READ too picky about line terminators
- 0035 All END from inside SWITCH doesn't work
- 0036 All Problem telnetting to multihomed hosts
- 0037 All Redirection failures in REMOTE xxx > file
- REDIRECT was missing in many UNIX C-Kermit implementations; in version
- 7.0, it should be available in all of them.
- 1.1. Command Continuation
- Comments that start with ";" or "#" can no longer be continued. In:
- ; this is a comment -
- echo blah
- the ECHO command will execute, rather than being taken as a
- continuation of the preceding comment line. This allows easy
- "commenting out" of commands from macro definitions.
- However, the text of the COMMENT command can still be continued onto
- subsequent lines:
- comment this is a comment -
- echo blah
- As of version 6.0, backslash is no longer a valid continuation
- character. Only hyphen should be used for command continuation. This is
- to make it possible to issue commands like "cd a:\" on DOS-like
- systems.
- As of version 7.0:
- * You can quote a final dash to prevent it from being a continuation
- character:
- echo foo\-
- This prints "foo-". The command is not continued.
- * You can enter commands such as:
- echo foo - ; this is a comment
- interactively and they are properly treated as continued commands.
- Previously this worked only in command files.
- 1.2. Editor Interface
- SET EDITOR name [ options ]
- Lets you specify a text-editing program. The name can be a fully
- specified pathname like /usr/local/bin/emacs19/emacs, or it can
- be the name of any program in your PATH, e.g. "set editor
- emacs". In VMS, it must be a DCL command like "edit",
- "edit/tpu", "emacs", etc. If an environment variable EDITOR is
- defined when Kermit starts, its value is the default editor. You
- can also specify options to be included on the editor command
- line. Returns to Kermit when the editor exits.
- EDIT [ filename ]
- If the EDIT command is given without a filename, then if a
- previous filename had been given to an EDIT command, it is used;
- if not, the editor is started without a file. If a filename is
- given, the editor is started on that file, and the filename is
- remembered for subsequent EDIT commands.
- SHOW EDITOR
- Displays the full pathname of your text editor, if any, along
- with any command line options, and the file most recently edited
- (and therefore the default filename for your next EDIT command).
- Related variables: \v(editor), \v(editopts), \v(editfile).
- 1.3. Web Browser and FTP Interface
- C-Kermit includes an FTP command, which simply runs the FTP program;
- C-Kermit does not include any built-in support for Internet File
- Transfer Protocol, nor any method for interacting directly with an FTP
- server. In version 7.0, however, C-Kermit lets you specify your FTP
- client:
- SET FTP-CLIENT [ name [ options ] ]
- The name is the name of the FTP executable. In UNIX, Windows, or
- OS/2, it can be the filename of any executable program in your
- PATH (e.g. "ftp.exe" in Windows, "ftp" in UNIX); elsewhere (or
- if you do not have a PATH definition), it must be the fully
- specified pathname of the FTP program. If the name contains any
- spaces, enclose it braces. Include any options after the
- filename; these depend the particular ftp client.
- The Web browser interface is covered in the following subsections.
- 1.3.1. Invoking your Browser from C-Kermit
- BROWSE [ url ]
- Starts your preferred Web browser on the URL, if one is given,
- otherwise on the most recently given URL, if any. Returns to
- Kermit when the browser exits.
- SET BROWSER [ name [ options ] ]
- Use this command to specify the name of your Web browser
- program, for example: "set browser lynx". The name must be in
- your PATH, or else it must be a fully specified filename; in VMS
- it must be a DCL command.
- SHOW BROWSER
- Displays the current browser, options, and most recent URL.
- Related variables: \v(browser), \v(browsopts), \v(browsurl).
- Also see Section 2.15: Contacting Web Servers with the HTTP
- Command.
- 1.3.2. Invoking C-Kermit from your Browser
- The method for doing this depends, of course, on your browser. Here are
- some examples:
- Netscape on UNIX (X-based)
- In the Options->Applications section, set your Telnet
- application to:
- xterm -e /usr/local/bin/kermit/kermit -J %h %p
- (replace "/usr/local/bin/kermit/kermit" by C-Kermit's actual
- pathname). -J is C-Kermit's command-line option to "be like
- Telnet"; %h and %p are Netscape placeholders for hostname and
- port.
- Lynx on UNIX
- As far as we know, this can be done only at compile time. Add
- the following line to the Lynx userdefs.h file before building
- the Lynx binary:
- #define TELNET_COMMAND "/opt/bin/kermit -J"
- And then add lines like the following to the Lynx.cfg file:
- DOWNLOADER:Kermit binary download:/opt/bin/kermit -i -V -s %s -a %s:TRUE
- DOWNLOADER:Kermit text download:/opt/bin/kermit -s %s -a %s:TRUE
- UPLOADER:Kermit binary upload:/opt/bin/kermit -i -r -a %s:TRUE
- UPLOADER:Kermit text upload:/opt/bin/kermit -r -a %s:TRUE
- UPLOADER:Kermit text get:/opt/bin/kermit -g %s:TRUE
- UPLOADER:Kermit binary get:/opt/bin/kermit -ig %s:TRUE
- But none of the above is necessary if you make C-Kermit your default
- Telnet client, which you can do by making a symlink called 'telnet' to
- the C-Kermit 7.0 binary. See Section 9.1 for details.
- 1.4. Command Editing
- Ctrl-W ("Word delete") was changed in 7.0 to delete back to the
- previous non-alphanumeric, rather than all the way back to the previous
- space.
- 1.5. Command Switches
- As of version 7.0, C-Kermit's command parser supports a new type of
- field, called a "switch". This is an optional command modifier.
- 1.5.1. General Switch Syntax
- A switch is a keyword beginning with a slash (/). If it takes a value,
- then the value is appended to it (with no intervening spaces),
- separated by a colon (:) or equal sign (=). Depending on the switch,
- the value may be a number, a keyword, a filename, a date/time, etc.
- Examples:
- send oofa.txt ; No switches
- send /binary oofa.zip ; A switch without a value
- send /protocol:zmodem oofa.zip ; A switch with a value (:)
- send /protocol=zmodem oofa.zip ; A switch with a value (=)
- send /text /delete /as-name:x.x oofa.txt ; Several switches
- Like other command fields, switches are separated from other fields,
- and from each other, by whitespace, as shown in the examples just
- above. You can not put them together like so:
- send/text/delete/as-name:x.x oofa.txt
- (as you might do in VMS or DOS, or as we might once have done in
- TOPS-10 or TOPS0-20, or PIP). This is primarily due to ambiguity
- between "/" as switch introducer versus "/" as UNIX directory
- separator; e.g. in:
- send /delete/as-name:foo/text oofa.txt
- Does "foo/text" mean the filename is "foo" and the transfer is to be in
- text mode, or does it mean the filename is "foo/text"? Therefore we
- require whitespace between switches to resolve the ambiguity. (That's
- only one of several possible ambiguities -- it is also conceivable that
- a file called "text" exists in the path "/delete/as-name:foo/").
- In general, if a switch can take a value, but you omit it, then either
- a reasonable default value is supplied, or an error message is printed:
- send /print:-Plaserwriter oofa.txt ; Value included = print options
- send /print oofa.txt ; Value omitted, OK
- send /mail:kermit@columbia.edu oofa.txt ; Value included = address
- send /mail oofa.txt ; Not OK - address required
- ?Address required
- Context-sensitive help (?) and completion (Esc or Tab) are available in
- the normal manner:
- C-Kermit> send /pr? Switch, one of the following:
- /print /protocol
- C-Kermit> send /pro<ESC>tocol:? File-transfer protocol,
- one of the following:
- kermit xmodem ymodem ymodem-g zmodem
- C-Kermit> send /protocol:k<TAB>ermit
- If a switch takes a value and you use completion on it, a colon (:) is
- printed at the end of its name to indicate this. If it does not take a
- value, a space is printed.
- Also, if you type ? in a switch field, switches that take values are
- shown with a trailing colon; those that don't take values are shown
- without one.
- 1.5.2. Order and Effect of Switches
- The order of switches should not matter, except that they are evaluated
- from left to right, so if you give two switches with opposite effects,
- the rightmost one is used:
- send /text /binary oofa.zip ; Sends oofa.zip in binary mode.
- Like other command fields, switches have no effect whatsoever until the
- command is entered (by pressing the Return or Enter key). Even then,
- switches affect only the command with which they are included; they do
- not have global effect or side effects.
- 1.5.3. Distinguishing Switches from Other Fields
- All switches are optional. A command that uses switches lets you give
- any number of them, including none at all. Example:
- send /binary oofa.zip
- send /bin /delete oofa.zip
- send /bin /as-name:mupeen.zip oofa.zip
- send oofa.zip
- But how does Kermit know when the first "non-switch" is given? It has
- been told to look for both a switch and for something else, the data
- type of the next field (filename, number, etc). In most cases, this
- works well. But conflicts are not impossible. Suppose, for example, in
- UNIX there was a file named "text" in the top-level directory. The
- command to send it would be:
- send /text
- But C-Kermit would think this was the "/text" switch. To resolve the
- conflict, use braces:
- send {/text}
- or other circumlocutions such as "send //text", "send /./text", etc.
- The opposite problem can occur if you give an illegal switch that
- happens to match a directory name. For example:
- send /f oofa.txt
- There is no "/f" switch (there are several switches that begin with
- "/f", so "/f" is ambiguous). Now suppose there is an "f" directory in
- the root directory; then this command would be interpreted as:
- Send all the files in the "/f" directory, giving each one an as-name
- of "oofa.txt".
- This could be a mistake, or it could be exactly what you intended;
- C-Kermit has no way of telling the difference. To avoid situations like
- this, spell switches out in full until you are comfortable enough with
- them to know the minimum abbreviation for each one. Hint: use ? and
- completion while typing switches to obtain the necessary feedback.
- 1.5.4. Standard File Selection Switches
- The following switches are used on different file-oriented commands
- (such as SEND, DIRECTORY, DELETE, PURGE) to refine the selection of
- files that match the given specification.
- /AFTER:date-time
- Select only those files having a date-time later than the one
- given. See Section 1.6 for date-time formats. Synonym:
- /SINCE.
- /NOT-AFTER:date-time
- Select only those files having a date-time not later than (i.e.
- earlier or equal to) the one given. Synonym: /NOT-SINCE.
- /BEFORE:date-time
- Select only those files having a date-time earlier than the one
- given.
- /NOT-BEFORE:date-time
- Select only those files having a date-time not earlier than
- (i.e. later or equal to) the one given.
- /DOTFILES
- UNIX and OS-9 only: The filespec is allowed to match files whose
- names start with (dot) period. Normally these files are not
- shown.
- /NODOTFILES
- (UNIX and OS-9 only) Don't show files whose names start with dot
- (period). This is the opposite of /DOTFILES, and is the default.
- Note that when a directory name starts with a period, the
- directory and (in recursive operations) all its subdirectories
- are skipped.
- /LARGER-THAN:number
- Only select files larger than the given number of bytes.
- /SMALLER-THAN:number
- Only select files smaller than the given number of bytes.
- /EXCEPT:pattern
- Specifies that any files whose names match the pattern, which
- can be a regular filename, or may contain "*" and/or "?"
- metacharacters (wildcards), are not to be selected. Example:
- send /except:*.log *.*
- sends all files in the current directory except those with a
- filetype of ".log". Another:
- send /except:*.~*~ *.*
- sends all files except the ones that look like Kermit or EMACS
- backup files (such as "oofa.txt.~17~") (of course you can also
- use the /NOBACKUP switch for this).
- The pattern matcher is the same one used by IF MATCH string
- pattern ( Section 7.4), so you can test your patterns using
- IF MATCH. If you need to match a literal * or ? (etc), precede
- it by a backslash (\). If the pattern contains any spaces, it
- must be enclosed in braces:
- send /except:{Foo bar} *.*
- The pattern can also be a list of up to 8 patterns. In this
- case, the entire pattern must be enclosed in braces, and each
- sub-pattern must also be enclosed in braces; this eliminates the
- need for designating a separator character, which is likely to
- also be a legal filename character on some platform or other,
- and therefore a source of confusion. You may include spaces
- between the subpatterns but they are not necessary. The
- following two commands are equivalent:
- send /except:{{ck*.o} {ck*.c}} ck*.?
- send /except:{{ck*.o}{ck*.c}} ck*.?
- If a pattern is to include a literal brace character, precede it
- with "\". Also note the apparent conflict of this list format
- and the string-list format described in Section 4.9.1. In
- case you want to include a wildcard string-list with braces on
- its outer ends as an /EXCEPT: argument, do it like this:
- send /except:{{{ckuusr.c,ckuus2.c,ckuus6.c}}} ckuus*.c
- 1.5.5. Setting Preferences for Different Commands
- Certain oft-used commands offer lots of switches because different
- people have different requirements or preferences. For example, some
- people want to be able to delete files without having to watch a list
- of the deleted files scroll past, while others want to be prompted for
- permission to delete each file. Different people prefer different
- directory-listing styles. And so on. Such commands can be tailored with
- the SET OPTIONS command:
- SET OPTIONS command [ switch [ switch [ ... ] ] ]
- Sets each switch as the default for the given command, replacing
- the "factory default". Of course you can also override any
- defaults established by the SET OPTIONS command by including the
- relevant switches in the affected command any time you issue it.
- SHOW OPTIONS
- Lists the commands that allows option-setting, and the options
- currently in effect, if any, for each. Switches that have
- synonyms are shown under their primary name; for example. /LOG
- and /VERBOSE are shown as /LIST.
- Commands for which options may be set include DIRECTORY, DELETE, PURGE,
- and TYPE. Examples:
- SET OPTIONS DIRECTORY /PAGE /NOBACKUP /HEADING /SORT:DATE /REVERSE
- SET OPTIONS DELETE /LIST /NOHEADING /NOPAGE /NOASK /NODOTFILES
- SET OPTIONS TYPE /PAGE
- Not necessarily all of a command's switches can be set as options. For
- example, file selection switches, since these would normally be
- different for each command.
- Put the desired SET OPTIONS commands in your C-Kermit customization
- file for each command whose default switches you want to change every
- time you run C-Kermit.
- 1.6. Dates and Times
- Some commands and switches take date-time values, such as:
- send /after:{8-Feb-2000 10:28:01}
- Various date-time formats are acceptable. The rules for the date are:
- * The year must have 4 digits.
- * If the year comes first, the second field is the month.
- * The day, month, and year may be separated by spaces, /, -, or
- underscore.
- * The month may be numeric (1 = January) or spelled out or
- abbreviated in English.
- If the date-time string contains any spaces, it must be enclosed in
- braces. Examples of legal dates:
- Interpretation:
- 2000-Feb-8 8 February 2000
- {2000 Feb 8} 8 February 2000
- 2000/Feb/8 8 February 2000
- 2000_Feb_8 8 February 2000
- 2000-2-8 8 February 2000
- 2000-02-08 8 February 2000
- 8-Feb-2000 8 February 2000
- 08-Feb-2000 8 February 2000
- 12/25/2000 25 December 2000
- 25/12/2000 25 December 2000
- The last two examples show that when the year comes last, and the month
- is given numerically, the order of the day and month doesn't matter as
- long as the day is 13 or greater (mm/dd/yyyy is commonly used in the
- USA, whereas dd/mm/yyyy is the norm in Europe). However:
- 08/02/2000 Is ambiguous and therefore not accepted.
- If a date is given, the time is optional and defaults to 00:00:00. If
- the time is given with a date, it must follow the date, separated by
- space, /, -, or underscore, and with hours, minutes, and seconds
- separated by colon (:). Example:
- 2000-Feb-8 10:28:01 Represents 8 February 2000, 10:28:01am
- If a date is not given, the current date is used and a time is
- required.
- Time format is hh:mm:ss or hh:mm or hh in 24-hour format, or followed
- by "am" or "pm" (or "AM" or "PM") to indicate morning or afternoon.
- Examples of times that are acceptable:
- Interpretation:
- 3:23:56 3:23:56am
- 3:23:56am 3:23:56am
- 3:23:56pm 3:23:56pm = 15:23:56
- 15:23:56 3:23:56pm = 15:23:56
- 3:23pm 3:23:00pm = 15:23:00
- 3:23PM 3:23:00pm = 15:23:00
- 3pm 3:00:00pm = 15:00:00
- Examples of legal date-times:
- send /after:{8 Feb 2000 10:28:01}
- send /after:8_Feb_2000_10:28:01
- send /after:8-Feb-2000/10:28:01
- send /after:2000/02/08/10:28:01
- send /after:2000/02/08_10:28:01
- send /after:2000/02/08_10:28:01am
- send /after:2000/02/08_10:28:01pm
- send /after:2000/02/08_10:28pm
- send /after:2000/02/08_10pm
- send /after:10:00:00pm
- send /after:10:00pm
- send /after:10pm
- send /after:22
- Finally, there is a special all-numeric format you can use:
- yyyymmdd hh:mm:ss
- For example:
- 20000208 10:28:01
- This is Kermit's standard date-time format (based on ISO 8601), and is
- accepted (among other formats) by any command or switch that requires a
- date-time, and is output by any function whose result is a calendar
- date-time.
- There are no optional parts to this format and it must be exactly 17
- characters long, punctuated as shown (except you can substitute
- underscore for space in contexts where a single "word" is required).
- The time is in 24-hour format (23:00:00 is 11:00pm). This is the format
- returned by \fdate(filename), so you can also use constructions like
- this:
- send /after:\fdate(oofa.txt)
- which means "all files newer than oofa.txt".
- Besides explicit dates, you can also use the any of the following
- shortcuts:
- TODAY
- Stands for the current date at 00:00:00.
- TODAY 12:34:56
- Stands for the current date at the given time.
- YESTERDAY
- Stands for yesterday's date at 00:00:00. A time may also be
- given.
- TOMORROW
- Stands for tomorrow's date at 00:00:00. A time may also be
- given.
- + number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
- Is replaced by the future date indicated, relative to the
- current date. If the time is omitted, 00:00:00 is used.
- Examples: +3days, +2weeks, +1year, +37months.
- - number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
- Is replaced by the past date indicated, relative to the current
- date. If the time is omitted, 00:00:00 is used.
- The time can be separated from the date shortcut by any of the same
- separators that are allowed for explicit date-times: space, hyphen,
- slash, period, or underscore. In switches and other space-delimited
- fields, use non-spaces to separate date/time fields, or enclose the
- date-time in braces, e.g.:
- purge /before:-4days_12:00:00
- purge /before:{- 4 days 12:00:00}
- Of course you can also use variables:
- define \%n 43
- purge /before:-\%ndays_12:00:00
- Shortcut names can be abbreviated to any length that still
- distinguishes them from any other name that can appear in the same
- context, e.g. "TOD" for today, "Y" for yesterday. Also, the special
- abbreviation "wks" is accepted for WEEKS, and "yrs" for "YEARS".
- (To see how to specify dates relative to a specific date, rather than
- the current one, see the\fmjd() function description below.)
- You can check date formats with the DATE command. DATE by itself prints
- the current date and time in standard format: yyyymmdd hh:mm:ss. DATE
- followed by a date and/or time (including shortcuts) converts it to
- standard format if it can understand it, otherwise it prints an error
- message.
- The following variables and functions deal with dates and times; any
- function argument designated as "date-time" can be in any of the
- formats described above.
- \v(day)
- The first three letters of the English word for the current day
- of the week, e.g. "Wed".
- \fday(date-time)
- The first three letters of the English word for day of the week
- of the given date. If a time is included, it is ignored.
- Example: \fday(8 Feb 1988) = "Mon".
- \v(nday)
- The numeric day of the week: 0 = Sunday, 1 = Monday, ..., 6 =
- Saturday.
- \fnday(date-time)
- The numeric day of the week for the given date. If a time is
- included, it is ignored. Example: \fnday(8 Feb 1988) = "1".
- \v(date)
- The current date as dd mmm yyyy, e.g. "08 Feb 2000" (as in this
- example, a leading zero is supplied for day-of-month less than
- 10).
- \v(ndate)
- The current date in numeric format: yyyymmdd, e.g. "20000208".
- \v(time)
- The current time as hh:mm:ss, e.g. "15:27:14".
- \ftime(time)
- The given free-format date and/or time (e.g. "3pm") returns the
- time (without the date) converted to hh:mm:ss 24-hour format,
- e.g. "15:00:00" (the date, if given, is ignored).
- \v(ntime)
- The current time as seconds since midnight, e.g. "55634".
- \v(tftime)
- The elapsed time of the most recent file-transfer operation in
- seconds.
- \v(intime)
- The elapsed time for the most recent INPUT command to complete,
- in milliseconds.
- \fntime(time)
- The given free-format date and/or time is converted to seconds
- since midnight (the date, if given, is ignored). This function
- replaces \ftod2secs(), which is now a synonym for \fntime().
- Unlike \ftod2secs(), \fntime() allows a date to be included, and
- it allows the time to be in free format (like 3pm), and it
- allows the amount of time to be more than 24 hours. E.g.
- \fntime(48:00:00) = 172800. Example of use:
- set alarm \fntime(48:00:00) ; set alarm 48 hours from now.
- \fn2time(seconds)
- The given number of seconds is converted to hh:mm:ss format.
- \fdate(filename)
- Returns the modification date-time of the given file in standard
- format: yyyymmdd hh:mm:ss.
- \fcvtdate(date-time)
- Converts a free-format date and/or time to Kermit standard
- format: yyyymmdd hh:mm:ss. If no argument is given, returns the
- current date-time in standard format. If a date is given but no
- time, the converted date is returned without a time. If a time
- is given with no date, the current date is supplied. Examples:
- \fcvtdate(4 Jul 2000 2:21:17pm) = 20000704 14:21:17
- \fcvtdate() = 20000704 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
- \fcvtd(4 Jul 2000) = 20000704
- \fcvtd(6pm) = 20000704 18:00:00 (on 4 Jul 2000 at 6:00pm).
- \fdayofyear(date-time)
- \fdoy(date-time)
- Converts a free-format date and/or time to yyyyddd, where ddd is
- the 3-digit day of the year, and 1 January is Day 1. If a time
- is included with the date, it is returned in standard format. If
- a date is included but no time, the date is returned without a
- time. If a time is given with no date, the time is converted and
- the current date is supplied. If no argument is given, the
- current date-time is returned. Synonym: \fdoy(). Examples:
- \fddayofyear(4 Jul 2000 2:21:17pm) = 2000185 14:21:17
- \fdoy() = 2000185 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
- \fdoy(4 Jul 2000) = 2000185
- \fdoy(6pm) = 2000185 18:00:00 (on 4 Jul 2000 at 6:00pm).
- Note: The yyyyddd day-of-year format is often erroneously referred to
- as a Julian date. However, a true Julian date is a simple counting
- number, the number of days since a certain fixed day in the past.
- See \fmjd() below.
- \fdoy2date(date-time)
- Converts a date or date-time in day-of-year format to a standard
- format date. A yyyyddd-format date must be supplied; time is
- optional. The given date is converted to yyyymmdd format. If a
- time is given, it is converted to 24-hour format. Examples:
- \fdoy2date(2000185) = 20000704
- \fdoy2(2000185 3pm) = 20000704 15:00:00
- \fmjd(date-time)
- Converts free-format date and/or time to a Modified Julian Date
- (MJD), the number of days since 17 Nov 1858 00:00:00. If a time
- is given, it is ignored. Examples:
- \fmjd(4 Jul 2000) = 50998
- \fmjd(17 Nov 1858) = 0
- \fmjd(16 Nov 1858) = -1
- \fmjd2date(mjd)
- Converts an MJD (integer) to standard date format, yyyymmdd:
- \fmjd2(50998) = 4 Jul 1998
- \fmjd2(0) = 17 Nov 1858
- \fmjd2(-1) = 16 Nov 1858
- \fmjd2(-365) = 17 Nov 1857
- MJDs are normal integers and, unlike DOYs, may be added, subtracted,
- etc, with each other or with other integers, to obtain meaningful
- results. For example, to find out the date 212 days ago:
- echo \fmjd2date(\fmjd()-212)
- Constructions such as this can be used in any command where a date-time
- is required, e.g.:
- send /after:\fmjd2date(\fmjd()-212)
- to send all files that are not older than 212 days (this is equivalent
- to "send /after:-212days").
- MJDs also have other regularities not exhibited by other date formats.
- For example, \fmodulus(\fmjd(any-date),7) gives the day of the week for
- any date (where 4=Sun, 5=Mon, ..., 3=Sat). (However, it is easier to
- use \fnday() for this purpose, and it gives the more conventional
- result of 0=Sun, 1=Mon, ..., 6=Sat).
- Note that if MJDs are to be compared, they must be compared numerically
- (IF <, =, >) and not lexically (IF LLT, EQUAL, LGT), whereas DOYs must
- be compared lexically if they include a time (which contains ":"
- characters); however, if DOYs do not include a time, they may also be
- compared numerically.
- In any case, lexical comparison of DOYs always produces the appropriate
- result, as does numeric comparison of MJDs.
- The same comments apply to sorting. Also note that DOYs are fixed
- length, but MJDs can vary in length. However, all MJDs between 3 April
- 1886 and 30 Aug 2132 are 5 decimal digits long. (MJDs become 6 digits
- long on 31 Aug 2132, and 7 digits long on 13 Oct 4596).
- 1.7. Partial Completion of Keywords
- Partial completion of keywords was added in C-Kermit 7.0. In prior
- versions, if completion was attempted (by pressing the Esc or Tab key)
- on a string that matched different keywords, you'd just get a beep. Now
- Kermit completes up to the first character where the possibly matching
- keywords differ and then beeps. For example:
- C-Kermit> send /n<Tab>
- which matches /NOT-BEFORE and /NOT-AFTER, now completes up to the dash:
- C-Kermit> send /n<Tab>ot-<Beep>
- Partial completion works for filenames too (as it has for some years).
- 1.8. Command Recall
- C-Kermit has had a command history buffer for some time, which could be
- scrolled interactively using control characters or (in Kermit 95 only)
- arrow keys. Version 7.0 adds a REDO command that allows the most recent
- command matching a given pattern to be re-executed:
- { REDO, RR, ^ } [ pattern ]
- Search the command history list for the most recent command that
- matches the given pattern, and if one is found, execute it
- again.
- The pattern can be a simple string (like "send"), in which case the
- last SEND command is re-executed. Or it can contain wildcard characters
- "*" and/or "?", which match any string and any single character,
- respectively (note that "?" must be preceded by backslash to override
- its normal function of giving help), and in most C-Kermit versions may
- also include [] character lists and {} string lists (seeSection
- 4.9).
- The match works by appending "*" to the end of the given pattern (if
- you didn't put one there yourself). Thus "redo *oofa" becomes "redo
- *oofa*" and therefore matches the most recent command that contains
- "oofa" anywhere within the command. If you want to inhibit the
- application of the trailing "*", e.g. to force matching a string at the
- end of a command, enclose the pattern in braces:
- redo {*oofa}
- matches the most recent command that ends with "oofa".
- REDO commands themselves are not entered into the command history list.
- If no pattern is given, the previous (non-REDO) command is re-executed.
- The REDOne command is reinserted at the end of the command history
- buffer, so the command scrollback character (Ctrl-P, Ctrl-B, or
- Uparrow) can retrieve it.
- Examples:
- C-Kermit> echo foo
- foo
- C-Kermit> show alarm
- (no alarm set)
- C-Kermit> echo blah
- blah
- C-Kermit> redo ; Most recent command
- blah
- C-Kermit> redo s ; Most recent command starting with "s"
- (no alarm set)
- C-Kermit> redo echo f ; Most recent command starting with "echo f"
- foo
- C-Kermit> redo *foo ; Most recent command that has "foo" in it
- foo
- C-Kermit> <Ctrl-P> ; Scroll back
- C-Kermit> echo foo ; The REDOne command is there
- C-Kermit> redo {*foo} ; Most recent command that ends with "foo"
- foo
- C-Kermit>
- Since REDO, REDIAL, and REDIRECT all start the same way, and RED is the
- designated non-unique abbreviation for REDIAL, REDO must be spelled out
- in full. For convenience, RR is included as an invisible easy-to-type
- synonym for REDO. You can also use the "^" character for this:
- C-Kermit> ^ ; Most recent command
- C-Kermit> ^ s ; Most recent command starting with "s"
- C-Kermit> ^s ; Ditto (space not required after "^").
- C-Kermit> ^*foo ; Most recent command that has "foo" in it.
- C-Kermit> ^{*foo} ; Most recent command ends with "foo".
- Unlike the manual command-history-scrolling keys, the REDO command can
- be used in a script, but it's not recommended (since the command to be
- REDOne might not be found, so if the REDO command fails, you can't tell
- whether it was because REDO failed to find the requested command, or
- because the command was found but it failed).
- 1.9. EXIT Messages
- The EXIT and QUIT commands now accept an optional message to be
- printed. This makes the syntax of EXIT and QUIT just like END and STOP:
- { EXIT, QUIT, END, STOP } [ status-code [ message ] ]
- where status-code is a number (0 indicating success, nonzero indicating
- failure). This is handy in scripts that are never supposed to enter
- interactive mode:
- dial 7654321
- if fail exit 1 Can't make connection - try again later.
- Previously this could only be done in two steps:
- dial 7654321
- xif fail { echo Can't make connection - try again later, exit 1 }
- A status code must be included in order to specify a message. In the
- case of EXIT and QUIT, the default status code is contained in the
- variable \v(exitstatus), and is set automatically by various events
- (file transfer failures, etc; it can also be set explicitly with the
- SET EXIT STATUS command). If you want to give an EXIT or QUIT command
- with a message, but without changing the exit status from what it
- normally would have been, use the \v(exitstatus) variable, e.g.:
- exit \v(exitstatus) Goodbye from \v(cmdfile).
- The EXIT status is returned to the system shell or whatever other
- process invoked C-Kermit, e.g. in UNIX:
- C-Kermit> exit 97 bye bye
- bye bye
- $ echo $?
- 97
- $
- 1.10. Managing Keyboard Interruptions
- When C-Kermit is in command or file-transfer mode (as opposed to
- CONNECT mode), it can be interrupted with Ctrl-C. Version 7.0 adds the
- ability to disarm the Ctrl-C interrupt:
- SET COMMAND INTERRUPT { ON, OFF }
- COMMAND INTERRUPT is ON by default, meaning the Ctrl-C can be
- used to interrupt a command or a file transfer in progress. Use
- OFF to disable these interruptions, and use it with great
- caution for obvious reasons.
- SET TRANSFER INTERRUPT { ON, OFF }
- This can be used to disable keyboard interruption of file
- transfer when C-Kermit is in local mode, or to re-enable it
- after it has been disabled. This applies to the X, Z, E, and
- similar keys as well as to the system interrupt character,
- usually Ctrl-C. This is distinct from SET TRANSFER CANCELLATION,
- which tells whether packet mode can be exited by sending a
- special sequence of characters.
- Several other commands can be interrupted by pressing any key while
- they are active. Version 7.0 adds the ability to disable this form of
- interruption also:
- SET INPUT CANCELLATION { ON, OFF }
- Whether an INPUT command in progress can be interrupted by
- pressing a key. Normally ON. Setting INPUT CANCELLATION OFF
- makes INPUT commands uninterruptible except by Ctrl-C (unless
- COMMAND INTERRUPTION is also OFF).
- SET SLEEP CANCELLATION { ON, OFF }
- Whether a SLEEP, PAUSE, or WAIT command in progress can be
- interrupted by pressing a key. Normally ON. Setting SLEEP
- CANCELLATION OFF makes these commands uninterruptible except by
- Ctrl-C (unless COMMAND INTERRUPTION is also OFF). Synonyms: SET
- PAUSE CANCELLATION, SET WAIT CANCELLATION.
- So to make certain a script is not interruptible by the user, include
- these commands:
- SET TRANSFER INTERRUPT OFF
- SET SLEEP CANCELLATION OFF
- SET INPUT CANCELLATION OFF
- SET COMMAND INTERRUPTION OFF
- Make sure to turn them back on afterwards if interruption is to be
- re-enabled.
- When a PAUSE, SLEEP, WAIT, or INPUT command is interrupted from the
- keyboard, the new variable \v(kbchar) contains a copy of the (first)
- character that was typed and caused the interruption, provided it was
- not the command interrupt character (usually Ctrl-C). If these commands
- complete successfully or time out without a keyboard interruption, the
- \v(kbchar) variable is empty.
- The \v(kbchar) variable (like any other variable) can be tested with:
- if defined \v(kbchar) command
- The command is executed if the variable is not empty.
- The \v(kbchar) variable can be reset with WAIT 0 (PAUSE 0, SLEEP 0,
- etc).
- 1.11. Taming The Wild Backslash -- Part Deux
- Using C-Kermit, 2nd Edition, contains a brief section, "Taming the
- Wild Backslash", on page 48, which subsequent experience has shown to
- be inadequate for Kermit users intent on writing scripts that deal with
- Windows, DOS, and OS/2 filenames, in which backslash (\) is used as the
- directory separator. This section fills in the blanks.
- 1.11.1. Background
- The Kermit command language shares a certain unavoidable but annoying
- characteristic with most other command languages that are capable of
- string replacement, namely the necessity to "quote" certain characters
- when you want them to be taken literally. This is a consequence of the
- facts that:
- 1. One or more characters must be set aside to denote replacement,
- rather than acting as literal text.
- 2. We have only 96 printable characters to work with in ASCII, which
- is still the only universally portable character set.
- 3. There is no single printable character that is unused everywhere.
- 4. Variables are not restricted to certain contexts, as they are in
- formal programming languages like C and Fortran, but can appear
- anywhere at all within a command, and therefore require special
- syntax.
- Thus there can be conflicts. To illustrate, the standard UNIX shell
- uses dollar sign ($) to introduce variables. So the shell command:
- echo $TERM
- displays the value of the TERM variable, e.g. vt320. But suppose you
- want to display a real dollar sign:
- echo The price is $10.20
- This causes the shell to evaluate the variable "$1", which might or
- might not exist, and substitute its value, e.g.:
- The price is 0.20
- (in this case the $1 variable had no value.) This is probably not what
- you wanted. To force the dollar sign to be taken literally, you must
- apply a "quoting rule", such as "precede a character by backslash (\)
- to force the shell to take the character literally":
- echo The price is \$10.20
- The price is $10.20
- But now suppose you want the backslash AND the dollar sign to be taken
- literally:
- echo The price is \\$10.20
- This doesn't work, since the first backslash quotes the second one,
- thereby leaving the dollar sign unquoted again:
- The price is \0.20
- Quoting the dollar sign requires addition of a third backslash:
- echo The price is \\\$10.20
- The price is \$10.20
- The first backslash quotes the second one, and the third backslash
- quotes the dollar sign.
- Every command language -- all UNIX shells, VMS DCL, DOS Batch, AOS/VS
- CLI, etc etc -- has similar rules. UNIX shell rules are probably the
- most complicated, since many printable characters -- not just one --
- are special there: dollar sign, single quote, double quote, backslash,
- asterisk, accent grave, number sign, ampersand, question mark,
- parentheses, brackets, braces, etc -- practically every
- non-alphanumeric character needs some form of quoting if it is to be
- taken literally. And to add to the confusion, the UNIX shell offers
- many forms of quoting, and many alternative UNIX shells are available,
- each using slightly different syntax.
- 1.11.2. Kermit's Quoting Rules
- Kermit's basic quoting rules are simple by comparison (there are, of
- course, additional syntax requirements for macro definitions, command
- blocks, function calls, etc, but they are not relevant here).
- The following characters are special in Kermit commands:
- Backslash (\)
- Introduces a variable, or the numeric representation of a
- special character, or a function, or other item for
- substitution. If the backslash is followed by a digit or by any
- of the following characters:
- x, o, d, m, s, f, v, $, %, &, :, {
- this indicates a special substitution item; otherwise the
- following character is to be taken literally (exceptions: \ at
- end of line is taken literally; \n, \b, and \n are special items
- in the OUTPUT command only).
- Semicolon (;)
- (Only when at the beginning of a line or preceded by at least
- one space or tab) Introduces a comment.
- Number sign (#)
- (Only when at the beginning of a line or preceded by at least
- one space or tab) Just like semicolon; introduces a comment.
- Question mark (?)
- (Only at the command prompt - not in command files or macros)
- Requests context-sensitive help.
- To force Kermit to take any of these characters literally, simply
- precede it by a backslash (\).
- Sounds easy! And it is, except when backslash also has a special
- meaning to the underlying operating system, as it does in DOS, Windows,
- and OS/2, where it serves as the directory separator in filenames such
- as:
- D:\K95\KEYMAPS\READ.ME
- Using our rule, we would need to refer to this file in Kermit commands
- as follows:
- D:\\K95\\KEYMAPS\\READ.ME
- But this would not be obvious to new users of Kermit software on DOS,
- Windows, or OS/2, and it would be annoying to seasoned ones. Thus
- MS-DOS Kermit and Kermit 95 go to rather extreme lengths to allow the
- more natural notation, as in:
- send d:\k95\keymaps\read.me
- The reason this is tricky is that we also need to allow for variables
- and other expressions introduced by backslash in the same command. For
- example, suppose \%a is a variable whose value is "oofa" (without the
- quotes). What does the following command do?
- send d:\%a
- Does it send the file named "oofa" in the current directory of the D:
- disk, or does it send a file named "%a" in the root directory of the D:
- disk? This is the kind of trouble we get into when we attempt to bend
- the rules in the interest of user friendliness. (The answer is: if the
- variable \%a has definition that is the name of an existing file, that
- file is sent; if a file d:\%a exists, it is sent; otherwise if both
- conditions are true, the variable takes precedence, and the literal
- filename can be forced by quoting: \\%a.)
- In Kermit 95 (but not MS-DOS Kermit), we also bend the rules another
- way by allowing you to use forward slash (/) rather than backslash (\)
- as the directory separator:
- send d:/k95/keymaps/read.me
- This looks more natural to UNIX users, and in fact is perfectly
- acceptable to the Windows 95/98/NT and OS/2 operating systems on the
- API level. BUT (there is always a "but") the Microsoft shell,
- COMMAND.COM, for Windows 95/98 and NT does not allow this notation, and
- therefore it can not be used in any Kermit command -- such as RUN --
- that invokes the Windows command shell AND your command shell is
- COMMAND.COM or any other shell that does not allow forward slash as
- directory separator (some alternative shells do allow this).
- NOTE: There exists a wide variety of alternative shells from third
- parties that do not have this restriction. If you are using a shell
- that accepts forward slash as a directory separator, you can stop
- reading right now -- UNLESS (there is always an "unless") you want
- your scripts to be portable to systems that have other shells. Also
- note that some Windows shells might actually REQUIRE forward slashes
- (instead of backslashes) as directory separators; we do not treat
- this situation below, but the treatment is obvious -- use slash
- rather backslash as the directory separator.
- 1.11.3. Passing DOS Filenames from Kermit to Shell Commands
- The following Kermit commands invoke the system command shell:
- RUN (and its synonyms ! and @)
- REDIRECT
- PIPE
- Each of these commands takes a shell command as an operand. These shell
- commands are not, and can not be, parsed by Kermit since Kermit does
- not know the syntax of shell commands, and so can't tell the difference
- between a keyword, a filename, a variable, a switch, or other item.
- Therefore the rules can not be bent since Kermit doesn't know where or
- how to bend them. To illustrate (using the regular Windows shell):
- run c:\\windows\\command\\chkdsk.exe
- works OK, but:
- run c:/windows/command/chkdsk.exe
- is not accepted by COMMAND.COM. But:
- run c:\windows\command\chkdsk.exe
- results in Kermit applying its quoting rules before sending the text to
- the shell. Since "w" and "c" are not in the list of backslash-item
- codes, the backslash means "take the following character literally".
- Thus, by the time this filename gets to the Windows shell, it has
- become:
- c:windowscommandchkdsk.exe
- which is probably not what you wanted. (If "w" and "c" were in the
- list, the results could be even stranger.) Even more confusing is the
- case where a directory or filename starts with one or more digits:
- run c:\123\lotus.exe
- in which "\123" is the Kermit notation for ASCII character 123, which
- happens to be left brace ({), resulting in "c:{lotus.exe".
- So when passing filenames to a Windows shell, always use double
- backslashes as directory separators, to ensure that the shell gets
- single backslashes:
- run c:\\windows\\command\\chkdsk.exe
- run c:\\123\\lotus.exe
- Similar problems might occur with the built-in EDIT, BROWSE, and FTP
- commands. These commands result in Kermit building a shell command
- internally to invoke the associated helper program; the form of this
- command might conflict with the form demanded by certain alternative
- shells.
- 1.11.4. Using Variables to Hold DOS Filenames
- Now to the next level. Suppose you want to write a script in which
- filenames are parameters, and therefore are stored in variables.
- Example:
- define \%f c:\windows\command\chkdsk.exe
- ...
- run \%f
- Obviously this won't work for the reasons just noted; the RUN command
- requires directory separators be coded as double backslashes:
- define \%f c:\\windows\\command\\chkdsk.exe
- ...
- run \%f
- This will work; no surprises here. However, if you had used ASSIGN
- rather than DEFINE, you might have been surprised after all; review
- pages 348-349 ofUsing C-Kermit (2nd Ed) for the difference
- between DEFINE and ASSIGN.
- We have said that any Kermit 95 or MS-DOS Kermit command that parses
- filenames itself -- SEND, for example -- does not require double
- backslashes since it knows it is parsing a filename. So since the
- following works:
- send c:\windows\command\chkdsk.exe
- Should the following also work?
- define \%f c:\windows\command\chkdsk.exe
- ...
- send \%f
- Answer: No. Why? Because \%f is evaluated "recursively", to allow for
- the possibility that its definition contains further variable
- references. This is true of all "backslash-percent-letter" (or -digit)
- variables, and also for array references. So \%f becomes
- c:\windows\command\chkdsk.exe, which becomes
- c:windowscommandchkdsk.exe.
- The trick here is to use the "other" kind of variable, that is
- evaluated only "one level deep" rather than recursively:
- define filename c:\windows\command\chkdsk.exe
- ...
- send \m(filename)
- Similarly if you want to prompt the user for a filename:
- ask filename { Please type a filename: }
- Please type a filename: c:\windows\command\chkdsk.exe
- send \m(filename)
- 1.11.5. Passing DOS Filenames as Parameters to Macros
- Suppose you want to pass a DOS filename containing backslashes as a
- parameter to a Kermit macro. This raises two issues:
- 1. Parameters to macros are "just text" and so are fully evaluated
- before they are passed to the macro.
- 2. Once inside the macro, the formal parameters \%1, \%2, ... \%9 are
- the type of variable that is evaluated recursively.
- Thus a DOS filename is ruined once in the act of parsing the macro
- invocation, and again when referring to it from within the macro. To
- illustrate, suppose "test" is a macro. Then in the invocation:
- test c:\mydir\blah.txt
- "c:mydirblah.txt" is assigned to \%1. However, if we double the
- backslashes:
- test c:\\mydir\\blah.txt
- "c:\mydir\blah.txt" is assigned to \%1. But then when you refer to \%1
- in the macro, it is evaluated recursively, resulting in
- "c:mydirblah.txt". To illustrate:
- define test echo \%1
- test c:\mydir\blah.txt
- c:mydirblah.txt
- test c:\\mydir\\blah.txt
- c:mydirblah.txt
- test c:\\\\mydir\\\\blah.txt
- c:\mydir\blah.txt
- Let's address each part of the problem separately. First, inside the
- macro. You can use the \fcontents() function to force a
- backslash-percent variable (such as a macro argument) to be evaluated
- one level deep instead of recursively, for example:
- define test echo { The filename is "\fcontents(\%1)"}
- test c:\mydir\blah.txt ; We don't expect this to work
- The filename is "c:mydirblah.txt" ; and it doesn't.
- test c:\\mydir\\blah.txt ; But this does...
- The filename is "c:\mydir\blah.txt"
- Thus if the filename arrives inside the macro with single backslashes,
- the backslashes are preserved if you always refer to the parameter
- through the \fcontents() function.
- Now how to ensure that backslashes are not stripped or misinterpreted
- when passing a filename to a macro? This brings us back to what we
- learned in earlier sections:
- 1. If it is a literal filename, either double the backslashes, or (if
- the filename is to be used only within Kermit itself and not passed
- to a DOS shell, or it is to be passed to an alternative shell that
- accepts forward slash as a directory separator), use forward slash
- instead of backslash as the directory separator.
- 2. If it is a variable that contains a filename, make sure you use a
- macro-style variable name, rather than a
- backslash-percent-character name.
- Examples:
- define test echo \fcontents(\%1)
- define filename c:\mydir\blah.txt
- test c:\\mydir\\blah.txt ; Literal filename with double backslashes
- c:\mydir\blah.txt
- test c:/mydir/blah.txt ; Literal filename with forward slashes
- c:/mydir/blah.txt
- test \m(filename) ; Variable
- c:\mydir\blah.txt
- But what if you don't like these rules and you still want to pass a
- literal filename containing single backslashes to a macro? This is
- possible too, but a bit tricky: turn command quoting off before
- invoking the macro, and then turn it back on inside the macro. Example:
- define test set command quoting on, echo \fcontents(\%1)
- set command quoting off
- test c:\mydir\blah.txt
- c:\mydir\blah.txt
- Upon return from the macro, command quoting is back on (since the macro
- turned it on).
- Obviously this trick can not be used if the filename is stored in a
- variable, since it prevents the variable from being evaluated.
- 1.11.6. Passing DOS File Names from Macro Parameters to the DOS Shell
- Now suppose you need to pass a DOS filename to a macro, and the macro
- needs to pass it, in turn, to the Windows shell via (say) Kermit's RUN
- command. This works too:
- define xrun run \fcontents(\%1)
- xrun c:\\windows\\command\\chkdsk.exe
- (or you can use the SET COMMAND QUOTING OFF / ON technique described
- above to avoid the double backslashes.) But..
- xrun c:/windows/command/chkdsk.exe
- does not work if the Windows shell does not recognize "/" as a
- directory separator. If there is a chance that a filename might be
- passed to the macro in this form, the macro will need to convert it to
- a form acceptable to the shell:
- define xrun run \freplace(\fcontents(\%1),/,\\)
- Here we replace all occurrences (if any) of "/" in the argument with
- "\" prior to issuing the RUN command. Of course, in order to specify
- "\" as a literal character in the \freplace() argument list, we have to
- double it.
- 1.11.7. Passing DOS Filenames to Kermit from the Shell
- As noted in the manual, the \&@[] array contains Kermit's command-line
- arguments. Suppose one of these arguments, say \&@[3], is a DOS
- filename such as C:\FOO\BAR\BAZ\OOFA.TXT. (Note: In C-Kermit 7.0 and
- K95 1.1.18 and later, command-line arguments after "=" or "--" are also
- available in the top-level \%1..9 variables; see Section 7.5.)
- Of course you can eliminate any problems by using forward slashes
- rather than backslashes in the filename, but sometimes this is not
- possible, as when the Kermit command line is being generated by another
- program than can only generate "native" format DOS filenames.
- As noted in the manual, "\%x" variables and \&x[] arrays are always
- evaluated "all the way" (recursively). If the contents of one of these
- variables contains backslashes, this causes another level of
- evaluation.
- There is another kind of variable, which is evaluated only "one level
- deep". You can use this to prevent interpretation of the backslashes in
- the filenames. Example:
- assign filename \fcontents(\&@[3]) ; Transfer contents
- ...
- send \m(filename)
- Or, more simply:
- send \fcontents(\&@[3])
- 1.12. Debugging
- The debug log is produced when you give a "log debug" command. This is
- normally done at the request of the Kermit help desk, for forwarding to
- the Kermit developers for analysis as a last resort in troubleshooting
- problems. (Last resort because it can grow quite huge in a very short
- time.) In cases where timing information is critical to understanding a
- problem, you can tell C-Kermit to put a timestamp on each debug log
- line by giving the command:
- SET DEBUG TIMESTAMP ON
- At any time before or after activating the debug log (SET DEBUG
- TIMESTAMP OFF turns off timestamping). Timestamps can be turned off and
- on as desired while logging. Obviously, they increase the size and
- growth rate of the log significantly, and so should be used sparingly.
- Timestamps are of the form hh:mm:ss.xxx, where .xxx is thousands of a
- second (but is included only on platforms that include this feature).
- 1.13. Logs
- In UNIX C-Kermit and in K-95, you can now direct any log to a pipe.
- This not only lets you send your logs to places other than disk files,
- but also lets you customize them to any desired degree.
- LOG { DEBUG, PACKETS, SESSION, TRANSACTION, CONNECTION } { file, pipe }
- ...
- A "pipe" is the name of a command, preceded by a vertical bar.
- If the pipe contains any spaces, it must be enclosed in braces.
- Here are some examples for UNIX (always remember the importance of
- getting the UNIX shell quoting rules right):
- LOG TRANSACTIONS |lpr
- This sends the transaction log to the default UNIX printer,
- rather than to a file (use "lp" rather than "lpr" if necessary).
- LOG TRANSACTIONS {| myfilter > t.log}
- For those who don't like the format of the transaction log, or
- want to extract certain information from it; write your own
- output filter.
- LOG SESSION {| lpr -Plaserwriter}
- This sends the session log to a specific UNIX printer, rather
- than to a file. Note the braces around the pipeline. These are
- required because it contains spaces.
- LOG DEBUG {| tail -100 > debug.log}
- This causes the debug log file to contain only the final 100
- lines. Suppose C-Kermit crashes under some unpredictable
- circumstances, and you need a debug log to catch it in the act.
- But the debug log can grow to huge proportions very quickly,
- possibly filling up the disk. Piping the debug log through
- "tail" results in keeping only the last 100 lines (or other
- number of your choice).
- LOG DEBUG {| grep "^TELNET" > debug.log}
- This one shows how to log only Telnet negotiations. Piping the
- debug log through grep or egrep lets you log only specific
- information, rather than everything. "man grep" for further
- info.
- LOG DEBUG {| gzip -c > debug.log.gz}
- Creates a full debug log, but compressed by gzip to save space.
- LOG PACKETS {| tr "\\01" "X" | cut -c9- > packet.log}
- This one writes the regular packet log, but translates the
- Ctrl-A that starts each packet to the letter "X" and removes the
- s-nn-nn- notation from the beginning of each line. Note the
- double backslash (normal Kermit quoting rules). "man tr" and
- "man cut" for further info.
- See Section 2.12 for information about the new connection log.
- 1.14. Automatic File-Transfer Packet Recognition at the Command Prompt
- Beginning in version 7.0, C-Kermit can recognize Kermit (and in some
- cases also Zmodem) file-transfer packets while at its command prompt.
- This is convenient (for example), if you escaped back from a remote
- Kermit program and told the local Kermit program to send a file, but
- forgot to tell the remote Kermit program to receive it (and the local
- Kermit did not have the "send a Kermit receive command" feature
- available). This feature is controlled by the following command:
- SET COMMAND AUTODOWNLOAD { ON, OFF }
- When ON, which is the default, the command parser recognizes
- Kermit packets when Kermit is in remote mode. An S packet makes
- it go into receive mode, an I packet makes it go into server
- mode. When OFF, packet recognition is disabled and the behavior
- when a packet is received at the command prompt is as it was in
- C-Kermit 6.1 and earlier (namely to print an error message).
- COMMAND AUTODOWNLOAD is the command-mode equivalent of TERMINAL
- AUTODOWNLOAD, which is effective during CONNECT mode.
- 1.15. The TYPE Command
- The TYPE command now accepts a selection of optional switches
- ( Section 1.5), and also sets several variables.
- Syntax: TYPE [ switches... ] filename
- Variables:
- \v(ty_ln)
- Line number of current line (during TYPE command; see /PREFIX)
- \v(ty_lc)
- Line count of file most recently TYPEd.
- \v(ty_mc)
- Match count of file most recently TYPEd (see /MATCH).
- Switches:
- /PAGE
- If /PAGE is included, Kermit pauses at the end of each screenful
- and issues a "more?" prompt. You may press the space bar to view
- the next page (screenful), or press "q" or "n" to return to the
- C-Kermit prompt. If this switch is given, it overrides the
- COMMAND MORE-PROMPTING setting for this command only. If it is
- not given, paging is according to COMMAND MORE-PROMPTING.
- /NOPAGE
- Do not pause at the end of each screenful; show the whole file
- (or all selected lines) at once. If this switch is given, it
- overrides the COMMAND MORE-PROMPTING setting for this command
- only. If it is not given, paging is according to COMMAND
- MORE-PROMPTING.
- /HEAD[:n]
- Only show the first n lines of the file (where n is a number).
- If n is omitted, 10 is used.
- /TAIL[:n]
- Only show the last n lines of the file (where n is a number). If
- nis omitted, 10 is used. Note: /HEAD and /TAIL can't be
- combined; if you give both switches, only the most recent one is
- used.
- /MATCH:pattern
- Only type lines from the file that match the given pattern (see
- Section 4.9.1 for pattern notation). UNIX users familiar
- with grep should note a significant difference: there is no
- implied "*" at the beginning and end of the pattern. Thus:
- TYPE /MATCH:foo Lists lines whose entire contents are "foo".
- TYPE /MATCH:foo* Lists lines that start with "foo".
- TYPE /MATCH:*foo Lists lines that end with "foo".
- TYPE /MATCH:*foo* Lists lines that have "foo" anywhere in them.
- /HEAD and /TAIL apply after /MATCH, so "type /tail:20 /match:x*"
- shows the last 20 lines in the file that start with "x".
- /PREFIX:string
- Print the given string at the beginning of each line. The string
- may be a constant, a variable, or a quoted variable. If it's an
- unquoted variable, its value at the time the TYPE command was
- given is used as a constant. If it is a quoted variable, it is
- re-evaluated for each line; a useful variable for this context
- is \v(ty_ln) (the line number of the current line being typed).
- If the prefix is to include spaces, it must be enclosed in
- braces. Examples:
- type /prefix:{oofa.txt: } /match:*thing* oofa.txt
- Prints all lines in oofa.txt that contain "thing" with the
- filename itself as the prefix (similar to UNIX grep).
- type /prefix:{\v(time). } oofa.txt
- Prefixes each line of oofa.txt with the time at which the
- TYPE command was given (one backslash)
- type /prefix:{\\v(time). } oofa.txt
- Prefixes each line of oofa.txt with the time at which that
- line is being typed (two backslashes).
- type /prefix:{\\v(ty_ln). } oofa.txt
- Prefixes each line of oofa.txt with its line number.
- type /prefix:{\\flpad(\\v(ty_ln),4). } oofa.txt
- Same as the previous example, except the line number is
- right-adjusted in a 4-column field.
- /WIDTH[:n]
- Truncates each line at column n (which must be a number) prior
- to printing it. This option can be used for long lines when you
- don't want them to wrap. If nis omitted, your current screen
- width is used.
- /COUNT
- Counts lines and -- if /MATCH was included, matches -- but does
- not print any lines from the file. The line and match count is
- shown at the end, and the variables \v(ty_lc) and \v(ty_lm) are
- set accordingly.
- SET OPTIONS TYPE { /PAGE, /NOPAGE, /WIDTH:n }
- Sets the paging default for TYPE commands, which can be
- overridden in any particular TYPE command by including the
- desired switch.
- If a TYPE command is given with no switch, and no SET OPTIONS TYPE
- selection is in effect, paging is according to your COMMAND
- MORE-PROMPTING setting (SHOW COMMAND).
- 1.16. The RESET Command
- The RESET command, added in 7.0, closes all open files and logs, but
- does not affect the open connection (if any).
- 1.17. The COPY and RENAME Commands
- As of C-Kermit 7.0, in the UNIX version only, the COPY and RENAME
- commands are built in and do not call the underlying platform's COPY or
- RENAME command. This allows them to work in "NOPUSH" versions and other
- circumstances where it can't access system commands, and it allows file
- copying and renaming to be done portably in scripts. The
- characteristics of the built-in COPY or RENAME include:
- * It fails if the source file is a directory or is wild or lacks read
- access.
- * It fails if the source file is the destination file.
- * It allows the destination file to be a directory, in which case the
- source file is copied (or renamed) into it with the same name.
- * It overwrites an existing destination file if its permission
- allows.
- * It sets the new file's permission according to umask but also
- carries forward the source file's execute permission bits if the
- destination file did not already exist.
- * It fails if interrupted by Ctrl-C.
- * Upon error, it prints an appropriate message.
- * It returns standardized error codes that can be tested by IF
- SUCCESS / FAIL.
- These commands now also accept the following switches:
- /LIST (/LOG, /VERBOSE) = Print "file1 => file2 (OK)" (or error message).
- /NOLIST (/NOLOG, /QUIET) = Don't print anything (except error messages).
- /NOLIST is the default.
- The same built-in code is used by the UNIX C-Kermit server to execute
- REMOTE COPY commands (except in this case no switches are available).
- The COPY command also accepts the following additional switches. When
- any of these are given (and they can be used in any combination except
- /SWAP and /APPEND), some of the checks listed above are relaxed, and
- thus it might be possible to get into trouble in certain cases, e.g.
- when the source and target files are the same file:
- /APPEND = Append source file to destination file.
- /SWAP-BYTES = Swap bytes (see Section 6.6.5).
- /FROMB64 = Decode the source file from Base64 encoding.
- /TOB64 = Encode the target file in Base64.
- Base64 is the encoding commonly used for enclosures in Internet email.
- 1.18. The MANUAL Command
- The MANUAL command can be used to access the appropriate Kermit manual
- or other manual. The general syntax is:
- MANUAL [ string ]
- If the string is omitted, C-Kermit asks the underlying system to
- access the C-Kermit manual using whatever method is appropriate
- for the system.
- The specific action depends on the system. In UNIX, a "man" command is
- issued; "kermit" is the default argument but other manual topics may be
- specified. If the "man" command allows index or string searching, the
- appropriate syntax may be included.
- In Kermit 95, the MANUAL command brings up the HTML online K95 manual.
- In VMS and elsewhere, "man" is simply translated to "help", with a
- default argument of "kermit"; other and/or additional arguments may be
- included according to the definition of the system's "help" command.
- Correct operation of the "man" command in C-Kermit depends on the
- appropriate man page or help topic having been installed in the right
- place with the right permissions and format.
- 1.19. String and Filename Matching Patterns
- A pattern is a string that includes special notation for matching
- classes or sequences of characters. C-Kermit 7.0 / K95 1.1.19 supports
- patterns in several places:
- * Filenames ( Section 4.9)
- * SWITCH case labels ( Section 7.18)
- * The new IF MATCH statement ( Section 7.4)
- * TYPE /MATCH ( Section 1.15)
- * SET FILE TEXT-PATTERNS and BINARY-PATTERNS ( Section 4.3)
- * The \fsearch() and \farraylook() functions (Sections 7.3 and
- 7.10.7)
- * The \fpattern() function used with [M,RE]INPUT ( Section 7.1)
- Patterns are also called wildcards, especially when used for filename
- matching. C-Kermit's pattern syntax is explained in Section 4.9.1,
- and also by the HELP WILDCARDS command.
- 1.20. Multiple Commands on One Line
- As of C-Kermit 7.0, commands can be grouped together on one line by
- separating the commands with commas and enclosing the list in braces.
- For example:
- C-Kermit> { echo One, echo Two, echo Three }
- C-Kermit> do { echo One, echo Two, echo Three }
- Command lists can be nested:
- [ do ] { echo One, echo Two, if true { echo A, echo B}, echo Three }
- and the END command works as it does in macros:
- [ do ] { echo One, echo Two, if true end, echo Three }
- The "one line" stricture is, of course, pliant to line-continuation
- conventions, namely that lines ending in hyphen (-) or left brace ({)
- are to be continued. Thus the first example can also be rendered:
- [ do ] {
- echo One
- echo Two
- echo Three
- }
- (the "do" is optional).
- 1.21. What Do I Have?
- C-Kermit can be built for hundreds of different platforms with
- practically countless configuration options. Certain commands might not
- be available in certain configurations, etc. Even on the same platform,
- different builds are possible: "maximum functionality", "minimum size",
- "maximum performance", and so on. You can find out a lot about the
- configuration of your C-Kermit program with the SHOW FEATURES command.
- Of course, a lot of what it says, especially in the bottom part, might
- seem like gibberish, but can be deciphered with a Rosetta Stone (such
- as the C-Kermit source or theckccfg.txt file). In any case, the
- output from SHOW FEATURES might easily explain why some expected
- feature is missing, or some buffer is smaller than expected. Here's a
- sample of the bottom section for the SunOS version:
- C-Kermit 7.0.196, 1 Jan 2000
- Major optional features included:
- Network support (type SHOW NET for further info)
- Telnet Kermit Option
- Hardware flow control
- External XYZMODEM protocol support
- Latin-1 (West European) character-set translation
- Latin-2 (East European) character-set translation
- Cyrillic (Russian, Ukrainian, etc) character-set translation
- Greek character-set translation
- Hebrew character-set translation
- Japanese character-set translation
- Unicode character-set translation
- Pseudoterminal control
- REDIRECT command
- RESEND command
- Fullscreen file transfer display
- Control-character unprefixing
- Streaming
- Autodownload
- Major optional features not included:
- No Kerberos(TM) authentication
- No SRP(TM) (Secure Remote Password) protocol
- No Secure Sockets Layer (SSL) protocol
- No Transport Layer Security (TLS) protocol
- No encryption
- No X Windows forwarding
- Host info:
- Machine: sun4m
- Model: (unknown)
- OS: SunOS
- OS Release: 4.1.3_U1
- OS Version: 4
- Target: sunos41gsc
- GCC version: 2.7.2
- Compiled Dec 31 1999 10:38:54, options:
- __GNUC__ __STDC__ _POSIX_JOB_CONTROL _SC_JOB_CONTROL ARRAYREFLEN=1024 BIGBUFOK
- BROWSER BSD4 CK_ANSIC CK_APC CK_AUTODL CK_CURSES CK_DNS_SRV CK_ENVIRONMENT
- CK_FAST CK_LOGIN CK_MKDIR CK_NAWS CK_PCT_BAR CK_PERMS CK_RECALL CK_RTSCTS
- CK_SPEED CK_TIMERS CK_TMPDIR CK_TTGWSIZ CK_TTYFD CK_WREFRESH CKEXEC
- CKFLOAT=double CKGHNLHOST ckmaxfiles=64 CKMAXOPEN=64 CKMAXPATH=1023 CKREALPATH
- CKREGEX CKSYSLOG CKTUNING CMDBL=32763 CMDDEP=64 CONGSPD DCMDBUF DIRENT DYNAMIC
- FNFLOAT FORDEPTH=32 GFTIMER HADDRLIST HDBUUCP IFDEBUG IKS_OPTION IKSDB
- IKSDCONF INBUFSIZE=32768 INPBUFSIZ=4096 MAC_MAX=16384 MACLEVEL=128 MAXDDIR=32
- MAXDNUMS=4095 MAXGETPATH=128 MAXTAKE=54 MAXWLD=102400 MSENDMAX=1024 NETCMD
- NETCONN NETPTY NOKVERBS NOSETBUF OBUFSIZE=32768 PARSENSE PATTERNS PIPESEND
- RENAME RLOGCODE SAVEDUID SELECT SIG_V SOL_SOCKET sparc STREAMING sun SUNOS4
- SYSTIMEH TCPSOCKET TIMEH TLOG TNCODE TTLEBUF TTSPDLIST UIDBUFLEN=256 UNIX
- UNPREFIXZERO USE_LSTAT USE_MEMCPY VNAML=4096 WHATAMI XFRCAN Z_MAXCHAN=46
- z_maxchan=46 ZXREWIND
- byte order: big endian
- sizeofs: int=4 long=4 short=2 char=1 char*=4 float=4 double=8
- floating-point: precision=16 rounding=1
- Without going into detail about what all the notation means, notice a
- couple things:
- * The Options section shows symbols ("macros") in effect during
- compilation, together with their values (for those that have
- values). The options are listed in alphabetical order to make any
- particular option easier to find.
- * MAXWLD is the maximum number of files that a wildcard can expand
- to.
- * Anything starting with "NO" is a feature (or something other than a
- feature) that has been deliberately "compiled out", or omitted.
- * Important items for script writers include: CMDBL=32763 (the size
- of the command buffer and therefore the maximum length for a macro
- or variable definition; CMDDEP=64 (the limit on recursion depth);
- FORDEPTH=32 (the nesting limit on FOR loops); INBUFSIZE=32768 (the
- size of the INPUT command circular buffer); MAC_MAX=16384 (the
- maximum number of macros), etc.
- See theckccfg.txt file for details.
- 1.22. Generalized File Input and Output
- C-Kermit 7.0 adds a new generalized I/O system for stream files,
- augmenting (and to some extent, overlapping with) the older OPEN, READ,
- WRITE, and CLOSE commands. In the new file i/o system, which can be
- used simultaneously with the old one, all commands are grouped together
- under the new FILE keyword, and some related functions and variables
- are added.
- 1.22.1. Why Another I/O System?
- The well-known LOG, OPEN, READ, WRITE, and CLOSE commands have the
- following restrictions:
- 1. Only one READ file and one WRITE file can be open at a time.
- 2. The READ and WRITE commands are strictly line oriented.
- 3. These commands can not be used with binary files.
- 4. They do not support read/write access or random access.
- 5. The syntax is a bit counterintuitive for programmers.
- The new file i/o system allows multiple files to be open at once, in
- any desired combination of modes (read/write/append) supported by the
- operating system, for line, block (record), or character i/o, for
- sequential or random access, using consistent syntax and conventions.
- The new system, however, does not replace the old one, since the old
- system still must be used for:
- 1. The session, packet, debug, transaction, and connection logs.
- 2. Reading and writing commands rather than files.
- 3. Existing scripts.
- The new system works only with regular files, not with commands or
- pipes or mailboxes or pseudoterminals. No special provisions are made
- in the FILE commands for handling devices or network connections, nor
- for preventing you from trying to open them; if the underlying
- operating system treats them like regular stream disk files, the FILE
- commands (except, of course SEEK, REWIND, and COUNT) might work with
- them. (In C programming terms, the FILE commands are, at present,
- nothing more than a front end to fopen() / fread() / fwrite() /
- fclose() and friends, which are a portable API to sequential files, but
- this might change in the future for platforms like VMS and VOS that
- have more complicated file systems.)
- Definitions:
- Channel
- A number assigned to a file when it is opened, by which it must
- be referred to in all input/output operations.
- Read/Write Pointer
- The current position in an open file, expressed as the 0-based
- byte count from the beginning.
- 1.22.2. The FILE Command
- FILE keyword [ switches ] channel [ data ]
- The keyword specifies the function: FILE OPEN, FILE READ, FILE
- WRITE, FILE CLOSE, etc. For convenience (and for familiarity to
- C programmers), the two-word FILE commands can be shortened to
- the single words FOPEN, FREAD, FWRITE, FCLOSE, and so on.
- Switches are optional, and modify or amplify the requested file
- function.
- As in C, Fortran, and other programming languages, open files are
- referred to by "channels", integers such as 0, 1, 2, 3, and so on. A
- channel number is assigned when you open a file. The number of
- available channels depends on the underlying operating system, and can
- be seen in the variable:
- \v(f_max)
- or by giving the FILE LIST (FLIST) command. Channels are discussed in
- greater detail in Section 1.22.4.
- FILE command errors can be caught with IF FAIL after the FILE command.
- In addition, the \v(f_error) variable is set to the completion code of
- the command: 0 if no error, or a negative number if there was an error.
- The error codes are listed in Section 1.22.5.
- The command to open a file is:
- FILE OPEN [ switches ] variable filename
- Opens a file for the type of access specified by the switches,
- or for read-only access if no switches are given. Upon success,
- a channel number is assigned to this file and stored in the
- given variable so you can refer to the open file in subsequent
- i/o commands. If the file can not be opened, the FILE OPEN
- command fails. Synonym: FOPEN.
- The FILE OPEN switches are:
- /READ
- Open the file for read access. If no switches are given, /READ
- is assumed. If the file does not exist or can't be opened for
- read access, the FILE OPEN command fails.
- /WRITE
- Allow writing. If a file of the same name already exists, it is
- overwritten unless /READ or /APPEND is also included. If a file
- of the given name does not exist, it is created.
- /APPEND
- Equivalent to /WRITE, except that if the file exists, it is not
- destroyed. The read/write pointer is set to the end of the file,
- so unless you change it with FILE SEEK or REWIND (see below),
- the first FILE WRITE command adds to the end of the file,
- preserving what was there already. If /WRITE is also given, it
- is ignored.
- /BINARY
- Open the file in "binary" mode, rather than text mode. This
- switch is meaningless (but still can be used) in UNIX. In VMS,
- Windows, and OS/2, it inhibits end-of-line processing and
- conversion, and so should be used for binary files and/or files
- that are to be accessed in record or character mode rather than
- line by line.
- The variable for the channel number can be any kind of variable: the
- \%x kind, a macro name, or an array element. But it must be a variable,
- not a number -- C-Kermit assigns the channel number; you can't tell it
- what number to use.
- Example:
- FILE OPEN \%c oofa.txt ; Open oofa.txt for reading.
- IF FAIL exit 1 Can't open oofa.txt ; Always check to see if it worked.
- ECHO oofa.txt: channel = \%c
- If the file oofa.txt is opened successfully, a channel number is
- assigned to the variable \%c. Here's another example using a macro name
- for the channel number:
- FILE OPEN channel oofa.txt ; Open oofa.txt for reading.
- IF SUCCESS ECHO oofa.txt: channel = \m(channel)
- Switches can be combined when it makes sense and the underlying
- operating system allows it. For example, to open a file in binary mode
- for reading and writing (sometimes called "update"):
- FILE OPEN /READ /WRITE /BINARY \%c budget.db
- Some combinations might be allowed, others not. For example /READ
- /APPEND will usually not be allowed. /WRITE /APPEND is treated as
- /APPEND.
- A major advantage of the new system over the older one is that you can
- have multiple files open at once. Suppose, for example, that you want
- to open all the files in a certain directory at once:
- .\%n := \ffiles(/usr/olga*,&f) ; Get file list into array.
- if ( > \%n \v(f_max) ) { ; Make sure there aren't too many.
- exit 1 {\v(dir): \%n = Too many files}
- }
- declare \&c[\%n] ; Make array for channel numbers.
- for \%i 1 \%n 1 { ; Loop to open every file...
- file open \&c[\%i] \&f[\%i] ; Try to open this one
- if fail exit 1 Open error: \&f[\%i] ; Check for failure
- }
- If this loop completes successfully, the \&c[] array will contain \%n
- channel numbers of open files in elements 1 through \%n.
- Any file that you open with FILE OPEN stays open until Kermit exits, or
- you close it explicitly. The command to close a file is:
- FILE CLOSE { ALL, channel }
- If a channel number is given and the channel refers to an open
- file, the file is closed and the channel is freed for reuse; if
- the channel does not refer to an open file, an error message is
- printed and the command fails. If ALL is specified instead of a
- specific channel, all files opened with FILE OPEN are closed and
- if all open files were closed successfully (even if no files
- were open), the command succeeds; if any open file could not be
- closed, the command fails; however, all open files that could be
- closed are still closed. Synonym: FCLOSE.
- FILE CLOSE might fail because, for example, the disk filled up or a
- quota was exceeded. Example:
- fopen /write \%c new.txt ; Open new.txt for writing.
- if fail exit 1 ; Check for error.
- fclose \%c ; Close the file we just opened.
- This creates a 0-length file called new.txt.
- Note that FILE OPEN /WRITE (without /READ or /APPEND) always creates a
- new file, and therefore destroys any file with the same name that might
- already exist (assuming you have permission to delete it). To avoid
- overwriting existing files, simply check first:
- if exist new.txt exit 1 {Fatal - new.txt already exists}
- fopen /write \%c new.txt
- if fail ...
- The next two commands give information about open files:
- FILE STATUS channel
- Tells the name of the file, if any, open on the given channel
- and the switches it was opened with. The read/write pointer is
- also shown; this is where the next read or write will occur;
- "[EOF]" is shown if the current position in the open file is the
- end -- i.e. the next read will fail if the file was opened in
- /READ mode; the next write will add material to the end. The
- current line number (0-based) is also shown if known. The FILE
- STATUS command succeeds if the channel is open, and fails if
- there is no open file on the given channel, or if the channel
- number is invalid or out of range. Synonym: FSTATUS.
- FILE LIST
- Lists the channel number and name of each open file, along with
- its OPEN modes (R, W, A, B, RW, etc) and its current read/write
- pointer or "[EOF]" if it is at the end. Also tells the number of
- files currently opened with FILE OPEN, plus the maximum number
- of open files allowed by the system and the maximum number
- allowed for FILE OPEN. Synonym: FLIST.
- Next come the commands for reading and writing files:
- FILE READ [ switches ] channel [ variable ]
- Reads data from the file on the given channel number into the
- variable, if one was given; if no variable was given, the result
- is printed on the screen. IMPORTANT: The variable should
- normally be a macro name rather than a \%x or \&x[] variable if
- you want backslash characters in the file to be taken literally
- (see pp.408-412 ofUsing C-Kermit for an explanation; you
- can also read into a \%x or \&x[] variable, but then you must
- remember to protect future references to by \fcontents() if you
- don't want C-Kermit to process any backslashes it might
- contain). The desired amount of data (according to the switches)
- is read from the file at the current read/write pointer, and
- upon completion the read/write position is updated to first byte
- after the data that was read, no matter what switches were
- given. Synonym: FREAD.
- FILE WRITE [ switches ] channel text
- Writes the given text to the file on the given channel number.
- The text, of course, can be literal text or a variable, or any
- combination. If the text might contain leading or trailing
- spaces, it must be enclosed in braces if you want to preserve
- them. Synonym: FWRITE.
- Before proceeding, a caution about the NUL character. C-Kermit is so
- named because it is a Kermit program written in the C language. In C,
- character strings are represented as a sequence of non-NUL bytes
- terminated by a NUL byte (a byte in which all bits are 0). Thus a C
- string can not contain NUL bytes; it always ends with the first NUL
- byte. C-Kermit variables are implemented as C strings and therefore
- can't contain NUL bytes either, so the FILE READ and FILE WRITE
- commands do not handle files or strings that contain NUL bytes, except
- when the /CHARACTER switch is included with the FILE READ or WRITE
- command, or when /LPAD:0 or /RPAD:0 is given with the FILE WRITE
- command; these switches are explained below.
- Also note that Kermit can not be used read or write binary numbers in
- the machine's internal format (integer or floating-point); in general,
- numbers can be processed only when represented as numeric or
- floating-point strings.
- FILE READ switches are:
- /LINE
- Specifies that a line of text is to be read. A line is defined
- according to the underlying operating system's text-file format.
- For example, in UNIX a line is a sequence of characters up to
- and including a linefeed, or the end of the file, which ever
- comes first. The line terminator (if any) is removed before
- assigning the text to the variable. If no switches are included
- with the FILE READ command, /LINE is assumed. Normally this
- switch should not be used with files opened in /BINARY mode (but
- nothing prevents it either).
- /SIZE:number
- Specifies that the given number of bytes (characters) is to be
- read. The actual number of bytes returned will be less if the
- end of file is reached (or a NUL byte is encountered). For
- example, if a file is 514 bytes long, FILE READ /SIZE:512
- returns 512 bytes the first time and 2 bytes the second time.
- FILE READ /SIZE provides a kind of "record i/o" for files that
- do not necessarily contain lines. The resulting block of
- characters is assigned to the variable without any editing.
- Synonym: /BLOCK.
- /CHARACTER
- Equivalent to /SIZE:1. If FILE READ /CHAR succeeds but the
- variable is empty, this indicates a NUL byte was read. Synonym:
- BYTE.
- FILE WRITE switches are:
- /LINE
- Specifies that an appropriate line terminator is to be added to
- the end of the text. If no switches are included, /LINE is
- assumed.
- /SIZE:number
- Specifies that the given number of bytes (characters) is to be
- written. If the given text is longer than the requested size, it
- is truncated; if is shorter, it is padded according /LPAD and
- /RPAD switches. Synonym: /BLOCK.
- /LPAD[:value]
- If /SIZE was given, but the text is shorter than the requested
- size, the text is padded on the left with sufficient copies of
- the character whose ASCII value is given to write the given
- length. If no value is specified, 32 (the code for Space) is
- used. The value can also be 0 to write the indicated number of
- NUL bytes. If /SIZE was not given, this switch is ignored.
- /RPAD[:value]
- Like LPAD, but pads on the right.
- /CHARACTER
- Specifies that one character should be written. If the text is
- empty or not given, a NUL character is written; otherwise the
- first character of text is given. Synonym: /BYTE.
- /STRING
- Specifies that the text is to be written as-is, with no
- terminator added.
- Here's an example in which we copy a text file line by line:
- file open /read \%c oofa.txt ; Open input file
- if fail exit 1 Can't open input file ; Check that it's open
- file open /write \%d new.txt ; Open output file
- if fail exit 1 Can't open output file ; Check
- while true { ; Loop to copy lines
- file read /line \%c line ; Read a line
- if fail break ; Assume failure = end of file
- file write /line \%d {\m(line)} ; Write the line to output file
- if fail exit 1 Write failure ; Failure here is fatal
- }
- file close \%c ; Close the two files
- file close \%d
- Note that since /LINE is the default for both FILE READ and FILE WRITE,
- it can be omitted as in the following example, where we also use the
- short names for the FILE commands.
- fopen /read \%c oofa.txt ; Open input file
- if fail exit 1 Can't open input file ; Check that it's open
- fopen /write \%d new.txt ; Open output file
- if fail exit 1 Can't open output file ; Check
- while true { ; Loop to copy lines
- fread \%c line ; Read a line
- if fail break ; Assume failure = end of file
- fwrite \%d {\m(line)} ; Write the line to output file
- if fail exit 1 Write failure ; Failure here is fatal
- }
- fclose \%c ; Close the two files
- fclose \%d
- Here's the same example using "record i/o" (the open and close
- sequences are are omitted since they are the same as above). The result
- is the same, but execution is much faster:
- while true { ; Loop to copy blocks
- fread /size:512 \%c block ; Read a block into \%a
- if fail break ; Assume failure = end of file
- fwrite /string \%d {\m(block)} ; Write the block to output file
- if fail exit 1 Write failure ; Failure here is fatal
- }
- Although record i/o is faster, it should not be used in line-oriented
- applications, since it returns arbitrary chunks of the file to your
- script, rather than lines. In this example, FWRITE /STRING is used
- rather than FWRITE /SIZE:512 to avoid the last output block being
- padded beyond the original file's length.
- A file can also be copied character by character, but this is much
- slower than line i/o and VERY much slower than block i/o:
- while true { ; Loop to copy blocks
- fread /char \%c c ; Read a character into c
- if fail break ; Assume failure = end of file
- fwrite /char \%d {\m(c)} ; Write character to output file
- if fail exit 1 Write failure ; Failure is fatal
- }
- Although character i/o is slow, it is the only way to process files
- that contain NUL characters (i.e. bytes composed of only zero bits). In
- the example above, when "fread /char \%c c" returns a NUL, the c
- variable is empty. But since the FREAD /CHAR command did not fail, we
- know the result was really a NUL. FWRITE /CHAR, when given an empty
- variable (or no variable at all) writes a NUL. Thus the loop above will
- copy any file at all (very slowly). In non-copying applications, NULs
- are detected like this:
- fread /char \%c c
- if fail (do something)
- if not def c (a NUL byte was read)
- Finally some advanced file operations:
- FILE FLUSH channel
- For output files only: commits all previous writes to disk, in
- case the computer was buffering them. Synonym: FFLUSH.
- FILE COUNT [ { /BYTES, /LINES, /LIST, /NOLIST } ] channel
- By default, or if the /BYTES switch is given, counts the bytes
- in the file, if any, open on the given channel. If the /LINES
- switch is given, counts lines in the file. If the /LIST switch
- is given, the result is printed. If the /NOLIST switch is given,
- the result is not printed. /QUIET is a synonym for /NOLIST. If
- neither /LIST nor /NOLIST is given, the result is printed if the
- command is given at top level, i.e. not from a command file or
- macro. In all cases, the result of the most recent FILE COUNT
- command is stored in the variable \v(f_count). Note that FILE
- COUNT /LINE works (and can only work) by reading the entire
- file; expect it to take some time if the file is large. Synonym:
- FCOUNT.
- FILE REWIND channel
- Moves the read/write pointer to the beginning of the file.
- Equivalent to FILE SEEK channel 0. Synonym: FREWIND.
- FILE SEEK [ switches ] channel { [{+,-}]number, LAST, EOF }
- Moves the read/write pointer for the file on this channel to the
- given position, which may be a byte (character) number or a line
- number, expressed in either absolute or relative terms.
- Switches:
- /BYTE
- The number given is a byte number. Synonym: /CHARACTER.
- /LINE
- The number given is a line number.
- /ABSOLUTE
- The number given is absolute.
- /RELATIVE
- The number given is relative to the current position.
- By default, or if the /BYTE switch is given, the number is a
- byte number (0 = first byte). If /LINE is given, the number is a
- line number (0 = first line). EOF means to move to the end of
- the file. LAST means to move to the last line or character of
- the file, depending on whether it's a line or character seek.
- If neither the /RELATIVE nor the /ABSOLUTE switch is given, then
- if a signed number is given, the motion is relative to the
- current position. An expression that evaluates to a negative
- number is not considered signed for this purpose; that is, a
- sign (+ or -) must be included as the first character of the
- number in the command itself to force a relative seek (in the
- absence of /RELATIVE or /ABSOLUTE).
- If the number has no sign, or if the /ABSOLUTE switch is given,
- the number represents an absolute position (relative to the
- beginning of the file). Subsequent FILE READs or WRITEs will
- take place at the new position.
- If the read/write pointer is placed after the end of the file, a
- subsequent FILE READ will fail, but a FILE WRITE will succeed
- (possibly creating a file with "holes"). If a FILE SEEK /BYTE
- command is given, the current line becomes unknown (unless the
- position is 0) and subsequent FILE SEEK /RELATIVE /LINE commands
- will fail until the next non-relative FILE SEEK /LINE command is
- given. Synonym: FSEEK.
- An absolute FILE SEEK to a negative position fails silently, as does a
- relative seek to a position before the beginning of the file.
- A caution about relative SEEKs: remember that the number is relative to
- the current position. Whenever you read or write, this changes the
- position. In each of the following examples, assume the file open on
- channel \%c is positioned at line n (the FREAD target variable is
- omitted for lack of space):
- { FREAD \%c, FSEEK /LINE \%c -1, FREAD \%c } <-- Reads line n twice
- { FREAD \%c, FSEEK /LINE \%c +0, FREAD \%c } <-- Reads lines n and n+1
- { FREAD \%c, FSEEK /LINE \%c +1, FREAD \%c } <-- Reads lines n and n+2
- { FREAD \%c, FSEEK /LINE \%c -2, FREAD \%c } <-- Reads lines n and n-1
- { FREAD \%c, FSEEK /LINE \%c -3, FREAD \%c } <-- Reads lines n and n-2
- Another caution: Using FSEEK and FREAD /SIZE to repeatedly read the
- same disk block (e.g. when sampling a database record that is
- frequently updated) might not give you updated disk blocks due to the
- internal buffering and caching of the C library (this probably varies
- from one platform/compiler combination to another). If necessary you
- can force a fresh disk read with a close/open sequence:
- FCLOS \%c
- FOPEN \%c samefilename
- FSEEK \%c samespot
- FREAD /SIZE:howmanybytes \%c variable
- 1.22.3. FILE Command Examples
- To read the last 10 lines of a text file into an array:
- fopen /read \%c oofa.txt ; Open the file
- if fail exit 1 Can't open oofa.txt ; Always check for failure
- dcl \&a[10] ; Declare a 10-element array
- fcount /line \%c ; Count lines in the file
- fseek /line \%c \v(f_count)-10 ; Seek to 10 lines from the end
- if fail exit 1 Can't seek ; Check for failure
- for \%i 1 10 1 { fread \%c \&a[\%i] } ; Read the last 10 lines
- fclose \%c ; Close the file
- Note that blank lines show up as empty (undefined) array elements, for
- example if you give a "show array a" command at this point. This is
- normal. You can still use these elements; e.g.:
- for \%i 1 10 1 { echo \%i. \&a[\%i] } ; Display the 10 lines
- Here is how to read the last line of a file (already open on channel
- \%c):
- fseek /line \%c last ; Seek directly to last line
- Alternatively:
- fseek /line \%c eof ; Seek to end of file
- fseek /line \%c -1 ; Seek to beginning of last line
- Alternatively:
- fcount /line \%c ; Count the file's lines
- fseek /line \%c \v(f_count)-1 ; Seek to last line
- fread \%c ; Read it
- To read every other line from the file (using relative SEEK), skipping
- the first line:
- fopen /read \%c oofa.txt ; Open the file
- while ( success ) { ; Loop through lines
- fseek /line \%c +1 ; Skip a line
- if success fread \%c ; Read & display a line
- }
- fclose \%c ; Close the file
- Here is how to read the lines of a file in reverse order:
- fopen /read \%c oofa.txt ; Open
- if fail exit 1 ; Check
- fseek /line \%c last ; Seek to last line
- while success { ; Loop
- fread \%c ; Read line
- fseek /line \%c -2 ; Seek backwards two lines
- }
- fclose \%c ; Close the file
- The loop works because a relative SEEK outside the file fails.
- It is also possible to use block i/o to manage random-access files with
- fixed-length records (as long as they don't contain NUL characters).
- Suppose, for example, you have a file of "card image" records with
- fixed-field information about customers, such as:
- Name: Columns 1-32 (column numbers are 1-based)
- Address: Columns 33-72
- Balance: Columns 73-80
- The records are indexed by customer number, starting with 0. There are
- no line terminators separating them. Therefore the record for customer
- number n starts at position nx 80 (\%n*80).
- Now suppose we received a payment from customer number 173 and want to
- update the balance:
- .\%n = 173 ; Customer (record) number
- .\%a = 12.72 ; Amount
- fopen /read /write \%c customer.db ; Open the file
- if fail stop 1 OPEN FAILED: \f_errmsg() ; Check
- fseek /byte \%c 80*\%n ; Seek to record
- fread /size:80 \%c r ; Read the record
- if fail stop 1 READ FAILED: \f_errmsg() ; Check (IMPORTANT)
- .\%b := \fright(\m(r),8) ; Extract the balance
- .\%b := \ffpadd(\%b,\%a,2) ; Add the new payment
- if fail stop 1 ARITHMETIC ERROR: \%b/\%a ; Catch bad records
- .r := {\fleft(\m(r),72)\flpad(\%b,8)} ; Update the record
- fseek /byte \%c 80*\%n ; Reposition to same spot
- fwrite /size:80 \%c {\m(r)} ; Replace the record
- if fail stop 1 WRITE FAILED: \f_errmsg() ; Check
- fclose \%c ; Close the file
- REMEMBER: Using FILE SEEK to move beyond the end of file can result in
- a file with holes when writing; when reading, an end-of-file error will
- occur -- be sure to check for it.
- 1.22.4. Channel Numbers
- C-Kermit's channel numbers are integers from 0 to some
- platform-dependent limit, such as 46 or 1985 (the value of \v(f_max)).
- This is the limit placed by the operating system on the number of files
- that may be opened by one process or user or job, minus the standard
- input, output, and error files, and minus the number of files reserved
- by C-Kermit for logs, OPEN READ and WRITE, and file transfer (and maybe
- some command files -- the \v(f_max) number can't be exact).
- Although you must include a variable in the FILE OPEN command, to which
- the channel number is assigned, you don't have to use a variable in the
- other FILE commands if you know what the number is -- you can just put
- the number. This saves you a few keystrokes when typing commands at the
- prompt:
- fopen \%c oofa.txt
- flist
- 0. /usr/olga.oofa.txt (R) 0
- This tells the channel number is 0 (the number on the left is the
- channel file's channel number). Of course you can also find it by
- echoing the variable:
- echo \%c
- 0
- Or with "fstatus \%c". Now you can type commands like:
- fread 0
- to read a line from the file. Obviously, however, using digits rather
- than a variable for the channel number would be poor practice in a
- script.
- If in commands like:
- fread \%c \%a
- you have trouble remembering which variable is which, note that the
- channel number is, indeed, a number. Anywhere C-Kermit accepts a number
- it can also accept an expression, so you can put parentheses around the
- channel number to remind you it's the channel number and not the
- variable into which data is to be read:
- fread (\%c) \%a
- Normally channel numbers are assigned sequentially as 0, 1, 2, ... up
- to the limit. However, once you start closing files, there can be holes
- in the sequence. New channels are assigned to fill in the holes. Thus
- you can't depend on channel numbers being in any particular sequence.
- 1.22.5. FILE Command Errors
- Each FILE command sets the variable \v(f_error) to one of the following
- values:
- 0 = No error
- -1 = System error
- -2 = Attempt to read after end of file
- -3 = Channel not open
- -4 = Channel number out of range (negative or too large)
- -5 = Numeric argument (size, ...) out of range
- -6 = File not found
- -7 = Bad or missing filename
- -8 = Too many files are already open (FILE OPEN only)
- -9 = Forbidden operation (e.g. write to a read-only file)
- -10 = Access denied
- -11 = Illegal combination of OPEN modes (FILE OPEN only)
- -12 = Buffer overflow
- -13 = Current line number unknown (for relative line seeks)
- -14 through -98: Reserved.
- -99 = Requested operation not implemented in this version of C-Kermit
- -999 = Unknown error
- When \v(f_error) is -1, this means the FILE command failed because
- because of a system error, in which case you can examine the following
- variables:
- \v(errno) = System error number.
- \v(errstring) = Error message corresponding to \v(errno).
- A special function is available for translating the \v(f_error) code to
- an error message string:
- \f_errmsg([code])
- If the code is -1, returns error message of the most recent system
- error; otherwise if the code is a valid \v(f_error) value, the associated
- message is returned. If the code is omitted, the status message
- corresponding to the current \v(f_error) value is returned.
- A FILE command that fails prints the appropriate error message
- automatically, except when the command is READ or SEEK and the error is
- -2 (end of file); in that case, the command still fails, but does not
- print a message. This allows constructions such as:
- fopen \%c oofa.txt
- while success { fread \%c }
- fclose \%c
- to work as expected, i.e. without an annoying message when the end of
- file is reached.
- 1.22.6. File I/O Variables
- The variables associated with the file i/o package are:
- \v(f_count)
- Result of the most recent FILE COUNT (FCOUNT) command.
- \v(f_error)
- Numeric error code of most recent FILE command (0 = no error).
- \v(f_max)
- Maximum number of files open simultaneously.
- 1.22.7. File I/O Functions
- Some of the FILE commands can also be issued as function calls, which
- makes script writing a bit more convenient, especially for C
- programmers. Also, several functions are provided that do not have
- command equivalents. Each of these functions takes a channel number as
- the first argument. These functions do not work for OPEN { READ, !READ,
- WRITE, !WRITE, and APPEND } files.
- \f_status(channel)
- Returns 0 if the channel is not open, otherwise a number between
- 1 and 15 which is the sum of the OPEN modes:
- 1 = /READ
- 2 = /WRITE
- 4 = /APPEND
- 8 = /BINARY
- The remaining functions work only for open channels. Each of these
- functions can fail for the applicable reasons listed inSection
- 1.22.5. For instructions on handling function errors, seeSection
- 7.12.
- \f_pos(channel)
- Returns the file's current read/write pointer (0-based). There
- is no FILE command equivalent.
- \f_line(channel)
- Returns the file's current line number (0-based), if known,
- otherwise -1. There is no FILE command equivalent. The line
- number is known as long as no character or block i/o has been
- done on the channel.
- \f_handle(channel)
- Returns the "file handle" of the file. That is, it translates
- the portable C-Kermit channel number into a system-specific file
- handle or number that can be passed to other programs on the
- same platform. In UNIX this is a file descriptor. There is no
- FILE command equivalent.
- \f_eof(channel)
- Returns 1 if the read/write pointer of the file on the given
- channel is at the end of the file, 0 otherwise. Convenient in
- WHILE statements, e.g.:
- while not \f_eof(\%c) { fread \%c }
- \f_getchar(channel)
- Equivalent to FREAD /CHAR. Returns the character actually read.
- If \f_getchar() does not fail but the return value is empty,
- this means a NULL character was read.
- \f_getline(channel)
- Equivalent to FREAD /LINE. Returns the line actually read, but
- with the line terminator stripped. If \f_getline() does not fail
- but the return value is empty, this normally means an empty line
- was read.
- \f_getblock(channel,n)
- Equivalent to FREAD /SIZE:n. Returns the block of characters
- actually read. If the returned block is smaller than n, it
- indicates either that the end of file was reached or a NUL
- character is in the block.
- \f_putchar(channel,c)
- Equivalent to FWRITE /CHARACTER. Writes the character c. If c
- contains more than one character, only the first is written. If
- c is empty a NUL is written. Returns the number of characters
- written on success, or a negative error code upon failure.
- \f_putline(channel,string)
- Equivalent to FWRITE /LINE. Writes the string and adds the
- appropriate line termination character or sequence. If the
- string is empty or omitted, an empty line is written. Returns
- the number of characters written on success, or a negative error
- code upon failure.
- \f_putblock(channel,string)
- Equivalent to FWRITE /STRING. Writes the string as given. If the
- string is empty or omitted, nothing is written. Returns the
- number of characters written on success, or a negative error
- code upon failure.
- 1.22.8. File I/O Function Examples
- fopen /read \%c oofa.txt ; Open our favorite file for reading
- if failure exit 1 ; Check that it's open
- while not \f_eof(\%c) { ; Loop until EOF
- .line := \f_getline(\%c) ; Get a line
- if success echo {\m(line)} ; Echo it
- }
- if not \f_eof(\%c) { ; Check reason for loop exit
- exit 1 File Error: \f_errmsg() ; If not EOF say so.
- }
- frewind \%c ; Rewind the file
- while not \f_eof(\%c) { ; Same thing but with block i/o
- .block := \f_getblock(\%c,256) ; (much faster than line i/o)
- if success xecho {\m(block)}
- }
- frewind \%c ; Rewind again
- while not \f_eof(\%c) { ; Same deal but with character i/o
- .c := \f_getchar(\%c) ; (much slower than line i/o)
- if success xecho {\m(c)}
- }
- close \%c
- To close all open files (equivalent to FCLOSE ALL):
- for \%i 0 \v(f_max)-1 1 {
- if \f_status(\%i) fclose \%i
- }
- 1.23. The EXEC Command
- The EXEC command is available only in UNIX.
- EXEC [ /REDIRECT ] command [ arg1 [ arg2 [ ... ] ]
- Runs the given command with the arguments in such a way that the
- command replaces C-Kermit in memory, and C-Kermit ceases to
- execute. EXEC is like RUN, except instead of returning to
- C-Kermit when finished, the command returns to whatever process
- invoked Kermit.
- In the normal case, no files are closed, so the EXEC'd command inherits
- the open files, read/write pointers, working directory, process ID,
- user ID (unless command is SUID), group ID (unless command is SGID),
- groups, etc. (In UNIX, the EXEC command is simply a front end for
- execvp().)
- If the /REDIRECT switch is included, then if a connection is open (SET
- LINE or SET HOST), it becomes the standard input and output of the
- EXEC'd program. If no connection is open, the /REDIRECT switch has no
- effect. For example to use C-Kermit for PPP dialing in Linux:
- set modem type usr ; Specify the kind of modem you have
- set line /dev/ttyS1 ; Specify the device it's connected to
- set speed 57600 ; and the speed
- set flow rts/cts ; and flow control.
- set dial retries 100 ; Try the dial sequence up to 100 times.
- dial {{9-212-555-1212}{9-212-555-1213}{9-212-555-1214}{9-212-555-1215}}
- if fail exit 1
- for \%i 1 16 1 { ; Try up to 16 times to get login prompt
- input 10 Login: ; Wait 10 sec for it to appear
- if success break ; Got it - proceed...
- output \13 ; Send a carriage return and try again
- }
- if ( > \%i 16 ) stop 1 NO LOGIN PROMPT
- lineout \(myuserid) ; Send user ID
- input 30 assword: ; Wait for Password prompt
- if fail stop 1 NO PASSWORD PROMPT
- lineout \m(mypassword) ; Send the password.
- exec /redirect pppd ; Replace ourselves with pppd.
- In this example we assume that the script has already set up the
- myuserid and mypassword variables -- normally the password should be
- prompted for, rather than stored on disk. Notice the advantages over
- the well-known "chat script":
- * You don't have to control the modem itself with AT commands;
- Kermit's DIAL command does this for you.
- * You can have Kermit automatically redial as many times as you want
- until it gets a connection (if this is legal in your country).
- * You can have Kermit fetch the number or numbers from a dialing
- directory.
- * You can have Kermit cycle through a list of phone numbers (this is
- new in C-Kermit 7.0; see Section 2.1.16) without having to
- enter the numbers in a dialing directory.
- * Dialing is location-independent; you can use the same script to
- dial from different areas or countries.
- * Once the connection is made, the full power of Kermit's script
- language is available to manage the dialog with the terminal server
- or other device that answers the phone call.
- NOTE: PPP and SLIP dialing are not available in Windows 95/98/NT/2000,
- whose APIs do not provide a method for an application to hand over a
- connection to the PPP or SLIP driver.
- 1.24. Getting Keyword Lists with '?'
- Suppose you type "te" at the C-Kermit> 6.0 prompt and then Esc or Tab
- to request keyword completion. Kermit beeps, indicating that more than
- one command starts with "te". But if you type '?' to see what they are,
- Kermit shows only "telnet". So why the beep? Because of invisible
- keywords like "telopt", "terminal", and "text". Lots of keywords are
- invisible because they are either synonyms for other keywords or else
- esoteric options to be used only in special circumstances, so we don't
- want them cluttering up the menus.
- But then there is no way for you to discover them. So in C-Kermit 7.0,
- if you type '?' AFTER the beginning of a keyword field, then invisible
- keywords are shown too:
- C-Kermit> te<Esc><BEEP>
- C-Kermit> te? Command, one of the following:
- telnet telopt terminal text
- C-Kermit>te
- But if '?' is typed at the beginning of a field, only visible keywords
- are shown, as before (so, in this example, if '?' is typed at the
- C-Kermit> prompt, "telnet" is the only command shown that starts with
- "te").
- 2. MAKING AND USING CONNECTIONS The SET LINE, SET HOST, and SET PORT (a
- synonym for SET LINE) commands have new synonyms, in which the word SET is
- replaced by the word OPEN: OPEN LINE, etc. There is no new functionality
- here, but OPEN is a better verb, since SET generally takes no action, whereas
- these commands actually try to open a connection. Furthermore, there is the
- symmetry with CLOSE. 2.0. SET LINE and SET HOST Command SwitchesThe SET LINE
- (SET PORT) and SET HOST commands now allow switches before the device or host
- name, in most cases, and under certain circumstances, also at the end. The
- new syntax is backwards compatible with the previous syntax; thus SET LINE,
- SET PORT, and SET HOST commands in command files written for C-Kermit 6.0 or
- earlier still work. The expanded syntax is:
- { OPEN, SET } { LINE, PORT, HOST } [ switches ] device-or-address [ switches
- ]
- The first group of switches is:
- /NETWORK-TYPE:{TCP/IP,X.25,PIPE,PTY...}
- When more than one network type is available, this lets you
- specify the type of network to use for this connection without
- affecting your global SET NETWORK TYPE. See Section 2.7
- about pipes and ptys.
- /USERID:[string]
- This switch is equivalent to SET LOGIN USERID. If a string is
- given, it sent to host during Telnet negotiations; if this
- switch is given but the string is omitted, no user ID is sent to
- the host. If this switch is not given, your current LOGIN USERID
- (\v(userid) value), if any, is sent. Unlike most other switches,
- this one is "sticky", since the value must persist throughout
- the session in case the server requests the ID string at a later
- time.
- /CONNECT
- Enter CONNECT mode immediately and automatically after the
- device or connection is open. On serial devices, however, when
- CARRIER-WATCH is not OFF, wait up to 1 second for the Carrier
- Detect signal to appear before trying to connect, to give the
- device time to react DTR, which might have been off prior to
- opening the device.
- /SERVER
- Enter server mode immediately and automatically after the device
- or connection is open. Treatment of carrier is the same as for
- /CONNECT.
- /WAIT
- /NOWAIT
- For Telnet connections only: Like SET TELNET WAIT { ON, OFF },
- but applies only to this connection, and in fact applies only
- when OPENing this connection (which is usually the only place it
- matters). Typically you would use TELNET /NOWAIT to make a
- connection to a misbehaving Telnet server that does not reply to
- negotiations as required by the Telnet protocol definition.
- Note: /CONNECT and /SERVER switches are not available in the RLOGIN and
- TELNET commands, since these commands already include an implicit
- /CONNECT and preclude automatic entry into server mode.
- The /CONNECT and /SERVER switches are especially useful with "set host
- *" connections. For example, suppose you want to start a Kermit server
- on socket 3000 of your TCP host. Normally you would have to give the
- command:
- set host * 3000
- and then wait for a connection to come in, and only then could you give
- the SERVER command (or else define a macro to do this, and then execute
- the macro). Now you can do it in one step:
- set host /server * 3000
- This tells C-Kermit to wait for the connection and then enter server
- mode once it comes in, no matter how long it takes. Similarly, "set
- host /conn *" can be used to wait for a "chat" connection to come in.
- Another set of switches is available in VMS only, for use only with SET
- LINE:
- /SHARE
- Allows the SET LINE device to be opened in shared mode. Normally
- it makes no sense to open a serial device in shared mode, but
- it's necessary when C-Kermit is running in an environment such
- as DECIntact, that opens your job's controlling terminal in such
- a way that C-Kermit can't open it too, unless it enables SHARE
- privilege. Note: SHARE privilege is required.
- /NOSHARE
- Requires that the SET LINE device not be in use by any other
- process in order for it to be successfully opened by C-Kermit.
- If neither /SHARE nor /NOSHARE is specified, /NOSHARE is used.
- The second group of switches is:
- /NO-TELNET-INIT
- Do not send initial Telnet negotiations even if this is a Telnet
- port.
- /RAW-SOCKET
- This is a connection to a raw TCP socket ( Section 2.3.5).
- /RLOGIN
- Use Rlogin protocol even if this is not an Rlogin port.
- /TELNET
- Send initial Telnet negotiations even if this is not a Telnet
- port.
- As of C-Kermit 7.0 and K95 1.1.19, the TELNET command includes an
- implicit /TELNET switch. So if you TELNET to a non-TELNET port, Kermit
- sends initial Telnet negotiations. This makes sense, since that's what
- "telnet" means.
- If you want to make a connection to a non-Telnet port without sending
- initial Telnet negotiations, use:
- set host [ /connect ] name-or-address port
- or:
- telnet name-or-address port /no-telnet-init
- Additional switches might be added in the future; type "set host ?" or
- "set line ?" to see a current list.
- 2.1. Dialing
- Automatic redialing is illegal or restricted in many countries, so
- until C-Kermit 7.0, it was disabled by default, i.e. until a SET DIAL
- RETRIES command was given. In C-Kermit 7.0, if no SET DIAL RETRIES
- command has been given, a default is picked dynamically at DIAL time
- based on the calling country code, if known. At this writing, the only
- country code known to have no restrictions on automatic redialing is 1.
- So in this case a limit of 10 is chosen; otherwise 1. If you have not
- given an explicit SET DIAL RETRIES command, SHOW DIAL shows the value
- as "(auto)", and then the value actually used is shown when you give
- the DIAL command.
- As of C-Kermit 7.0, automatic redialing is automatically canceled if
- the call could not be placed because no dialtone was detected.
- 2.1.1. The Dial Result Message
- If DIAL DISPLAY is not ON, the "Call complete" message now shows the
- modem's call result message, for example:
- Dialing: ...
- Call complete: "CONNECT 31200/ARQ/V32/LAPM/V42BIS"
- The exact format and contents of this message, of course, depends on
- the make, model, and configuration of your modem, so use your modem
- manual to interpret it. The call result message is also available in
- C-Kermit's \v(dialresult) variable.
- C-Kermit> echo \v(dialresult)
- CONNECT 31200/ARQ/V32/LAPM/V42BIS
- C-Kermit> echo Speed = \fword(\v(dialresult),2)
- Speed = 31200
- C-Kermit>
- Suppose your modem reports the modulation speed as shown above and you
- want to ensure your call is completed at (say) 24000 bps or more. You
- can use a little macro to do the job:
- define HSDIAL { ; High Speed DIAL
- local \%s
- if < \v(argc) 1 if not def \v(dialnumber) end 1 Usage: \%0 number
- set dial retries 100
- set dial interval 1
- while true {
- dial \%*
- if fail end 1 DIAL failed.
- asg \%s \fword(\v(dialresult),2)
- if def \%s if numeric \%s if not < \%s 24000 break
- }
- }
- (See Section 7.5 about the \%* variable.)
- 2.1.2. Long-Distance Dialing Changes
- Due to the glut of cell phones, pagers, fax machines, ISPs, etc, area
- codes and dialing rules are changing all the time. In the North
- American Numbering Plan (NANP) countries (USA, Canada, etc), area codes
- are split or overlayed with increasing frequency, and 10- and 11-digit
- dialing is gradually becoming the norm for local calls. Changes are
- occurring In Europe, too, partly for these reasons and partly because
- of some new EC rules.
- In France, effective 18 October 1996, all calls, even local ones, must
- be dialed with an area code. French area codes are presently 1-digit
- numbers, 1-6, and the long-distance dialing prefix is 0. All calls
- within France are considered long distance and begin with 01, 02, ...,
- 06.
- Effective 1 May 1997, all calls within the US state of Maryland, even
- local ones, must be dialed with an area code but without the
- long-distance prefix -- this is the now widely-known North American
- phenomenon of "ten digit dialing". The same is happening elsewhere --
- many cities in Florida adopted 10-digit dialing in 1998.
- In Italy beginning 19 June 1998, all calls to fixed (as opposed to
- mobile) numbers must be prefixed by 0. When calling into Italy from
- outside, the 0 must follow the country code (39). Calls to cell phones,
- however, must be placed without the 0. Then on 29 December 2000, the 0
- will become a 4 (for calling fixed numbers) and a prefix of 3 must used
- for calling mobile phones. More info at:
- http://www.telecomitalia.it/npnn/.
- In Spain, effective 4 April 1998, with hard cutover on 18 July 1998,
- all calls within the country must be dialed with 9 digits, and all
- calls from outside Spain must also be dialed with 9 digits (after the
- country code, 34). The new 9-digit numbers all begin with "9". More
- info at:http://www.telefonica.es/cambiodenumeracion/
- Several new dialing features and commands have been added in version
- 6.1 and 7.0 to address these changes.
- C-Kermit 6.0 and Kermit 95 1.1.11 and earlier handle the French
- situation via a reasonable subterfuge (setting the local area code to a
- nonexistent one), but did not handle "ten-digit dialing" well at all;
- the recommended technique was to change the long-distance dialing
- prefix to nothing, but this defeated Kermit's "list numbers for one
- name" feature when the numbers were in different locations. For
- example:
- set dial ld-prefix
- dial onlineservice
- where "onlineservice" is a dialing directory entry name corresponding
- to entries that are in (say) Maryland as well as other states, would
- not correctly dial the numbers not in Maryland.
- A new command lets you specify a list of area codes to be considered
- local, except that the area code must be dialed:
- SET DIAL LC-AREA-CODES [ areacode [ areacode [ areacode [ ... ] ] ] ]
- The list may include up to 32 area codes. If a number is called
- whose area code is in this list, it is dialed WITHOUT the
- long-distance prefix, but WITH the area code.
- So in Maryland, which (last time we looked) has two area codes, 410 and
- 301, the setup would be:
- SET DIAL LC-AREA-CODES 410 301
- Example:
- SET DIAL LD-PREFIX 1
- SET DIAL AREA-CODE 301
- SET DIAL LC-AREA-CODES 410 301 <-- Area codes in 10-digit dialing region
- DIAL +1 (301) 765-4321 <-- Dials 3017654321 (local with area code)
- DIAL +1 (410) 765-4321 <-- Dials 4107654321 (local with area code)
- DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance)
- The SET DIAL LC-AREA-CODES command does not replace the SET DIAL
- AREA-CODE command. The latter specifies the area code you are dialing
- from. If the called number is in the same area code, then the area code
- is dialed if it is also in the LC-AREA-CODES list, and it is not dialed
- otherwise. So if "301" had not appeared in the LC-AREA-CODES list in
- the previous example:
- SET DIAL LD-PREFIX 1
- SET DIAL AREA-CODE 301
- SET DIAL LC-AREA-CODES 410 <-- Area codes in 10-digit dialing region
- DIAL +1 (301) 765-4321 <-- Dials 7654321 (local)
- DIAL +1 (410) 765-4321 <-- Dials 4107654321 (local with area code)
- DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance)
- The new Kermit versions also add a Local Call Prefix and Local Call
- Suffix, in case you have any need for it. These are added to the
- beginning and of local phone numbers (i.e. numbers that are not
- long-distance or international). Examples:
- SET DIAL LD-PREFIX 1
- SET DIAL LC-PREFIX 9
- SET DIAL LC-SUFFIX *
- SET DIAL LC-AREA-CODES 410 <-- Area codes in 10-digit dialing region
- SET DIAL AREA-CODE 301
- DIAL +1 (301) 765-4321 <-- Dials 97654321* (local)
- DIAL +1 (410) 765-4321 <-- Dials 94107654321* (local with area code)
- DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance)
- 2.1.3. Forcing Long-Distance Dialing
- Suppose a number is in your country and area, but for some reason you
- need to dial it long-distance anyway (as is always the case in France).
- There have always been various ways to handle this:
- 1. Temporarily set your area code to a different (or nonexistent or
- impossible) one (but this required knowledge of which area codes
- were nonexistent or impossible in each country).
- 2. Dial the number literally instead of using the portable format, but
- this defeats the purpose of the portable dialing directory.
- Now there is also a new command that, very simply, can force
- long-distance dialing:
- SET DIAL FORCE-LONG-DISTANCE { ON, OFF }
- If a call is placed to a portable phone number within the same
- country code as the calling number, it is dialed with the
- long-distance prefix and the area code if FORCE-LONG-DISTANCE is
- ON. If OFF, the regular rules and procedures apply.
- Example (France):
- SET DIAL COUNTRY-CODE 33
- SET DIAL AREA-CODE 6
- SET DIAL FORCE-LONG-DISTANCE ON
- (In fact, SET DIAL COUNTRY-CODE 33 automatically sets DIAL
- FORCE-LONG-DISTANCE ON...)
- Example (USA, for a certain type of reverse-charge calling in which the
- called number must always be fully specified):
- SET DIAL PREFIX 18002666328$ ; 1-800-COLLECT
- SET DIAL COUNTRY-CODE 1
- SET DIAL AREA-CODE 212
- SET DIAL FORCE-LONG-DISTANCE ON
- Example (Toronto, where calls to exchange 976 within area code 416 must
- be dialed as long distance, even when you are dialing from area code
- 416):
- SET DIAL COUNTRY-CODE 1
- SET DIAL AREA-CODE 416
- SET DIAL FORCE-LONG-DISTANCE ON
- DIAL +1 (416) 976-xxxx
- If dialing methods were consistent and sensible, of course it would be
- possible to always dial every domestic call as if it were long
- distance. But in many locations this doesn't work or if it does, it
- costs extra. The following macro can be used for dialing any given
- number with forced long-distance format:
- define LDIAL {
- local \%x
- set dial force-long-distance on
- dial \%*
- asg \%x \v(success)
- set dial force-long-distance off
- end \%x
- }
- (See Section 7.5 about the \%* variable.)
- 2.1.4. Exchange-Specific Dialing Decisions
- This applies mainly to the North American Numbering Plan (NANP). Refer
- to the section "Alternative notations" inUsing C-Kermit 2nd
- Edition, pages 106-107, and the story about Toronto on page 110. Using
- the new LC-AREA-CODES list, we can address the problem by treating the
- exchange as part of the area code:
- SET DIAL LD-PREFIX 1
- SET DIAL AREA-CODE 416
- SET DIAL LC-AREA-CODES 905276
- DIAL +1 416 765 4321 <-- 7654321 (local)
- DIAL +1 905 276 4321 <-- 9052764321 (local with area code)
- DIAL +1 905 528 4321 <-- 19055284321 (long distance)
- The same technique can be used in Massachusetts (story at top of page
- 111) and in any other place where dialing to some exchanges within a
- particular area code is local, but to others in the same area code is
- long distance.
- 2.1.5. Cautions about Cheapest-First Dialing
- Kermit does not maintain a knowledge base of telephony information; it
- only provides the tools to let you enter a phone number in a standard
- format and dial it correctly from any location in most cases.
- In particular, Kermit does not differentiate the charging method from
- the dialing method. If a call that is DIALED as long-distance (e.g.
- from 212 to 718 in country code 1) is not CHARGED as long distance, we
- have no way of knowing that without keeping a matrix of charging
- information for every area-code combination within every country, and
- any such matrix would be obsolete five minutes after it was
- constructed. Thus, "cheapest-first" sorting is only as reliable as our
- assumption that the charging method follows the dialing method. A good
- illustration would be certain online services that have toll-free
- dialup numbers which they charge you a premium (in your online service
- bill) for using.
- 2.1.6. Blind Dialing (Dialing with No Dialtone)
- C-Kermit's init string for Hayes-like modems generally includes an X4
- command to enable as many result codes as possible, so that Kermit can
- react appropriately to different failure reasons. One of the result
- codes that X4 enables is "NO DIALTONE". A perhaps not obvious side
- effect of enabling this result code that the modem must hear dialtone
- before it will dial.
- It is becoming increasingly necessary to force a modem to dial even
- though it does not hear a dialtone on the phone line; for example, with
- PBXs that have strange dialtones, or with phone systems in different
- countries, or with ISDN phones, etc. This is called "blind dialing".
- C-Kermit 7.0 has two new commands to cope with this situation:
- SET DIAL IGNORE-DIALTONE { ON, OFF }
- OFF (the default) means to tell the modem to wait for dialtone
- before dialing. ON means to enable "blind dialing", i.e. tell
- the modem NOT to wait for dialtone before dialing. Generally
- this is accomplished by sending ATX3 to the modem just prior to
- dialing. SET MODEM TYPE xxx and then SHOW MODEM displays
- Kermit's built-in "ignore dialtone" command.
- SET DIAL COMMAND IGNORE-DIALTONE text
- This lets you change the built-in ignore-dialtone command (such
- as ATX3) to whatever you choose, in case the built-in one does
- not work, or another command works better.
- Notes:
- 1. The ignore-dialtone command is not sent unless SET DIAL
- IGNORE-DIALTONE is ON.
- 2. The ATX3 command generally disables not only NO DIALTONE, but also
- BUSY. So this will prevent Kermit from detecting when the line is
- busy. This is a property of the modem, not of Kermit.
- 2.1.7. Trimming the Dialing Dialog
- The command:
- SET MODEM COMMAND action [ command ]
- is used to override Kermit's built-in modem commands for each action,
- for each kind of modem in its internal database. If you include a
- command, this is used instead of the built-in one. If you omit the
- command, this restores the original built-in command.
- If you want to omit the command altogether, so Kermit doesn't send the
- command at all, or wait for a response, use:
- SET MODEM COMMAND action {}
- That is, specify a pair of empty braces as the command, for example:
- SET MODEM COMMAND ERROR-CORRECTION ON {}
- 2.1.8. Controlling the Dialing Speed
- The rate at which characters are sent to the modem during dialing is
- normally controlled by the built-in modem database. You might want to
- override this if Kermit seems to be dialing too slowly, or it is
- sending characters to the modem faster than the modem handle them. A
- new command was added for this in C-Kermit 7.0:
- SET DIAL PACING number
- Specifies the number of milliseconds (thousandths of seconds) to
- pause between each character when sending commands to the modem
- during DIAL or ANSWER command execution. 0 means no pause at
- all, -1 (the default) or any other negative number means to use
- the value from the database. Any number greater than 0 is the
- number of milliseconds to pause.
- HINT: You might also need to control the rate at which the modem
- generates Touch Tones during dialing, for example when sending a
- numeric page. There are two ways to do this. One way is to insert pause
- characters into the dialing string. For modems that use the AT command
- set, the pause character is comma (,) and causes a 2-second pause. On
- most modems, you can use the S8 register to change the pause interval
- caused by comma in the dialing string. The other way is to set your
- modem's tone generation interval, if it has a command for that. Most
- AT-command-set modems use S11 for this; the value is in milliseconds.
- For example on USR modems:
- ATS11=200
- selects an interval of 200 milliseconds to separate each dialing tone.
- Hint: To add S-Register settings or other commands to your dialing
- procedure, use the new SET MODEM COMMAND PREDIAL-INIT command
- ( Section 2.2.2).
- 2.1.9. Pretesting Phone Number Conversions
- The LOOKUP command now accepts telephone numbers as well as
- directory-entry names, for example:
- LOOKUP +1 (212) 7654321
- When given a phone number, LOOKUP prints the result of converting the
- phone number for dialing under the current dialing rules. For example,
- if my country code is 1 and my area code is 212, and I am dialing out
- from a PBX whose outside-line prefix is "93,":
- C-Kermit> lookup +1 (212) 7654321
- +1 (212) 7654321 => 93,7654321
- C-Kermit>
- You can also use the \fdialconvert(phone-number) function (Section
- 2.1.11) to do this programmatically:
- C-Kermit> echo "\fdialconvert(+1 (212) 7654321)"
- "93,7654321"
- C-Kermit>
- So the new LOOKUP behaves as follows:
- LOOKUP portable-format-phone-number
- Displays how the number would actually be dialed Sets FAILURE if
- there was a conversion error, otherwise SUCCESS.
- LOOKUP literal-format-phone-number
- Displays the same literal-format-phone-number Always sets
- SUCCESS.
- LOOKUP dialing-directory-name
- Displays all matching entries and converts portable phone
- numbers. Sets SUCCESS if at least one entry was found, otherwise
- FAILURE.
- LOOKUP =anything
- Displays "=anything" and sets SUCCESS.
- There is, at present, no programmatic way to fetch numbers from the
- dialing directory. This will be considered for a future release.
- 2.1.10. Greater Control over Partial Dialing
- The following rules now apply to partial dialing:
- * Phone number transformations based on country and area code,
- application of prefixes, etc, are performed only on the first
- PDIAL.
- * Each PDIAL argument is looked up in the dialing directory, so it is
- possible have directory entries for pieces of phone numbers or
- other information.
- * Suffixes are not applied automatically, since there is no way for
- C-Kermit to know in which PDIAL segment you want them to be
- applied.
- However, the suffix that *would* have been applied, based on the
- dialing rules that were invoked when processing the first PDIAL
- command, is stored in the variable:
- \v(dialsuffix)
- which you can include in any subsequent PDIAL or DIAL commands.
- Example:
- pdial {\m(my_long_distance_pager_number_part_1)}
- pdial {\m(my_long_distance_pager_number_part_2)}
- pdial {\v(dialsuffix)}
- pdial {\m(my_long_distance_pager_number_part_3)}
- pdial {@\m(numeric_pager_code)#}
- 2.1.11. New DIAL-related Variables and Functions
- \fdialconvert(s)
- s is a phone number in either literal or portable format (not a
- dialing directory entry name). The function returns the dial
- string that would actually be used by the DIAL command when
- dialing from the current location, after processing country
- code, area code, and other SET DIAL values, and should be the
- same as the result of LOOKUP when given a telephone number.
- \v(dialsuffix)
- Contains the suffix, if any, that was applied in the most recent
- DIAL command, or the suffix that would have been applied in the
- most recent PDIAL command. Use this variable to send the dial
- suffix at any desired point in a PDIAL sequence.
- \v(dialtype)
- A number indicating the type of call that was most recently
- placed. Can be used after a normal DIAL command, or after the
- first PDIAL command in a PDIAL sequence. Values are:
- -2: Unknown because TAPI handled the phone number translation.
- -1: Unknown because some kind of error occurred.
- 0: Internal within PBX.
- 1: Toll-free.
- 2: Local within calling area.
- 3: Unknown (e.g. because a literal-format phone number was given).
- 4: Long distance within country.
- 5: International
- \v(dialcount)
- The current value of the DIAL retry counter, for use in a DIAL
- macro ( Section 2.1.13).
- \v(d$px)
- PBX Exchange (see Section 2.1.12).
- Other dial-related variables, already documented inUsing C-Kermit
- (or other sections of this document, e.g. Section 2.1.1), include
- \v(dialnumber), \v(dialstatus), etc. A convenient way to display all of
- them is:
- show variable dial ; hint: abbreviate "sho var dial"
- This shows the values of all the variables whose names start with
- "dial". Also "show variable d$" (to show the \v(d$...) variables).
- 2.1.12. Increased Flexibility of PBX Dialing
- Refer toUsing C-Kermit, 2nd Edition, pages 107-108. Recall that
- three commands are needed to configure C-Kermit for dialing from a PBX:
- SET DIAL PBX-EXCHANGE number
- SET DIAL PBX-INSIDE-PREFIX number
- SET DIAL PBX-OUTSIDE-PREFIX number
- Unfortunately, this model does not accommodate PBXs that have more than
- one exchange. For example our PBX at Columbia University (which must
- handle more than 10,000 phones) has 853-xxxx and 854-xxxx exchanges.
- Beginning in C-Kermit 7.0, the SET DIAL PBX-EXCHANGE command accepts a
- list of exchanges, e.g.:
- SET DIAL PBX-EXCHANGE 853 854
- (multiple exchanges are separated by spaces, not commas).
- So now when dialing a portable-format number that has the same country
- and area codes as those of your dialing location, C-Kermit compares the
- exchange of the dialed number with each number in the PBX Exchange list
- (rather than with a single PBX Exchange number, as it did formerly) to
- determine whether this is an internal PBX number or an external call.
- If it is an external call, then the PBX Outside Prefix is applied, and
- then the normal dialing rules for local or long-distance calls.
- If it is an inside call, the exchange is replaced by the PBX Inside
- Prefix. But if the PBX has more than one exchange, a single fixed PBX
- Inside Prefix is probably not sufficient. For example, at Columbia
- University, we must dial 3-xxxx for an internal call to 853-xxxx, but
- 4-xxxx for a call to 854-xxxx. That is, the inside prefix is the final
- digit of the exchange we are dialing. For this reason, C-Kermit 7.0
- provides a method to determine the inside prefix dynamically at dialing
- time, consisting of a new variable and new syntax for the SET DIAL
- PBX-INSIDE-PREFIX command:
- \v(d$px)
- This variable contains the exchange that was matched when a PBX
- internal call was detected. For example, if the PBX exchange
- list is "853 854" and a call is placed to +1 (212) 854-9999,
- \v(d$px) is set to 854.
- SET DIAL PBX-INSIDE-PREFIX \fxxx(...)
- If the PBX Inside Prefix is defined to be a function, its
- evaluation is deferred until dialing time. Normally, this would
- be a string function having \v(d$px) as an operand. Of course,
- you can still specify a constant string, as before.
- So given the following setup:
- SET DIAL COUNTRY-CODE 1
- SET DIAL AREA-CODE 212
- SET DIAL PBX-OUTSIDE-PREFIX 93,
- SET DIAL PBX-EXCHANGE 853 854
- SET DIAL PBX-INSIDE-PREFIX \fright(\v(d$px),1)
- The following numbers give the results indicated:
- Number Result
- +1 (212) 854-9876 4-9876
- +1 (212) 853-1234 3-1234
- +1 (212) 765-4321 93,765-4321
- +1 (333) 765-4321 93,1333765-4321
- Furthermore, the K_PBX_XCH environment variable may now be set to a
- list of exchanges to automatically initialize C-Kermit's PBX exchange
- list, for example (in UNIX ksh or bash):
- export K_PBX_XCH="853 854"
- (Quotes required because of the space.) Of course, this variable can
- also be set to a single exchange, as before:
- export K_PBX_XCH=853
- 2.1.13. The DIAL macro - Last-Minute Phone Number Conversions
- After a DIAL or LOOKUP command is given, a list of phone numbers is
- assembled from the dialing directory (if any), with all
- location-dependent conversion rules applied as described in Chapter 5
- ofUsing C-Kermit.
- However, additional conversions might still be required at the last
- minute based on local or ephemeral conditions. So that you can have the
- final word on the exact format of the dial string, C-Kermit 7.0 lets
- you pass the converted string through a macro of your own design for
- final processing before dialing. The relevant command is:
- SET DIAL MACRO [ name ]
- Specifies the name of a macro to be run on each phone number
- after all built-in conversions have been applied, just before
- the number is dialed. If no name is given, no macro is run. The
- phone number, as it would have been dialed if there were no dial
- macro, is passed to the macro.
- The dial macro can do anything at all (except start a file transfer).
- However, the normal use for the macro would be to modify the phone
- number. For this reason the phone number is passed to the macro as
- argument number 1 (\%1). To cause a modified number to be dialed, the
- macro should terminate with a RETURN statement specifying a return
- value. To leave the number alone, the macro should simply end. Example:
- define xxx return 10108889999$\%1
- set dial macro xxx
- dial xyzcorp
- This defines a DIAL MACRO called xxx, which puts an access code on the
- front of the number. Another example might be:
- def xxx if equal "\v(modem)" "hayes-1200" return \freplace(\%1,$,{,,,,,})
- set dial macro xxx
- dial xyzcorp
- which replaces any dollar-sign in the dial string by a series of five
- commas, e.g. because this particular modem does not support the "wait
- for bong" feature (remember that commas that are to be included
- literally in function arguments must be enclosed in braces to
- distinguish them from the commas that separate the arguments) and when
- the IF condition is not satisfied, the macro does not return a value,
- and so the number is not modified. Then when a DIAL command is given
- referencing a dialing directory entry, "xyzcorp". The macro is
- automatically applied to each matching number.
- Numerous dial-, modem-, communications-, and time-related variables are
- available for decision making your dial macro. Type SHOW VARIABLES for
- a list. Of particular interest is the \v(dialcount) variable, which
- tells how many times the DIAL command gone through its retry loop: 1 on
- the first try, 2 on the second, 3 on the third, and so on, and the
- \v(dialresult) and \v(dialstatus) variables.
- Here are some other applications for the DIAL MACRO (from users):
- * Phone numbers in the dialing directory are formatted with '-' for
- readability, but some modems don't like the hyphens, so the DIAL
- macro is used to remove them before dialing; e.g 0090-123-456-78-99
- becomes 00901234567899: "def xxx return \freplace(\%1,-)".
- * To set some specific modem (or other) options depending on the
- called customer or telephone number.
- * Choosing the most appropriate provider based on (e.g.) time of day,
- or cycling through a list of providers in case some providers might
- be busy.
- To illustrate the final item, suppose you have a choice among many
- phone service providers; the provider is chosen by dialing an access
- code before the number. Different providers might be better (e.g.
- cheaper) for certain times of day or days of the week, or for dialing
- certain locations; you can use the DIAL macro to add the access for the
- most desirable provider.
- Similarly, when the same number might be reached through multiple
- providers, it's possible that one provider might not be able to
- complete the call, but another one can. In that case, you can use the
- DIAL macro to switch providers each time through the DIAL loop --
- that's where the \v(dialcount) variable comes in handy.
- The following command can be used to debug the DIAL macro:
- SET DIAL TEST { ON, OFF }
- Normally OFF, so the DIAL command actually dials. When ON, the
- DIAL command performs all lookups and number conversions, and
- then goes through the number list and retry loop, but instead of
- actually dialing, lists the numbers it would have called if none
- of the DIAL attempts succeeded (or more precisely, every number
- was always busy).
- 2.1.14. Automatic Tone/Pulse Dialing Selection
- SET DIAL METHOD { AUTO, DEFAULT, PULSE, TONE }
- Chooses the dialing method for subsequent calls.
- Prior to version 7.0, C-Kermit's DIAL METHOD was DEFAULT by default,
- meaning it does not specify a dialing method to the modem, but relies
- on the modem to have an appropriate default dialing method set. So, for
- example, when using Hayes compatible modems, the dial string would be
- something like ATD7654321, rather than ATDT7654321 or ATDP7654321.
- In C-Kermit 7.0 and K95 1.1.19, the dial method can be set from the
- environment variable:
- K_DIAL_METHOD
- when Kermit starts. The values can be TONE, PULSE, or DEFAULT, e.g.
- (UNIX):
- set K_DIAL_METHOD=TONE; export K_DIAL_METHOD
- In the absence of a K_DIAL_METHOD definition, the new default SET DIAL
- METHOD is AUTO rather than DEFAULT. When DIAL METHOD is AUTO and the
- local country code is known, then if tone dialing is universally
- available in the corresponding area, tone dialing is used; if dialing
- from a location where pulse dialing is mandatory, pulse dialing is
- used.
- The "tone country" and "pulse country" lists are preloaded according to
- our knowledge at the time of release. You can see their contents in the
- SHOW DIAL listing. You can change the lists with:
- SET DIAL TONE-COUNTRIES [ cc [ cc [ ... ] ] ]
- Replaces the current TONE-COUNTRIES list with the one given.
- Each cc is a country code; separate them with spaces (not
- commas). Example:
- set dial tone-countries 1 358 44 46 49
- If no country codes are given, the current list, if any, is
- removed, in which case SET DIAL METHOD AUTO is equivalent to SET
- DIAL METHOD DEFAULT.
- SET DIAL PULSE-COUNTRIES [ cc [ cc [ ... ] ] ]
- Replaces the current PULSE-COUNTRIES list with the one give.
- Syntax and operation is like SET DIAL TONE-COUNTRIES.
- If the same country code appears in both lists, Pulse takes precedence.
- The SET DIAL TONE- and PULSE-COUNTRIES commands perform no verification
- whatsoever on the cc's, since almost any syntax might be legal in some
- settings. Furthermore, there is no facility to edit the lists; you can
- only replace the whole list. However, since the only purpose of these
- lists is to establish a basis for picking tone or pulse dialing
- automatically, all you need to override the effect of the list is to
- set a specific dialing method with SET DIAL METHOD TONE or SET DIAL
- METHOD PULSE.
- 2.1.15. Dial-Modifier Variables
- As of C-Kermit 7.0, dial modifiers are available in the following
- variables:
- \v(dm_lp) Long pause
- \v(dm_sp) Short pause
- \v(dm_pd) Pulse dial
- \v(dm_td) Tone dial
- \v(dm_wa) Wait for answer
- \v(dm_wd) Wait for dialtone
- \v(dm_rc) Return to command mode
- You can use these in your dial strings in place of hardwired modifiers
- like "@", ",", etc, for increased portability of scripts. Example:
- C-Kermit>set modem type usrobotics
- C-Kermit>sho variables dm
- \v(dm_lp) = ,
- \v(dm_sp) = /
- \v(dm_pd) = P
- \v(dm_td) = T
- \v(dm_wa) = @
- \v(dm_wd) = W
- \v(dm_rc) = ;
- C-Kermit>exit
- 2.1.16. Giving Multiple Numbers to the DIAL Command
- Prior to C-Kermit 7.0, the only way to give a DIAL command a list of
- phone numbers to try until one answers was to create a dialing
- directory that had multiple entries under the same name, and then use
- that entry name in the DIAL command. Now a list of numbers can be given
- to the DIAL command directly in the following format:
- dial {{number1}{number2}{number3}...}
- This is the same list format used by SEND /EXCEPT: and other commands
- that allow a list where normally a single item is given. Restrictions
- on this form of the DIAL command are:
- * The first two braces must be adjacent; spacing is optional
- thereafter.
- * Each number must be an actual number to dial, not a dialing
- directory entry.
- * Dialing directory entries may not contain number lists in this
- format.
- In all other respects, the numbers are treated as if they had been
- fetched from the dialing directory; they can be in literal or portable
- format, etc. Example:
- dial {{7654321} {+1 (212) 5551212} { 1-212-5556789 }}
- The list can be any length at all, within reason.
- This feature is especially handy for use with the K95 Dialer, allowing
- a list of phone numbers to be specified in the Telephone Number box
- without having to set up or reference a separate dialing directory.
- You can also use it to add commonly-dialed sequences as variables in
- your C-Kermit customization file, e.g.:
- define work {{7654321}{7654322}{7654323}}
- and then:
- dial {\m(work)}
- (the variable name must be enclosed in braces).
- Or more simply:
- define work dial {{7654321}{7654322}{7654323}}
- and then:
- work
- 2.2. Modems
- 2.2.1. New Modem Types
- Since C-Kermit 6.0:
- atlas-newcom-33600ifxC Atlas/Newcom 33600
- att-keepintouch AT&T KeepinTouch PCMCIA V.32bis Card Modem
- att-1900-stu-iii AT&T Secure Data STU-III Model 1900
- att-1910-stu-iii AT&T Secure Data STU-III Model 1910
- bestdata Best Data
- cardinal Cardinal V.34 MVP288X series.
- compaq Compaq Data+Fax (e.g. in Presario)
- fujitsu Fujitsu Fax/Modem Adapter
- generic-high-speed Any modern error-correcting data-compressing modem
- itu-t-v25ter/v250 ITU-T (CCITT) V.25ter (V.250) standard command set
- megahertz-att-v34 Megahertz AT&T V.34
- megahertz-xjack Megahertz X-Jack
- motorola-codex Motorola Codex 326X Series
- motorola-montana Motorola Montana
- mt5634zpx Multitech MT5634ZPX
- rockwell-v90 Rockwell V.90 56K
- rolm-244pc Siemens/Rolm 244PC (AT command set)
- rolm-600-series Siemens/Rolm 600 Series (AT command set)
- spirit-ii QuickComm Spirit II
- suprasonic SupraSonic V288+
- supra-express-v90 Supra Express V.90
- One of the new types, "generic-high-speed" needs a bit of explanation.
- This type was added to easily handle other types that are not
- explicitly covered, without going through the bother of adding a
- complete user-defined modem type. This one works for modern modems that
- use the AT command set, on the assumption that all the default
- ("factory") settings of the modem (a) are appropriate for Kermit, (b)
- include error correction, data compression, and speed buffering; and
- (c) are recallable with the command AT&F.
- If the command to recall your modem's profile is not AT&F, use the SET
- MODEM COMMAND INIT-STRING command to specify the appropriate modem
- command. The default init-string is AT&F\13 (that is, AT, ampersand, F,
- and then carriage return); a survey of about 20 modern modem types
- shows they all support this, but they might mean different things by
- it. For example, the USR Sportster or Courier needs AT&F1 (not AT&F,
- which is equivalent to AT&F0, which recalls an inappropriate profile),
- so for USR modems:
- set modem type generic-high-speed
- set modem command init AT&F1\13
- Of course, USR modems already have their own built-in modem type. But
- if you use this one instead, it will dial faster because it has fewer
- commands to give to the modem; in that sense "&F1" is like a macro that
- bundles numerous commands into a single one. See your modem manual for
- details about factory profiles and commands to recall them.
- WARNING: Do not use the generic-high-speed modem type in operating
- systems like VMS where hardware flow control is not available, at least
- not unless you change the init string from AT&F\13 to something else
- that enables local Xon/Xoff or other appropriate type of flow control.
- Also see Section 2.1.7 for additional hints about making dialing
- go faster.
- 2.2.2. New Modem Controls
- SET MODEM CAPABILITIES list
- In C-Kermit 7.0, this command automatically turns MODEM
- SPEED-MATCHING OFF if SB (Speed Buffering) is in the list, and
- turns it ON if SB is absent.
- SET MODEM COMMAND PREDIAL-INIT [ text ]
- Commands to be sent to the modem just prior to dialing. Normally
- none.
- SET MODEM SPEAKER { ON, OFF }
- Determines whether modem speaker is on or off while call is
- being placed. ON by default. Note: This command does not provide
- fine-grained control over when the speaker is on or off.
- Normally, ON means while the call is being placed, until the
- point at which carrier is successfully established. If your
- modem has a different speaker option that you want to choose,
- then use the SET MODEM COMMAND SPEAKER ON text command to
- specify this option.
- SET MODEM COMMAND SPEAKER { ON, OFF } [ text ]
- Specify or override the commands to turn your modem's speaker on
- and off.
- SET MODEM VOLUME { LOW, MEDIUM, HIGH }
- When MODEM SPEAKER is on, select volume. Note: In some modems,
- especially internal ones, these commands have no effect; this is
- a limitation of the particular modem, not of Kermit.
- SET MODEM COMMAND VOLUME { LOW, MEDIUM, HIGH } [ text ]
- Specify or override the commands to set your modem's speaker
- volume.
- SET MODEM COMMAND IGNORE-DIALTONE [ text ]
- The command to enable blind dialing ( Section 2.1.6).
- SET MODEM ESCAPE-CHARACTER code
- Has been augmented to allow codes of 0 or less: < 0 means the
- escape mechanism is disabled. = 0 means to use (restore) the
- default value from the modem database. > 0 and < 128 is a
- literal value to be used instead of the default one. > 127 means
- the escape mechanism is disabled. This affects "modem hangup".
- When the escape mechanism is disabled, but SET MODEM
- HANGUP-METHOD is MODEM-COMMAND, it sends the hangup command
- immediately, without the <pause>+++<pause> business first. This
- is useful (for example) when sending lots of numeric pages, a
- process in which never we go online, and so never need to escape
- back. Eliminating the unnecessary pauses and escape sequence
- allows a lot more pages to be sent per unit time.
- Recall that C-Kermit can dial modems to which it is connected via
- TCP/IP (Telnet or Rlogin) as described on page 126 ofUsing
- C-Kermit, 2nd Ed. In this case the MODEM HANGUP-METHOD should be
- MODEM-COMMAND, since RS-232 signals don't work over TCP/IP connections.
- As noted in the manual, such connections are set up by the following
- sequence:
- set host host [ port ]
- set modem type name
- dial number
- But this can cause complications when you use Kermit to switch between
- serial and TCP/IP connections. In the following sequence:
- set host name
- set modem type name
- set port name
- the first two commands obey the rules for dialing out over Telnet.
- However, the SET PORT command requires that Kermit close its current
- (Telnet) connection before it can open the serial port (since Kermit
- can only have one connection open at a time). But since a modem type
- was set after the "set host" command was given, Kermit assumes it is a
- Telnet dialout connection and so sends the modem's hangup sequence is
- sent to the Telnet host. To avoid this, close the network connection
- explicitly before opening the serial one:
- set host name
- close
- set modem type name
- set port name
- 2.3. TELNET and RLOGIN
- For additional background, please also read theTELNET.TXT file,
- also available on the Web inHTML format.
- Cautions:
- * If making a Telnet connection with C-Kermit takes a very long time,
- like over a minute, whereas the system Telnet program makes the
- same connection immediately, try including the /NOWAIT switch:
- C-Kermit> telnet /nowait hostname
- SeeTELNET.TXT orTELNET.HTM for details. If it also
- takes a very long time to make a Telnet connection with system
- Telnet, then the delay is most likely caused by reverse DNS lookups
- when your host is not properly registered in DNS.
- * When supplying numeric IP addresses to C-Kermit or to any other
- application (regular Telnet, Rlogin, etc), do not include leading
- 0's in any fields unless you intend for those fields to be
- interpreted as octal (or hex) numbers. The description of the
- Internet address interpreter (the sockets library inet_addr()
- routine) includes these words:
- All numbers supplied as "parts" in a "." notation may be decimal,
- octal, or hexadecimal, as specified in the C language (that is, a
- leading 0x or 0X implies hexadecimal; otherwise, a leading 0 implies
- octal; otherwise, the number is interpreted as decimal).
- To illustrate, 128.59.39.2 and 128.059.039.002 are not the same
- host! Even though most of the fields contain non-octal digits.
- Using system Telnet (not Kermit):
- $ telnet 128.059.039.002
- Trying 128.49.33.2 ...
- Of course the same thing happens with Kermit because it uses (as it
- must) the same system service for resolving network addresses that
- Telnet, FTP, and all other TCP/IP applications use.
- * The RLOGIN section on page 123 does not make it clear that you can
- use the SET TELNET TERMINAL-TYPE command to govern the terminal
- type that is reported by C-Kermit to the RLOGIN server.
- * Note that the SET TCP commands described on pages 122-123 might be
- absent; some platforms that support TCP/IP do not support these
- particular controls.
- New commands:
- TELOPT { AO, AYT, BREAK, CANCEL, EC, EL, EOF, EOR, GA, IP, DMARK,
- DO, DONT, NOP, SB, SE, SUSP, WILL, WONT }
- This command was available previously, but supported only DO,
- DONT, WILL, and WONT. Now it lets you send all the Telnet
- protocol commands. Note that certain commands do not require a
- response, and therefore can be used as nondestructive "probes"
- to see if the Telnet session is still open; e.g.:
- set host xyzcorp.com
- ...
- telopt nop
- if fail stop 1 Connection lost
- SET TCP ADDRESS [ ip-address ]
- Specifies the IP address of the computer that C-Kermit is
- running on. Normally this is not necessary. The exception would
- be if your machine has multiple network adapters (physical or
- virtual) with a different address for each adapter AND you want
- C-Kermit to use a specific address when making outgoing
- connections or accepting incoming connections.
- SET TCP DNS-SERVICE-RECORDS { ON, OFF }
- Tells C-Kermit whether to try to use DNS SRV records to
- determine the host and port number upon which to find an
- advertised service. For example, if a host wants regular Telnet
- connections redirected to some port other than 23, this feature
- allows C-Kermit to ask the host which port it should use. Since
- not all domain servers are set up to answer such requests, this
- feature is OFF by default.
- SET TCP REVERSE-DNS-LOOKUP { ON, OFF, AUTO }
- Tells Kermit whether to perform a reverse DNS lookup on TCP/IP
- connections. This allows Kermit to determine the actual hostname
- of the host it is connected to, which is useful for connections
- to host pools, and is required for Kerberos connections to host
- pools and for incoming connections. If the other host does not
- have a DNS entry, the reverse lookup could take a long time
- (minutes) to fail, but the connection will still be made. Turn
- this option OFF for speedier connections if you do not need to
- know exactly which host you are connected to and you are not
- using Kerberos. AUTO, the default, means the lookup is done on
- hostnames, but not on numeric IP addresses.
- SET TELNET WAIT-FOR-NEGOTIATIONS { ON, OFF }
- Each Telnet option must be fully negotiated either On or Off
- before the session can continue. This is especially true with
- options that require sub-negotiations such as Authentication,
- Encryption, and Kermit; for proper support of these options
- Kermit must wait for the negotiations to complete. Of course,
- Kermit has no way of knowing whether a reply is delayed or not
- coming at all, and so will wait a minute or more for required
- replies before continuing the session. If you know that Kermit's
- Telnet partner will not be sending the required replies, you can
- set this option of OFF to avoid the long timeouts. Or you can
- instruct Kermit to REFUSE specific options with the SET TELOPT
- command.
- SET TELOPT [ { /CLIENT, /SERVER } ] option
- { ACCEPTED, REFUSED, REQUESTED, REQUIRED }
- [ { ACCEPTED, REFUSED, REQUESTED, REQUIRED } ]
- SET TELOPT lets you specify policy requirements for Kermit's
- handling of Telnet option negotiations. Setting an option is
- REQUIRED causes Kermit to offer the option to the peer and
- disconnect if the option is refused. REQUESTED causes Kermit to
- offer an option to the peer. ACCEPTED results in no offer but
- Kermit will attempt to negotiate the option if it is requested.
- REFUSED instructs Kermit to refuse the option if it is requested
- by the peer.
- Some options are negotiated in two directions and accept
- separate policies for each direction; the first keyword applies
- to Kermit itself, the second applies to Kermit's Telnet partner;
- if the second keyword is omitted, an appropriate
- (option-specific) default is applied. You can also include a
- /CLIENT or /SERVER switch to indicate whether the given policies
- apply when Kermit is the Telnet client or the Telnet server; if
- no switch is given, the command applies to the client.
- Note that some of Kermit's Telnet partners fail to refuse
- options that they do not recognize and instead do not respond at
- all. In this case it is possible to use SET TELOPT to instruct
- Kermit to REFUSE the option before connecting to the problem
- host, thus skipping the problematic negotiation.
- Use SHOW TELOPT to view current Telnet Option negotiation
- settings. SHOW TELNET displays current Telnet settings.
- 2.3.0. Bug Fixes
- If "set host nonexistent-host" was given (and it properly failed),
- followed by certain commands like SEND, the original line and modem
- type were not restored and C-Kermit thought that it still had a network
- hostname; fixed in 7.0.
- 2.3.1. Telnet Binary Mode Bug Adjustments
- SET TELNET BUG BINARY-ME-MEANS-U-TOO { ON, OFF } was added to edit 192
- after the book was printed. Also SET TELNET BUG BINARY-U-MEANS-ME-TOO.
- The default for both is OFF. ON should be used when communicating with
- a Telnet partner (client or server) that mistakenly believes that
- telling C-Kermit to enter Telnet binary mode also means that it, too,
- is in binary mode, contrary to the Telnet specification, which says
- that binary mode must be negotiated in each direction separately.
- 2.3.2. VMS UCX Telnet Port Bug Adjustment
- A new command, SET TCP UCX-PORT-BUG, was added for VMS versions with
- UCX (DEC TCP/IP), applying only to early versions of UCX, like 2.2 or
- earlier. If you try to use VMS C-Kermit to make a Telnet connection
- using a port name (like "telnet", which is used by default), the
- underlying UCX getservbyname() function might return the service number
- with its bytes swapped and the connection will fail. If "telnet
- hostname 23" works, then your version of UCX has this bug and you can
- put "set tcp ucx-port-bug on" in your CKERMIT.INI file to get around
- it.
- 2.3.3. Telnet New Environment Option
- The TELNET NEW-ENVIRONMENT option (RFC 1572) is supported as 7.0.
- This option allows the C-Kermit Telnet client to send certain
- well-known variables to the Telnet server, including USER, PRINTER,
- DISPLAY, and several others. This feature is enabled by default in
- Windows and OS/2, disabled by default elsewhere. The command to enable
- and disable it is:
- SET TELNET ENVIRONMENT { ON, OFF }
- When ON, and you Telnet to another computer, you might (or might not)
- notice that the "login:" or "Username:" prompt does not appear --
- that's because your username was sent ahead, in which case the remote
- system might prompt you only for your password (similar to Rlogin). Use
- "set telnet environment off" to defeat this feature, particularly in
- scripts where the dialog must be predictable. You can also use this
- command to specify or override specific well-known environment variable
- values:
- SET TELNET ENVIRONMENT { ACCT,DISPLAY,JOB,PRINTER,SYSTEMTYPE,USER } [ text ]
- 2.3.4. Telnet Location Option
- The TELNET LOCATION option (RFC 779) is supported in 7.0. This
- option allows the C-Kermit Telnet client to send a location string to
- the server if the server indicates its willingness to accept one. If an
- environment variable named LOCATION exists at the time C-Kermit starts,
- its value is used as the location string. If you want to change it,
- use:
- SET TELNET LOCATION text
- If you omit the text from this command, the Telnet location feature is
- disabled.
- SET TELNET ENVIRONMENT DISPLAY is used to set the DISPLAY variable that
- is sent to the host, as well as the XDISPLAY location.
- 2.3.5. Connecting to Raw TCP Sockets
- The SET HOST and TELNET commands now accept an optional switch,
- /RAW-SOCKET, at the end, only if you first give a host and a port.
- Example:
- set host xyzcorp.com 23 /raw-socket
- set host 128.49.39.2:2000 /raw-socket
- telnet xyzcorp.com 3000 /raw
- Without this switch, C-Kermit behaves as a Telnet client when (a) the
- port is 23 or 1649, or (b) the port is not 513 and the server sent what
- appeared to be Telnet negotiations -- that is, messages starting with
- 0xFF (IAC). With this switch, Kermit should treat all incoming bytes as
- raw data, and will not engage in any Telnet negotiations or NVT CRLF
- manipulations. This allows transparent operation through (e.g.) raw TCP
- ports on Cisco terminal servers, through the 'modemd' modem server,
- etc.
- 2.3.6. Incoming TCP Connections
- Accomplished via SET HOST * port, were introduced in C-Kermit 6.0, but
- for UNIX only. In Version 7.0, they are also available for VMS.
- 2.4. The EIGHTBIT Command
- EIGHTBIT is simply a shorthand for: SET PARITY NONE, SET TERMINAL
- BYTESIZE 8, SET COMMAND BYTESIZE 8; that is, a way to set up an 8-bit
- clean connection in a single command.
- 2.5. The Services Directory
- Chapter 7 ofUsing C-Kermit does not mention the ULOGIN macro,
- which is used by our sample services directory, CKERMIT.KND. Unlike
- UNIXLOGIN, VMSLOGIN, etc, this one is for use with systems that require
- a user ID but no password. Therefore it doesn't prompt for a password
- or wait for a password prompt from the remote service.
- In version 7.0, the CALL macro was changed to not execute a SET MODEM
- TYPE command if the given modem type was the same as the current one;
- otherwise the new SET MODEM TYPE command would overwrite any
- customizations that the user had made to the modem settings. Ditto for
- SET LINE / SET PORT and SET SPEED.
- 2.6. Closing Connections
- Until version 7.0, there was never an obvious and general way to close
- a connection. If a serial connection was open, it could be closed by
- "set line" or "set port" (giving no device name); if a network
- connection was open, it could be closed by "set host" (no host name).
- In version 7.0, a new command closes the connection in an obvious and
- straightforward way, no matter what the connection type:
- CLOSE [ CONNECTION ]
- The CLOSE command was already present, and required an operand such as
- DEBUG-LOG, WRITE-FILE, etc, and so could never be given by itself. The
- new CONNECTION operand is now the default operand for CLOSE, so CLOSE
- by itself closes the connection, if one is open, just as you would
- expect, especially if you are a Telnet or Ftp user.
- Also see the description of the new SET CLOSE-ON-DISCONNECT command in
- Section 2.10.
- 2.7. Using C-Kermit with External Communication Programs
- C-Kermit 7.0 includes a new ability to create and conduct sessions
- through other communications programs. Two methods are available:
- 1. Pty (pseudoterminal): The external program is run on a
- "pseudoterminal", which is controlled by Kermit. This method works
- with practically any external program, but it is not portable. At
- this writing, it works only on some (not all) UNIX versions, and
- not on any non-UNIX platforms.
- 2. Pipe: The external program's standard input and output are
- redirected through a "pipe" controlled by Kermit. This method is
- relatively portable -- it should work across all UNIX versions, and
- it also works in Windows and OS/2 -- but it is effective only when
- the external program actually uses standard i/o (and many don't).
- The two methods are started differently but are used the same way
- thereafter.
- The purpose of this feature is to let you use C-Kermit services like
- file transfer, character-set translation, scripting, automatic dialing,
- etc, on connections that Kermit can't otherwise make itself.
- This feature is the opposite of the REDIRECT feature, in which C-Kermit
- makes the connection, and redirects an external (local) command or
- program over this connection. In a pty or pipe connection, C-Kermit
- runs and controls a local command or program, which makes the
- connection. (The same method can be used to simply to control a local
- program without making a connection; see Section 2.8.)
- To find out if your version of Kermit includes PTY support, type "show
- features" and look for NETPTY in the alphabetical list of options. For
- pipes, look for NETCMD.
- The commands are:
- SET NETWORK TYPE PTY or SET NETWORK TYPE PIPE
- SET HOST command
- where command is any interactive command. If the command does
- not use standard i/o, you must use SET NETWORK TYPE PTY.
- Notes:
- * COMMAND is an invisible synonym for PIPE.
- * The command and its arguments are case-sensitive in UNIX.
- The SET NETWORK TYPE, SET HOST sequence sets the given network type for
- all subsequent SET HOST commands until another SET NETWORK TYPE command
- is given to change it.
- You can also use the new /NETWORK-TYPE:PTY or /NETWORK-TYPE:PIPE (or
- simply /PIPE or /PTY) switches on the SET HOST command itself:
- SET HOST /NETWORK-TYPE:PIPE command ; These two are the same
- SET HOST /PIPE command
- SET HOST /NETWORK-TYPE:PTY command ; Ditto
- SET HOST /PTY command
- These are like SET NETWORK TYPE followed by SET HOST, except they apply
- only to the connection being made and do not change the global network
- type setting (see Section 1.5 about the difference between
- switches and SET commands).
- Include any command-line options with the command that might be needed,
- as in this example where C-Kermit uses another copy of itself as the
- communications program:
- SET HOST /PIPE /CONNECT kermit -YQJ xyzcorp.com
- IMPORTANT: In Unix, wildcards and redirectors are interpreted by the
- shell. If you want to run a program with (say) SET HOST /PTY with
- its i/o redirected or with wildcard file arguments, you will need to
- invoke the shell too. Example:
- SET HOST /PTY {sh -c "crypt < foo.x"}
- SET HOST /PTY {sh -c "grep somestring *.txt"}
- As usual, if you include the /CONNECT switch, SET HOST enters CONNECT
- mode immediately upon successful execution of the given command.
- Therefore new commands are available as a shorthand for SET HOST
- /CONNECT /PTY and /PIPE:
- PTY [ command ]
- PIPE [ command ]
- The PTY and PIPE commands work like the TELNET and RLOGIN
- commands: they set up the connection (in this case, using the
- given command) and then enter CONNECT mode automatically (if the
- PIPE or PTY command is given without a command, it continues the
- current session if one is active; otherwise it gives an error
- message).
- The PIPE command is named after the mechanism by which C-Kermit
- communicates with the command: UNIX pipes. C-Kermit's i/o is "piped"
- through the given command. Here is a typical example:
- PIPE rlogin -8 xyzcorp.com
- This is equivalent to:
- SET HOST /PIPE rlogin -8 xyzcorp.com
- CONNECT
- and to:
- SET HOST /PIPE /CONNECT rlogin -8 xyzcorp.com
- IMPORTANT:
- If you are writing a script, do not use the PIPE, PTY, TELNET,
- or RLOGIN command unless you really want C-Kermit to enter
- CONNECT mode at that point. Normally SET HOST is used in scripts
- to allow the login and other dialogs to be controlled by the
- script itself, rather than by an actively participating human at
- the keyboard.
- Throughput of pty and pipe connections is limited by the performance of
- the chosen command or program and by the interprocess communication
- (IPC) method used and/or buffering capacity of the pipe or pty, which
- in turn depends on the underlying operating system.
- In one trial (on SunOS 4.1.3), we observed file transfer rates over an
- rlogin connection proceeding at 200Kcps for downloads, but only 10Kcps
- for uploads on the same connection with the same settings (similar
- disparities were noted in HP-UX). Examination of the logs revealed that
- a write to the pipe could take as long as 5 seconds, whereas reads were
- practically instantaneous. On the other hand, using Telnet as the
- external program rather than rlogin, downloads and uploads were better
- matched at about 177K each.
- Most external communication programs, like C-Kermit itself, have escape
- characters or sequences. Normally these begin with (or consist entirely
- of) a control character. You must be sure that this control character
- is not "unprefixed" when uploading files, otherwise the external
- program will "escape back" to its prompt, or close the connection, or
- take some other unwanted action. When in CONNECT mode, observe the
- program's normal interaction rules. Of course C-Kermit's own escape
- character (normally Ctrl-\) is active too, unless you have taken some
- action to disable it.
- On PTY connections, the underlying PTY driver is not guaranteed to be
- transparent to control characters -- for example, it might expand tabs,
- translate carriage returns, generate signals if it sees an interrupt
- character, and so on. Similar things might happen on a PIPE connection.
- For this reason, if you plan to transfer files over a PTY or PIPE
- connection, tell the file sender to:
- SET PREFIXING ALL
- This causes all control characters to be prefixed and
- transmitted as printable ASCII characters.
- If the external connection program is not 8-bit clean, you should also:
- SET PARITY SPACE
- This causes 8-bit data to be encoded in 7 bits using single
- and/or locking shifts.
- And if it does not make a reliable connection (such as those made by
- Telnet, Rlogin, Ssh, etc), you should:
- SET STREAMING OFF
- This forces C-Kermit to treat the connection as unreliable and
- to engage in its normal ACK/NAK protocol for error detection and
- correction, rather than "streaming" its packets, as it normally
- does on a network connection ( Section 4.20).
- In some cases, buffer sizes might be restricted, so you might also need
- to reduce the Kermit packet length to fit; this is a trial-and-error
- affair. For example, if transfers always fail with 4000-byte packets,
- try 2000. If that fails too, try 1000, and so on. The commands are:
- SET RECEIVE PACKET-LENGTH number
- This tells the file receiver to tell the file sender the longest
- packet length it can accept.
- SET SEND PACKET-LENGTH number
- This tells the file sender not to send packets longer than the
- given length, even if the receiver says longer ones are OK. Of
- course, if the receiver's length is shorter, the shorter length
- is used.
- If none of this seems to help, try falling back to the bare minimum,
- lowest-common-denominator protocol settings:
- ROBUST
- No sliding windows, no streaming, no control-character
- unprefixing, packet length 90.
- And then work your way back up by trial and error to get greater
- throughput.
- Note that when starting a PIPE connection, and the connection program
- (such as telnet or rlogin) prints some greeting or information messages
- before starting the connection, these are quite likely to be printed
- with a stairstep effect (linefeed without carriage return). This is
- because the program is not connected with the UNIX terminal driver;
- there's not much Kermit can do about it. Once the connection is made,
- everything should go back to normal. This shouldn't happen on a PTY
- connection because a PTY is, indeed, a terminal.
- On a similar note, some connection programs (like Solaris 2.5 rlogin)
- might print lots of error messages like "ioctl TIOCGETP: invalid
- argument" when used through a pipe. They are annoying but usually
- harmless. If you want to avoid these messages, and your shell allows
- redirection of stderr, you can redirect stderr in your pipe command, as
- in this example where the user's shell is bash:
- PIPE rlogin xyzcorp.com 2> /dev/null
- Or use PTY rather than PIPE, since PTY is available on Solaris.
- 2.7.0. C-Kermit over tn3270 and tn5250
- Now you can make a connection from C-Kermit "directly" to an IBM
- mainframe and transfer files with it, assuming it has Kermit-370
- installed. Because tn3270 is neither 8-bit clean nor transparent to
- control characters, you must give these commands:
- SET PREFIXING ALL ; Prefix all control characters
- SET PARITY SPACE ; Telnet connections are usually not 8-bit clean
- and then:
- SET HOST /PTY /CONNECT tn3270 abccorp.com
- or simply:
- pty tn3270 abccorp.com
- SET HOST /PIPE does not work in this case, at least not for file
- transfer. File transfer does work, however, with SET HOST /PTY,
- provided you use the default packet length of 90 bytes; anything longer
- seems to kill the session.
- You can also make connections to IBM AS/400 computers if you have a
- tn5250 program installed:
- pty tn5250 hostname
- In this case, however, file transfer is probably not in the cards since
- nobody has ever succeeded in writing a Kermit program for the AS/400.
- Hint:
- define tn3270 {
- check pty
- if fail end 1 Sorry - no PTY support...
- pty tn3270 \%*
- }
- Similarly for tn5250. Note that CHECK PTY and CHECK PIPE can be used in
- macros and scripts to test whether PTY or PIPE support is available.
- 2.7.1. C-Kermit over Telnet
- Although C-Kermit includes its own Telnet implementation, you might
- need to use an external Telnet program to make certain connections;
- perhaps because it has access or security features not available in
- C-Kermit itself. As noted above, the only precautions necessary are
- usually:
- SET PREFIXING ALL ; Prefix all control characters
- SET PARITY SPACE ; Telnet connections might not be 8-bit clean
- and then:
- SET HOST /PTY (or /PIPE) /CONNECT telnet abccorp.com
- or, equivalently:
- PTY (or PIPE) telnet abccorp.com
- 2.7.2. C-Kermit over Rlogin
- C-Kermit includes its own Rlogin client, but this can normally be used
- only if you are root, since the rlogin TCP port is privileged. But ptys
- and pipes let you make rlogin connections with C-Kermit through your
- computer's external rlogin program, which is normally installed as a
- privileged program:
- SET PREFIXING ALL
- and then:
- SET HOST /PTY (or /PIPE) /CONNECT rlogin -8 abccorp.com
- or, equivalently:
- PTY (or PIPE) rlogin -8 abccorp.com
- The "-8" option to rlogin enables transmission of 8-bit data. If this
- is not available, then include SET PARITY SPACE if you intend to
- transfer files.
- Note that the normal escape sequence for rlogin is Carriage Return
- followed by Tilde (~), but only when the tilde is followed by certain
- other characters; the exact behavior depends on your rlogin client, so
- read its documentation.
- 2.7.3. C-Kermit over Serial Communication Programs
- Ptys and pipes also let you use programs that make serial connections,
- such as cu or tip. For example, C-Kermit can be used through cu to make
- connections that otherwise might not be allowed, e.g. because C-Kermit
- is not installed with the required write permissions to the dialout
- device and the UUCP lockfile directory.
- Suppose your UUCP Devices file contains an entry for a serial device
- tty04 to be used for direct connections, but this device is protected
- against you (and Kermit when you run it). In this case you can:
- SET CONTROL PREFIX ALL
- PTY (or PIPE) cu -l tty04
- (Similarly for dialout devices, except then you also need to include
- the phone number in the "cu" command.)
- As with other communication programs, watch out for cu's escape
- sequence, which is the same as the rlogin program's: Carriage Return
- followed by Tilde (followed by another character to specify an action,
- like "." for closing the connection and exiting from cu).
- 2.7.4. C-Kermit over Secure Network Clients
- DISCLAIMER: There are laws in the USA and other countries regarding
- use, import, and/or export of encryption and/or decryption or other
- forms of security software, algorithms, technology, and intellectual
- property. The Kermit Project attempts to follow all known statutes,
- and neither intends nor suggests that Kermit software can or should
- be used in any way, in any location, that circumvents any
- regulations, laws, treaties, covenants, or other legitimate canons
- or instruments of law, international relations, trade, ethics, or
- propriety.
- For secure connections or connections through firewalls, C-Kermit 7.0
- can be a Kerberos, SRP, and/or SOCKS client when built with the
- appropriate options and libraries. But other application-level security
- acronyms and methods -- SSH, SSL, SRP, TLS -- pop up at an alarming
- rate and are (a) impossible to keep up with, (b) usually mutually
- incompatible, and (c) have restrictions on export or redistribution and
- so cannot be included in C-Kermit itself.
- However, if you have a secure text-based Telnet (or other) client that
- employs one of these security methods, you can use C-Kermit "through"
- it via a pty or pipe.
- 2.7.4.1. SSH
- C-Kermit does not and can not incorporate SSH due to licensing, patent,
- and USA export law restrictions.
- The UNIX SSH client does not use standard input/output, and therefore
- can be used only by Kermit's PTY interface, if one is present. The
- cautions about file transfer, etc, are the same as for Rlogin. Example:
- SET PREFIXING ALL
- PTY ssh XYZCORP.COM
- Or, for a scripted session:
- SET PREFIXING ALL
- SET HOST /PTY ssh XYZCORP.COM
- Hint:
- define ssh {
- check pty
- if fail end 1 Sorry - no PTY support...
- pty ssh \%*
- }
- 2.7.4.2. SSL
- Secure Sockets Layer (SSL) is another TCP/IP security overlay, this one
- designed by and for Netscape. An SSL Telnet client is available for
- UNIX from the University of Queensland. More info at:
- http://www.psy.uq.oz.au/~ftp/Crypto/
- Interoperability with C-Kermit is unknown. C-Kermit also includes its
- own built-in SSL/TLS support, but it is not exportable.
- 2.7.4.3. SRP
- SRP(TM) is Stanford University's Secure Remote Password protocol. An
- SRP Telnet client is available from Stanford:
- http://srp.stanford.edu/srp/
- Stanford's SRP Telnet client for UNIX has been tested on SunOS and
- works fine with C-Kermit, as described in Section 2.7.1, e.g.
- SET PREFIX ALL
- PTY (or PIPE) srp-telnet xenon.stanford.edu
- C-Kermit itself can be built as an SRP Telnet client on systems that
- have libsrp.a installed; the C-Kermit support code, however, may not be
- exported outside the USA or Canada.
- 2.7.4.4. SOCKS
- C-Kermit can be built as a SOCKS-aware client on systems that have a
- SOCKS library. See section 8.1.1 of theckccfg.txt file.
- C-Kermit 7.0 can also be run over SOCKSified Telnet or rlogin clients
- with SET NETWORK TYPE COMMAND. Suppose the Telnet program on your
- system is SOCKS enabled but C-Kermit is not. Make Kermit connections
- like this:
- SET PREFIX ALL
- PTY (or PIPE) telnet zzz.com
- 2.7.4.5. Kerberos
- UNIX C-Kermit can be built with MIT Kerberos IV or V authentication and
- encryption. Instructions are available in aseparate document.
- Additional modules are required that can not be exported from the USA
- to any country except Canada, by US law.
- If you have Kerberos installed but you don't have a Kerberized version
- of C-Kermit, you can use ktelnet as C-Kermit's external communications
- program to make secure connections without giving up C-Kermit's
- services:
- SET PREFIX ALL
- PTY (or PIPE) ktelnet cia.gov
- 2.8. Scripting Local Programs
- If your version of Kermit has PTY support built in, then any text-based
- program can be invoked with SET HOST /PTY or equivalent command and
- controlled using the normal sequence of OUTPUT, INPUT, IF SUCCESS
- commands (this is the same service that is provided by the 'expect'
- program, but controlled by the Kermit script language rather than Tcl).
- When PTY service is not available, then any program that uses standard
- input and output can be invoked with SET HOST /PIPE.
- Here's an example in which we start an external Kermit program, wait
- for its prompt, give it a VERSION command, and then extract the numeric
- version number from its response:
- set host /pty kermit -Y
- if fail stop 1 {Can't start external command}
- input 10 C-Kermit>
- if fail stop 1 {No C-Kermit> prompt}
- output version\13
- input 10 {Numeric: }
- if fail stop 1 {No match for "Numeric:"}
- clear input
- input 10 \10
- echo VERSION = "\fsubstr(\v(input),1,6)"
- output exit\13
- This technique could be used to control any other interactive program,
- even those that do screen formatting (like Emacs or Vi), if you can
- figure out the sequence of events. If your Kermit program doesn't have
- PTY support, then the commands are restricted to those using standard
- i/o, including certain shells, interactive text-mode "hardcopy" editors
- like ex, and so on.
- If you are using the PTY interface, you should be aware that it runs
- the given program or command directly on the pty, without any
- intervening shell to interpret metacharacters, redirectors, etc. If you
- need this sort of thing, include the appropriate shell invocation as
- part of your command; for example:
- pty echo *
- just echoes "*"; whereas:
- pty ksh -c "echo *"
- echoes all the filenames that ksh finds matching "*".
- Similarly for redirection:
- set host /pty ksh -c "cat > foo" ; Note: use shell quoting rules here
- set transmit eof \4
- transmit bar
- And for that matter, for built-in shell commands:
- set host /pty ksh -c "for i in *; do echo $i; done"
- The PIPE interface, on the other hand, invokes the shell automatically,
- so:
- pipe echo *
- prints filenames, not "*".
- 2.9. X.25 Networking
- X.25 networking is documented inUsing C-Kermit, 2nd Edition. When
- the book was published, X.25 was available only in SunOS, Solaris, and
- Stratus VOS. Unlike TCP/IP, X.25 APIs are not standardized; each
- vendor's X.25 libraries and services (if they have them at all) are
- unique.
- This section describes new additions.
- 2.9.1. IBM AIXLink/X.25 Network Provider Interface for AIX
- Support for X.25 was added via IBM's Network Provider Interface (NPI),
- AIXLink/X.25 1.1, to the AIX 4.x version of C-Kermit 7.0.
- Unfortunately, AIXLink/X.25 is a rather bare-bones facility, lacking in
- particular any form of PAD support (X.3, X.28, X.29). Thus, the AIX
- version of C-Kermit, when built to include X.25 networking, has neither
- a PAD command, nor a SET PAD command. The same is true for the
- underlying AIX system: no PAD support. Thus it is not possible to have
- an interactive shell session over an X.25 connection into an AIX system
- (as far as we know), even from X.25-capable Kermit versions (such as
- Solaris or VOS) that do include PAD support.
- Thus the X.25 capabilities in AIX C-Kermit are limited to peer-to-peer
- connections, e.g. from a C-Kermit client to a C-Kermit server. Unlike
- the Solaris, SunOS, and VOS versions, the AIX version can accept
- incoming X.25 connections:
- set network type x.25
- if fail stop 1 Sorry - no X.25 support
- ; Put any desired DISABLE or ENABLE or SET commands here.
- set host /server *
- if fail stop 1 X.25 "set host *" failed
- And then access it from the client as follows:
- set network type x.25
- if fail stop 1 Sorry - no X.25 support
- set host xxxxxxx ; Specify the X.25/X.121 address
- if fail stop 1 Can't open connection
- And at this point the client can use the full range of client commands:
- SEND, GET, REMOTE xxx, FINISH, BYE.
- The AIX version also adds two new variables:
- \v(x25local_nua)
- The local X.25 address.
- \v(x25remote_nua)
- The X.25 address of the host on the other end of the connection.
- C-Kermit's AIX X.25 client has not been tested against anything other
- than a C-Kermit X.25 server on AIX. It is not known if it will
- interoperate with C-Kermit servers on Solaris, SunOS, or VOS.
- To make an X.25 connection from AIX C-Kermit, you must:
- set x25 call-user-data xxxx
- where xxxx can be any even-length string of hexadecimal digits, e.g.
- 123ABC.
- 2.9.2. HP-UX X.25
- Although C-Kermit presently does not include built-in support for HP-UX
- X.25, it can still be used to make X.25 connections as follows: start
- Kermit and tell it to:
- set prefixing all
- set parity space
- pty padem address
- This should work in HP-UX 9.00 and later (see Section 2.7). If you
- have an earlier HP-UX version, or the PTY interface doesn't work or
- isn't available, try:
- set prefixing all
- set parity space
- pipe padem address
- Failing that, use Kermit to telnet to localhost and then after logging
- back in, start padem as you would normally do to connect over X.25.
- 2.10. Additional Serial Port Controls
- C-Kermit 7.0 adds the following commands for greater control over
- serial ports. These commands are available only in C-Kermit versions
- whose underlying operating systems provide the corresponding services
- (such as POSIX and UNIX System V), and even then their successful
- operation depends on the capabilities of the specific device and
- driver.
- SET DISCONNECT { ON, OFF }
- On a SET LINE or SET PORT connection with SET CARRIER ON or
- AUTO, if the carrier signal drops during the connection,
- indicating that the connection has been lost, and C-Kermit
- notices it, this setting governs what happens next. With SET
- DISCONNECT OFF, which is consistent with previous behavior, and
- therefore the default, C-Kermit continues to keep the device
- open and allocated. With SET DISCONNECT ON, C-Kermit
- automatically closes and releases the device when it senses a
- carrier on-to-off transition, thus allowing others to use it.
- However, it remains the default device for i/o (DIAL, REDIAL,
- INPUT, SEND, CONNECT, etc), so if a subsequent i/o command is
- given, the device is reopened if it is still available. When it
- has been automatically closed in this manner, SHOW
- COMMUNICATIONS puts "(closed)" after its name, and in UNIX, the
- lockfile disappears -- both from SHOW COMM and from the lockfile
- directory itself. Synonym: SET CLOSE-ON-DISCONNECT.
- SET EXIT ON-DISCONNECT { ON, OFF }
- Like DISCONNECT, but makes the program exit if a connection
- drops.
- Note that SET CLOSE-ON-DISCONNECT and SET EXIT ON-DISCONNECT apply only
- to connections that drop; they do not apply to connections that can't
- be made in the first place. For example, they have no effect when a SET
- LINE, SET HOST, TELNET, or DIAL command fails.
- HANGUP
- If [CLOSE-ON-]DISCONNECT is ON, and the HANGUP command is given
- on a serial device, and the carrier signal is no longer present
- after the HANGUP command, the device is closed and released.
- SET PARITY HARDWARE { EVEN, ODD }
- Unlike SET PARITY { EVEN, ODD, MARK, SPACE }, which selects 7
- data bits plus the indicated kind of parity (to be done in
- software by Kermit itself), SET PARITY HARDWARE selects 8 data
- bits plus even or odd parity, to be done by the underlying
- hardware, operating system, or device driver. This command is
- effective only with a SET LINE or SET PORT device. That is, it
- has no effect in remote mode, nor on network connections. There
- is presently no method for selecting 8 data bits plus mark or
- space parity. If hardware parity is in effect, the variable
- \v(hwparity) is set to "even" or "odd". Note: some platforms
- might also support settings of SPACE, MARK, or NONE.
- SET STOP-BITS { 1, 2 }
- This tells the number of 1-bits to insert after an outbound
- character's data and parity bits, to separate it from the next
- character. Normally 1. Choosing 2 stop bits should do no harm,
- but will slow down serial transmission by approximately 10
- percent. Historically, 2 stop bits were used with Teletypes (at
- 110 bps or below) for print-head recovery time. There is
- presently no method for choosing any number of stop bits besides
- 1 and 2.
- SET SERIAL [ dps ]
- dps stands for Data-bits, Parity, Stop-bits. This is the
- notation familiar to many people for serial port configuration:
- 7E1, 8N1, 7O2, etc. The data bits number also becomes the
- TERMINAL BYTESIZE setting. The second character is E for Even, O
- for Odd, M for Mark, S for Space, or N for None. The list of
- available options depends on the capabilities of the specific
- platform. If dps is omitted, 8N1 is used. Type "set serial ?"
- for a list of available choices. Examples:
- SET SERIAL 7E1
- Equivalent to SET PARITY EVEN, SET STOP-BITS 1, SET TERM
- BYTE 7.
- SET SERIAL 8N1
- Equivalent to SET PARITY NONE, SET STOP-BITS 1, SET TERM
- BYTE 8.
- SET SERIAL 7E2
- Equivalent to SET PARITY EVEN and SET STOP-BITS 2, SET
- TERM BYTE 7.
- SET SERIAL 8E2
- Same as SET PARITY HARDWARE EVEN, SET STOP-BITS 2, SET
- TERM BYTE 8.
- SET SERIAL
- Same as SET PARITY NONE and SET STOP-BITS 1, SET TERM BYTE
- 8.
- Notes:
- * The SET SERIAL xx2 options are available only in Kermit versions
- where the SET PARITY HARDWARE command is also available. (SHOW
- FEATURES includes "HWPARITY" in its options list.)
- * The SET SERIAL 7xx and 8N1 options affect the software parity
- setting, even for network connections.
- * As noted in the manual, selecting 8 data bits does not give you
- 8-bit terminal sessions in CONNECT mode unless you also SET
- TERMINAL BYTESIZE 8. The default terminal bytesize remains 7, to
- protect against the situation where the remote host is generating
- parity but you don't know about it. If the terminal bytesize was 8
- by default and you CONNECTed to such a host, you would see only
- garbage on your screen.
- * If you do not give a SET STOP-BITS or SET SET SERIAL command,
- C-Kermit does not attempt to set the device's stop bits; instead,
- it uses whatever setting the device uses when not given explicit
- instructions about stop bits.
- SHOW COMMUNICATIONS displays the current settings. Stop bits and
- hardware parity are shown only for SET PORT / SET LINE (serial)
- devices, since they do not apply to network connections or to remote
- mode. STOP-BITS is shown as "(default)" if you have not given an
- explicit SET STOP-BITS or SET SERIAL command.
- The \v(serial) variable shows the SET SERIAL setting (8N1, 7E1, etc).
- 2.11. Getting Access to the Dialout Device
- This section is for UNIX only; note the special words about QNX at
- the end. Also see Section 2.0 for SET LINE switches,
- particularly the /SHARE switch for VMS only.
- C-Kermit does its best to obey the UUCP lockfile conventions of each
- platform (machine, operating system, OS version) where it runs, if that
- platform uses UUCP.
- But simply obeying the conventions is often not good enough, due to the
- increasing likelihood that a particular serial device might have more
- than one name (e.g. /dev/tty00 and /dev/term/00 are the same device in
- Unixware 7; /dev/cua and /dev/cufa are the same device in NeXTSTEP),
- plus the increasingly widespread use of symlinks for device names, such
- as /dev/modem.
- C-Kermit 7.0 goes to greater lengths than previous versions to
- successfully interlock with other communications program (and other
- instances of Kermit itself); for example, by:
- * Creation of dual lockfiles whenever a symlink is used; one for the
- link name and one for the real name.
- * Creation of dual lockfiles in HP-UX according to HP rules.
- * Creation of dual uppercase/lowercase lockfile names in SCO
- UNIX/ODT/OSR5.
- * The use of ttylock() in versions of AIX where it works.
- * The use, wherever possible, of lockfile names based on
- inode/major/minor device number rather than device name.
- See theckuins.txt andckubwr.txt files for details.
- QNX is almost unique among UNIX varieties in having no UUCP programs
- nor UUCP-oriented dialout-device locking conventions. QNX does,
- however, allow a program to get the device open count. This can not be
- a reliable form of locking unless all applications do it (and they
- don't), so by default, Kermit uses this information only for printing a
- warning message such as:
- C-Kermit>set line /dev/ser1
- WARNING - "/dev/ser1" looks busy...
- However, if you want to use it as a lock, you can do so with:
- SET QNX-PORT-LOCK { ON, OFF }
- QNX-PORT-LOCK is OFF by default; if you set in ON, C-Kermit fails to
- open any dialout device when its open count indicates that another
- process has it open. SHOW COMM (in QNX only) displays the setting, and
- if you have a port open, it also shows the current open count (with
- C-Kermit's own access always counting as 1).
- 2.12. The Connection Log
- C-Kermit 7.0 adds the ability to log connections, so you can see where
- you've been and have a record of calls you've made. A connection is
- defined as any communications session that is begun by SET LINE, SET
- PORT, DIAL, SET HOST, TELNET, or RLOGIN. Connections are not logged
- unless you request it; the command is:
- LOG CX [ filename [ { NEW, APPEND } ] ]
- Enables logging of connections in the given file. If the
- trailing { NEW, APPEND } keyword is omitted, the file is opened
- for appending; i.e. new records are written to the end. If NEW
- is specified, a new file is created; if a file of the same name
- already existed, it is overwritten. If the filename is omitted,
- CX.LOG in your home (login) directory is used (note: uppercase).
- To accept all defaults, just use "log connections" (or "l c" for
- short). Synonym: LOG CONNECTIONS.
- CLOSE CX-LOG
- This closes the connection log if it was open. (Note, the CLOSE
- CONNECTION command closes the connection itself).
- SHOW CX
- This shows your current connection, if any, including the
- elapsed time (since you opened it). Synonym: SHOW CONNECTION.
- \v(cx_time)
- This variable shows the elapsed time of your current connection,
- or if there is no current connection, of your most recent
- connection, of if there have been no connections, 0.
- The connection contains one line per connection, of the form:
- yyyymmdd hh:mm:ss username pid p=v [ p=v [ ... ] ]
- where the timestamp (in columns 1-18) shows when the connection was
- made; username is the login identity of the person who made the
- connection; pid is Kermit's process ID when it made the connection. The
- p's are parameters that depend on the type of connection, and the v's
- are their values:
- T = Connection Type (TCP, SERIAL, DIAL, DECNET, etc).
- H = The name of the Host from which the connection was made.
- N = Destination phone Number or Network host name or address.
- D = Serial connections only: Device name.
- O = Dialed calls only: Originating country code & area code if known.
- E = Elapsed time in hh:mm:ss format (or hhh:mm:ss, etc).
- If you always want to keep a connection log, simply add:
- log connections
- to your C-Kermit customization file. Note, however, that if you make a
- lot of connections, your CX.LOG will grow and grow. You can handle this
- by adding a "logrotate" procedure like the following to your
- customization file, before the "log connections" command:
- define LOGROTATE { ; Define LOGROTATE macro
- local \%i \%m \%d \%n \%f MAX
- def MAX 4 ; How many months to keep
- if not def \%1 - ; No argument given
- end 1 \%0: No filename given
- if not = 1 \ffiles(\%1) - ; Exactly 1 file must match
- end 1 \%0: \%1 - File not found
- .\%d := \fsubstr(\fdate(\%1),1,6) ; Arg OK - get file year & month
- if = \%d - ; Compare file year & month
- \fsubstr(\v(ndate),1,6) - ; with current year & month
- end 0 ; Same year & month - done
- rename \%1 \%1.\%d ; Different - rename file
- .\%n := \ffiles(\%1.*) ; How many old files
- if < \%n \m(MAX) end 0 ; Not enough to rotate
- .\%m := \%1.999999 ; Initial compare string
- for \%i 1 \%n 1 { ; Loop thru old logs
- .\%f := \fnextfile() ; Get next file name
- if llt \%f \%m .\%m := \%f ; If this one older remember it
- }
- delete \%m ; Delete the oldest one
- }
- log connections ; Now open the (possibly new) log
- logrotate \v(home)CX.LOG ; Run the LOGROTATE macro
- As you can see, this compares the yyyymm portion of the modification
- date (\fdate()) of the given file (\%1) with the current yyyymm. If
- they differ, the current file has the yyyymm suffix (from its most
- recent modification date) appended to its name. Then we search through
- all other such files, find the oldest one, and delete it. Thus the
- current log, plus the logs from the most recent four months, are kept.
- This is all done automatically every time you start C-Kermit.
- On multiuser systems, it is possible to keep a single, shared,
- system-wide connection log, but this is not recommended since (a) it
- requires you keep a publicly write-accessible logfile (a glaring target
- for mischief), and (b) it would require each user to log to that file
- and not disable logging. A better method for logging connections, in
- UNIX at least, is syslogging (seeckuins.txt Section 15 and
- Section 4.2 of theIKSD Administration Guide for details).
- 2.13. Automatic Connection-Specific Flow Control Selection
- Beginning in C-Kermit 7.0, the appropriate flow-control method for each
- connection type is kept in a table, for example:
- Remote: NONE
- Modem: RTS/CTS
- Direct-Serial: NONE
- TCPIP: NONE
- The size of the table and values for each connection type can vary from
- platform to platform. Type "set flow ?" for a list of available
- flow-control types.
- The table is used to automatically select the appropriate kind of flow
- control whenever you make a connection. You can display the table with:
- SHOW FLOW-CONTROL
- The defaults are as follows:
- Remote:
- NONE or XON/XOFF. This is because C-Kermit is not allowed to
- find out what type of connection the incoming user has (*). No
- kind of flow control will work on every kind of connection,
- including (unexpectedly) KEEP, which we would have liked to use,
- but not turning off flow control at the remote end during file
- transfer on TCP/IP connections is fatal to the transfer (except
- in VMS and HP-UX, where it must be set to Xon/Xoff!) Therefore
- if you are dialing in to a serial port on a server (UNIX or VMS)
- where C-Kermit is running, you will need to tell C-Kermit to
- "set flow keep" before transferring files (assuming the modem
- and port are configured correctly by the system administrator;
- otherwise you'll need to give a specific kind of flow control,
- e.g. "set flow xon/xoff"), so in this case C-Kermit will not
- disable flow control, as it must do when you are coming via
- Telnet (directly or through a terminal server, except on VMS and
- HP-UX).
- Modem:
- This applies when you dial out with a modem. In this case, the
- MODEM FLOW-CONTROL setting takes affect after the SET FLOW
- setting, so it can pick the most appropriate flow control for
- the combination of the particular modem and the
- computer/port/driver that is dialing.
- Direct-Serial:
- The default here is NONE because C-Kermit has no way of knowing
- what kind of flow control, if any, is or can be done by the
- device at the other end of the connection. RTS/CTS would be a
- bad choice here, because if the CTS signal is not asserted, the
- connection will hang. And since direct connections are often
- made with 3-wire cables, there is a good chance the CTS signal
- will not be received.
- TCPIP:
- NONE, since TCP and IP provide their own flow control
- transparently to the application, except in VMS, where Xon/Xoff
- is the default due to the requirements of the VMS TCP/IP
- products.
- Other networks:
- NONE, since networks should provide their flow control
- transparently to the application.
- (*) This is possibly the worst feature of UNIX, VMS, and other
- platforms where C-Kermit runs. If C-Kermit was able to ask the
- operating system what kind of connection it had to the user, it could
- set up many things for you automatically.
- You can modify the default-flow-control table with:
- SET FLOW-CONTROL /xxx { NONE, KEEP, RTS/CTS, XON/XOFF, ... }
- where "xxx" is the connection type, e.g.
- SET FLOW /REMOTE NONE
- SET FLOW /DIRECT RTS/CTS
- If you leave out the switch, SET FLOW works as before, choosing the
- flow control method to be used on the current connection:
- SET FLOW XON/XOFF
- Thus, whenever you make a connection with SET PORT, SET LINE, DIAL, SET
- HOST, TELNET, RLOGIN, etc, an appropriate form of flow control is
- selected automatically. You can override the automatic selection with a
- subsequent SET FLOW command, such as SET FLOW NONE (no switch
- included).
- The flow control is changed automatically too when you give a SET MODEM
- TYPE command. For example, suppose your operating system (say Linux)
- supports hardware flow control (RTS/CTS). Now suppose you give the
- following commands:
- set line /dev/ttyS2 ; Automatically sets flow to NONE
- set modem type usr ; Automatically sets flow to RTS/CTS
- set modem type rolm ; Doesn't support RTS/CTS so now flow is XON/XOFF
- IMPORTANT: This new feature tends to make the order of SET LINE/HOST
- and SET FLOW commands matter, where it didn't before. For example, in
- VMS:
- SET FLOW KEEP
- SET LINE TTA0:
- the SET LINE undoes the SET FLOW KEEP command; the sequence now must
- be:
- SET FLOW /DIRECT KEEP
- SET LINE TTA0:
- or:
- SET LINE TTA0:
- SET FLOW KEEP
- 2.14. Trapping Connection Establishment and Loss
- If you define a macro called ON_OPEN, it is executed any time that a
- SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or similar command
- succeeds in opening a connection. The argument is the host or device
- name (as shown by SHOW COMMUNICATIONS, and the same as \v(line)). This
- macro can be used for all sorts of things, like automatically setting
- connection- or host-specific parameters when the connection is opened.
- Example:
- def ON_OPEN {
- switch \%1 {
- :abccorp.com, set reliable off, break
- :xyzcorp.com, set receive packet-length 1000, break
- etc etc...
- }
- }
- If you define a macro called ON_CLOSE, it will be executed any time
- that a SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or any other kind
- of connection that C-Kermit has made is closed, either by the remote or
- by a local CLOSE, HANGUP, or EXIT command or other local action, such
- as when a new connection is opened before an old one was explicitly
- closed.
- As soon as C-Kermit notices the connection has been closed, the
- ON_CLOSE macro is invoked at (a) the top of the command parsing loop,
- or (b) when a connection is closed implicitly by a command such as SET
- LINE that closes any open connection prior to making a new connection,
- or (c) when C-Kermit closes an open connection in the act of exiting.
- The ON_CLOSE macro was inspired by the neverending quest to unite
- Kermit and SSH. In this case using the "tunnel" mechanism:
- def TUNNEL { ; \%1 = host to tunnel to
- local \%p
- if not def \%1 stop 1
- assign tunnelhost \%1 ; Make global copy
- undef on_close
- set macro error off
- close connection ; Ignore any error
- open !read tunnel start \%1
- read \%p ; Get port number
- if fail stop 1 Tunnel failure: \%1
- close read
- if fail stop 1 Tunnel failure: \%1 ; See Section 4.2.8.1
- assign on_close { ; Set up close handler
- echo Closing tunnel: \m(tunnelhost)
- !tunnel stop \m(tunnelhost)
- undef on_close
- }
- set host localhost:\%p /telnet
- if success end 0
- undef on_close
- stop 1 Connection failure: \%1
- }
- In this case, when the connection stops, we also need to shut down the
- tunnel, even if it is at a later time after TUNNEL has finished
- executing. This way we can escape back, reconnect, transfer files, and
- so on until the connection is broken by logging out from the remote, or
- by explicitly closing it, or by EXITing from C-Kermit, at which time
- the tunnel is shut down.
- When the connection is closed, no matter how, the ON_CLOSE macro
- executes and then undefines (destroys) itself, since we don't want to
- be closing tunnels in the future when we close subsequent connections.
- Other such tricks can be imagined, including ending ON_CLOSE with a
- STOP command to force the command stack to be peeled all the way back
- to the top, for example in a deeply nested script that depends on the
- connection being open:
- def on_close { stop 1 CONNECTION LOST }
- When C-Kermit invokes the ON_CLOSE macro, it supplies one argument
- (\%1): the reason the connection was closed as a number, one of the
- following:
- 2 - Fatal failure to negotiate a required item on a network connection.
- 1 - Closed by C-Kermit command.
- 0 - All others (normally closed by remote).
- which may be used for any purpose; for example, to add a comment to the
- connection log:
- def on_close {
- local \%m
- if not open cx end 0
- switch \%1 {
- :0, .\%m = Closed by remote, break
- :1, .\%m = Closed by me, break
- :2, .\%m = Network protocol negotiation failure, break
- }
- if def \%m writeln cx {# \%m}
- }
- 2.15. Contacting Web Servers with the HTTP Command
- C-Kermit 7.0 (at this writing, the UNIX version only) supports direct
- contact and interaction with Web servers via HTTP 1.0 protocol. To make
- a connection, use Kermit's normal method for making a TCP/IP
- connection, but specify the HTTP port:
- SET HOST host http [ switches ]
- where host is the IP hostname or address, and http is the name of the
- TCP port for the Web server. Relevant switches include:
- /RAW
- Treat the connection as a transparent binary pipe. This switch
- may be required if a port other than 'http' is used.
- /SSL
- Make an secure private connection with SSL (only if SSL support
- is included in your version of Kermit). In this case the port
- name might need to be https rather than http, e.g. "set host
- secureserver.xyzcorp.com https /ssl".
- /TLS
- Make an secure private connection with TLS (only if TLS support
- is included in your version of Kermit). In this case the port
- name would be https rather than http.
- Then you can issue an HTTP command. In most cases, the server closes
- the connection when the command is complete. Example:
- SET HOST www.columbia.edu http
- IF FAIL EXIT 1 Can't contact server
- HTTP GET kermit/index.html
- At this point the connection is closed, since that's how HTTP 1.0
- works. If you want to perform additional operations, you must establish
- a new connection with another SET HOST command.
- The HTTP command acts as a client to the Web server, except instead of
- displaying the results like a Web browser would, it stores them. Any
- HTTP command can (but need not) include any or all of the following
- switches:
- /AGENT:user-agent
- Identifies the client to the server; "C-Kermit" or "Kermit-95"
- by default.
- /HEADER:header-line
- Used for specifying any optional headers. A list of headers is
- provided using braces for grouping:
- /HEADER:{{tag:value}{tag:value}...}
- For a listing of valid tag value and value formats seeRFC
- 1945: Hypertext Transfer Protocol -- HTTP/1.0. A maximum of
- eight headers may be specified.
- /USER:name
- In case a page requires a username for access.
- /PASSWORD:password
- In case a page requires a password for access.
- /ARRAY:arrayname
- Tells Kermit to store the response headers in the given array,
- one line per element. The array need not be declared in advance.
- Example:
- C-Kermit? http /array:c get kermit/index.html
- C-Kermit? show array c
- Dimension = 9
- 1. Date: Fri, 26 Nov 1999 23:12:22 GMT
- 2. Server: Apache/1.3.4 (Unix)
- 3. Last-Modified: Mon, 06 Sep 1999 22:35:58 GMT
- 4. ETag: "bc049-f72-37d441ce"
- 5. Accept-Ranges: bytes
- 6. Content-Length: 3954
- 7. Connection: close
- 8. Content-Type: text/html
- As you can see, the header lines are like MIME e-mail header lines:
- identifier, colon, value. The /ARRAY switch is the only method
- available to a script to process the server responses for a POST or PUT
- command.
- The HTTP commands are:
- HTTP [ switches ] GET remote-filename [ local-filename ]
- Retrieves the named file. If a local-filename is given, the file
- is stored locally under that name; otherwise it is stored with
- its own name.
- HTTP [ switches ] HEAD remote-filename local-filename
- Like GET except without actually getting the file; instead it
- gets only the headers, storing them into the given file, whose
- name must be given, one line per header item, as shown above in
- the /ARRAY: switch description.
- HTTP [ switches ] INDEX remote-directory [ local-filename ]
- Retrieves the file listing for the given server directory. NOTE:
- This command is not supported by most Web servers.
- HTTP [ switches ] POST [ /MIME-TYPE:type ] local-file remote-file
- Used to send a response as if it were sent from a form. The data
- to be posted must be read from a file.
- HTTP [ switches ] PUT [ /MIME-TYPE:type ] local-file remote-file
- Uploads a local file to a server file.
- HTTP [ switches ] DELETE remote-filename
- Instructs the server to delete the specified filename.
- 3. TERMINAL CONNECTION
- 3.1. CONNECT Command Switches
- The following switches (see Section 1.5) were added to the CONNECT
- command in 7.0:
- /QUIETLY
- Don't print the "Connecting to..." or "Back at..." messages. CQ
- is an invisible command synonym for CONNECT /QUIETLY.
- /TRIGGER:string
- Specify a trigger or triggers ( Section 3.2) effective for
- this CONNECT command only, temporarily overriding any current
- SET TERMINAL TRIGGER values ( Section 3.2).
- Note: Other switches might also be available; type "connect ?" for a
- list, "help connect" for a description of each.
- 3.2. Triggers
- Triggers were added for UNIX, VMS, AOS/VS, and K95 in C-Kermit 7.0.
- SET TERMINAL TRIGGER string
- Tells C-Kermit to look for the given string during all
- subsequent CONNECT sessions, and if seen, to return to command
- mode automatically, as if you had escaped back manually. If the
- string includes any spaces, you must enclose it in braces.
- Example:
- set terminal trigger {NO CARRIER}
- Comparisons are made after character-set translation.
- If a string is to include a literal brace character, precede it with a
- backslash:
- ; My modem always makes this noise when the connection is lost:
- set terminal trigger |||ppp\{\{\{\{UUUUUUU
- If you want Kermit to look for more than one string simultaneously, use
- the following syntax:
- set terminal trigger {{string1}{string2}...{stringn}}
- In this case, C-Kermit will return to command mode automatically if any
- of the given strings is encountered. Up to 8 strings may be specified.
- If the most recent return to command mode was caused by a trigger, the
- new variable, \v(trigger), shows the trigger value; otherwise
- \v(trigger) is empty.
- The SHOW TRIGGER command displays the SET TERMINAL TRIGGER values as
- well as the \v(trigger) value.
- 3.3. Transparent Printing
- As noted in the manual, C-Kermit's CONNECT command on UNIX is not a
- terminal emulator, but rather a "semitransparent pipe" between the
- terminal or emulator you are using to access C-Kermit, and the remote
- host to which C-Kermit is connected. The "semitransparent" qualifier is
- because of character-set translation as well as several actions taken
- by the emulator in response to the characters or strings that pass
- through it, such as APCs, Kermit packets (autodownload), triggers, etc.
- The UNIX version of C-Kermit 7.0 adds another such action: Transparent
- printing, also called Controller printing (as distinct from Autoprint
- or line or screen print). It is intended mainly for use on UNIX
- workstation consoles (as opposed to remote logins), but with some care
- can also be used when accessing C-Kermit remotely.
- Transparent printing is related to APC by sharing C-Kermit's built-in
- ANSI escape-sequence parser to detect "printer on" and "printer off"
- sequences from the host. When the printer-on sequence is received, all
- subsequent arriving characters -- including NUL, control characters,
- and escape sequences -- are sent to the SET PRINTER device instead of
- to your screen until the printer-off sequence is received, or you
- escape back, whichever happens first. These bytes are not translated or
- modified or filtered in any way by Kermit (except for possibly
- stripping of the 8th bit, as noted below), but if filtering or
- translation is desired, this can be accomplished by your SET PRINTER
- selection (e.g. by choosing a pipeline of filters).
- By default, your SET PRINTER device is your default UNIX printer, but
- it can also be a file, a command, or the null device (which causes all
- printer material to be discarded). SeeUsing C-Kermit, 2nd Ed.,
- p.41 for details.
- Transparent printing is controlled by the command:
- SET TERMINAL PRINT { ON, OFF }
- When ON, transparent-print sequences are obeyed, and printing
- occurs on the system where C-Kermit is running. When OFF,
- transparent print sequences are ignored and passed through to
- your actual terminal or emulator, along with the data they
- enclose. OFF is the default, for compatibility with earlier
- C-Kermit releases. As noted in the manual, when the current SET
- PRINTER device is a file, transparent-print material is appended
- to it; the file is not overwritten.
- SET TERMINAL BYTESIZE { 7, 8 }
- SET PARITY { EVEN, ODD, MARK, SPACE, NONE }
- If the terminal bytesize is 7, or PARITY is not NONE, the 8th
- bit of each byte is stripped prior to printing.
- The transparent-print escape sequences are:
- <ESC>[5i
- Printer On. Send all subsequent incoming bytes to the printer
- without any kind of filtering, translation, or alteration. Note:
- <ESC> stands for ASCII character number 27 (decimal), Escape.
- <ESC>[4i
- Printer Off. Resume displaying incoming bytes on the screen.
- These are the same sequences used by DEC VT100 and higher terminals and
- other ANSI X3.64 and ISO 6429 compatible terminals. There is no
- provision for selecting other printer-control sequences.
- Restrictions:
- 1. You must SET TERM TRANSPARENT-PRINT ON before you can use this
- feature.
- 2. Only the 7-bit forms of the escape sequences are supported. The
- 8-bit CSI C1 control is not recognized.
- 3. Autoprint is not supported, since this requires a full-fledged
- terminal emulator with direct access to the screen.
- 4. The start-print and stop-print sequences pass through to the screen
- (there is no way to avoid this without causing unacceptable delays
- or deadlocks in CONNECT mode). Thus if your terminal or emulator
- also supports transparent printing via these same sequences, an
- empty file will be sent to its printer. Normally this has no
- effect.
- Point (4) is similar to the situation with autodownload and APC -- when
- you have several Kermit clients in a chain, you should take care that
- these features are enabled in only one of them.
- Example 1:
- set printer {|lpr -Plaser} ; Specify the printer (if not default).
- set term print on ; Enable transparent printing.
- set term byte 8 ; Enable 8-bit characters.
- connect ; Enter CONNECT mode.
- Example 2:
- set printer /home/users/olga/printer.log ; Send printer material to a file.
- Example 3:
- set printer {| grep -v ^Received | lpr} ; Filter out some lines
- Then use "pcprint" or "vtprint" commands on the host to initiate
- transparent print operations. SeeUsing C-Kermit, 2nd Ed., p.406
- for details.
- Here is a sample "pcprint" shell script for UNIX:
- #!/bin/sh
- echo -n '<ESC>[5i'
- if [ $# -eq 0 ]; then
- cat
- else
- cat $*
- fi
- echo -n '<FF><ESC>[4i'
- # (end)
- (Replace "<ESC>" by the actual ASCII Escape character and "<FF>" by the
- ASCII Formfeed character).
- If you always want transparent printing enabled, put "set term print
- on" in your C-Kermit customization file (~/.mykermrc in UNIX). The "set
- term bytesize" selection, however, is a property of each separate
- connection.
- 3.4. Binary and Text Session Logs
- C-Kermit 7.0 corrects an oversight in earlier releases, in which binary
- session logs (SET SESSION-LOG BINARY) translated character sets and
- performed various formatting transformations (e.g. "newline mode")
- before writing characters to the session log. In C-Kermit 7.0,
- binary-mode session logging writes characters as they come in, before
- anything (other that parity-bit stripping) is done to them. Text-mode
- session logging records the characters after processing.
- 4. FILE TRANSFER
- Every file is transferred either in text mode (which implies
- record-format and character-set translation) or binary mode (in which
- each byte is sent literally without any kind of conversion). The mode
- in which a file is transferred is controlled by (a) the default mode,
- in the absence of any other indications; (b) the SET FILE TYPE command;
- (c) various automatic mechanisms based on client/server negotiations,
- directory information or filename patterns, etc.
- The default FILE TYPE was changed from TEXT to BINARY in C-Kermit 7.0
- because:
- * Transferring a text file in binary mode does less damage than
- transferring a binary file in text mode.
- * Only binary-mode transfers can be recovered from the point of
- failure.
- * The automatic transfer-mode mechanisms switch to text mode on a
- per-file basis anyway, so only those files that are not covered by
- the automatic mechanisms are affected.
- * All file transfers on the Web are done in binary mode, so people
- are accustomed to it and expect it.
- 4.0. BUG FIXES, MINOR CHANGES, AND CLARIFICATIONS
- 4.0.0. Filenames with Spaces
- Filenames that contain spaces are a major nuisance to a program like
- Kermit, whose command language is line- and word-oriented, in which
- words are separated by spaces and a filename is assumed to be a "word".
- In general (unless noted otherwise in the description of a particular
- command), there is only one way to refer to such files in Kermit
- commands, and that is to enclose the name in braces:
- send {this file}
- Tells Kermit to send the file whose name is "this file" (two words, no
- quotes). Of course, various circumlocutions are also possible, such as:
- define \%a this file
- send \%a
- BUT, perhaps contrary to expectation, you can't use "\32" to represent
- the space:
- send this\32file
- does not work. Why? Because the Kermit parser, which must work on many
- operating systems including Windows, has no way of knowing what you
- mean by "this\32file". Do you mean a file whose name is "this file" in
- the current directory? Or do you mean a file whose name is "32file" in
- the "this" subdirectory of the current directory? Guessing won't do
- here; Kermit must behave consistently and deterministically in all
- cases on all platforms.
- Note that you can't use Esc or Tab within {...} for filename
- completion, or question mark to get a filename list. However, you can
- include wildcards; for example:
- send {* *}
- sends all files whose name contains a space.
- All things considered, it is best to avoid spaces in file and directory
- names if you can. Also see Section 5.4 on this topic.
- 4.0.1. Packet out of Window
- C-Kermit 6.0 could send packets "out of window" if the window size was
- greater than 1 and ACKs had arrived out of order. Fixed in 6.1.
- 4.0.2. MOVE after ADD SEND-LIST
- ADD SEND-LIST followed by MOVE did not delete original files; fixed in
- 6.1. Carrier loss was not detected during transfer; in 7.0 C-Kermit
- checks for this (but results can not be guaranteed). In any case, the
- protocol will eventually time out if the connection is lost.
- 4.0.3. GET and RECEIVE As-Names
- In 5A(190) through 6.0.192, the GET and RECEIVE as-name did not
- properly override the RECEIVE PATHNAMES setting. In 7.0 it does.
- 4.0.4. New Brief Statistics Listing
- Version 7.0 adds a /BRIEF switch to the STATISTICS command, to display
- a short file-transfer statistics report. /BRIEF is now the default. Use
- /VERBOSE to see the full display, which is about 25 lines long.
- 4.0.5. Improved FAST Command
- The preinstalled definition of the FAST macro did not take enough
- factors into account. Now it sets packet lengths and window sizes
- appropriate to the configuration. Furthermore, in IRIX only, it might
- restrict the SEND packet length to 4000, to work around a bug in the
- IRIX Telnet server, depending on the IRIX version (seeckubwr.txt,
- IRIX section). To see the built-in definition of the FAST macro, type
- "show macro fast". To change it, simply define it to be whatever you
- want -- it's just a macro, like any other.
- 4.0.6. The SET SEND BACKUP Command
- Version 7.0 adds SET SEND BACKUP { ON, OFF }. This tells whether backup
- files should be sent. Backup files are the ones created by Kermit (and
- EMACS, and possibly other applications) to preserve old copies of files
- when creating new ones with the same name. Kermit does this when
- receiving a file and its FILE COLLISION setting is BACKUP (or RENAME,
- in which case it the new file gets the backup name). On most platforms,
- the backup name is formed by adding:
- .~n~
- to the end of the filename, where "n" is a number. For example, if the
- original file is oofa.txt, a backup file might be called:
- oofa.txt.~1~
- (or oofa.txt.~2~, etc). If you SET SEND BACKUP OFF, this tells Kermit
- not to send files that have backup names. Normally, SET SEND BACKUP is
- ON (as shown by SHOW PROTOCOL), and backup files are sent if their
- names match the SEND file specification.
- Also see PURGE, SET FILE COLLISION, SEND /NOBACKUP, DIRECTORY
- /[NO]BACKUP.
- 4.0.7. The SET { SEND, RECEIVE } VERSION-NUMBERS Command
- VMS Only. Normally when sending files, VMS C-Kermit strips the version
- number. For example, if the file is FOO.BAR;34, the name is sent as
- FOO.BAR (without the ";34"). If you want to keep version numbers on
- when sending files, use SET SEND VERSION-NUMBERS ON. The effect depends
- on the receiver.
- Normally when receiving files, and an incoming filename includes a
- VMS-style version number (such as FOO.BAR;34) VMS C-Kermit strips it
- before trying to create the new file; this way the new file receives
- the next highest version number in the customary manner for VMS. If you
- want version numbers on incoming filenames to be used in creating the
- new files, use SET RECEIVE VERSION-NUMBERS ON.
- Normally these commands would be effective only when VMS C-Kermit is
- exchanging files with a non-VMS Kermit program, since VMS-to-VMS
- transfers use labeled mode unless you have gone out of your way to
- defeat it.
- Example: You want to send all versions of all files in the current
- directory from a VMS C-Kermit client to a UNIX C-Kermit server. Use:
- set send version-numbers on
- send *.*;*
- The resulting Unix files will have VMS-style version numbers as part of
- their name, for example "foo.bar;1", "foo.bar;2", etc.
- Now suppose you want to send these files from Unix to another VMS
- system and preserve the version numbers. Again we have a Unix C-Kermit
- server and VMS C-Kermit client. Give these commands to the client:
- set receive version-numbers on
- get *
- 4.0.8. The SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } Commands
- These commands are persistent global versions of the /MOVE-TO: and
- /RENAME-TO: switches of the SEND, GET, and RECEIVE commands. They
- should normally be used only when setting up a dedicated
- transaction-processing application, in which each file is to be moved
- or renamed immediately after, and only if, it is transferred
- successfully, so that (for example) an independent, concurrent process
- can notice when new files appear and process them immediately without
- having to guess whether they are complete.
- 4.0.9. SET FILE INCOMPLETE AUTO
- SET FILE INCOMPLETE { KEEP, DISCARD }, which tells whether to keep or
- discard incompletely received files, has a new option, AUTO, which is
- also the default. It means KEEP the incomplete file if the transfer is
- in binary mode, otherwise DISCARD it. This reduces the chances that a
- subsequent recovery operation (RESEND, REGET, etc) could produce a
- corrupt file, since recovery works only for binary-mode transfers.
- 4.1. FILE-TRANSFER FILENAME TEMPLATES
- File-transfer filename templates allow files to be renamed
- automatically by the file sender, the receiver, or both, during
- transfer of groups of files.
- 4.1.1. Templates in the As-Name
- Prior to C-Kermit 6.1 and Kermit 95 1.1.12 the only options that could
- be used to affect the names of files being transferred were SET
- FILENAMES { LITERAL, CONVERTED } and SET { SEND, RECEIVE } PATHNAMES {
- ON, OFF }, plus the "as-name" feature of the SEND (MOVE, etc) and
- RECEIVE commands.
- Previously, the as-name could be used only for a single file. For
- example:
- SEND FOO BAR
- would send the file FOO under the name BAR, but:
- SEND *.TXT anything
- was not allowed, since it would give the same name to each file that
- was sent. When receiving:
- RECEIVE FOO
- would rename the first incoming file to FOO before storing it on the
- disk, but subsequent files would not be renamed to FOO, since this
- would result in overwriting the same file repeatedly. Instead, they
- were stored under the names they arrived with.
- Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to
- specify as-names in SEND, RECEIVE, and related commands even for file
- groups. This is accomplished by using replacement variables in the
- as-name, along with optional material such character-string functions
- and/or constant strings. An as-name containing replacement variables is
- called a filename template.
- The key to filename templates is the new variable:
- \v(filename)
- During file transfer it is replaced by the name of each file currently
- being transferred (after transfer, it is the name of the last file
- transferred).
- So, for example:
- send *.txt \v(filename).new
- sends each file with its own name, but with ".new" appended to it. Of
- course if the name already contains periods, this could confuse the
- file receiver, so you can also achieve fancier effects with
- constructions like:
- send *.txt \freplace(\v(filename),.,_).new
- which replaces all periods in the original filename by underscores, and
- then appends ".new" to the result. So, for example, oofa.txt would be
- sent as oofa_txt.new.
- Another new variable that is useful in this regard is \v(filenumber),
- which is the ordinal number of the current file in the file group, so
- you can also:
- send *.txt FILE\flpad(\v(filenum),2,0)
- resulting in a series of files called FILE00, FILE01, FILE02, etc. (At
- the end of the transfer, \v(filenum) tells the number of files that
- were transferred).
- If you specify a constant as-name when sending a file group:
- send *.txt thisnameonly
- Kermit complains and asks you to include replacement variables in the
- as-name. You should generally use \v(filename) or \v(filenumber) for
- this purpose, since other variables (with the possible exception of
- date/time related variables) do not change from one file to the next.
- But Kermit accepts any as-name at all that contains any kind of
- variables for file group, even if the variable will not change. So:
- send *.txt \%a
- is accepted, but all files are sent with the same name (the value of
- \%a, if it has one and it is constant). If the variable has no value at
- all, the files are sent under their own names.
- Of course, the value of \%a in the previous example need not be
- constant:
- define \%a FILE\flpad(\v(filenum),2,0)_at_\v(time)
- send *.txt \%a
- The RECEIVE command, when given without an as-name, behaves as always,
- storing all incoming files under the names they arrive with, subject to
- SET FILE NAME and SET RECEIVE PATHNAMES modifications (Section
- 4.10).
- However, when an as-name is given in the RECEIVE command, it is applied
- to all incoming files rather than to just the first. If it does not
- contain replacement variables, then the current FILE COLLISION setting
- governs the result. For example:
- receive foo
- will result in incoming files named foo, foo.~1~, foo.~2~, and so on,
- with the default FILE COLLISION setting of BACKUP. If it does contain
- replacement variables, of course they are used.
- When receiving files, the \v(filename) variable refers to the name that
- was received in the incoming file-header packet, BEFORE any processing
- by SET FILE NAMES or SET RECEIVE PATHNAMES. Since the filenames in
- file-header packets are usually in uppercase, you would need to convert
- them explicitly if you want them in lowercase, e.g.:
- receive \flower(\v(filename)).new
- 4.1.2. Templates on the Command Line
- On the command-line, use templates as shown above as the -a option
- argument, bearing in mind the propensity of UNIX and perhaps other
- shells to treat backslash as a shell escape character. So in UNIX (for
- example):
- kermit -s oofa.* -a x.\\v(filenum)
- By the way, this represents a change from 6.0 and earlier releases in
- which the as-name (-a argument or otherwise) was not evaluated by the
- command parser. Thus, for example, in VMS (where the shell does not
- care about backslashes), it was possible to:
- kermit -s oofa.txt -a c:\tmp\oofa.txt
- Now backslashes in the as-name must be quoted not only for the shell
- (if necessary) but also for Kermit itself:
- kermit -s oofa.txt -a c:\\tmp\\oofa.txt ; Kermit only
- kermit -s oofa.txt -a c:\\\\tmp\\\\oofa.txt ; Shell and Kermit
- You can also use the \fliteral() function for this:
- kermit -s oofa.txt -a \fliteral(c:\tmp\oofa.txt) ; Kermit only
- kermit -s oofa.txt -a \\fliteral(c:\\tmp\\oofa.txt) ; Shell and Kermit
- 4.1.3. Post-Transfer Renaming
- Filename templates are now also useful in SET { SEND, RECEIVE }
- RENAME-TO and in the /RENAME-TO: switch, that can be given to the SEND,
- GET, or RECEIVE commands; this is similar to an as-name, but is
- effective on a per-file basis if and only if the file was transferred
- successfully.
- MOVE-TO and RENAME-TO address a requirement commonly stated for
- transaction processing and similar systems. Suppose, for example, a
- central system "X" accepts connections from multiple clients
- simultaneously; a process on X waits for a file to appear and then
- processes the file. This process must have a way of knowing when the
- file has been completely and successfully transferred before it starts
- to process it. This can be accomplished easily using C-Kermit's SET {
- SEND, RECEIVE } { MOVE-TO, RENAME-TO } command or /MOVE-TO: or
- /RENAME-TO: switches, described inSections 4.7.1 through
- 4.7.3.
- Here's an example for the client side, in which files to be sent are
- placed in a certain directory (/usr/olga/tosend in this example) by
- another process when they are ready to go. This might be in a hospital
- or big doctor's office, where medical insurance claims are entered at a
- number of workstations, and then deposited in the "tosend" directory,
- from which they are sent to a claims clearinghouse. We assume the
- connection is already made and a Kermit server is on the other end.
- local srcdir findir ; Declare local (automatic) variables
- assign srcdir /usr/olga/tosend ; Local source directory (files to send)
- assign findir /usr/olga/sent ; Where to move files after they are sent
- log transactions ; Keep a log of transfers
- cd \m(srcdir) ; Change to the source directory
- while true { ; Loop forever...
- send /move-to:\m(findir) * ; Send all files
- sleep 60 ; Sleep a minute
- } ; Go back and do it again
- Note how simple this is. Once each file is sent, it is moved so it
- won't be sent again (you could also use SEND /RENAME-TO: or even SEND
- /DELETE). If a transfer fails, the file is not moved and so we try
- again to send it next time around. If there are no files to send, the
- SEND command does nothing but a message is printed; you can avoid the
- message by checking first to see if any files are in the directory:
- while true { ; Loop forever...
- if > \ffiles(*) 0 - ; If there are any files
- send /move-to:\m(findir) * ; send them.
- sleep 60 ; Sleep a minute.
- } ; Go back and do it again.
- It's even simpler on the server side (here again we assume the
- connection is already in place):
- local rcvdir findir ; Declare local (automatic) variables
- assign rcvdir /usr/ivan/tmp ; Temporary receiving directory
- assign findir /usr/ivan/new ; Where to move files after reception
- log transactions ; Keep a log of transfers
- cd \m(rcvdir) ; Change to the source directory
- set receive move-to \m(findir) ; Declare move-to directory.
- server ; Enter server mode.
- A separate process (e.g. the medical claim-form decoder) can look for
- files appearing in the /usr/ivan/new directory and process them with
- every confidence that they have been completely received.
- Note that the use of MOVE-TO can result in moved files overwriting one
- another (the application would normally avoid this by assigning each
- transaction a unique, e.g. based on customer number and claim number).
- But if filename collisions are a possibility in your application,
- RENAME-TO might be a better choice; you can use any variables you like
- in the template to ensure uniqueness of the RENAME-TO filename; for
- example:
- SET RECEIVE RENAME-TO \v(filename)_\v(ndate)_\v(ntime)_\v(userid)_\v(pid)
- 4.2. FILE-TRANSFER PIPES AND FILTERS
- 4.2.1. INTRODUCTION
- Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to send
- from a command, or "pipe", as well as from a file, and to receive to a
- pipe or command. In a typical example, we might want to transfer an
- entire directory tree from one UNIX system to another (but without
- using the methods described inSections 4.3 ,4.10,
- 4.11, and4.15). We could do this in multiple steps as
- follows:
- 1. Create a tar archive of the desired directory tree
- 2. Compress the tar archive
- 3. Transfer it in binary mode to the other computer
- 4. Decompress it
- 5. Extract the directory tree from the tar archive
- But this is inconvenient and it requires a temporary file, which might
- be larger than we have room for.
- The new pipe-transfer feature lets you do such things in a single step,
- and without intermediate files.
- Additional new features, also discussed here, let you specify pre- and
- post- processing filters for outbound and incoming files, and give you
- a way to insert the output from shell or system commands into C-Kermit
- commands.
- The file-transfer related features are available only with Kermit
- protocol, not with any external protocols, nor with K95's built-in
- XYZMODEM protocols (because XYZMODEM recovers from transmission errors
- by rewinding the source file, and you can't rewind a pipe).
- This section begins by discussing the simple and straightforward use of
- these features in UNIX, in which pipes and input/output redirection are
- a fundamental component and therefore "just work", and then goes on to
- discuss their operation in Windows and OS/2, where matters are much
- more complicated.
- 4.2.1.1. TERMINOLOGY
- Standard Input
- This is a precise technical term denoting the normal source of
- input for a command or program, which is the keyboard of your
- terminal by default, but which can be redirected to a file or
- pipe.
- Stdin
- Abbreviation for Standard Input.
- Standard Output
- A precise technical term denoting the normal destination for
- output from a command or program, which is your terminal screen
- by default, but which can be redirected to a file.
- Stdout
- Abbreviation for Standard Output.
- Stdio
- Abbreviation for Standard Input / Standard Output.
- I/O
- Abbreviation for Input / Output.
- Shell
- Text-based system command processor, such as the UNIX shell, DOS
- COMMAND.COM, etc.
- Pipe
- A mechanism by which the standard output of one program is sent
- to the standard input of another.
- Pipeline
- A series of programs connected by pipes.
- 4.2.1.2. NOTATION
- In command descriptions, "command" is replaced by a shell or system
- command or pipeline. The command names specified in these commands are
- interpreted by your shell, just as if you were typing them at the shell
- prompt, and so if they are in your PATH, they will be found in the
- expected manner. Therefore you don't have to specify complete pathnames
- for commands that are programs (but it shouldn't hurt if you do).
- The normal notation for I/O redirection is as follows:
- < Read Stdin from the given file.
- > Send Stdout to the given file.
- | Send Stdout from the command on the left to the command on the right.
- Examples:
- sort < foo > bar
- Sorts the lines in file "foo" and writes the results to file
- "bar"
- grep -c "some text" *.txt | grep -v ":0" | sort | pr -3 | lpr
- This is a command pipeline composed of 5 commands:
- grep -c "some text" *.txt
- Looks in all files whose names end with ".txt" for the string
- "some text" and writes to Stdout the names of each file followed
- by a colon and the number of occurrences in each.
- grep -v ":0"
- Prints to Stdout the lines from Stdin that do NOT contain the
- string ":0", in this case, it removes the names of files that do
- not contain "some text".
- sort
- Sorts the lines from Stdin alphabetically to Stdout.
- pr -3
- Arranges the lines from Stdin in three columns.
- lpr
- Prints its Stdin on the default printer.
- Note that the Kermit features described here work only with commands
- that use Stdio. If you attempt to use them with commands whose input
- and output can not be redirected, Kermit will most likely get stuck.
- Kermit has no way of telling how an external command works, nor what
- the syntax of the shell is, so it's up to you to make sure you use
- these features only with redirectable commands.
- The quoting rules of your shell apply to the command. Thus in UNIX,
- where C-Kermit tries to use your preferred shell for running commands,
- shell "metacharacters" within commands must be escaped if they are to
- be taken literally, using the methods normal for your shell. For
- example, the UNIX tr (translate) command must have its arguments in
- quotes:
- tr "[a-z]" "[A-Z]"
- otherwise the shell is likely to replace them by all filenames that
- match, which is probably not what you want. This is also true when
- using your shell directly, and has nothing to do with Kermit.
- 4.2.1.3. SECURITY
- Some sites might not wish to allow access to system commands or
- external programs from within Kermit. Such access, including all the
- features described here, can be disabled in various ways:
- 1. When building from source code, include -DNOPUSH among the CFLAGS.
- 2. At runtime, give the NOPUSH command.
- 3. For server mode, give the DISABLE HOST command.
- 4. Implicit use of pipes can be disabled as described inSection
- 4.2.4.
- Note: 3 and 4 are not necessary if you have done 1 or 2.
- 4.2.2. Commands for Transferring from and to Pipes
- SEND /COMMAND sends data from a command or command pipeline, and
- RECEIVE /COMMENT writes data to a command or pipeline. The GET /COMMAND
- command asks a server to send material, and then writes the incoming
- material to a command or pipeline. These features, along with switches
- (like "/COMMAND", described in Section 4.7) are new to C-Kermit
- 6.1. The following synonyms are also provided:
- CSEND = SEND /COMMAND
- CRECEIVE = RECEIVE /COMMAND
- CGET = GET /COMMAND
- None of these commands can be used if a SEND or RECEIVE FILTER
- (respectively, Section 4.2.3) is in effect, or if a NOPUSH command
- ( Section 4.2.1.3) has been given, or if the current protocol is
- not Kermit.
- 4.2.2.1. Sending from a Command
- SEND /COMMAND command [ as-name ]
- SEND /AS-NAME:as-name /COMMAND command
- CSEND command [ as-name ]
- These three forms are the same. They work like the SEND command,
- but instead of sending a file, it sends the standard output of
- the given command, either under the command's own name, or else
- with the given as-name. If the command contains spaces, it must
- be enclosed in braces. Braces should also be used for the
- as-name if it contains spaces. If braces are included around
- either the command or the as-name, they are removed after
- parsing but before use. As with SEND, the transfer is in text or
- binary mode according the current FILE TYPE setting, unless you
- override the global transfer mode by including a /TEXT or
- /BINARY switch. The command must require no input.
- When sending from a command or pipeline, C-Kermit has no way of knowing
- in advance how much data will be sent, and so it can not send the size
- to the other Kermit in the Attribute packet, and so the receiving
- Kermit has no way of displaying "percent done" or a progress bar
- (thermometer).
- Examples that make sense in text mode (illustrated by common UNIX
- commands):
- SEND /COMMAND finger
- CSEND finger
- sends the current "finger" listing (who's logged in) under the
- name "finger". The two forms "send /command" and "csend" are
- equivalent; we won't bother showing them both in the rest of the
- examples.
- SEND /COMMAND:{finger}
- CSEND {finger}
- Same as previous example (braces are removed from "{finger}").
- SEND /COMMAND:{ finger }
- CSEND { finger }
- Same as previous example, but note that the spaces are kept.
- This does not prevent the shell from running the "finger"
- program, but its output is sent under the name " finger " (with
- a leading and trailing space).
- SEND /COMMAND:finger /AS-NAME:userlist
- CSEND finger userlist
- sends the current finger listing under the name "userlist".
- SEND /COMMAND:{finger | sort -r} /AS-NAME:userlist
- CSEND {finger | sort -r} userlist
- sends the current finger listing, sorted in reverse order, under
- the name "userlist". The braces are needed to distinguish the
- command from the as-name.
- SEND /COMMAND:{finger | sort -r} /AS-NAME:{userlist}
- CSEND {finger | sort -r} {userlist}
- Same as previous example (braces are removed from "{userlist}").
- SEND /COMMAND:{finger | sort -r}
- /AS-NAME:{\freplace(\v(filename),\32,_)}
- CSEND {finger | sort -r} {\freplace(\v(filename),\32,_)}
- Like the previous example, but sends the output of the command
- under the name of the command, but with all spaces (\32)
- replaced by underscores, so the as-name is "finger_|_sort_-r".
- Examples that make sense in binary mode (three equivalent forms are
- shown):
- SEND /COMMAND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
- SEND /COMMAND /BINARY /AS-NAME:mydir.tar.gz {tar cf - . | gzip -c}
- CSEND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
- Makes a tar archive of the current directory, compresses it with
- the GNU gzip program, and sends it as "mydir.tar.gz". The other
- Kermit can, of course, just store it as a file, or it can use
- CRECEIVE to uncompress and dearchive it as part of the transfer
- process.
- When using a "pipeline" of commands in the command field, obviously,
- the first command must not require any input, and the last command
- should produce some output, and all intermediate commands should get
- some input and produce some output.
- 4.2.2.2. Receiving to a Command
- RECEIVE /COMMAND command
- CRECEIVE command
- This is like RECEIVE, except incoming material is written to the
- standard input of the given command, in text or binary mode
- according to the normal rules for file reception. Be sure to
- include a redirector to a file (if the command normally writes
- to standard output), or the output of the command won't go
- anywhere. The command may contain spaces; braces are not needed,
- but they are removed if used.
- WARNING: C-Kermit has no way of knowing anything about the command, or
- even whether it is a command. Thus this command will always cause
- C-Kermit to enter protocol mode, as long as some text is specified in
- the command field. However, if the text does not correspond to a
- command, the transfer will eventually fail with a message such as
- "Error writing data" or "Failure to close file".
- Examples for text mode (in UNIX):
- RECEIVE /COMMAND sort -r > reverse.txt
- CRECEIVE sort -r > reverse.txt
- The text that is received is sorted in reverse order and stored
- in the file "reverse.txt". The two forms shown are equivalent.
- RECEIVE /COMMAND {sort -r > reverse.txt}
- CRECEIVE {sort -r > reverse.txt}
- The same as the previous example; if braces are included, they
- are simply removed.
- RECEIVE /COMMAND {sort -r > \flower(\v(filename)).reverse}
- CRECEIVE {sort -r > \flower(\v(filename)).reverse}
- Same but stores result under the incoming filename, lowercased,
- and with ".reverse" appended to it.
- RECEIVE /COMMAND sort
- CRECEIVE sort
- Does nothing useful, since the output of sort has nowhere to go.
- RECEIVE /COMMAND sort -r | pr -3 | lpr -Plaserjet
- CRECEIVE sort -r | pr -3 | lpr -Plaserjet
- The text that is received is sorted in reverse order, arranged
- into three columns, and sent to the "laserjet" printer.
- Examples for binary mode:
- RECEIVE /COMMAND:{gunzip -c | tar xf -}
- CRECEIVE {gunzip -c | tar xf -}
- Assuming the data that is received is a compressed tar archive,
- uncompresses the archive and passes it to tar for extraction. In
- this case the braces are needed because otherwise the final "-"
- would be taken as a command continuation character (see
- Using C-Kermit, 2nd Edition, p.33).
- GET /COMMAND remote-file command
- GET /COMMAND /AS-NAME:command remote-file
- CGET remote-file command
- This command tells the Kermit client to send a GET request for
- the given remote file to a Kermit server. Unlike GET, however,
- the incoming material is written to a command, rather than to a
- file. If the remote-file or the command contain spaces, they
- must be enclosed in braces. The same cautions about the command
- apply as for CRECEIVE.
- Examples (for UNIX):
- GET /COMMAND oofa.txt sort -r > oofa.new
- GET /COMMAND {oofa.txt} {sort -r > oofa.new}
- CGET oofa.txt sort -r > oofa.new
- CGET {oofa.txt} {sort -r > oofa.new}
- These four are equivalent. Each of them requests the server to
- send its "oofa.txt" file, and as it arrives, it is sorted in
- reverse order and written to "oofa.new".
- GET /COMMAND {profile exec a} lpr
- GET /COMMAND {profile exec a} {lpr}
- GET /COMMAND /AS-NAME:lpr {profile exec a}
- GET /COMMAND /AS-NAME:{lpr} {profile exec a}
- GET /COMMAND /AS:lpr {profile exec a}
- CGET {profile exec a} lpr
- CGET {profile exec a} {lpr}
- Here the remote filename contains spaces so it MUST be enclosed
- in braces. As it arrives it is sent to the lpr program for
- printing. Braces are optional around "lpr" since it contains no
- spaces.
- GET /COMMAND *.txt {cat >> new.txt}
- GET /AS-NAME:{cat >> new.txt} /COMMAND *.txt
- CGET *.txt {cat >> new.txt}
- This gets all the ".txt" files from the server and concatenates
- them all into a single "new.txt" file on the client.
- GET /COMMAND *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
- CGET *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
- As above, but inserts each file's name before its contents.
- 4.2.3. Using File-Transfer Filters
- The commands described in Section 4.2.2 let you send the output of
- a command, or receive data into a command. But what if you want to
- specify preprocessing for files that you send, or postprocessing of
- files that you receive, even when multiple files are involved? For this
- you need a way to specify send and receive filters. The commands are
- SET SEND FILTER and SET RECEIVE FILTER; SHOW PROTOCOL displays the
- current settings.
- 4.2.3.1. The SEND Filter
- SET SEND FILTER [ command ]
- This command specifies a command to be run on any file that you
- SEND (or MOVE, MSEND, etc). It also applies to files sent when
- in server mode, in response to GET commands, but not to the
- results of REMOTE commands like REMOTE DIRECTORY, REMOTE TYPE,
- REMOTE HOST, etc. The command may be, but need not be, enclosed
- in braces; if it is, the braces are stripped before use. The
- output of this command is sent, rather than the file itself. The
- current FILE TYPE setting (TEXT or BINARY) applies to the output
- of the command. The command must contain at least one instance
- of \v(filename), for which the name of the actual file is
- substituted. If the command is omitted, the send filter is
- removed and files are sent in the normal manner.
- The SET SEND FILTER sets up a "global" filter -- that is, one that
- applies to all subsequent file-sending commands until you change or
- remove it. You can also specify a "local" filter to be used in a
- specific file-sending command by using the /FILTER switch (see
- Section 1.5); for example:
- SEND /FILTER:command [ other-switches ] filename
- Besides \v(filename), you can include any other script programming
- notation in the send filter: variable names, array references, calls to
- built-in string or other functions, and so on. These are evaluated
- during file transfer, NOT during parsing, and they are evaluated
- separately for each file.
- When the SEND or MOVE (SEND /DELETE) command is used with a send
- filter, the output from the filter is sent under the file's original
- name unless you specify an "as-name" or template. The Attribute packet
- (if any) contains the original file's attributes (size, creation date,
- etc). So (for example) if the filter changes the file's size, the
- progress thermometer might be wrong. (We can't send the size of the
- output from the filter, because it is not known until the transfer is
- finished.) If you prefer that the size not be sent, use "set attributes
- size off".
- You can not use send filters with RESEND (SEND /RECOVER) or PSEND (SEND
- /START).
- Examples for text mode:
- SET SEND FILTER sort -r \v(filename) ; Braces may be omitted
- SET SEND FILTER {sort -r \v(filename)} ; Braces may be included
- SEND *.txt
- This sends every file in the current directory whose name ends
- with ".txt" under its own name, but with its lines sorted in
- reverse order.
- SEND /FILTER:{sort -r \v(filename)} *.txt
- Same as above, but the filter applies only to this SEND command.
- Braces are required in this case.
- SET SEND FILTER {sort -r \v(filename)}
- SEND oofa.txt reverse.txt
- Sends the oofa.txt file with its lines sorted in reverse order
- under the name "reverse.txt".
- SET SEND FILTER {sort -r \v(filename)}
- SEND oofa.* \v(filename).reverse
- Sends all the oofa.* files with their lines sorted in reverse
- order; each file is sent under its own name but with ".reverse"
- appended to it.
- SET SEND FILTER {tr "[a-z]" "[A-Z]" < \v(filename)}
- SEND *.txt
- Sends all ".txt" files under their own names, but uppercasing
- their contents.
- Note that the SEND FILTER applies not only to files that are sent with
- SEND, MOVE, MSEND, etc, but also to files sent by the C-Kermit server
- in response to GET requests.
- Examples for binary mode:
- SET SEND FILTER {gzip -c \v(filename)}
- SEND /BINARY oofa.txt oofa.txt.gz
- Sends the oofa.txt file, compressed by gzip, as oofa.txt.gz.
- SEND /BINARY /FILTER:{gzip -c \v(filename)} oofa.txt oofa.txt.gz
- As above, but the filter applies only to this SEND command.
- SET SEND FILTER {gzip -c \v(filename)}
- SEND /BINARY oofa.* \fupper(\replace(\v(filename),.,_)).GZ
- Sends all the oofa.* files, compressed by gzip, each under its
- own name, but with the name uppercased, all periods within the
- name converted to underscores, and ".GZ" appended to it. So, for
- example, "oofa.txt" is sent as "OOFA_TXT.GZ".
- In the gzip examples, note that the amount of data that is sent is
- normally less than the original file size because gzip compresses the
- file. But Kermit sends the original file size ahead in the attribute
- packet anyway (unless you tell it not too). Thus the transfer will
- probably appear to terminate early, e.g. when the receiver's
- file-transfer display thermometer is only at 40%. If this annoys you,
- tell Kermit to "set attribute length off". On the other hand, you can
- use the final position of the thermometer as a measure of the
- effectiveness of compression.
- 4.2.3.2. The RECEIVE Filter
- SET RECEIVE FILTER [ command ]
- This command specifies that the given command will be run on any
- file that is received before it is written to disk. The command
- may be, but need not be, enclosed in braces; if it is the braces
- are stripped before use. The following two commands are
- equivalent:
- SET RECEIVE FILTER sort -r > \v(filename)
- SET RECEIVE FILTER {sort -r > \v(filename)}
- The RECEIVE filter command may contain a "\v(filename)" sequence to be
- replaced by the incoming filename from the file header packet, but it
- is not required. However you must use it whenever your filter would
- normally write to Stdout, otherwise its output will be lost.
- The RECEIVE filter command may contain one or more "\v(filename)"
- sequence to be replaced by the incoming filename from the file header
- packet, but it is not required. However you must use it whenever your
- filter would normally write to Stdout, otherwise its output will be
- lost.
- RECEIVE /FILTER:command and GET /FILTER:command can also be used to
- specify a filter to be used for only one file-transfer operation.
- UNIX examples for text mode:
- SET RECEIVE FILTER lpr
- RECEIVE
- All the files that are received are sent to the default UNIX
- print spooler.
- RECEIVE /FILTER:lpr
- Same as above, except the lpr filter is used only with this
- RECEIVE command.
- RECEIVE lpr
- This is probably not what you want; it creates a file called
- lpr.
- SET RECEIVE FILTER {sort -r > \v(filename)}
- RECEIVE
- Stores each incoming file with its lines sorted in reverse
- order, under its own name.
- RECEIVE /FILTER:{sort -r > \v(filename)}
- As above, but the filter is used only for this RECEIVE command.
- SET RECEIVE FILTER sort -r > \v(filename)
- RECEIVE reverse.txt
- Stores each incoming file with its lines sorted in reverse
- order, under the name "reverse.txt". The actual result depends
- on the FILE COLLISION setting. If it is OVERWRITE and multiple
- files arrive, then each incoming file destroys the previous one.
- If it is BACKUP (the default), filename conflicts are resolve by
- adding "version numbers" to the filenames: reverse.txt,
- reverse.txt.~1~, reverse.txt.~2~, etc.
- SET RECEIVE FILTER sort -r > \v(filename)
- RECEIVE \v(filename).reverse
- Stores each incoming file with its lines sorted in reverse
- order, under the name it arrived with, but with ".reverse"
- appended to it.
- SET RECEIVE FILTER sort -r > \v(filename)
- RECEIVE \flower(\v(filename)).reverse
- Like the previous example, but ensures that the filename is
- lowercase.
- Examples for binary mode:
- SET RECEIVE FILTER gunzip -c > \v(filename)
- RECEIVE
- This receives one or more presumably compressed file and
- uncompresses each one into a file having the same name it was
- sent with. For example, if the file is sent with the name
- OOFA.TXT.GZ, it is stored with that name, even after
- decompression.
- SET RECEIVE FILTER gunzip -c > \v(filename)
- RECEIVE \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
- Like the previous example, but the resulting filename has its
- rightmost three characters removed from it and the remainder is
- lowercased. So if the incoming filename is OOFA.TXT.GZ, it is
- stored as oofa.txt after decompression.
- Of course you don't want to type such long hideous commands, so we have
- also introduced several new functions:
- \fstripx(string[,character])
- This function removes the rightmost segment of the string that
- starts with the given character. If no character is given,
- period (.) is used. Thus it is most conveniently used for
- stripping the extension from a filename (or the decimal portion
- from a floating-point number written in US/UK style). Examples:
- \fstripx(OOFA.TXT.GZ) => OOFA.TXT
- \fstripx(OOFA.TXT.GZ,.) => OOFA.TXT
- \fstripx(OOFA.TXT.GZ,X) => OOFA.T
- \fstripx(\fstripx(OOFA.TXT.GZ)) => OOFA
- \fstripx($100.00) => $100
- \fstripn(string,number)
- Removes the rightmost number characters from the string.
- Examples:
- \fstripn(OOFA.TXT.GZ) => OOFA.TXT.GZ
- \fstripn(OOFA.TXT.GZ,3) => OOFA.TXT
- \fstripn(OOFA.TXT.GZ,7) => OOFA
- \fstripb(string[,c1[,c2]])
- Strips enclosing matching braces, brackets, parentheses, or
- quotes from the string. The second argument, c1, specifies which
- kind of enclosure to look for; if not specified, any enclosing
- (), [], <>, {}, "", '', or `' are removed. If c1 is specified
- and c2 is not, then if c1 is an opening brace, bracket, or
- parenthesis, the matching closing one is supplied automatically
- as c2. If both c1 and c2 are specified, then to be stripped the
- string must begin with c1 and end with c2. If the string is not
- enclosed in the indicated manner, the result is the original
- string. Examples:
- \fstripb("abc") => abc
- \fstripb([abc]) => abc
- \fstripb([abc) => [abc
- \fstripb(<abc>) => abc
- \fstripb(<abc>,[) => <abc>
- \fstripb((abc)) => abc
- \fstripb((abc),[) => (abc)
- \fstripb((abc),{(}) => abc
- \fstripb(+abc+) => +abc+
- \fstripb(+abc+,+) => abc
- \fstripb(+abc+,+,^) => +abc+
- \fstripb(+abc^,+,^) => abc
- \fstripb('abc') => abc
- \fstripb(`abc') => abc
- \fstripb(``abc'') => `abc'
- \fstripb(\fstripb(``abc'')) => abc
- Notice the special syntax required for including a literal
- parenthesis in the argument list. As the last two examples
- illustrate, \fstripb() strips only one level at at a time;
- nesting can be used to strip a small fixed number of levels;
- loops can be used to strip larger or indeterminate numbers of
- levels.
- \flop(string[,char])
- Removes the leftmost segment of the string that ends with the
- given character. If no character is given, period (.) is used.
- Examples:
- \flop(OOFA.TXT.GZ) => TXT.GZ
- \flop(OOFA.TXT.GZ,.) => TXT.GZ
- \flop(OOFA.TXT.GZ,X) => T.GZ
- To remove the leftmost number characters, just use
- \fsubstring(s,number+1). To return the rightmost number
- characters, use \fright(s,number).
- So the hideous example:
- receive \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
- can now be written as:
- receive \flower(\fstripx(\v(filename)))
- That is, the filename stripped of its extension and then lowercased.
- This is not only shorter and less hideous, but also does not depend on
- the length of the extension being 3.
- Note that when a receive filter is in effect, this overrides your FILE
- COLLISION setting, since Kermit has no way of knowing what the final
- destination filename will be (because it does not know, and can not be
- expected to know, the syntax of every version of every command shell on
- every platform on the planet).
- 4.2.4. Implicit Use of Pipes
- If you wish, C-Kermit can also examine incoming filenames to see if
- they start with "!", and if so, the subsequent text is treated as a
- command to read from or write to. For example, if a Kermit client is
- given the following command:
- get {!finger | sort}
- the server on the other end, if it supports this feature, will run the
- "finger" program, pipe its standard output to the "sort" program, and
- send sort's standard output back to you. Similarly, if you:
- send oofa.txt !sort -r > oofa.new
- or, equivalently:
- send oofa.txt {!sort -r > oofa.new}
- or:
- send /as-name:{!sort -r > oofa.new} oofa.txt
- this has the receiver send the contents of the incoming oofa.txt file
- to the sort program, which sorts the text in reverse order and stores
- the result in oofa.new.
- This use of the exclamation mark should be familiar to UNIX users as
- the "bang" feature that lets you run an external application or command
- from within another application.
- Kermit's "bang" feature is disabled by default, since it is not unheard
- for filenames to actually begin with "!". So if you want to use this
- feature, you must enable it with the following command:
- SET TRANSFER PIPES { ON, OFF }
- ON enables the recognition of "!" notation in incoming filenames
- during file transfer as an indicator that the remaining text is
- the name of a command. OFF, the default, disables this feature
- and uses the text as a filename in the normal fashion. This
- command does NOT affect SEND /COMMAND, GET /COMMAND, CSEND, etc.
- So using a combination of CSEND (SEND /COMMAND) and the "bang" feature,
- you can transfer a directory tree all in one command (assuming the
- remote Kermit supports pipe transfers and has them enabled):
- CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
- or:
- SEND /COMMAND:{tar cf - . | gzip -c} /as:{!gunzip -c | tar xf -}
- Pay close attention to the syntax. Braces are needed around the command
- because it contains spaces; braces are needed around the as-name
- because it ends with "-". The as-name must begin with "!" or receiving
- Kermit will not recognize it as a command. The CSEND command must NOT
- begin with "!" unless you are running a command whose name really does
- start that character.
- Similarly, you have a Kermit server send a directory tree to be
- unpacked on the client end:
- CGET {!tar cf - . | gzip -c} {gunzip -c | tar xf -}
- or:
- GET /COMMAND {!tar cf - . | gzip -c} /as:{gunzip -c | tar xf -}
- Notice how, in this case, the bang is required in the remote command,
- to distinguish it from a filename, but not in the local command, since
- by definition of CGET (or GET /COMMAND), it is known to be a command.
- SEND and RECEIVE FILTERs supersede the bang feature. For example, if a
- file arrives under the name "!gunzip -c | tar xf -", but the receiving
- Kermit also has been given a command like:
- set receive filter sort -r > \v(filename)
- then the incoming data will be sorted rather than gunzipped.
- Finally, if SET TRANSFER PIPES is ON (and in this case, this must be
- done in your C-Kermit initialization file), you can send from a pipe on
- the C-Kermit command line:
- kermit -s "!finger | sort -r" -a userlist
- In this case the "filename" contains spaces and so must be quoting
- using your shell's quoting rules.
- 4.2.5. Success and Failure of Piped Commands
- Commands or programs started by Kermit as a result of CSEND or CRECEIVE
- commands, CGET, SEND /COMMAND, REDIRECT commands (seeSection
- 4.2.8.2), implicit use of pipes, RUN commands, and so forth, should
- return their exit status codes to the Kermit command that caused them
- to be run, and therefore IF SUCCESS and IF FAILURE tests after these
- commands should work as expected. For example:
- CSEND blah < filename
- should fail if there is no command called "blah" or if there is no file
- called "filename". However, this is not foolproof and sometimes
- C-Kermit might think a command succeeded when it failed, or vice versa.
- This is most likely to happen when the highly system-dependent methods
- that Kermit must use to determine a command's exit status code do not
- supply the right information.
- It can also happen because some commands might define success and
- failure differently from what you expect, or because you are using a
- pipeline composed of many commands, and one of them fails to pass
- failing exit status codes up the chain. The most likely culprit is the
- shell itself, which in most cases must be interposed between Kermit and
- any external program to be run.
- In any case, you can examine the following variable to find out the
- exit status code returned to Kermit by the process most recently run by
- any command that runs external commands or programs, including CSEND,
- CRECEIVE, REDIRECT, RUN, etc:
- \v(pexitstat)
- In UNIX, Windows and OS/2, the value should be -2 if no command has
- been run yet, 0 if the most recent command succeeded, -1, -3, or -4 if
- there was an internal error, and a positive number returned by the
- command itself if the command failed. If the number is in the range
- 1-127, this is the program's exit status code. If it is 128 or greater,
- this is supposed to indicate that the command or program was
- interrupted or terminated from outside itself.
- In Windows 95 and 98, the return values of the default shell are
- unreliable; various third-party shells can be used to work around this
- deficiency.
- In VMS, it is the actual exit status code of the command that was run.
- This is an odd number if the command succeeded, and an even number if
- it failed. You can see the associated message as follows:
- run write sys$output f$message(\v(pexitstat))
- Or, more conveniently, use the new Kermit function:
- echo \ferrstring(\v(pexitstat))
- which converts a system error code (number) to the corresponding
- message.
- 4.2.6. Cautions about Using Pipes to Transfer Directory Trees
- Although utilities such as tar and zip/unzip might be available on
- different platforms (such as UNIX and Windows), this does not
- necessarily mean you can use them successfully to transfer directory
- trees between unlike platforms. For example:
- CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
- when used from UNIX to Windows will have satisfactory results for
- binary files, but not for text files. UNIX text files have lines ending
- with Linefeed (LF) only, whereas Windows text files have lines ending
- in Carriage Return and Linefeed (CRLF). Thus any text files that were
- in the archive formed by the first tar command will be unpacked by the
- second tar command in their original form, and will display and print
- incorrectly in Windows (except in applications that have been
- explicitly coded to handle UNIX-format text files). On the other hand
- if you told gzip to use "text mode" to do record format conversion
- (assuming there was a way to tell it, as there is with most "zip"
- programs), this would destroy any binary files in the archive.
- Furthermore, if the archive contains text files that are written in
- languages other than English, the "special" (accented and/or non-Roman)
- characters are NOT translated, and are therefore likely show up as
- gibberish on the target system. For example, West European languages
- are usually encoded in ISO Latin Alphabet 1 in UNIX, but in PC code
- page 850 on the PC. Capital A with acute accent is code point 193
- (decimal) Latin-1, but 181 in CP850. So A-acute in the UNIX file
- becomes Middle Box Bottom on the PC, and similarly for all the other
- special characters, and for all other languages -- Greek, Russian,
- Hebrew, Japanese, etc.
- So when transferring text files between unlike platforms, you should
- use direct Kermit file transfers so Kermit can apply the needed
- record-format and character-set transformations. Use pipelines
- containing archivers like tar or zip only if all the files are binary
- or the two systems use the same record format and character set for
- text files.
- Also seeSections 4.3,4.10,4.11, and4.15 for how
- to transfer directory trees between both like and unlike systems
- directly with Kermit.
- 4.2.7. Pipes and Encryption
- Of course pipelines could be used for encrypted file transfers,
- assuming proper precautions could be taken concerning the transmission
- of the key. But there is rarely a good way to do this. To illustrate
- using UNIX crypt:
- csend {crypt key < filename} {!crypt key > filename}
- Or, more ambitiously:
- csend {tar cf - . | gzip -c | crypt key} {!crypt key | gunzip -c | tar xf -}
- transmits the key in the file header packet as part of the (clear-text)
- remote command, defeating the entire purpose of encrypting the file
- data.
- But if you are connected in terminal mode to the remote computer and
- type:
- creceive {crypt key > filename}
- at the remote Kermit prompt, you have also transmitted the key in clear
- text over the communications link.
- At present, the only secure way to use CSEND and CRECEIVE with an
- encryption filter is to have a human operator at both ends, so the key
- does not have to be transmitted.
- Theoretically it would be possible to use PGP software (Pretty Good
- Privacy, by Phil Zimmerman, Phil's Pretty Good Software) to avoid key
- transmission (since PGP uses separate public and private key and "lets
- you communicate securely with people you've never met, with no secure
- channels needed for prior exchange of keys"), but the specific method
- has yet to be worked out.
- HINT: See the PGP User's Guide, e.g. at:
- http://www.telstra.com.au/docs/PGP/
- Especially the topic "Using PGP as a UNIX-Style Filter":
- http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
- In any case, better and more convenient security options are now
- available: Kerberos authentication and encryption and the new
- ability to run C-Kermit "though" other communication programs,
- described in Section 2.7.
- 4.2.8. Commands and Functions Related to Pipes
- 4.2.8.1. The OPEN !READ and OPEN !WRITE Commands
- These are described inUsing C-Kermit, and are generally useful
- with reading output from commands that produce more than one line on
- their standard output, or writing multiple lines into commands that
- accept them on their standard input.
- In C-Kermit 7.0 CLOSE !READ is accepted as a synonym for CLOSE READ,
- and CLOSE !WRITE for CLOSE WRITE.
- Testing the success and failure of these commands, however, can be a
- bit tricky. Consider:
- open !read lalaskjfsldkfjsldkfj
- (where "lalaskjfsldkfjsldkfj" is neither a valid command nor the name
- of a program or script that can be run). OPEN !READ, in UNIX at least,
- translates this into execl(shellpath,shellname,"-c",command). This
- means it starts your preferred shell (e.g. from the SHELL environment
- variable) and asks it to execute the given command. It must be this
- way, because your command can be a either an internal shell command
- (which only your shell can execute) or an external command, which only
- your shell knows how to find (it knows your PATH and interprets, etc).
- Therefore unless OPEN !READ can't start your shell, it always succeeds.
- Continuing with the nonexistent-command example:
- C-Kermit> open !read lalaskjfsldkfjsldkfj
- C-Kermit> status
- SUCCESS
- C-Kermit> read line
- C-Kermit> status
- SUCCESS
- C-Kermit> echo "\m(line)"
- "bash: lalaskjfsldkfjsldkfj: command not found"
- C-Kermit> close read
- C-Kermit> status
- FAILURE
- C-Kermit>
- In other words, the failure can not be detected on OPEN, since the OPEN
- command succeeds if it can start your shell. It can't be detected on
- READ, since all this does is read output from the shell, which in this
- case happens to be an error message. However, failure IS detected upon
- close, since this is the occasion upon which the shell gives Kermit its
- exit status code.
- For an illustration of this situation, see Section 2.14.
- 4.2.8.2. The REDIRECT Command
- A second method of I/O redirection is offered by the REDIRECT command.
- This is a rather advanced and tricky feature that is presently
- supported only in UNIX C-Kermit, in OS-9 C-Kermit, and in Kermit 95.
- Syntax:
- REDIRECT command
- Runs the given command, sending its standard output to the
- current communications channel (SET LINE, SET PORT, or SET HOST
- connection), and reading its standard input from the same
- connection. Works only in local mode -- i.e. a connection is
- required -- and then only if the given command uses Standard
- I/O.
- Example:
- redirect finger
- runs the local "finger" command and sends its output over the
- connection as plain text, where presumably there is a process set up to
- read it. Another example:
- redirect finger | sort -r
- shows the use of a pipeline.
- Note: REDIRECT differs from CSEND/CRECEIVE in two important ways: (1)
- it does not use the Kermit protocol, and (2) it uses a bidirectional
- pipe rather than a one-way pipe.
- The primary use of the REDIRECT command is to run external protocols,
- such as sz/rz in UNIX for ZMODEM, when they work over Standard I/O(*).
- Example:
- set host xyzcorp.com
- (login, etc)
- redirect sz oofa.zip
- lets you make a Telnet connection with C-Kermit and then do a ZMODEM
- transfer over it. ZMODEM protocol messages go both ways over the same
- connection simultaneously.
- It is possible to use C-Kermit on UNIX as your PPP dialer and then to
- REDIRECT the connection to the PPP software, but C-Kermit 7.0 offers a
- better approach to PPP dialing in its new EXEC command (Section
- 1.23).
- In theory, you can also redirect an interactive process. For example,
- suppose you tell Kermit 95 to wait for an incoming TCP/IP connection:
- set host * 3000
- and then tell C-Kermit on UNIX to:
- set host kermit95hostname 3000
- redirect ksh
- and then tell Kermit 95 to CONNECT: now you are talking to the UNIX
- K-shell; you can give commands (pwd, ls, etc) and see the results. In
- practice, the K-shell's terminal modes are messed up because (a) it is
- not going through the Unix terminal driver, and (b) it is "smart" and
- knows it is being redirected, and so acts in a decidedly inhospitable
- manner (other applications like EMACS, vi, etc, simply refuse to run if
- their standard i/o has been redirected).
- (*) The publicly-distributed sz/rz programs do not work as clients.
- However, Omen Technology does offer an up-to-date redirectable
- client XYZMODEM program called crzsz.
- 4.2.8.3. Receiving Mail and Print Jobs
- As of 7.0, and in UNIX only, files that are sent to C-Kermit as mail
- (when the other Kermit uses a MAIL or SEND /MAIL command) or to be
- printed (via REMOTE PRINT or SEND /PRINT) are now piped directly to the
- mail or print program, rather than written to temporary files and then
- mailed or printed and then deleted. This has the advantages of (a) not
- requiring a temporary file, and (b) allowing mail to have a proper
- subject in place of the filename. Temporary files were bad not only
- because they required (a) space, and (b) writability of the current
- directory, but also because using them could result in wiping out an
- existing file. See Section 4.7 for more about SEND /MAIL and SEND
- /PRINT.
- 4.2.8.4. Pipe-Related Functions
- The \fcommand(command) function runs the given shell or system command
- and returns the command's standard output as its value (with any
- newline characters stripped from the end), unless the result is too
- long, in which case it returns the empty string. The maximum length for
- the result is at least 1022 bytes, and it might be longer on some
- platforms. Examples (UNIX):
- C-Kermit> echo "\fcommand(date)"
- "Fri Apr 18 13:31:42 1997"
- C-Kermit> echo "\fcommand(finger | wc -l)" ; how many users logged in?
- " 83"
- C-Kermit> evaluate \fcommand(finger | wc -l) * 2
- 166
- C-Kermit> echo Welcome to \fcommand(tty) on \fcommand(date)
- Welcome to /dev/ttyre on Fri Apr 18 13:31:42 1997
- C-Kermit> echo "\fcommand(ls oofa.*)"
- "oofa.c
- oofa.h
- oofa.o"
- C-Kermit> cd /directory-with-thousands-of-files
- C-Kermit> echo "\fcommand(ls -l)" ; This would be too long
- ""
- C-Kermit>
- If a command's output would be too long, you can use the other, more
- laborious method of reading from a command: OPEN !READ command, READ
- each line, CLOSE !READ.
- The \frawcommand(command) function is identical to \fcommand(command),
- except it does not remove trailing newline characters:
- C-Kermit> echo "\frawcommand(date)"
- "Fri Apr 18 13:31:42 1997
- "
- C-Kermit> echo "\frawcommand(ls oofa.*)"
- "oofa.c
- oofa.h
- oofa.o
- "
- C-Kermit>
- Use \frawcommand() if you want to retain the final line terminators, or
- if the command's output is "binary". But remember that if the result of
- this (or any other) function contains any NUL (ASCII code 0)
- characters, the first NUL will terminate the result string because this
- is how C strings work (it's "C-Kermit", remember?).
- These functions are useful not only locally, but also in the
- client/server arena. If you need to get the results from a system
- command on the server end into a variable on the client end, just do:
- [ remote ] query kermit command(date)
- The result is in the local \v(query) variable; seeUsing C-Kermit,
- 2nd Ed., pp.359-360 for details.
- 4.3. Automatic Per-File Text/Binary Mode Switching
- When transferring files between like systems (e.g. UNIX-to-UNIX),
- binary mode can be used for all files unless character-set translation
- is needed, and in fact Kermit programs of recent vintage recognize each
- others' platforms and switch to binary mode automatically when it is
- appropriate (e.g. DOS to OS/2, or UNIX to UNIX). (Exception: LABELED
- mode is chosen for VMS-to-VMS and OS/2-to-OS/2 transfers so complex
- file formats can be preserved.)
- On a client/server connection between like systems, the transfer mode
- is currently determined by the file sender, rather than always by the
- client. If the client is sending, it controls the transfer mode. If a
- GET command is sent to the server, the server sends all files in binary
- mode if its TRANSFER CHARACTER-SET is TRANSPARENT; otherwise it uses
- text mode for text files (according to its text-pattern list) and
- binary mode for binary files. Of course, the client can control the
- server's transfer character-set with the REMOTE SET TRANSFER
- CHARACTER-SET command.
- When transferring files between unlike systems, however, (e.g.
- UNIX-to-DOS), some files (such as executable program images) must be
- transferred in binary mode but others (such as plain-text files) must
- be transferred in text mode so their record format and character sets
- can be appropriately converted. If a binary file is transferred in text
- mode, it is ruined. If a text file is transferred in binary mode, then
- at the very least, its format can be incorrect; at worst it is also
- corrupted because its character set was not converted (in extreme cases
- the corruption is total, e.g. because one system is ASCII-based and the
- other EBCDIC).
- 4.3.1. Exceptions
- VMS C-Kermit, when sending files to a non-VMS system, switches to text
- or binary mode automatically for each file, based on the record format
- in the file's directory entry; thus the mechanisms described in this
- section do not apply to VMS C-Kermit, yet the effect is the same:
- automatic text/binary mode switching when VMS C-Kermit is sending
- files. See the VMS Appendix ofUsing C-Kermit for details.
- Kermit versions that support LABELED or IMAGE transfer mode are
- likewise not affected by this feature when one of those modes is
- selected (normally used only when transferring between like systems).
- Kermit versions that support file-transfer pipes and filters are not
- affected by this feature when pipes or filters are used, since the
- output of a pipe or filter (such as gzip) is likely to require transfer
- in a different mode than the original file.
- Finally, SEND /TEXT or SEND /BINARY will force files to be sent in the
- indicated mode, overriding all automatic transfer-mode-choosing
- mechanisms.
- 4.3.2. Overview
- Suppose you give C-Kermit a command like:
- SEND *.*
- And suppose the pattern *.* matches a mixture of text files (such as
- program source code) and binary files (such os object modules or
- executable programs).
- C-Kermit 6.0 and earlier (except on VMS) send all files in the same
- mode: whatever you said in your most recent SET FILE TYPE command, or
- else whatever mode was chosen automatically according to the rules on
- page 236 of Using C-Kermit, 2nd Ed.
- But when text and binary files are mixed in the same group, and the
- files are being transferred to an unlike system (e.g. UNIX to IBM
- Mainframe), this results in corruption of either all the text files or
- all the binary files.
- Stream-oriented file systems such as in UNIX and DOS do not record any
- information about the file to tell us whether the file should be
- transferred in binary or text mode, making it impossible to select the
- transfer mode for each file in a group automatically with any
- certainty.
- However, we can use some fairly-well established file naming
- conventions for this purpose. C-Kermit 7.0 lets you provide lists of
- filename patterns that are used to separately determine the file type
- for each individual file being transferred. A pattern is a string,
- possibly containing the special characters "*" (asterisk, which matches
- any string of zero of more characters) and/or "?" (question mark, which
- matches any single character). For example "a*b" matches all files
- whose names start with "a" and end with "b", such as "ab", "arb",
- "ababababab", etc, but not "abba". And "a?b" matches any file whose
- name starts with "a", ends with "b", and is exactly 3 characters long.
- NOTE: When typing commands at the C-Kermit prompt, you must prefix
- "?" with \ to override its normal function of giving help.
- (Also see Section 4.9 for additional pattern-matching notations
- that might be available in your version of C-Kermit.)
- When you have specified filename recognition patterns, C-Kermit can
- transfer the ones whose names match any of the binary-mode patterns in
- binary mode, and those with names that match any of the text-mode
- patterns in text mode, and those whose names match neither in the
- prevailing mode you have chosen, or that was chosen automatically via
- peer recognition.
- 4.3.3. Commands
- SET FILE PATTERNS { ON, OFF, AUTO }
- This tells Kermit whether to do per-file filename
- pattern-matching to determine text or binary mode. The normal
- and default setting is AUTO, which means to use pattern lists to
- switch transfer mode only when it is certain that the other
- Kermit program supports automatic notification of transfer mode
- (via Attribute packets) on a per-file basis (this information is
- obtained automatically during protocol startup negotiation). ON
- means to always determine the transfer mode from the filename
- and pattern list when sending files. Use OFF to disable this
- feature (without resetting your pattern lists). Also note that
- if you have selected LABELED file transfer (SET FILE TYPE
- LABELED), this takes precedence over filename-matching patterns
- and all files are sent in labeled mode.
- SET TRANSFER MODE MANUAL
- Disables the use of filename patterns, no matter what the FILE
- PATTERNS setting.
- REMOTE SET TRANSFER MODE MANUAL
- Client command to disable automatic transfer mode, and therefore
- also filename patterns, in the server. Synonym: REMOTE SET XFER
- MODE MANUAL.
- { GET, SEND, etc } { /BINARY, /TEXT }
- Including a /BINARY or /TEXT (or, where supported, /IMAGE or
- /LABELED) switch with a file-transfer command changes the
- transfer mode to manual for that command only, and therefore
- disables patterns that that command.
- SET FILE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- A list of zero or more patterns, separated by spaces (not
- commas). Letters in a pattern are case-sensitive if the
- underlying filenames are case sensitive (as in UNIX), and
- case-insensitive otherwise (as in Windows). If a file's name is
- matched by any pattern in the list and SET FILE PATTERNS is ON,
- the file is sent in binary mode. Examples:
- SET FILE BINARY-PATTERNS *.gz *.Z *.tar *.zip *.o *.so *.a *.out ; UNIX
- SET FILE BINARY-PATTERNS *.EXE *.ZIP *.OBJ *.COM ; DOS or OS/2 or Windows
- If a pattern contains spaces, enclose it in braces.
- SET FILE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- Like SET FILE BINARY-PATTERNS, but the patterns choose text
- files rather than binary ones. Examples:
- SET FILE TEXT-PATTERNS *.TXT *.KSC *.HTM* *.BAT ; DOS, Windows, OS/2
- ADD BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- Adds one or more patterns to the BINARY-PATTERN list.
- ADD TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- Adds one or more patterns to the TEXT-PATTERN list.
- REMOVE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- Removes one or more patterns from the BINARY-PATTERN list. The
- given patterns are matched with the ones in the BINARY-PATTERNS
- list with case sensitivity if the underlying file system has
- case-sensitive names (as do UNIX and OS-9), otherwise with case
- independence.
- REMOVE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
- Removes one or more patterns from the TEXT-PATTERN list.
- SHOW PATTERNS
- Displays the current pattern selections.
- Whenever you give a SET FILE BINARY-PATTERNS or SET FILE TEXT-PATTERNS
- command, the previous list is replaced. If you give one of these
- commands without a pattern list, the previous list is removed.
- When patterns are active and files are being sent, text patterns (if
- any) are applied first (but only if not RESENDing and not sending in
- LABELED mode), then binary patterns, so if the same pattern appears in
- both lists, binary mode is chosen.
- 4.3.4. Examples
- Here's an example that might be used when sending files from UNIX:
- set file type binary
- set file text-patterns *.c *.h *.w *.txt makefile
- set file binary-patterns *.o
- msend makefile wermit wart ck*.[cwho] ck*.txt
- Note that "wermit" and "wart" do not match any patterns so they are
- sent in the prevailing mode, which is binary. Also note the use of
- "makefile" as a pattern that does not contain any wildcard characters
- (there is no other convention to distinguish among "wermit" and "wart",
- which are binary executables, and "makefile", which is a text file,
- purely by their names).
- Most C-Kermit implementations have a default pattern list built in,
- which includes patterns that are almost certain to succeed in picking
- the right transfer mode. Others are omitted due to ambiguity. For
- example ".hlp", and ".ini" are generally binary types in Windows but
- text types everywhere else.
- NOTE: ".doc", used for decades to denote plain-text documentation
- files, now more often than not denotes a Microsoft Word Document, so
- ".doc" is now considered a binary type since it does less harm to
- transfer a plain-text document in binary mode than it does to
- transfer an MS Word file in text mode (except when IBM mainframes
- are involved!)
- ANOTHER NOTE: ".com" files are binary in DOS-like operating systems,
- but they are text (DCL command procedures) in VMS. VMS C-Kermit
- sends .COM files in text mode; K95 sends them in binary mode. If you
- download a .COM file from VMS to DOS or Windows, and then upload it
- to another VMS system, be sure to use SEND /TEXT to preserve its
- textness.
- You can see the default pattern list by starting C-Kermit without its
- initialization file (e.g. "kermit -Y") and using the SHOW PATTERNS
- command. If you will be depending on this feature, be sure to examine
- the list carefully in conjunction with the applications that you use.
- The default pattern list does not take "backup files" into account
- because (a) people usually don't want to transfer them; and (b) it
- would make the pattern lists more than twice as long. For example, we
- would need to include both *.txt and *.txt.~[0-9]*~ for ".txt" files,
- and similarly for all the others. Instead, you can use SEND /NOBACKUP
- (or SET SEND BACKUP OFF) to skip over all backup files.
- Put your most commonly-used safe pattern declarations in your C-Kermit
- customization file (ckermod.ini, .mykermrc, k95custom.ini, etc).
- As noted, SET FILE PATTERNS is ON by default. Sometimes, however, it is
- desirable, or necessary, to force files to be sent in a particular
- mode, and often this must be done from the command line (e.g. when
- using Kermit as a download helper in a Web browser like Lynx). The -V
- command-line options is equivalent to SET FILE PATTERNS OFF and SET
- TRANSFER MODE MANUAL. Example:
- kermit -Vis oofa.txt
- forces oofa.txt to be sent in binary mode, even though ".txt" might
- match a text pattern.
- 4.4. File Permissions
- "Permissions" refers to a code associated with a file that specifies
- who is allowed to access it, and in what manner. For example, the
- owner, the members of one or more groups, the system administrator, and
- everybody else, might be allowed various combinations of Read, Write,
- Append, Execute, or Listing access.
- The permission code goes by different names on different platforms. In
- UNIX, it might be called the filemode. In VMS, it is called the file
- protection (or protection mask).
- The comments in this section presently apply only to the UNIX and VMS
- versions of C-Kermit, to which these features were added in version
- 7.0; the DOS, Windows, and OS/2 file systems embody no notions of
- protection, and so MS-DOS Kermit and Kermit 95 do not send file
- permissions, and ignore them when received.
- The permissions for a received file are determined by a combination of
- the file transfer mode (VMS-to-VMS transfers only), whether a file of
- the same name exists already, whether permissions of the file are
- received in the file attribute packet, and the setting of ATTRIBUTES
- PROTECTION.
- The default for ATTRIBUTES PROTECTION is ON. If no attributes are
- received, the effect is the same as if attributes PROTECTION were OFF.
- For VMS-to-VMS transfers, the default LABELED mode simply copies the
- protection code from source to destination.
- 4.4.1. When ATTRIBUTES PROTECTION is OFF
- If no file of the same name exists, system defaults determine the
- permissions of the new file. Otherwise, the actions taken depend on the
- current FILE COLLISION setting: BACKUP, OVERWRITE, RENAME, etc, as
- documented inUsing C-Kermit. But now the new file (if it is
- created at all) automatically inherits the permissions (mode bits) of
- the existing file in a way that is appropriate for the platform.
- 4.4.1.1. Unix
- All mode bits are inherited except the directory bit, since the
- incoming file can not possibly be a directory. (In any case, it is not
- possible to receive a file that has the same name as an existing
- directory unless FILE COLLISION is set to RENAME).
- 4.4.1.2. VMS
- Files with the same name as an existing file, transferred in modes
- other than LABELED between VMS systems, inherit the protection of the
- prior version.
- 4.4.2 When ATTRIBUTES PROTECTION is ON
- File permissions can be conveyed as part of the file transfer process,
- in accordance with the Kermit protocol definition. If the file sender
- puts system-dependent and/or system-independent versions of the file
- protection (permissions) into the Attribute (A) packet, the file
- receiver can set the new file's permissions from them. Otherwise, the
- permissions are set the same as for ATTRIBUTES PROTECTION OFF.
- When the incoming A packet contains system-dependent permissions, the
- file receiver checks to see if the sender has the same system ID (e.g.
- both the sending and receiving systems are UNIX, or both are VMS); if
- so, it decodes and uses the system-dependent permissions; otherwise it
- uses the generic ones (if any) and applies them to the owner field,
- setting the other fields appropriately as described in the following
- sections.
- Setting the incoming file's protection from the A packet is controlled
- by SET ATTRIBUTES PROTECTION (or PERMISSION), which is ON by default,
- and its status is displayed by SHOW ATTRIBUTES.
- The main benefit of this feature is to not have to "chmod +x" an
- executable file after transfer from UNIX to UNIX. Its cross-platform
- benefits are less evident, perhaps to retain the status of the Unix 'x'
- bit on a VMS system, for subsequent transfer back to a Unix system.
- 4.4.2.1. System-Specific Permissions
- System-specific file permissions are used when the two Kermit programs
- recognize each other as running on the same type of system. For
- example, both are running under some form of UNIX (it doesn't matter
- which UNIX variation -- HP-UX, Solaris, AIX, etc -- all use the same
- scheme for file permissions); or both are running under VMS (even if
- one is on an Alpha and the other on a VAX, and/or one is old and the
- other is new).
- 4.4.2.1.1. UNIX
- UNIX supports three categories of users, File Owner, Group, and World,
- and three types of file access permission: Read, Write, and Execute.
- Thus, a UNIX file's permissions are expressed in 9 bits.
- The system-dependent permission string for UNIX is a 3-digit octal
- string, the low-order 9 bits of the st_mode member of the stat struct;
- we deliberately chop off the "file format" bits because they are not
- permissions, nor do we convey the setuid/setgid bits, lock bit, sticky
- bit, etc.
- 4.4.2.1.2. VMS
- VMS supports four categories of users, System, File Owner, Group, and
- World, and four types of file access permission: Read, Write, Execute,
- and Delete. Thus, a VMS file's permissions are expressed in 16 bits.
- The system-dependent protection string for VMS is a 4-digit hexadecimal
- string, corresponding to the internal-format protection word of the
- file (RWED for each of World,Group,Owner,System). A new file normally
- gets all 16 protection bits from the original file of the same name.
- Note: VMS-to-VMS transfers take place in LABELED mode when the two
- C-Kermits recognize each other's platform as VMS (unless you have
- disabled LABELED-mode transfers). In this case, all of a file's
- attributes are preserved in the transfer and the protection mask (and
- other information) is taken from the file's internal information, and
- this takes precedence over any information in the Attribute packets.
- You can defeat the automatic switching into LABELED mode (if you want
- to) with SET TRANSFER MODE MANUAL.
- 4.4.2.2. System-Independent Permissions
- The system-independent ("generic") protection is used when the system
- IDs of the two Kermit programs do not agree (e.g. one is UNIX, the
- other is VMS). The generic protection attribute includes the following
- permissions (not all are applicable to every file system): Read, Write,
- Append, Execute, Delete, Search. The generic permissions are derived
- from the owner permissions of the source file, thus, a Unix 'w'
- permission becomes VMS Write,Delete.
- The Owner field of the new file's permissions is set from the incoming
- generic protection attribute.
- In UNIX, the Group and World permissions are set according to your
- umask, except that execute permission is NOT set in these fields if it
- was not also set in the generic protection (and consequently, is set in
- the Owner field).
- In VMS, the System, Group, and World permissions are set according to
- the process default file permission (as shown in VMS by SHOW
- PROTECTION), except that no permissions are allowed in these fields
- that are not included in the generic permissions.
- Note that the VMS and UNIX interpretations of Execute permission are
- not identical. In UNIX, a file (binary executable, shell script, etc)
- may not be executed unless it has Execute permission, and normally
- files that are not intended for execution do not have Execute
- permission. In VMS, Read permission implicitly supplies Execute
- capability. Generally files that have Read permission also have
- explicit Execute permission, but files (binary executables, DCL command
- procedures) that have Read permission and not Execute permission can
- still be executed.
- 4.5. File Management Commands
- 4.5.1. The DIRECTORY Command
- Prior to C-Kermit 7.0, the DIRECTORY command always ran an external
- system command (such as "ls" on UNIX) or program to product the
- directory listing. This had certain advantages, mostly that you could
- include system-dependent options for customized listings, e.g. on UNIX:
- dir -lt c* | more
- or in VMS:
- directory /size/date/protection/except=*.obj oofa.*;0
- This approach, however, carries some disadvantages: C-Kermit can't
- return SUCCESS or FAILURE status for (e.g.) "dir foo" according to
- whether the file "foo" exists; and it runs an inferior process, which
- might be a problem in some environments for resource and/or security
- reasons, and won't work at all in a "nopush" environment (e.g. one in
- which C-Kermit is configured to forbid access to exterior commands and
- programs, e.g. in a VMS "captive account").
- In C-Kermit 7.0 on VMS and UNIX, and in K95 1.1.19 and later, the
- DIRECTORY command is internal to Kermit. It can be run in a "nopush"
- environment and returns SUCCESS or FAILURE status appropriately. In
- UNIX it prints all dates and times in a consistent way (unlike ls). In
- VMS it prints precise file sizes, rather than "blocks". It offers
- several formatting and other options, but it is not necessarily more
- flexible than the corresponding external commands or programs (the UNIX
- "ls" program, the VMS "directory" command). The syntax is:
- DIRECTORY [ switch [ switch [ ... ] ] ] [ filespec ]
- If no filespec is given, all files in the current directory are listed.
- Optional switches include all the standard file-selection switches
- presented in Section 1.5.4, plus:
- /ALL
- Show both regular files and directories; this is the default.
- /ARRAY:x
- Instead of displaying a directory listing, put the files that
- would have been shown (based on the filespec and other selection
- switches) in the given array. The array need not (and should
- not) be predeclared; if the array already exists, it is
- destroyed and reused. The array name can be a single letter,
- like "a", or any fuller form, such as "&a", "\&a", "\&a[]", etc.
- If the /ARRAY switch is included, the following other switches
- are ignored: /BRIEF, /VERBOSE, /HEADING, /PAGE, /ENGLISHDATE,
- /ISODATE, /XFERMODE, /MESSAGE, /SORT, /REVERSE, /ASCENDING. In
- other words, only file selection switches are meaningful with
- /ARRAY: /FILES, /DIRECTORIES, /ALL, /DOTFILES, /NOBACKUP,
- /RECURSIVE, /SMALLER, /LARGER, /AFTER, /BEFORE, /EXCEPT, etc.
- The resulting array has the number of files (n) as its 0th
- element, and the filenames in elements 1 through n Example:
- dir /array:&a /files /nobackup /after:19990101 /larger:10000 [ab]*
- show array &a
- /FILES
- Only show regular files.
- /DIRECTORIES
- Only show directories.
- /BACKUP
- In UNIX, OS-9, K-95, and other versions that support SET FILE
- COLLISION BACKUP and create backup files by appending .~n~ to
- the filename (where "n" is a number), /BACKUP means to include
- these files in directory listings. This is the default.
- /NOBACKUP
- This is the opposite of /BACKUP: that is, do not include backup
- files in the listing.
- /BRIEF
- List filenames only; use a compact format, as many filenames as
- will fit across the screen (based on the longest name). A brief
- listing is always sorted alphabetically.
- /VERBOSE
- List one file per line, and include date, size, and (in UNIX
- only) permissions of each file. This is the opposite of /BRIEF,
- and is the default.
- /PAGE
- Pause at the end of each screenful and give a "more?" prompt,
- even if SET COMMAND MORE-PROMPTING is OFF.
- /NOPAGE
- Don't pause at the end of each screenful and give a "more?"
- prompt, even if SET COMMAND MORE-PROMPTING is ON. If neither
- /PAGE or /NOPAGE is given, paging is according to the prevailing
- COMMAND MORE-PROMPTING setting (which can be displayed with SHOW
- COMMAND).
- /ENGLISHDATE
- Show dates in dd-mmm-yyyy format; mmm is the first three letters
- of the English month name.
- /ISODATE
- Show dates in yyyy-mm-dd format; mm is the month number, 1-12.
- This is the opposite of /ENGLISHDATE, and is the default.
- /HEADINGS
- Print a heading before the listing and a summary at the end.
- /NOHEADINGS
- Don't print a heading before the listing or a summary at the
- end. This is the opposite of /HEADINGS, and is the default.
- /XFERMODE
- Only in Kermit programs that support SET FILE PATTERNS. If this
- switch is included, and the filename matches any FILE
- BINARY-PATTERN ( Section 4.3), "(B)" is printed after the
- filename; otherwise, if it matches a FILE TEXT-PATTERN, "(T)" is
- printed.
- /NOXFERMODE
- Don't display transfer-mode indicators. This is the opposite of
- /XFERMODE and is the default.
- /RECURSIVE
- Show files not only in the given directory, but also in its
- subdirectories (if any), their subdirectories, etc.
- /NORECURSIVE
- Don't show files in subdirectories. This is the opposite of
- /RECURSIVE, and is the default.
- /MESSAGE:text
- This lets you specify a short text string to be appended to the
- end of each directory listing line (a space is supplied
- automatically). If the text contains any spaces, enclose it in
- braces, e.g. /MESSAGE:{two words}.
- /NOMESSAGE
- Don't append any message to the end of each directory listing
- line (default).
- /SORT:[{NAME,SIZE,DATE}]
- Sort the listing by name, size, or date. If the /SORT switch is
- given but the "sort-by" keyword is omitted, the listing is
- sorted by name. /SORT:NAME /ASCENDING (alphabetic sort by name)
- is the default.
- /NOSORT
- Don't sort the listing. Files are listed in whatever order they
- are supplied by the operating system, e.g. inode order in UNIX.
- /REVERSE
- If the /SORT switch is given, reverse the order of the sort.
- Synonym: /DESCENDING.
- /ASCENDING
- If the /SORT switch is given, sort the listing in normal order.
- This is the opposite of /REVERSE and is the default.
- Note that most of the DIRECTORY-specific switches come in pairs, in
- which one member of a pair (e.g. /NOHEADINGS) is the opposite of the
- other (e.g. /HEADINGS).
- If you always want to use certain options, you can set them with the
- SET OPTIONS DIRECTORY command ( Section 1.5.5). Use SHOW OPTIONS to
- list the options currently in effect. To make the desired options apply
- every time you run C-Kermit, put a SET OPTIONS DIRECTORY command in
- your C-Kermit customization file, specifying the desired options.
- Options set in this manner apply to every subsequent DIRECTORY command.
- Of course, if you include switches in a DIRECTORY command, these
- override any defaults, built-in or custom. Example:
- DIRECTORY ; Use "factory defaults"
- SET OPTIONS DIRECTORY /SORT:SIZE /REVERSE /HEADINGS ; Customize defaults
- DIRECTORY ; Use customized defaults
- DIR /SORT:NAME ; Override customized default SORT key
- SET OPT DIR /RECURS ; Add /RECURSIVE to customized defaults
- DIR /ASCEND ; Override customized default SORT order
- Notes:
- * Only a single sort key is supported; there is presently no way to
- have multiple sort keys.
- * If the /BRIEF switch is given, all other switches (except
- /[NO]RECURSIVE, /[NO]DOTFILES, /DIRECTORIES, /FILES, and /ALL) are
- ignored.
- * /SORT:anything gives incorrect results if any files have lengths
- greater than 10 digits (i.e. that are more than 9999999999 bytes
- long, i.e. if they are 10GB or more in size) because the overlong
- length field causes the date and name fields to be misaligned.
- * /SORT:NAME is redundant in VMS since VMS returns filenames in
- alphabetic order anyway.
- * /SORT:NAME ignores alphabetic case on platforms where case does not
- matter in filenames, but this works only for unaccented Roman
- letters A-Z.
- * /SORT:NAME is currently based on code values, and so works fine for
- ASCII, but will probably produce unexpected results for files with
- non-ASCII or 8-bit characters in their names. (Locale-based sorting
- raises rather significant issues of portability, size, performance,
- etc.)
- * /SORT:DATE works right only for ISO-format dates, not English ones.
- * /SORT:SIZE sorts the size field lexically. On some platforms (e.g.
- Windows), the size of a directory file is listed as "<DIR>" rather
- than as a number; in this case, the "<DIR>" files are gathered at
- the end (or beginning, depending on the sort order) of the listing.
- * /RECURSIVE is accepted but ignored in AOS/VS. Use the normal
- system-specific filespec notation, e.g. "dir #.txt".
- * /RECURSIVE has no affect when a full, absolute pathname is given;
- e.g. "dir /recursive /tmp/foo" (where "foo" is a regular file) only
- shows the "/tmp/foo" file. If you want to see all "foo" files in
- the /tmp tree, do "cd /tmp" and then "dir /recursive foo".
- * If a file size of -1 is shown, or date-time of 0000-00-00 00:00:00,
- this means the file was located, but access to information about
- the file was denied to C-Kermit.
- * In VMS, if FOO.DIR;1 is a directory within your current directory,
- "directory foo" and "directory [.foo]" list the files in the [.FOO]
- subdirectory, but "directory foo.dir" lists the directory file
- itself; similarly for "*.dir" versus "[.*]", etc.
- * In UNIX, if "foo" is a directory within your current directory,
- "directory foo" lists the files in the foo directory. If you want
- to list the foo directory file itself, put an asterisk at the end:
- "dir foo*".
- Hint: How to find the biggest files in a directory tree:
- cd xxx ; (root of tree)
- directory /sort:size /recursive /reverse /dotfiles /page
- Another hint: If you often use several different directory-listing
- formats, define macro shortcuts for them:
- DEFINE WD DIRECTORY /SORT:DATE /REVERSE \%* ; Reverse chronological order
- DEFINE SD DIRECTORY /SORT:SIZE /REVERSE \%* ; Reverse order of size
- DEFINE ND DIRECTORY /SORT:NAME /ASCEND \%* ; Alphabetical by name
- DEFINE DL DIR /DIR /SORT:NAME /ASCEND \%* ; Alphabetical directory list
- Put these definitions in your C-Kermit customization file. Note that
- "\%*" ( Section 7.5) in these definitions lets you include other
- switches in your macro invocations, e.g.:
- wd /headings *.txt
- Of course you can still access your external directory listing program
- by using RUN or "!", e.g. in VMS:
- run directory /size/date/protection/except=*.obj oofa.*;0
- or:
- !dir /size/date/prot/exc=*.obj oofa.*;0
- In UNIX, use "!ls" or just "ls" (which is a special synonym for "!ls").
- 4.5.2. The CD and BACK Commands
- In C-Kermit 7.0, the CD command has a new friend, the BACK command.
- BACK means "CD to my previous current directory". A second BACK brings
- you back to where you were before the first one; thus successive BACK
- commands switch back and forth between two directories.
- 4.5.2.1. Parsing Improvements
- The CD command, as well as other commands that parse a directory name,
- were changed in 7.0 to provide all the expected functions: completion
- on Tab or Esc, directory-name lists on ?, etc. Other affected commands
- include SET SERVER GET-PATH, SET TEMP-DIRECTORY, SET FILE
- DOWNLOAD-DIRECTORY, and SPACE. CD and REMOTE CD also now work with
- logical names.
- In VMS, the situation is a bit complicated since a directory name can
- look like "DEV:", "[FOO.BAR]", "DEV:[FOO.BAR]", "[FOO]BAR.DIR;1", etc.
- Completion and ?-help might not always work, but they do in many cases.
- Examples:
- cd ? Lists all subdirectories of the current directory
- cd []? Ditto
- cd k? Ditto, but only those starting with K
- cd [foo]? Lists all subdirectories of the [FOO] directory
- cd [-]? Lists all subdirectories of the superior directory
- cd [--]? Lists all subdirectories of the directory 2 levels up
- cd [...]? Lists all directories below the current one
- cd [foo.? Does not work.
- C-Kermit allows all of the following in VMS:
- cd bar CD to subdirectory BAR of the current directory
- cd .bar Ditto
- cd [.bar] Ditto
- cd bar.dir etc...
- cd bar.dir;
- cd bar.dir;1
- cd [foo.bar]
- cd <foo.bar>
- cd bar.baz This can go more than 1 level deep...
- cd dir: (where logical name DIR is defined as [FOO.BAR])
- As well as the following:
- cd .. Go up one level as in UNIX
- cd . The current directory
- cd My login directory
- Note that "cd -" (go up one level) does not work as expected, because
- "-" is Kermit's command continuation character. However, "cd [-]", and
- "
- cd {-}" have the desired effect (and so does "cd ..", which is easier
- to type).
- 4.5.2.2. The CDPATH
- The CD command in the UNIX, Windows, OS/2, and VMS versions of
- C-Kermit, as of version 6.1 / 1.1.12, searches the CDPATH for the given
- directory, if it is not absolute and if a CDPATH environment variable
- is defined. Example (in UNIX ksh or bash):
- $ export CDPATH=$HOME:$HOME/kermit:/tmp
- Now if you give a "cd xxx" command, no matter what your current
- directory is, if the "xxx" directory is not a subdirectory of your
- current directory, then the xxx subdirectory of your home directory is
- used or if that does not exist, then the xxx subdirectory of the kermit
- subdirectory of your home directory is used or if that does not exist,
- then /tmp/xxx is used. This is how the ksh "cd" command works, and now
- the C-Kermit CD command works the same way.
- In VMS, you can define CDPATH to be a list of directories that contain
- actual directory delimiters, and/or logical names representing
- directories, using commas to separate them, e.g.:
- $ define cdpath [HOME],[SOMEOTHERDIR],[HOME.MISC]
- $ define cdpath SYS$LOGIN:,DISK1:[HOME],DISK2:[SCRATCH.IVAN]
- Example:
- $ define cdpath SYS$LOGIN:,[IVAN],[OLAF],[OLGA.MISC]
- $ kermit
- DISK1:[OLGA] C-Kermit> cd blah
- tries the BLAH subdirectory of the user's login directory, then
- [OLGA.BLAH], [IVAN.BLAH], [OLAF.BLAH], and [OLGA.MISC.BLAH], in that
- order, using the first one it finds, failing if it finds none.
- In C-Kermit 7.0, you may also set the CDPATH from the Kermit prompt:
- SET CD PATH path
- Allows the CD PATH to be set from within C-Kermit.
- SHOW CD shows the CD path and all other information relevant to the CD
- command.
- 4.5.2.3. CD Messages
- Whenever you change directory, you can have C-Kermit display a "Read
- Me" file from the new directory automatically. The commands are:
- SET CD MESSAGE { ON, OFF, FILE list }
- ON enables this feature; OFF (the default) disables it. File
- lets you specify the name of the "Read Me" file. A list of names
- to look for can be given in the following format:
- {{name1}{name2}{name3}{...}}
- e.g.:
- SET SERVER CD-MESSAGE FILE {{./.readme}{README.TXT}{READ.ME}}
- The default list of CD-message files is system dependent.
- SHOW CD shows your current directory, previous directory, CD path, and
- CD message info.
- 4.5.3. Creating and Removing Directories
- The MKDIR command now allows you to create multiple directories at
- once:
- C-Kermit> mkdir a/b/c/d
- creates the directory a in the current directory (if it doesn't exist
- already), and then creates subdirectory b in the a directory (if it
- didn't exist already), and so on.
- If you use MKDIR to try to create a directory that already exists,
- C-Kermit will print a warning ("?Directory already exists"), but the
- MKDIR command will still succeed. If you want to avoid the warning
- message, use IF DIRECTORY first to check if the directory already
- exists.
- The RMDIR command, however, will not remove more than one directory,
- nor will it remove a directory that contains any files. (There is, as
- yet, no RMDIR /RECURSIVE command, although one might be added later.)
- In VMS, these commands (like CD) are more forgiving of your syntax than
- is the DCL command shell; "mkdir oofa" is equivalent to "mkdir [.oofa]"
- and so on. Also in VMS, you'll find that C-Kermit's RMDIR command is
- easier than deleting a directory in DCL, since it automatically first
- gives it owner delete permission if you are the owner.
- 4.5.4. The DELETE and PURGE Commands
- The DELETE command now offers a selection of switches, and has a new
- companion, the PURGE command. First, DELETE:
- DELETE [ switches... ] filespec
- Deletes the file or files that match the filespec, which may
- contain wildcards ( Section 4.9).
- Optional switches include the standard file-selection switches
- presented in Section 1.5.4, plus:
- /ASK
- Before deleting each file, ask permission interactively. Answers
- are Yes or OK (delete the file), No (don't delete it), or Quit
- (stop executing the DELETE command).
- /NOASK
- Don't ask permission to delete each file.
- /LIST
- List each file and show whether it was deleted. Synonyms: /LOG,
- /VERBOSE.
- /NOLIST
- Don't list files while deleting them. Synonyms: /NOLOG, /QUIET.
- /HEADING
- Print a heading and summary line.
- /NOHEADING
- Don't print a heading and summary line.
- /PAGE
- When listing, pause at the end of each screenful and give the
- "More?" prompt. If you reply "n" (no), the DELETE command
- terminates.
- /SIMULATE
- Do everything implied by the given switches and filespec, except
- do not actually delete any files. This lets you preview which
- files would be deleted; implies /LIST.
- Now the PURGE command:
- PURGE [ switches... ] [ filespec ]
- (VMS only) Runs the DCL PURGE command. Switches and filespec, if
- any, are passed directly to DCL without parsing or verification.
- Deletes excess versions of the given (or all) files. The rest of
- this section does not apply to VMS.
- PURGE [ switches... ] [ filespec ]
- (UNIX only) Deletes "backup files" that match the filespec,
- which may contain wildcards ( Section 4.9). If no filespec
- is given, all backup files in the current directory are selected
- (subject to modification by any switches). Do not include backup
- notation in the filespec.
- Explanation:
- To avoid destroying preexisting files when a new file arrives that has
- the same name, C-Kermit backs up the old file by appending a "backup
- number" to its name. In UNIX, the backup suffix consists of a period, a
- tilde, a number, and another tilde. For example, if a file called
- oofa.txt exists and a new oofa.txt file arrives, the original is
- renamed to oofa.txt.~1~. If another oofa.txt file arrives, the existing
- one is renamed to oofa.txt.~2~. And so on. This system is compatible
- with the one used by EMACS. Thus over time, if you receive a lot of
- files with C-Kermit or edit them with EMACS, backup files can build up.
- The new PURGE command lets you clean out accumulated backup files:
- Optional switches include the standard file-selection switches
- presented in Section 1.5.4, plus all the switches listed above for
- the DELETE command, plus:
- /KEEP:n
- Retains the n most recent (highest-numbered) backup files for
- each file. For example, if oofa.txt, oofa.txt.~1~, oofa.txt.~2~,
- oofa.txt.~10~, oofa.txt.~12~, and oofa.txt.~100~ exist, "purge
- /keep:2 oofa.txt" deletes oofa.txt.~1~, oofa.txt.~2~, and
- oofa.txt.~10~, and keeps oofa.txt, oofa.txt.~12~, and
- oofa.txt.~100~. If /KEEP is given without a number, one (the
- highest numbered) backup file is kept.
- CAUTION: The PURGE command should be used only when *.~*~ files truly
- are backup files. This is the case for EMACS, and it is the DEFAULT for
- C-Kermit. However, if C-Kermit's FILE COLLISION has been set to RENAME,
- newly received files will look like backup files. In that case, don't
- use the PURGE command or you'll be removing new files rather than old
- ones. (Use SHOW FILE to find the FILE COLLISION setting.)
- The PURGE command is presently available only in UNIX. The command
- succeeds if it deleted any files, or if it deleted no files but there
- were no errors. It fails if it deleted no files and there were errors
- (i.e. deletion was attempted but failed). In VMS, backup file versions
- are handled automatically by the OS, and a PURGE command can be used at
- the VMS prompt to clean them up.
- If you want certain switches to be supplied automatically with each
- DELETE or PURGE command, you can set them with SET OPTIONS
- ( Section 1.5.5) and you can display any such settings with SHOW
- OPTIONS. Of course you can override them on a per-command basis by
- including switches in your PURGE or DELETE command.
- Also see SET FILE COLLISION, SHOW FILE, SEND /NOBACKUP, SET SEND
- BACKUP, and DIRECTORY /[NO]BACKUP.
- 4.6. Starting the Remote Kermit Server Automatically
- As noted on pages 275-276 ofUsing C-Kermit 2nd edition, you can
- have Kermit send "kermit receive" commands automatically when it is in
- local mode and you give a SEND or similar command, to start the remote
- Kermit receiver in case it is not already started. The "kermit receive"
- commands are specified by:
- SET PROTOCOL KERMIT binary-receive-command text-receive-command
- As of version 7.0, a Kermit protocol option has been added to send a
- string to the host in advance of any Kermit packets when you give a
- GET-class or REMOTE command. This will switch the remote C-Kermit into
- the appropriate mode or, if the remote system is at a system command
- (shell) prompt, execute the string on the remote system. The new syntax
- of the SET PROTOCOL KERMIT command is:
- SET PROTOCOL KERMIT [ s1 [ s2 [ s3 ] ] ]
- where:
- Default Meaning
- s1 {kermit -ir} Remote "kermit receive in binary mode" command.
- s2 {kermit -r} Remote "kermit receive in text mode" command.
- s3 {kermit -x} Remote "start kermit server" command.
- NOTE: If the remote Kermit is 6.0, the following are recommended for
- fast startup and high-performance file transfer (see Appendix I in
- Using C-Kermit, second Edition, for command-line options):
- s1 kermit -YQir (Kermit receive binary, skip init file, fast.)
- s2 kermit -YQTr (Kermit receive text, skip init file, fast.)
- s3 kermit -YQx (Kermit server, skip init file, fast.)
- If the remote is C-Kermit 7.0 or later, change the -x option (enter
- server mode) to -O (uppercase letter O), which means "enter server mode
- for One transaction only); this way, it is not stuck in server after
- the transfer. Also note that the Q is redundant in version 7.0, since
- fast Kermit protocol settings are now the default.
- Note that in case the C-Kermit executable is called "wermit" or
- "ckermit" you can change "kermit" in the strings above to "wermit" or
- "ckermit" and C-Kermit 7.0 or later will recognize these as synonyms
- for "kermit", in case it is at its command prompt when one of these
- strings is sent to it.
- 4.7. File-Transfer Command Switches
- Over the years, various new methods of transferring a file have
- accumulated, until we had, in addition to the SEND command, also MOVE
- (send and then delete), MAIL (send as email), REMOTE PRINT (send to be
- printed), CSEND (send the output of a command), PSEND (send a part of a
- file), BSEND (send in binary mode), RESEND (resume an interrupted
- SEND), etc etc. Similarly: GET, REGET, CGET, RETRIEVE, and so on.
- Not only is it confusing to have different names for these commands,
- many of which are not real words, but this also does not allow all
- combinations, like "send a file as mail, then delete it".
- In C-Kermit 7.0, the SEND, GET, and RECEIVE commands were restructured
- to accept modifier switches (switches are explained inSection
- 1.5).
- 4.7.1. SEND Command Switches
- Without switches, the SEND command still works exactly as before:
- send oofa.txt ; send a single file
- send oofa.* ; send multiple files
- send oofa.txt x.x ; send oofa.txt as x.x (tell receiver its name is x.x)
- send ; send from SEND-LIST
- But now the following modifier switches may be included between "send"
- and the filename. Zero, one, two, or more switches may be included in
- any combination that makes sense. Switch names (such as /BINARY) can be
- abbreviated, just like any other keywords. Most of these switches work
- only when using Kermit protocol (/TEXT and /BINARY are the exceptions).
- /AFTER:date-time
- Specifies that only those files modified (or, in VMS, created)
- after the given date-time (see Section 1.6) are to be sent.
- Examples:
- send /text /after:{2-Feb-1997 10:28:30} *.txt
- send /text /after:\fdate(oofa.txt) *.txt
- Synonym: /SINCE.
- /ARRAY:arrayname
- Specifies that instead of sending a file, C-Kermit is to send
- the contents of the given array. Since an array does not have a
- filename, you should include an /AS-NAME switch to specify the
- name under which the array is to be sent (if you do not, the
- name "_array_x_" is used, where 'x' is replaced by the array
- designator). Seesection 7.10 for array-name syntax. As
- noted in that section, you can also include a range to have a
- segment of the array sent, rather than the whole thing; for
- example: "send /array:&a[100:199]". It is strongly recommended
- that you accompany the /ARRAY switch with a /TEXT or /BINARY
- switch to force the desired transfer mode, since otherwise the
- various automatic mechanisms might switch to binary mode when
- you really wanted text, or vice versa. In text mode a line
- terminator is added to the end of each array element, but not in
- binary mode. For details and examples see Section 7.10.11.
- /AS-NAME:text
- Specifies "text" as the name to send the file under. You can
- also still specify the as-name as the second filename on the
- SEND command line. The following two commands are equivalent:
- send oofa.txt oofa.new
- send /as:oofa.new oofa.txt
- /BEFORE:date-time
- Specifies that only those files modified (or, in VMS, created)
- before the given date-time ( Section 1.6) are to be sent.
- /BINARY
- Performs this transfer in binary mode without affecting the
- global transfer mode, overriding not only the FILE TYPE and
- TRANSFER MODE settings, but also the FILE PATTERN setting, but
- for this SEND command only. In other words, SEND /BINARY means
- what it says: send the file in binary mode, regardless of any
- other settings. Example:
- set file type text ; Set global transfer mode to text
- send /binary oofa.zip ; Send a file in binary
- send oofa.txt ; This one is sent in text mode
- /COMMAND
- SEND /COMMAND is equivalent to CSEND ( Section 4.2.2) -- it
- says to send the output from a command, rather than the contents
- of a file. The first "filename" on the SEND command line is
- interpreted as the name of a command; the second (if any) is the
- as-name. Examples:
- send /command {grep Sunday oofa.txt} sunday.txt
- send /as-name:sunday.txt /command {grep Sunday oofa.txt}
- send /bin /command {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
- /DELETE
- Deletes the file (or each file in the group) after it has been
- sent successfully (but does not delete it if it was not sent
- successfully). SEND /DELETE is equivalent to MOVE. Has no effect
- when used with /COMMAND. Example:
- send /delete *.log
- /DOTFILES
- (UNIX and OS-9 only) Normally files whose names begin with "."
- are skipped when matching wildcards that do not also begin with
- ".". Include /DOTFILES to force these files to be included too.
- /RECURSIVE
- Descend the through the directory tree when locating files to
- send. Automatically sets /PATHNAMES:RELATIVE. Explained in
- Section 4.11 .
- /EXCEPT:pattern
- See Section 1.5.4.
- /NOBACKUP
- This means to skip backup files when sending, even if they match
- the SEND file specification. This is equivalent to using SEND
- /EXCEPT and including *.~[0-9]*~ in the exception list (or *.~*~
- if Kermit was built without pattern-matching support; see
- Section 4.9.1). Including this switch is equivalent to
- giving SET SEND BACKUP OFF ( Section 4.0.6) prior to SEND,
- except its effect is local to the SEND command with which it was
- given.
- /NODOTFILES
- The opposite of /DOTFILES (q.v.)
- /FILENAMES:{CONVERTED,LITERAL}
- Use this switch to override the current global SET FILE NAMES
- setting for this transfer only.
- /FILTER:command
- This specifies a filter to pass the file through before sending
- it. See thesection on file-transfer pipes and filters. The
- /FILTER switch applies only to the file-transfer command it is
- given with; it does not affect the global SEND FILTER setting,
- if any.
- /IMAGE
- VMS: Sends in image mode. Non-VMS: same as /BINARY.
- /LABELED
- VMS and OS/2 only: Sends in labeled mode.
- /LARGER-THAN:number
- Specifies that only those files that are longer than the given
- number of bytes are to be sent.
- /LISTFILE:filename
- Specifies that the files to be sent are listed in a file with
- the given filename. The file contains one filename per line.
- These filenames are not checked in any way; each filename is
- taken and does not use or depend on any Kermit-specific syntax.
- In particular, backslashes are not treated specially, leading
- and trailing spaces are not stripped, etc. However, if a
- filename contains wildcards, they are expanded. Example: If a
- file named files.txt contains the following lines:
- blah.txt
- oofa*
- x.x
- (but without leading or trailing spaces), then the C-Kermit
- command "send /listfile:files.txt" will send the files blah.txt,
- x.x, and all files whose names start with "oofa", assuming the
- files exist and are readable. The /LISTFILE switch, can, of
- course, be used with other switches when it makes sense, for
- example, /EXCEPT, /BINARY, /AFTER, /SMALLER, /MOVE-TO, /DELETE,
- /AS-NAME with a template, etc.
- /MAIL:address
- Sends the file as e-mail to the given address or addresses.
- "send /mail:address filename" is equivalent to "mail filename
- address". You can include multiple addresses separated by
- commas. Examples:
- send /mail:kermit-support@columbia.edu packet.log
- send /mail:cmg,fdc,jrd oofa.txt
- As with any switch argument, if the address or address list
- contains any spaces, you must enclose it in braces. The format
- of the addresses must agree with that understood by the
- mail-sending program on the receiver's computer.
- /MOVE-TO:directory-name
- Specifies that after each (or the only) source file is sent
- successfully, and ONLY if it is sent successfully, it should be
- moved to the named directory. If the directory name contains
- spaces, enclose it in braces. If the directory does not exist,
- it is created if possible; if it can't be created, the command
- fails and an error message is printed. Example:
- send /text /move-to:/users/olga/backup/ *.txt
- /NOT-AFTER:date-time
- Specifies that only those files modified at or before the given
- date and time are to be sent.
- /NOT-BEFORE:date-time
- Specifies that only those files modified at or after the given
- date and time are to be sent.
- /PATHNAMES:{OFF,ABSOLUTE,RELATIVE}
- Use this switch to override the current global SET SEND
- PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE or
- RELATIVE also sets /FILENAMES:LITERAL (also for this transfer
- only) since pathnames are not sent otherwise.
- /RENAME-TO:text
- Specifies that after the (or each) source file is sent
- successfully, and ONLY if it is sent successfully, it should be
- renamed to the name given. If the name contains spaces, enclose
- it in braces. If a file group is being sent, then the "text"
- must contain a variable reference such as \v(filename) (see
- Section 4.1). Example:
- send /rename-to:ok_\v(filename) *.*
- This sends each file in the current directory and if it was sent
- successfully, changes its name to begin with "ok_".
- /SMALLER-THAN:number
- Specifies that only those files that are smaller than the given
- number of bytes are to be sent.
- /SUBJECT:text
- Subject for email. Actually, this is just a synonym for
- /AS-NAME. If the text includes spaces, you must enclose it in
- braces. If you don't specify a subject (or as-name), the name of
- the file is used as the subject. Example:
- send /mail:kermit-support@columbia.edu /subj:{As requested} packet.log
- /PRINT:options
- Sends the file to be printed, optionally specifying options for
- the printer. Equivalent to REMOTE PRINT filename options.
- Examples:
- send /print oofa.txt ; No options.
- send /print:/copies=3 oofa.txt ; "/copies=3" is a VMS PRINT switch.
- send /print:-#3 oofa.txt ; "-#3" is a UNIX lpr switch.
- /PROTOCOL:name
- Uses the given protocol to send the file (Kermit, Zmodem, etc)
- for this transfer without changing global protocol. Only
- available in Kermit 95, UNIX, and OS-9. Example:
- set protocol kermit ; Set global protocol
- send /proto:zmodem /bin oofa.zip ; Send just this file with Zmodem
- send oofa.txt ; This file is sent with Kermit
- /QUIET
- When sending in local mode, this suppresses the file-transfer
- display.
- /RECOVER
- Used to recover from a previously interrupted transfer; SEND
- /RECOVER is equivalent to RESEND. Recovery only works in binary
- mode; SEND /RECOVER and RESEND include an implied /BINARY
- switch. Even then, recovery will successful only if (a) the
- original (interrupted) transfer was also in binary mode, or (b)
- if it was in text mode, the two Kermit programs run on platforms
- where text-mode transfers are not length-changing.
- /STARTING:number
- Starts sending the file from the given byte position. SEND
- /STARTING:n filename is equivalent to PSEND filename n.
- /TEXT
- Performs this transfer in text mode without affecting the global
- transfer mode, overriding not only the FILE TYPE and TRANSFER
- MODE settings, but also the FILE PATTERN setting, for this SEND
- command only. In other words, SEND /TEXT really send the file in
- text mode, regardless of any other settings or negotiations.
- About mail... Refer to Section 4.7.1. The same rules apply as for
- file transfer. If you are mailing multiple files, you can't use an
- as-name (in this case, a subject) unless it contains replacement
- variables like \v(filenum). For example, if you:
- send /mail:somebody@xyz.com *.txt
- Then each file will arrive as a separate email message with its name as
- the subject. But if you:
- send /mail:somebody@xyz.com /subject:{Here is a file} *.txt
- Then each file message will have the same subject, which is probably
- not what you want. You can get around this with constructions like:
- send /mail:somebody@xyz.com /subject:{Here is \v(filename)} *.txt
- which embed the filename in the subject.
- The MOVE, CSEND, MAIL, and RESEND commands now also accept the same
- switches. And the switches are also operative when sending from a
- SEND-LIST (seeUsing C-Kermit, 2nd Ed, pp.191-192), so, for
- example, it is now possible to SEND /PRINT or SEND /MAIL from a
- SEND-LIST.
- The MSEND and MMOVE commands also take switches, but not all of them.
- With these commands, which take an arbitrary list of filespecs, you can
- use /BINARY, /DELETE, /MAIL, /PRINT, /PROTOCOL, /QUIET, /RECOVER, and
- /TEXT (and /IMAGE or /LABELED, depending on the platform). MMOVE is
- equivalent to MSEND /DELETE. (If you want to send a group of files, but
- in mixed transfer modes with per-file as-names, use ADD SEND-LIST and
- then SEND.)
- The MSEND/MMOVE switches come before the filenames, and apply to all of
- them:
- msend /print /text *.log oofa.txt /etc/motd
- If you type any of these commands (SEND, CSEND, MSEND, etc) followed by
- a question mark (?), you will see a list of the switches you can use.
- If you want to see a list of filenames, you'll need to type something
- like "send ./?" (UNIX, OS/2, Windows, etc), or "send []?" (VMS), etc.
- Of course, you can also type pieces of a filename (anything that does
- not start with "/") and then "?" to get a list of filenames that start
- that way; e.g. "send x.?" still works as before.
- In UNIX, where "/" is also the directory separator, there is usually no
- ambiguity between a fully-specified pathname and a switch, except when
- a file in the root directory has the same name as a switch (as noted in
- Section 1.5):
- send /etc/motd ; Works as expected
- send /command ; ???
- The second example interprets "/command" as a switch, not a filename.
- To send a file actually called "command" in the root directory, use:
- send {/command}
- or other system-dependent forms such as //command, /./command,
- c:/command, etc, or cd to / and then "send command".
- 4.7.2. GET Command Switches
- Without switches, the GET command still works about the same as before:
- get oofa.txt ; GET a single file
- get oofa.* ; GET multiple files
- However, the mechanism for including an "as-name" has changed.
- Previously, in order to include an as-name, you were required to use
- the "multiline" form of GET:
- get
- remote-filespec
- local-name
- This was because the remote filespec might contain spaces, and so there
- would be no good way of telling where it ended and where the local name
- began, e.g:
- get profile exec a foo
- But now since we can use {braces} for grouping, we don't need the
- multiline GET form any more, and in fact, support for it has been
- removed. If you give a GET command by itself on a line, it fails and an
- error message is printed. The new form is:
- GET [ switches... ] remote-name [ local-name ]
- Ask the server to send the file whose name is remote-name. If
- the optional local-name is given, store it locally under this
- name. If the remote-name or local-name contains spaces, they
- must be enclosed in braces:
- get {profile exec a} foo
- get oofa.txt {~/My Files/Oofa text}
- If you want to give a list of remote file specifications, use the MGET
- command:
- MGET [ switches... ] remote-name [ remote-name [ remote-name ... ] ]
- Ask the server to send the files whose names are given.
- Now you can also include modifier switches between GET or MGET and the
- remote-name; most of the same switches as SEND:
- /AS-NAME:text
- Specifies "text" as the name to store the incoming file under.
- (This switch is not available for MGET.) You can also still
- specify the as-name as the second filename on the GET command
- line. The following two commands are equivalent:
- get oofa.txt oofa.new
- get /as:oofa.new oofa.txt
- /BINARY
- Tells the server to send the given file(s) in binary mode
- without affecting the global transfer mode. Example:
- set file type text ; Set global transfer mode to text
- get /binary oofa.zip ; get a file in binary mode
- get oofa.txt ; This one is transferred in text mode
- Or, perhaps more to the point:
- get /binary foo.txt ; where "*.txt" is a text-pattern
- This has the expected effect only if the server is C-Kermit 7.0
- or later or K95 1.1.19 or later.
- /COMMAND
- GET /COMMAND is equivalent to CGET ( Section 4.2.2) -- it
- says to receive the file into the standard input of a command,
- rather than saving it on disk. The /AS-NAME or the second
- "filename" on the GET command line is interpreted as the name of
- a command. Examples:
- get /command sunday.txt {grep Sunday oofa.txt}
- get /command /as-name:{grep Sunday oofa.txt} sunday.txt
- get /bin /command {!gunzip -c | tar xf -} {tar cf - . | gzip -c}
- /DELETE
- Asks the Kermit server to delete the file (or each file in the
- group) after it has been transferred successfully (but not to
- delete it if it was not sent successfully). GET /DELETE is
- equivalent to RETRIEVE. Example:
- get /delete *.log
- /EXCEPT:pattern
- Specifies that any files whose names match the pattern, which
- can be a regular filename, or may contain "*" and/or "?"
- metacharacters, are to be refused upon arrival. To specify
- multiple patterns (up to 8), use outer braces around the group,
- and inner braces around each pattern:
- /EXCEPT:{{pattern1}{pattern2}...}
- See the description of SEND /EXCEPT in Section 4.7.1 for
- examples, etc. Refusal is accomplished using the Attribute
- Rejection mechanism (reason "name"), which works only when
- Attribute packets have been successfully negotiated.
- /FILENAMES:{CONVERTED,LITERAL}
- Use this switch to override the current global SET FILE NAMES
- setting for this transfer only.
- /FILTER:command
- This specifies a filter to pass the incoming file through before
- writing to disk. See thesection on file-transfer pipes and
- filters. The /FILTER switch applies only to the file-transfer
- command it is given with; it does not affect the global RECEIVE
- FILTER setting, if any.
- /IMAGE
- VMS: Transfer in image mode. Non-VMS: same as /BINARY.
- /LABELED
- VMS and OS/2 only: Specifies labeled transfer mode.
- /MOVE-TO:directory
- This tells C-Kermit to move each file that is successfully
- received to the given directory. Files that are not successfully
- received are not moved. By default, files are not moved.
- /PATHNAMES:{OFF,ABSOLUTE,RELATIVE,AUTO}
- Use this switch to override the current global SET RECEIVE
- PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE or
- RELATIVE also sets /FILENAMES:LITERAL (also for this transfer
- only) since incoming pathnames would not be treated as pathnames
- otherwise. See Section 4.10.
- /QUIET
- When sending in local mode, this suppresses the file-transfer
- display.
- /RECOVER
- Used to recover from a previously interrupted transfer; GET
- /RECOVER is equivalent to REGET. Recovery only works in binary
- mode; SEND /RECOVER and RESEND include an implied /BINARY
- switch. Even then, recovery will successful only if (a) the
- original (interrupted) transfer was also in binary mode, or (b)
- if it was in text mode, the two Kermit programs run on platforms
- where text-mode transfers are not length-changing.
- /RECURSIVE
- Tells the server that the GET file specification applies
- recursively. This switch also automatically sets
- /PATHNAMES:RELATIVE in both the server AND the client. When used
- in conjunction with /DELETE, this "moves" a directory tree from
- the server's computer to the client's computer (except that only
- regular files are deleted from the server's computer, not
- directories; thus the original directories will be left, but
- will contain no files). Note that all servers that support
- /RECURSIVE do not necessarily do so in combination with other
- switches, such as /RECOVER. (Servers that do include C-Kermit
- 7.0 and later, K95 1.1.19 and later.)
- /RENAME-TO:string
- This tells C-Kermit to rename each file that is successfully
- received to the given string. Files that are not successfully
- received are not renamed. By default, files are not renamed. The
- string can be a literal string, which is appropriate when only
- one file is being received, or it can contain one or more
- variables that are to be evaluated at the time each file is
- received, such as \v(filename), \v(filenumber), \v(ntime),
- \v(pid), \v(user), etc. WARNING: if you give a literal string
- and more than one file arrives, each incoming file will be given
- the same name (but SET FILE COLLISION BACKUP or RENAME can be
- used to keep the incoming files from overwriting each other).
- /TEXT
- Tells the server to perform this transfer in text mode without
- affecting its global transfer mode. See /BINARY for additional
- info.
- The /MAIL and /PRINT options are not available (as they are for SEND),
- but you can use /COMMAND to achieve the same effect, as in these UNIX
- examples:
- get /command oofa.txt {mail kermit@columbia.edu}
- get /command oofa.txt lpr
- In OS/2 or Windows, you can GET and print like this:
- get oofa.txt prn
- The CGET, REGET, RETRIEVE commands also accept the same switches as
- GET. CGET automatically sets /COMMAND; REGET automatically sets
- /RECOVER and /BINARY, and RETRIEVE automatically sets /DELETE.
- 4.7.3. RECEIVE Command Switches
- Without switches, the RECEIVE command still works as before:
- receive ; Receives files under their own names
- receive /tmp ; Ditto, but into the /tmp directory
- r ; Same as "receive"
- receive foo.txt ; Receives a file and renames to foo.txt
- Now you can also include modifier switches may be included between
- "receive" and the as-name; most of the same switches as GET:
- /AS-NAME:text
- Specifies "text" as the name to store the incoming file under.
- You can also still specify the as-name as a filename on the
- command line. The following two commands are equivalent:
- r oofa.new
- r /as:oofa.new
- /BINARY
- Performs this transfer in binary mode without affecting the
- global transfer mode. NOTE: This does not override the incoming
- filetype (as it does with GET), so this switch is useful only if
- ATTRIBUTE TYPE is OFF, or if the other Kermit does not send a
- TYPE (text or binary) attribute. In any case, it has no affect
- whatsoever on the file sender.
- /COMMAND
- RECEIVE /COMMAND is equivalent to CRECEIVE ( Section 4.2.2)
- -- it says to receive the file into the standard input of a
- command, rather than saving it on disk. The /AS-NAME or the
- "filename" on the RECEIVE command line is interpreted as the
- name of a command.
- r /command {grep Sunday oofa.txt}
- r /command /as-name:{grep Sunday oofa.txt}
- r /bin /command {tar cf - . | gzip -c}
- /EXCEPT:pattern
- Specifies that any files whose names match the pattern, which
- can be a regular filename, or may contain "*" and/or "?"
- metacharacters, are to be refused upon arrival. To specify
- multiple patterns (up to 8), use outer braces around the group,
- and inner braces around each pattern:
- /EXCEPT:{{pattern1}{pattern2}...}
- See the description of SEND /EXCEPT in Section 4.7.1 for
- examples, etc. Refusal is accomplished using the Attribute
- Rejection mechanism (reason "name"), which works only when
- Attribute packets have been successfully negotiated.
- /FILENAMES:{CONVERTED,LITERAL}
- Use this switch to override the current global SET FILE NAMES
- setting for this transfer only.
- /FILTER:command
- This specifies a filter to pass the incoming file through before
- writing to disk. See thesection on file-transfer pipes and
- filters. The /FILTER switch applies only to the file-transfer
- command it is given with; it does not affect the global RECEIVE
- FILTER setting, if any.
- /IMAGE
- VMS: Transfer in image mode. Non-VMS: same as /BINARY. See
- comments under RECEIVE /BINARY.
- /LABELED
- VMS and OS/2 only: Specifies labeled transfer mode. See comments
- under RECEIVE /BINARY.
- /MOVE-TO:directory
- This tells C-Kermit to move each file that is successfully
- received to the given directory. Files that are not successfully
- received are not moved. By default, files are not moved.
- /PATHNAMES:{ABSOLUTE,RELATIVE,OFF,AUTO}
- Use this switch to override the current global SET RECEIVE
- PATHNAMES setting for this transfer only. See Section 4.10.
- /RECURSIVE
- When used with the RECEIVE command, /RECURSIVE is simply a
- synonym for /PATHNAMES:RELATIVE.
- /RENAME-TO:string
- This tells C-Kermit to rename each file that is successfully
- received to the given string. Files that are not successfully
- received are not renamed. By default, files are not renamed. The
- string can be a literal string, which is appropriate when only
- one file is being received, or it can contain one or more
- variables that are to be evaluated at the time each file is
- received, such as \v(filename), \v(filenumber), \v(ntime),
- \v(pid), \v(user), etc. WARNING: if you give a literal string
- and more than one file arrives, each incoming file will be given
- the same name (but SET FILE COLLISION BACKUP or RENAME can be
- used to keep the incoming files from overwriting each other).
- /QUIET
- When receiving in local mode, this suppresses the file-transfer
- display.
- /TEXT
- Receives in text mode without affecting the global transfer
- mode. See comments under RECEIVE /BINARY.
- The /MAIL and /PRINT options are not available, but you can use
- /COMMAND to achieve the same effect, as in these UNIX examples:
- r /command {mail kermit@columbia.edu}
- r /command lpr
- In OS/2 or Windows, you can RECEIVE and print like this:
- receive prn
- The CRECEIVE command now also accepts the same switches.
- 4.8. Minor Kermit Protocol Improvements
- 4.8.1. Multiple Attribute Packets
- C-Kermit 7.0 now sends more than one Attribute packet if a file's
- attributes do not fit into a single packet of the negotiated length. If
- a particular attribute (such as file creation date-time) does not fit
- within the negotiated length (which will only happen when the
- negotiated length is around 20 or less), that attribute is not sent at
- all.
- 4.8.2. Very Short Packets
- There are certain situations where extremely short packets must be
- used; 20 or 30 bytes at most. This can happen when one or more devices
- along the communication path have very small buffers and lack an
- effective means of flow control. Examples are sometimes cited involving
- radio modems.
- When the maximum packet length is shorter than certain packets that
- would be sent, those packets are either truncated or else broken up
- into multiple packets. Specifically:
- 1. Parameter negotiation packets (I, S, and their ACKs) are truncated
- to the negotiated length. Any parameters that do not fit are reset
- to their default values. There is no provision in the Kermit
- protocol for fragmentation and reassembly of parameter strings.
- 2. File header packets (containing the filename) are simply truncated.
- There is no provision in the Kermit protocol for fragmentation and
- reassembly of filenames.
- 3. Attribute packets are fragmented and reassembled as described in
- 4.8.1 without loss of data, except in case a field will not fit at
- all in the negotiated length (the longest attribute is usually the
- date and time of file creation/modification) because of the rule
- that attributes may not be broken across packets.
- 4. Data packets and other packets are unaffected -- they can be as
- short as they need to be, within reason.
- 4.9. Wildcard / File Group Expansion
- "Wildcard" refers to the notation used in filenames to specify a group
- of files by pattern matching.
- 4.9.1. In UNIX C-Kermit
- Prior to C-Kermit 7.0, C-Kermit was capable of expanding wildcard
- strings containing only the "metacharacters" '*' and '?':
- *
- Matches any sequence of zero or more characters. For example:
- "ck*.c" matches all files whose names start with "ck" and end
- with ".c", including "ck.c".
- ?
- Matches any single character. For example, "ck?.c" matches all
- files whose names are exactly 5 characters long and start with
- "ck" and end with ".c". When typing commands at the prompt, you
- must precede any question mark to be used for matching by a
- backslash (\) to override the normal function of question mark,
- which is providing menus and file lists.
- C-Kermit 7.0 adds the additional features that users of ksh, csh, and
- bash are accustomed to:
- [abc]
- Square brackets enclosing a list of characters matches any
- single character in the list. Example: ckuusr.[ch] matches
- ckuusr.c and ckuusr.h.
- [a-z]
- Square brackets enclosing a range of characters; the hyphen
- separates the low and high elements of the range. For example,
- [a-z] matches any character from a to z.
- [acdm-z]
- Lists and ranges may be combined. This example matches a, c, d,
- or m through z.
- {string1,string2,...}
- Braces enclose a list of strings to be matched. For example:
- ck{ufio,vcon,cmai}.c matches ckufio.c, ckvcon.c, or ckcmai.c.
- The strings may themselves contain metacharacters, bracket
- lists, or indeed, other lists of strings, but (when matching
- filenames) they may not contain directory separators.
- Thus, the metacharacters in filenames (and in any other field
- that can be a pattern, such as the IF MATCH pattern, SEND or GET
- exception lists, etc) are:
- * ? [ {
- And within braces only, comma (,) is a metacharacter.
- To include a metacharacter in a pattern literally, precede it with a
- backslash '\' (or two if you are passing the pattern to a macro).
- Examples:
- send a*b ; Send all files whose names start with 'a' and end with 'b'.
- send a?b ; Ditto, but the name must be exactly three characters long.
- send a[a-z]b ; Ditto, but the second character must be a lowercase letter.
- send a[x\-z]b ; Ditto, except the second character must be 'x', '-', or 'y'.
- send a[ghi]b ; Ditto, except the second character must be 'g', 'h', or 'i'.
- send a[?*]b ; Ditto, except the second character must be '?' or '*'.
- send a[\?\*]b ; Same as previous.
- send *?[a-z]* ; All files with names containing at least one character
- ; that is followed by a lowercase letter.
- Or, more practically:
- send ck[cuw]*.[cwh] ; Send the UNIX C-Kermit source files.
- To refer to the C-Kermit sources files and makefile all in one
- filespec:
- {{makefile,ck[cuw]*.[cwh]}}
- (NOTE: if the entire pattern is a {stringlist}, you must enclose it it
- TWO pairs of braces, since the SEND command strips the outer brace
- pair, because of the "enclose in braces if the filename contains
- spaces" rule).
- If the makefile is called ckuker.mak:
- ck[cuw]*.{[cwh],mak}
- (NOTE: double braces are not needed here since the pattern does not
- both begin and end with a brace.)
- To add in all the C-Kermit text files:
- ck[cuw]*.{[cwh],mak,txt}
- All of these features can be used anywhere you would type a filename
- that is allowed to contain wildcards.
- When you are typing at the command prompt, an extra level of quoting is
- required for the '?' character to defeat its regular function of
- producing a list of files that match what you have typed so far, for
- example:
- send ck[cu]?
- lists all the files whose names start with ckc and cku. If you quote
- the question mark, it is used as a pattern-matching character, for
- example:
- send ck\?[ft]io.c
- sends all the file and communications i/o modules for all the
- platforms: ckufio.c, ckutio.c, ckvfio.c, ckvtio.c, etc.
- If, however, a filename actually contains a question mark and you need
- to refer to it on the command line, you must use three (3) backslashes.
- For example, if the file is actually called ck?fio.c, you would use:
- send ck\\\?fio.c
- Further notes on quoting:
- * A single backslash is sufficient for quoting a special character at
- the command prompt or in a command file. However, when passing
- patterns to macros you'll need double backslashes, and when
- referring to these patterns within the macro, you'll need to use
- \fcontents(\%1) (see Section 1.11.5). You should enclose macro
- argument references in braces in case grouped arguments were
- passed. Example:
- define ismatch {
- if match {\fcont(\%1)} {\fcont(\%2)} {
- end 0 MATCH
- } else {
- end 1 NO MATCH
- }
- }
- ismatch ab*yz a*\\**z ; Backslash must be doubled
- ismatch {abc def xyz} *b*e*y* ; Braces must be used for grouping
- * Watch out for possible conflicts between {} in filename patterns
- and {} used for grouping multiple words into a single field, when
- the pattern has outer braces. For example, in:
- if match {abc xyz} {a* *z} echo THEY MATCH
- braces must be used to group "abc xyz" into a single string. Kermit
- strips off the braces before comparing the string with the pattern.
- Therefore:
- if match makefile {makefile,Makefile} echo THEY MATCH
- does not work, but:
- if match makefile {{makefile,Makefile}} echo THEY MATCH
- does.
- * If you use a pattern that has outer braces, like {*.txt,*.doc}, in
- a field that accepts a pattern list (like SEND /EXCEPT:xxx), you'll
- need to add two extra sets of outer braces:
- send /except:{{{*.txt,*.doc}}} *.*
- C-Kermit's new pattern matching capabilities are also used when
- C-Kermit is in server mode, so now you can send requests such as:
- get ck[cuw]*.[cwh]
- to a C-Kermit server without having to tell it to SET WILD SHELL first.
- Previously this would have required:
- mget ckc*.c ckc*.w ckc*.h cku*.c cku*.w cku*.h ckw*.c ckw*.w ckw*.h
- The new pattern matching features make SET WILD SHELL redundant, and
- barring any objections, it will eventually be phased out. (One possible
- reason for retaining it would be as an escape mechanism when Kermit
- does not understand the underlying file system.)
- By the way, patterns such as these are sometimes referred to as
- "regular expressions", but they are not quite the same. In a true
- regular expression (for example), "*" means "zero or more repetitions
- of the previous item", so (for example), "([0-9]*)" would match zero or
- more digits in parentheses. In Kermit (and in most shells), this
- matches one digit followed by zero or more characters, within
- parentheses. Here are some hints:
- * Although you can't match any sequence of digits (or letters, etc),
- you can match (say) 1, 2, or 3 of them in row. For example, the
- following pattern matches Kermit backup files (with backup numbers
- from 1 to 999):
- *.~{[1-9],[1-9][0-9],[1-9][0-9][0-9]}~
- * There is presently no NOT operator, so no way to match any
- character or string EXCEPT the one(s) shown.
- In other wildcarding news...
- * You may now "send xxx" where "xxx" is a directory name, and this
- will send all the files from the directory xxx, as if you had typed
- "send xxx/*". You can also use the special shorthand "send ." to
- send all the files from the current directory.
- * To easily skip over backup files (the ones whose names end like
- .~22~) when sending, you can use SEND /NOBACKUP (seeSection
- 4.0.6 for details).
- * When choosing Kermit to expand wildcards, rather than the shell,
- you can choose whether "dot files" -- files whose names begin with
- ".", which are normally "invisible" -- should be matched:
- SET WILD KERMIT /NO-MATCH-DOT-FILES (this is the default)
- SET WILD KERMIT /MATCH-DOT-FILES (this allows matching of "." files)
- or include the /DOTFILES or /NODOTFILES switch on the command you
- are using, such as SEND or DIRECTORY.
- * Commands such as DIRECTORY and SEND allow recursive directory
- traversal. There are also new functions for this to use in scripts.
- See Section 4.11 for details.
- When building file lists in UNIX, C-Kermit follows symbolic links.
- Because of this, you might encounter any or all of the following
- phenomena:
- * Multiple copies of the same file; e.g. one from its real directory
- and others from links to its real directory, if both the real
- directory and the links to it are in the wildcard expansion list.
- * A command might unexpectedly "hang" for a long time because an NFS
- link might not be responding, or the directory you are looking at
- contains a link to a huge directory tree (example: "directory
- /recursive /etc" when /etc/spool is a symlink to /var/spool, which
- is a large organization's incoming email directory, containing tens
- of thousands of subdirectories).
- The size of the file list that Kermit can build is limited in most
- C-Kermit implementations. The limit, if any, depends on the
- implementation. Use the SHOW FEATURES command and look in the
- alphabetized options list for MAXWLD to see the value.
- 4.9.2. In Kermit 95
- Kermit 95 1.1.19 and later uses the same pattern matching syntax as in
- UNIX, but (as always) you will encounter numerous difficulties if you
- use backslash (\) as the directory separator. In any command where K95
- parses filenames itself (that is, practically any file-oriented command
- except RUN), you can use forward slash (/) as the directory separator
- to avoid all the nasty conflicts.
- 4.9.3. In VMS, AOS/VS, OS-9, VOS, etc.
- Platforms other than UNIX, Windows 95/98/NT, and OS/2 have their own
- filename matching capabilities that are, in general, different from
- Kermit's built-in ones and in any case might conflict with them. For
- example, [] encloses directory names in VMS.
- Nevertheless you can still use all the pattern-matching capabilities
- described in Section 4.9.1 by loading a file list into an array
- (e.g. with \ffiles(*,&a), see Section 4.11.3) and then using IF
- MATCH on the members.
- 4.10. Additional Pathname Controls
- In version 6.0 and earlier, C-Kermit's SET { SEND, RECEIVE } PATHNAMES
- command had only ON and OFF as options. In version 7.0, there are more
- choices:
- SET SEND PATHNAMES OFF
- When sending a file, strip all disk/directory information from
- the name. Example: "send /usr/olga/letters/oofa.txt" sends the
- file as "oofa.txt". This applies to actual filenames, not to any
- as-name you might specify.
- SET SEND PATHNAMES RELATIVE
- When sending a file, leave the pathname on as given. For
- example, if your current directory is /usr/olga, "send
- letters/oofa.txt" sends the file as "letters/oofa.txt", not
- "/usr/olga/letters/oofa.txt" or "letters.txt".
- SET SEND PATHNAMES ABSOLUTE
- When sending a file, convert its name to the full, absolute
- local pathname. For example, if your current directory is
- /usr/olga, "send letters/oofa.txt" sends the file as
- "/usr/olga/letters/oofa.txt". NOTE: Even with this setting,
- device and/or node names are not included. For example, in VMS,
- any node or device name is stripped; in Windows or OS/2, any
- disk letter is stripped.
- SET RECEIVE PATHNAMES OFF
- When receiving a file, strip all disk/directory information from
- the name before attempting to store it. This applies to incoming
- filename, not to any as-name you might specify. Example: If a
- file arrives under the name "/usr/olga/letters/oofa.txt" it is
- stored simply as "oofa.txt" in your download directory or, if no
- download directory has been specified, in your current
- directory.
- SET RECEIVE PATHNAMES RELATIVE
- When receiving a file, leave the pathname on as it appears in
- the incoming name, but if the incoming name appears to be
- absolute, make it relative to your current or download
- directory. Examples:
- + "oofa.txt" is stored as "oofa.txt".
- + "letters/oofa.txt" is stored as "letters/oofa.txt"; the
- "letters" subdirectory is created if it does not already
- exist.
- + "/usr/olga/letters/oofa.txt" is stored as
- "usr/olga/letters/oofa.txt" in your current or download
- directory, and the "usr", "usr/olga", etc, directories are
- created if they do not exist.
- SET RECEIVE PATHNAMES ABSOLUTE
- The incoming filename is used as given. Thus it cannot be stored
- unless the given path (if any) already exists or can be created.
- In this case, node, device, or disk designations are NOT
- stripped, since they most likely were given explicitly by the
- user as an as-name, meant to be used as given.
- SET RECEIVE PATHNAMES AUTO
- This is the default, and means RELATIVE if the sender tells me
- it is a recursive transfer, OFF otherwise.
- Set FILE NAMES CONVERTED now also affects pathnames too. When PATHNAMES
- are RELATIVE or ABSOLUTE and FILE NAMES are CONVERTED, the file sender
- converts its native directory-name format to UNIX format, and the file
- receiver converts from UNIX format to its native one; thus UNIX format
- is the common intermediate representation for directory hierarchies, as
- it is in the ZIP/UNZIP programs (which is why ZIP archives are
- transportable among, UNIX, DOS, and VMS).
- Here's an example in which a file is sent from Windows to UNIX with
- relative pathnames and FILE NAMES CONVERTED:
- Source name Intermediate name Destination Name
- C:\K95\TMP\OOFA.TXT K95/TMP/OOFA.TXT k95/tmp/oofa.txt
- In a more complicated example, we send the same file from Windows to
- VMS:
- Source name Intermediate name Destination Name
- C:\K95\TMP\OOFA.TXT K95/TMP/OOFA.TXT [.K95.TMP]OOFA.TXT
- (Note that disk letters and device designations are always stripped
- when pathnames are relative).
- As you can imagine, as more and more directory formats are considered,
- this approach keeps matters simple: on each platform, Kermit must know
- only its own local format and the common intermediate one. In most
- cases, the receiver can detect which format is used automatically.
- 4.11. Recursive SEND and GET: Transferring Directory Trees
- C-Kermit 7.0 in selected versions (UNIX, VMS, VOS, AOS/VS, Windows, and
- OS/2 at this writing) now permits the SEND command to traverse
- directories "recursively" if you ask it to; that is, to send files from
- the current or specified directory and all of its subdirectories too,
- and their subdirectories, etc. (Some other commands can do this too,
- including DIRECTORY.)
- This feature is new to UNIX, Windows, VOS, and OS/2. VMS and AOS/VS
- have always included "wildcard" or "template" characters that allow
- this, and in this case, recursive directory traversal could happen
- behind Kermit's back, i.e. Kermit does not have to do it itself (in
- VMS, the notation is "[...]" or "[directory...]"; in AOS/VS is "#"). In
- C-Kermit 7.0, however, SEND /RECURSIVE is supported by C-Kermit itself
- for VMS.
- 4.11.1. Command-Line Options
- To descend a directory tree when sending files, use the -L command-line
- option to indicate that the send operation is to be recursive, and
- include a name or pattern to be sent. When giving a pattern, you should
- enclose it in quotes to prevent the shell from expanding it. Examples:
- $ kermit -Ls "/usr/olga/*" # send all of Olga's files in all her directories
- $ kermit -Ls foo.txt # send all foo.txt files in this directory tree
- $ kermit -Ls "*.txt" # send all .txt files in this directory tree
- $ kermit -Ls "letters/*" # send all files in the letters directory tree
- $ kermit -Ls letters # send all files in the letters directory tree
- $ kermit -Ls "*" # send all files in this directory tree
- $ kermit -Ls . # UNIX only: send all files in this directory tree
- $ kermit -s . # UNIX only: a filename of . implies -L
- If you let the shell expand wildcards, Kermit only sends files whose
- names match files in the current or given directory, because the shell
- replaces an unquoted wildcard expression with the list of matching
- files -- and the shell does not build recursive lists. Note that the
- "." notation for the tree rooted at the current directory is allowed
- only in UNIX, since in Windows and OS/2, it means "*.*" (nonrecursive).
- 4.11.2. The SEND /RECURSIVE Command
- If you include the /RECURSIVE switch in a SEND (or MOVE, or similar)
- command, it means to descend the current or specified directory tree
- searching for files whose names match the given name or pattern. Since
- this is not terribly useful unless you also include pathnames with the
- outbound files, the /RECURSIVE switch also includes an implicit
- /PATHNAMES:RELATIVE switch (which you can undo by including an explicit
- /PATHNAMES switch after the /RECURSIVE switch).
- Examples:
- SEND /RECURSIVE *
- Sends all of the files in the current directory and all the
- files in all of its subdirectories, and all of their
- subdirectories, etc, including their relative pathnames. Empty
- directories are not sent.
- SEND /RECURSIVE /PATHNAMES:ABSOLUTE *
- Sends all of the files in the current directory and all the
- files in all of its subdirectories, and all of their
- subdirectories, etc, including their absolute pathnames.
- SEND /RECURSIVE /PATHNAMES:OFF *
- Sends all of the files in the current directory and all the
- files in all of its subdirectories, and all of their
- subdirectories, etc, without pathnames.
- SEND /RECURSIVE /usr/olga/*
- Sends all of the files in the /usr/olga directory and all the
- files in all of its subdirectories, and all of their
- subdirectories, etc.
- SEND /RECURSIVE /usr/olga (or /usr/olga/)
- Same as above. If the name is a directory name (with or without
- a trailing slash), its files are sent, and those of its
- subdirectories, and their subdirectories, etc (seeSection
- 4.9).
- SEND /RECURSIVE /TEXT /usr/olga/*.txt
- As above, but only files whose names end with ".txt" are sent,
- and they are sent in text mode (as they would be by default
- anyway if SET FILE PATTERNS is ON or AUTO).
- SEND .
- UNIX only: Send all the files in the current directory.
- SEND /RECURSIVE .
- UNIX only: Sends all of the files in the current directory and
- all of its subdirectories, etc ( Section 4.9).
- The /RECURSIVE switch is different from most other switches in that its
- effect is immediate (but still local to the command in which it is
- given), because it determines how filenames are to be parsed. For
- example, "send *.txt" fails with a parse error ("No files match") if
- there are no *.txt files in the current directory, but "send /recursive
- *.txt" succeeds if there are ".txt" files anywhere in the tree rooted
- at the current directory.
- The /RECURSIVE switch also affects the file lists displayed if you type
- "?" in a filename field. "send ./?" lists the regular files in the
- current directory, but "send /recursive ./?" lists the entire directory
- tree rooted at the current directory.
- 4.11.3. The GET /RECURSIVE Command
- In a client/server setting, the client can also request a recursive
- transfer with:
- GET /RECURSIVE [ other switches ] remote-filespec [ local-spec ]
- In which remote file specification can be a directory name, a filename,
- a wildcard, or any combination. If the local-spec is not given (and
- PATHNAMES are RELATIVE), incoming files and directories go into the
- current local directory. If local-spec is given and is a directory, it
- becomes the root of the tree into which the incoming files and
- directories are placed. If local-spec has the syntax of a directory
- name (e.g. in UNIX it ends with /), C-Kermit creates the directory and
- then places the incoming files into it. If local-spec is a filename
- (not recommended), then all incoming files are stored with that name
- with collisions handled according to the FILE COLLISION setting.
- Again, the normal method for transferring directory trees uses relative
- pathnames, and this is the default when the sender has been given the
- /RECURSIVE switch. The action at the receiver depends on its RECEIVE
- PATHNAMES setting. The default is AUTO, meaning that if the sender
- tells it to expect a recursive transfer, then it should automatically
- switch to relative pathnames for this transfer only; otherwise it obeys
- the RECEIVE PATHNAMES setting of OFF, ABSOLUTE, or RELATIVE.
- What happens if a file arrives that has an absolute pathname, when the
- receiver has been told to use only relative pathnames? As a security
- precaution, in this case the receiver treats the name as if it was
- relative. For example, if a file arrives as:
- /usr/olga/oofa.txt
- The receiver creates a "usr" subdirectory in its current directory, and
- then an "olga" subdirectory under the "usr" subdirectory in which to
- store the incoming file.
- Suppose, however there is a sequence of directories:
- /usr/olga/a/b/c/d/
- in which "a" contains nothing but a subdirectory "b", which in turn
- contains nothing but a subdirectory "c", which in turn contains nothing
- but a subdirectory "d", which contains nothing at all. Thus there are
- no files in the "/usr/olga/a/" tree, and so it is not sent, and
- therefore it is not reproduced on the target computer.
- 4.11.4. New and Changed File Functions
- C-Kermit 7.0 adds the following functions:
- \ffiles(pattern[,&a])
- This function has been changed to match only regular files in
- the current or given directory, and to take an optional array
- name as a second argument (explained below).
- \fdirectories(pattern[,&a])
- Returns the number of directories that match the given pattern.
- If the pattern does not include a directory, then the search is
- performed in the current directory.
- \frfiles(pattern[,&a])
- Returns the number of files in the current or given directory
- and all of its subdirectories, and their subdirectories, etc,
- that match the given pattern. Warning -- this one can take quite
- some time if performed at the root of a large directory tree.
- \frdirectories(pattern[,&a])
- Returns the number of directories in the current or given
- directory and all of its subdirectories, and their
- subdirectories, etc, that match the given pattern.
- Each of these functions builds up a list of files to be returned by the
- \fnextfile() function, just as \ffiles() always has done. (This can
- also be done with the /ARRAY switch of the DIRECTORY command; see
- Sections 4.5.1 and7.10).
- Each of these functions can be given an array name as an optional
- second argument. If an array name is supplied, the array will contain
- the number of files as its 0th element, and the filenames in elements 1
- through last. If the array already existed, its previous contents are
- lost. For example, if the current directory contains two files,
- oofa.txt and foo.bar, then "\ffiles(*,&a)" creates an array \&a[] with
- a dimension of 2, containing the following elements:
- \&a[0] = 2
- \&a[1] = oofa.txt
- \&a[2] = foo.bar
- If no files match the specification given in the first argument, the
- array gets a dimension of 0, which is the same as undeclaring the
- array.
- Note that the order in which the array is filled (and in which
- \fnextfile() returns filenames) is indeterminate (but seeSection
- 7.10.5).
- Here's an example that builds and prints a list of all the file whose
- names end in .txt in the current directory and all its descendents:
- asg \%n \frfiles(*.txt)
- declare \&a[\%n]
- for \%i 1 \%n 1 {
- asg \&a[\%i] \fnextfile()
- echo \flpad(\%i,4). "\&a[\%i]"
- }
- Alternatively, using the array method, and then printing the filenames
- in alphabetic order (see Section 7.10.3 and7.10.5):
- asg \%n \frfiles(*.txt,&a)
- sort &a
- for \%i 1 \%n 1 {
- echo \flpad(\%i,4). "\&a[\%i]"
- }
- Or even more simply:
- asg \%n \frfiles(*.txt,&a)
- sort &a
- show array &a
- As noted elsewhere, the file lists built by \ffiles(), \frfiles(), etc,
- are now "safe" in the sense that SEND and other file-related commands
- can reference \fnextfile() without resetting the list:
- set send pathnames relative
- for \%i 1 \frfiles(*.txt) 1 {
- asg \%a \fnextfile()
- echo Sending \%a...
- send \%a
- if fail break
- }
- Copying to an array (as shown on p.398 ofUsing C-Kermit 2nd Ed)
- is no longer necessary.
- 4.11.5. Moving Directory Trees Between Like Systems
- 4.11.5.1. UNIX to UNIX
- Transferring a directory tree from one computer to another replicates
- the file sender's arrangement of files and directories on the file
- receiver's computer. Normally this is done using relative pathnames,
- since the user IDs might not be identical on the two computers. Let's
- say both computers are UNIX based, running C-Kermit 7.0 or later. On
- the sending computer (leaving out the connection details, etc):
- C-Kermit> cd /usr/olga
- C-Kermit> send /recursive .
- The /RECURSIVE switch tells C-Kermit to descend through the directory
- tree and to include relative pathnames on outbound filenames.
- On the receiving computer:
- C-Kermit> mkdir olgas-files ; Make a new directory.
- C-Kermit> cd olgas-files ; CD to it.
- C-Kermit> receive /recursive ; = /PATHNAMES:RELATIVE
- Each Kermit program recognizes that the other is running under UNIX and
- switches to binary mode and literal filenames automatically.
- Directories are automatically created on the receiving system as
- needed. File dates and permissions are automatically reproduced from
- source to destination.
- 4.11.5.2. VMS to VMS
- To send recursively from VMS, simply include the /RECURSIVE switch, for
- example at the sender:
- $ kermit
- C-Kermit> cd [olga]
- C-Kermit> send /recursive *.*;0
- And at the receiver:
- C-Kermit> cd [.olga]
- C-Kermit> receive /recursive
- The notation "..." within directory brackets in VMS means "this
- directory and all directories below it"; the /RECURSIVE switch, when
- given to the sender, implies the use of "..." in the file specification
- so you don't have to include "..."; but it makes no difference if you
- do:
- $ kermit
- C-Kermit> send /recursive [olga...]*.*;0
- And at the receiver:
- C-Kermit> cd [.olga]
- C-Kermit> receive /recursive
- In either case, since both systems recognize each other as VMS, they
- switch into LABELED transfer mode automatically.
- 4.11.6. Moving Directory Trees Between Unlike Systems
- There are several difficulties with recursive transfers between unlike
- systems:
- * File formats can be different, especially text files character sets
- and record formats. This can now be handled by using SET FILE
- PATTERN, SET FILE TEXT-PATTERNS, and SET FILE BINARY-PATTERNS
- ( Section 4.3).
- * File naming conventions are different. For example, one system
- might allow (and use) longer filenames than the other. You can tell
- Kermit how to handle file names with the normal "set file names"
- and "set file collision" mechanisms. Most modern Kermits are fairly
- tolerant of illegal filenames and should not fail simply because of
- an incoming filename; rather, it will do its best to convert it to
- a recognizable and unique legal filename.
- * Directory notations can be different, e.g. backslashes instead of
- slashes, brackets, parentheses, spaces, etc. But this is now
- handled by converting pathnames to a standard format during
- transfer ( Section 4.10).
- So now, for the first time, it is possible to send directory trees
- among any combination of UNIX, DOS, Windows, OS/2, VMS, AOS/VS, etc.
- Here's an example sending files from an HP-UX system (where text files
- are encoded in the HP Roman8 character set) to a PC with K95 (where
- text files are encoded in CP850):
- Sender:
- cd xxx ; CD to root of source tree
- set file type binary ; Default transfer mode
- set file character-set hp-roman8 ; Local character set for text files
- set xfer character-set latin1 ; Transfer character set
- set file patterns on ; Enable automatic file-type switching...
- set file binary-patterns *.Z *.gz *.o ; based on these patterns...
- set file text-patterns *.txt *.c *.h ; for binary and text files.
- send /recursive * ; Send all the file in this directory tree
- Receiver:
- cd yyy ; CD to root of destination tree
- set file character-set cp850 ; Local character set for text files
- receive /pathnames:relative ; Receive with pathnames
- Notes:
- * Replace "xxx" and "yyy" with the desired directories.
- * Replace the file character sets appropriately.
- * Change the patterns as needed (or just use the built-in default
- lists).
- * SEND /RECURSIVE also implies /PATHNAMES:RELATIVE.
- * The file sender tells the file receiver the transfer mode of each
- file.
- * The file sender tells the file receiver the transfer character set.
- * By default, destination file dates will be the same as on the
- source.
- * Many of the settings shown might already be set by default.
- * SeeSections 4.3,4.10, and4.15 for additional
- explanation.
- If you are refreshing an existing directory on the destination
- computer, use "set file collision update" or other appropriate file
- collision option to handle filename collisions.
- 4.12. Where Did My File Go?
- Now that Kermit can be started by clicking on desktop icons (thus
- obscuring the concept of "current directory"), and can have a download
- directory, and can create directories for incoming files on the fly,
- etc, sometimes it is easy to lose a file after transfer. Of course, if
- you keep a transaction log:
- LOG TRANSACTIONS
- it will record the fate and final resting place of each file. But in
- case you did not keep a log, the new command:
- WHERE
- added in C-Kermit 7.0, gives you as much information as it has about
- the location of the last files transferred, including the pathname
- reported by the receiving Kermit, if any, when C-Kermit is the sender.
- This information was also added to SHOW FILE in somewhat less detail.
- 4.13. File Output Buffer Control
- (UNIX only). The new command SET FILE OUTPUT lets you control how
- incoming files are written to disk:
- SET FILE OUTPUT BUFFERED [ size ]
- Chooses buffered file output; this is the default. UNIX does its
- normal sort of disk buffering. The optional size specifies
- Kermit's own file output buffer size, and therefore the
- frequency of disk accesses (write() system calls) -- the bigger
- the size, the fewer the disk accesses.
- SET FILE OUTPUT UNBUFFERED [ size ]
- This forces each file output write() call to actually commit the
- data to disk immediately. Choosing this option will usually slow
- file reception down.
- SET FILE OUTPUT BLOCKING
- Write() calls should not return until they are complete. This is
- the normal setting, and it lets Kermit detect disk-write errors
- immediately.
- SET FILE OUTPUT NONBLOCKING
- Write() calls should return immediately. This can speed up file
- reception, but also delay the detection of disk-write errors.
- Experimentation with these parameters should be harmless, and might (or
- might not) have a perceptible, even dramatic, effect on performance.
- 4.14. Improved Responsiveness
- In version 7.0, C-Kermit's file-transfer protocol engine has been tuned
- for additional speed and responsiveness.
- * Binary-mode transfers over 8-bit connections, a very common case,
- are now handled in a special way that minimizes overhead.
- * SET TRANSFER CRC-CALCULATION is now OFF by default, rather than ON.
- (This affects only the overall per-transfer CRC, \v(crc16), not the
- per-packet CRCs)
- * Connection loss during file transfer is now detected immediately in
- most cases on Internet connections and on serial connections when
- CARRIER-WATCH is not set to OFF.
- 4.15. Doubling and Ignoring Characters for Transparency
- The following commands were added in 7.0, primarily to allow successful
- file transfer through ARPAnet TACs and with Honeywell DPS6 systems, but
- can be used in any setting where they might be needed:
- SET SEND DOUBLE-CHAR { [ char [ char [ ... ] ] ], NONE }
- Tells C-Kermit to double the specified characters (use decimal
- notation) in packets that it sends. For example, if you are
- sending files through a device that uses @ as an escape
- character, but allows you to send a single copy of @ through by
- doubling it, use "set send double 64".
- SET RECEIVE IGNORE-CHAR [ char [ char [ ... ] ] ]
- Tells C-Kermit to ignore the specified character(s) in incoming
- packets. Use this, for example, when something between the
- sender and receiver is inserting linefeeds for wrapping, NULs
- for padding, etc.
- 4.16. New File-Transfer Display Formats
- SET TRANSFER DISPLAY { BRIEF, CRT, FULLSCREEN, NONE, SERIAL }
- Selects the file-transfer display format.
- BRIEF is the new one. This writes one line to the screen per file,
- showing the file's name, transfer mode, size, the status of the
- transfer, and when the transfer is successful, the effective data rate
- in characters per second (CPS). Example:
- SEND ckcfn3.o (binary) (59216 bytes): OK (0.104 sec, 570206 cps)
- SEND ckcfns.o (binary) (114436 bytes): OK (0.148 sec, 772006 cps)
- SEND ckcmai.c (text) (79147 bytes): OK (0.180 sec, 438543 cps)
- SEND ckcmai.o (binary) (35396 bytes): OK (0.060 sec, 587494 cps)
- SEND ckcnet.o (binary) (62772 bytes): REFUSED
- SEND ckcpro.o (binary) (121448 bytes): OK (0.173 sec, 703928 cps)
- SEND ckcpro.w (text) (63687 bytes): OK (0.141 sec, 453059 cps)
- SEND makefile (text) (186636 bytes): OK (0.444 sec, 420471 cps)
- SEND wermit (binary) (1064960 bytes): OK (2.207 sec, 482477 cps)
- Note that transfer times are now obtained in fractional seconds, rather
- than whole seconds, so the CPS figures are more accurate (the display
- shows 3 decimal places, but internally the figure is generally precise
- to the microsecond).
- 4.17. New Transaction Log Formats
- The new command:
- SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF [ separator ] }
- lets you choose the format of the transaction log. VERBOSE (the
- default) indicates the traditional format described in the book. BRIEF
- and FTP are new. This command must be given prior to the LOG
- TRANSACTION command if a non-VERBOSE type is desired.
- 4.17.1. The BRIEF Format
- BRIEF chooses a one-line per file format suitable for direct
- importation into databases like Informix, Oracle, or Sybase, in which:
- * Each record has 8 fields.
- * Fields are separated by a non-alphanumeric separator character.
- * The default separator character is comma (,).
- * Any field containing the separator character is enclosed in
- doublequotes.
- * The final field is enclosed in doublequotes.
- The fields are:
- 1. Date in yyyymmdd format
- 2. Time in hh:mm:ss format
- 3. Action: SEND or RECV
- 4. The local filename
- 5. The size of the file
- 6. The transfer mode (text, binary, image, labeled)
- 7. The status of the transfer: OK or FAILED
- 8. Additional status-dependent info, in doublequotes.
- Examples:
- 20000208,12:08:52,RECV,/u/olga/oofa.txt,5246,text,OK,"0.284sec 18443cps"
- 20000208,12:09:31,SEND,/u/olga/oofa.exe,32768,binary,OK,"1.243sec 26362cps"
- 20000208,12:10:02,SEND,"/u/olga/a,b",10130,text,FAILED,"Refused: date"
- Note how the filename is enclosed in doublequotes in the final example,
- because it contains a comma.
- To obtain BRIEF format, you must give the SET TRANSACTION-LOG BRIEF
- command before the LOG TRANSACTIONS command. (If you give them in the
- opposite order, a heading is written to the log by the LOG command.)
- 4.17.2. The FTP Format
- SET TRANSACTION-LOG FTP (available only in UNIX) chooses a format that
- is compatible with the WU-FTPD (Washington University FTP daemon) log,
- and so can be processed by any software that processes the WU-FTPD log.
- It logs only transfers in and out, both successful and failed (but
- success or failure is not indicated, due to lack of a field in the
- WU-FTPD log format for this purpose). Non-transfer events are not
- recorded.
- Unlike other logs, the FTP-format transaction log is opened in append
- mode by default. This allows you to easily keep a record of all your
- kermit transfers, and it also allows the same log to be shared by
- multiple simultaneous Kermit processes or (permissions permitting)
- users. You can, of course, force creation of a new logfile by
- specifying the NEW keyword after the filename, e.g.
- log transactions oofa.log new
- All records in the FTP-style log are in a consistent format. The first
- field is fixed-length and contains spaces; subsequent fields are
- variable length, contain no spaces, and are separated by one or more
- spaces. The fields are:
- Timestamp
- This is an asctime-style timestamp, example: "Wed Sep 16
- 20:19:05 1999" It is always exactly 24 characters long, and the
- subfields are always in fixed positions.
- Elapsed time
- The whole number of seconds required to transfer the file, as a
- string of decimal digits, e.g. "24".
- Connection
- The name of the network host to which C-Kermit is connected, or
- the name of the serial device through which it has dialed (or
- has a direct connection), or "/dev/tty" for transfers in remote
- mode.
- Bytes transferred
- The number of bytes transferred, decimal digits, e.g. "1537904".
- Filename
- The name of the file that was transferred, e.g.
- "/pub/ftp/kermit/a/README.TXT". If the filename contains any
- spaces or control characters, each such character is replaced by
- an underscore ('_') character.
- Mode
- The letter 'b' if the file was transferred in binary mode, or
- 'a' if it was transferred in text (ASCII) mode.
- Options
- This field always contains an underscore ('_') character.
- Direction
- The letter 'o' if the file was transferred Out, and 'i' if the
- file was transferred In.
- User class
- The letter 'r' indicates the file was transferred by a Real
- user.
- User identification
- The ID of the user who transferred the file.
- Server identification
- The string "kermit". This distinguishes a Kermit transfer log
- record from a WU-FTPD record, which contains "ftp" in this
- field.
- Authentication class
- The digit '1' if we know the user's ID on the client system,
- otherwise '0'. Currently, always '0'.
- Authenticated user
- If the authentication class is '1', this is the user's ID on the
- client system. Otherwise it is an asterisk ('*'). Currently it
- is always an asterisk.
- Examples:
- Thu Oct 22 17:42:48 1998 0 * 94 /usr/olga/new.x a _ i r olga kermit 0 *
- Thu Oct 22 17:51:29 1998 1 * 147899 /usr/olga/test.c a _ o r olga kermit 0 *
- Thu Oct 22 17:51:44 1998 1 * 235 /usr/olga/test.o b _ i r olga kermit 0 *
- Fri Oct 23 12:10:25 1998 0 * 235 /usr/olga/x.ksc a _ o r olga kermit 0 *
- Note that an ftp-format transaction log can also be selected on the
- Kermit command line as follows:
- kermit --xferfile:filespec
- This is equivalent to:
- SET TRANSACTION-LOG FTP
- LOG TRANSACTIONS filespec APPEND
- Conceivably it could be possible to have a system-wide shared Kermit
- log, except that UNIX lacks any notion of an append-only file; thus any
- user who could append to the log could also delete it (or alter it).
- This problem could be worked around using setuid/setgid tricks, but
- these would most likely interfere with the other setuid/setgid tricks
- C-Kermit must use for getting at dialout devices and UUCP logfiles.
- 4.18. Unprefixing NUL
- As of 6.1.193 Alpha.10, C-Kermit can finally send and receive
- file-transfer packets in which NUL (ASCII 0) is unprefixed (no more
- NUL-terminated packets!). NUL is, of course, extremely prevalent in
- binary files such as executables, and this has been a significant
- source of packet overhead. For example, when transferring itself (the
- SunOS C-Kermit executable) with minimal prefixing and 9000-byte
- packets, we see:
- File size: 1064960
- Packet chars with 0 prefixed: 1199629 overhead = 12.65%
- Packet chars with 0 unprefixed: 1062393 overhead = -0.03%
- Transfer rates go up accordingly, not only because of the reduced
- amount of i/o, but also because less computation is required on each
- end.
- 4.19. Clear-Channel Protocol
- Now that C-Kermit itself is capable of sending and receiving any byte
- at all on a clear channel ( Section 4.18), it is, for the first
- time, in a position to negotiate a clear channel with the other Kermit,
- giving it permission (but not requiring it) to unprefix any and all
- characters that it knows are safe. In general this means all but the
- Kermit start-of-packet character (normally Ctrl-A), Carriage Return
- (not only Kermit's end-of-packet character, but also treated specially
- on Telnet NVT links), and IAC (255, also special to Telnet).
- By default, C-Kermit will say it has a clear channel only if it has
- opened a TCP socket. Since the Kermit program on the far end of a
- TCP/IP connection generally does not know it has a TCP/IP connection,
- it will not announce a clear channel unless it has been told to do so.
- The command is:
- SET CLEAR-CHANNEL { ON, OFF, AUTO }
- AUTO is the default, meaning that the clear-channel status is
- determined automatically from the type of connection. ON means to
- announce a clear channel, OFF means not to announce it. Use SHOW
- STREAMING ( Section 4.20) to see the current CLEAR-CHANNEL status.
- Synonym: SET CLEARCHANNEL.
- CLEAR-CHANNEL is also set if you start C-Kermit with the -I switch (see
- Section 4.20).
- Whenever a clear channel is negotiated, the resulting control-character
- unprefixing is "sticky"; that is, it remains in effect after the
- transfer so you can use SHOW CONTROL to see what was negotiated.
- You can also see whether a clear channel was negotiated in the
- STATISTICS /VERBOSE Display.
- The advantage of the clear channel feature is that it can make file
- transfers go faster automatically. The disadvantage would be
- file-transfer failures if the channel is not truly clear, for example
- if C-Kermit made a Telnet connection to a terminal server, and then
- dialed out from there; or if C-Kermit made an Rlogin connection to host
- and then made a Telnet connection from there to another host. If a file
- transfer fails on a TCP/IP connection, use SHOW CONTROL to check
- whether control characters became unprefixed as a result of protocol
- negotiations, and/or SHOW STREAMING ( Section 4.20) to see if
- "clear-channel" was negotiated. If this happened, use SET CLEAR-CHANNEL
- OFF and SET PREFIXING CAUTIOUS (or whatever) to prevent it from
- happening again.
- 4.20. Streaming Protocol
- A new Kermit protocol option called "streaming" was added in C-Kermit
- 7.0. The idea is that if the two Kermit partners have a reliable
- transport (such as TCP/IP or X.25) between them, then there is no need
- to send ACKs for Data packets, or NAKs, since a reliable transport
- will, by definition, deliver all packets in order and undamaged. On
- such a connection, streaming cuts down not only on Kermit program
- overhead (switching back and forth between reading and sending
- packets), but also tends to make the underlying transport use itself
- more efficiently (e.g. by defeating the Nagle algorithm and/or Delayed
- ACK stratagem of the TCP layer). Furthermore, it allows transfers to
- work smoothly on extremely slow network congestions that would
- otherwise cause timeouts and retransmissions, and even failure when the
- retry limit was exceeded.
- The trick is knowing when we can stream:
- 1. If C-Kermit has opened a TCP socket or X.25 connection, it offers
- stream.
- 2. If C-Kermit has been started with the -I (uppercase) option, or if
- it has been told to SET RELIABLE ON, it offers to stream.
- 3. If C-Kermit is in remote mode, and has been told to SET RELIABLE
- AUTO (or ON), it always offers to stream, and also always agrees to
- stream, if the other Kermit offers. Unless you take explicit
- actions to override the defaults, this allows the local Kermit (the
- one that made the connection, and so knows whether it's reliable)
- to control streaming.
- (Note that an offer to stream also results in a Clear-Channel
- announcement if CLEAR-CHANNEL is set to AUTO; see Section 4.19.)
- When BOTH Kermits offer to stream, then they stream; otherwise they
- don't. Thus streaming-capable Kermit programs interoperate
- automatically and transparently with nonstreaming ones. If the two
- Kermits do agree to stream, you'll see the word "STREAMING" on the
- fullscreen file-transfer display in the Window Slots field. You can
- also find out afterwards with the STATISTICS or SHOW STREAMING
- commands.
- WARNING: Automatic choice of streaming is based on the assumption of
- a "direct" end-to-end network connection; for example, a Telnet or
- Rlogin connection from host A to host B, and transferring files
- between A and B. However, if your connection has additional
- components -- something "in the middle" (B) that you have made a
- network connection to, which makes a separate connection to the
- destination host (C), then you don't really have a reliable
- connection, but C-Kermit has no way of knowing this; transferring
- files between A and C will probably fail. In such cases, you'll need
- to tell the *local* C-Kermit to "set reliable off" before
- transferring files (it does no good to give this command to the
- remote Kermit since the local one controls the RELIABLE setting).
- Streaming is like using an infinite window size, with no timeouts and
- no tolerance for transmission errors (since there shouldn't be any). It
- relies on the underlying transport for flow control, error correction,
- timeouts, and retransmission. Thus it is very suitable for use on
- TCP/IP connections, especially slow or bursty ones, since Kermit's
- packet timeouts won't interfere with the transfer -- each packet takes
- as long to reach its destination as it takes TCP to deliver it. If TCP
- can't deliver the packet within its own timeout period (over which
- Kermit has no control), it signals a fatal error. Just like FTP.
- Streaming goes much faster than non-streaming when a relatively small
- packet length is used, and it tends to go faster than non-streaming
- with even the longest packet lengths. The Kermit window size is
- irrelevant to streaming protocol, but still might affect performance in
- small ways since it can result in different paths through the code.
- The definition of "reliable transport" does not necessarily demand
- 8-bit and control-character transparency. Streaming can work with
- parity and/or control-character prefixing just as well (but not as
- fast) as without them; in such cases you can leave RELIABLE set to ON,
- but set CLEARCHANNEL and/or PARITY appropriately.
- Maximum performance -- comparable to and often exceeding FTP -- is
- achieved on socket-to-socket connections (in which the considerable
- overhead of the terminal driver and Telnet or Rlogin server is
- eliminated) with long packets and the new "brief" file-transfer display
- ( Section 4.16).
- 4.20.1. Commands for Streaming
- SET RELIABLE { ON, OFF, AUTO }
- SET RELIABLE ON tells Kermit that it has a reliable transport.
- SET RELIABLE OFF tells Kermit the transport is not reliable.
- SET RELIABLE AUTO tells Kermit that it should SET RELIABLE ON
- whenever it makes a reliable connection (e.g. TELNET or SET HOST
- on a TCP/IP or X.25 network), and when in remote mode it should
- believe the transport is reliable if the other Kermit says it is
- during Kermit protocol negotiation.
- AUTO is the default; the Kermit program that makes the connection knows
- whether it is reliable, and tells the remote Kermit.
- The RELIABLE setting has several effects, including:
- * It can affect the timeouts used during normal ACK/NAK protocol.
- * It can affect the clear-channel announcement.
- * It can affect streaming.
- If you TELNET or SET HOST somewhere, this includes an implicit SET
- RELIABLE ON command. The -I command-line option is equivalent to SET
- RELIABLE ON.
- Since SET RELIABLE ON (and -I) also implies SET CLEAR CHANNEL ON, you
- might find that in certain cases you need to tell Kermit that even
- though the connection is reliable, it doesn't have a clear channel
- after all:
- SET CLEAR-CHANNEL OFF
- SET PREFIXING CAUTIOUS ; or whatever...
- You can control streaming without affecting the other items with:
- SET STREAMING { ON, OFF, AUTO }
- AUTO is the default, meaning streaming will occur if Kermit has made a
- TCP/IP connection or if RELIABLE is ON (or it was started with the -I
- command line option). OFF means don't stream; ON means offer to stream
- no matter what.
- 4.20.2. Examples of Streaming
- Here we look at the use and behavior of streaming on several different
- kinds of connections, and compare its performance with non-streaming
- transfers.
- 4.20.2.1. Streaming on Socket-to-Socket Connections
- Here we get streaming automatically when both Kermit programs are
- capable of it, since they both make socket connections. For example, on
- the far end:
- C-Kermit> set host * 3000
- C-Kermit> server
- and on the near end:
- C-Kermit> set host foo.bar.xyz.com 3000
- (now give SEND and GET command)
- All subsequent file transfers use streaming automatically.
- Here are the results from 84 trials, run on a production network,
- disk-to-disk, in which a 1-MB binary file (the SunOS C-Kermit Sparc
- executable) was sent from a Sun Sparc-10 with SunOS 4.1.3 to an IBM
- Power Server 850 with AIX 4.1, socket-to-socket, over a 10Mbps 10BaseT
- Ethernet, using minimal control-character unprefixing, window sizes
- from 10 to 32, and packet sizes from 1450 to 9010:
- Streaming Nonstreaming
- Max CPS 748955 683354
- Min CPS 221522 172491
- Mean CPS 646134 558680
- Median CPS 678043 595874
- Std Dev 101424 111493
- Correlations:
- CPS and window size: -0.036
- CPS and packet length: 0.254
- CPS and streaming: 0.382
- Note that the relationship between streaming and throughput is
- significantly stronger than that between CPS and window size or packet
- length.
- Also note that this and all other performance measurements in this
- section are snapshots in time; the results could be much different at
- other times when the load on the systems and/or the network is higher
- or lower.
- In a similar socket-to-socket trial, but this time over a wide-area
- TCP/IP connection (from New York City to Logan, Utah, about 2000
- miles), the following results were obtained:
- Streaming Nonstreaming
- Max CPS 338226 318203
- Min CPS 191659 132314
- Mean CPS 293744 259240
- Median CPS 300845 273271
- Std Dev 41914 52351
- Correlations:
- CPS and window size: 0.164
- CPS and packet length: 0.123
- CPS and streaming: 0.346
- 4.20.2.2. Streaming on Telnet Connections
- In this case the local copy of Kermit is told to TELNET or SET HOST,
- and so it knows it has a reliable connection and -- unless it has been
- told not to -- will offer to stream, and the other Kermit program,
- since it has STREAMING set to AUTO, agrees.
- Since we have a reliable connection, we'll also get control-character
- unprefixing automatically because of the new clear-channel protocol
- ( Section 4.19).
- Any errors that occur during streaming are fatal to the transfer. The
- message is "Transmission error on reliable link". Should this happen:
- 1. Check the remote Kermit's flow control setting (SHOW
- COMMUNICATIONS). If it is NONE, change it to XON/XOFF, or vice
- versa. If it is XON/XOFF (or you just changed it to XOFF/XOFF),
- make sure the file sender is prefixing the XON and XOFF characters.
- In the most drastic case, use "set prefix all" to force prefixing
- of all control characters.
- 2. The remote Telnet server might chop off the 8th bit. In that case,
- tell C-Kermit to "set parity space". Or, you might be able to force
- the Telnet to allow eight-bit data by telling C-Kermit to "set
- telopt binary request accept" -- that is, request the Telnet server
- to enter binary mode, and accept binary-mode bids from the server.
- 3. The remote Telnet server might have a buffering limitation. If a
- and b don't cure the problem, tell the file receiver to "set
- receive packet-length 1000" (or other number -- use the largest one
- that works). This too, is no different from the non-streaming case
- (more about this in Section 4.20.2.3).
- And remember you can continue interrupted binary-mode transfers where
- they left off with the RESEND (= SEND /RECOVER) command.
- Here are the figures for the same 84 trials between the same Sun and
- IBM hosts as in 4.20.2.1, on the same network, but over a Telnet
- connection rather than socket-to-socket:
- Streaming Nonstreaming
- Max CPS 350088 322523
- Min CPS 95547 173152
- Mean CPS 321372 281830
- Median CPS 342604 291469
- Std Dev 40503 29948
- Correlations:
- CPS and window size: 0.001
- CPS and packet length: 0.152
- CPS and streaming: 0.128
- Here the effect is not as emphatic as in the socket-to-socket case, yet
- on the whole streaming tends to be beneficial.
- Additional measurements on HP-UX using C-Kermit 7.0 Beta.06:
- Windowing Streaming
- HP-UX 8->8 not tested 14Kcps
- HP-UX 8->9 not tested 76Kcps
- HP-UX 8->10 36Kcps 66Kcps
- HP-UX 9->9 not tested 190Kcps
- HP-UX 9->10 160Kcps 378Kcps
- 4.20.2.3. Streaming with Limited Packet Length
- The IRIX telnet server (at least the ones observed in IRIX 5.3 and 6.2)
- does not allow Kermit to send packets longer than 4096 bytes. Thus when
- sending from IRIX C-Kermit when it is on the remote end of a Telnet
- connection, the packet length must be 4K or less. Trials in this case
- (in which packet lengths range from 1450 to 4000) show a strong
- advantage for streaming, which would be evident in any other case where
- the packet length is restricted, and stronger the shorter the maximum
- packet length.
- Streaming Nonstreaming
- Max CPS 426187 366870
- Min CPS 407500 276517
- Mean CPS 415226 339168
- Median CPS 414139 343803
- Std Dev 6094 25851
- Correlations:
- CPS and window size: 0.116
- CPS and packet length: 0.241
- CPS and streaming: 0.901
- 4.20.2.4. Streaming on Dialup Connections
- Here "dialup" refers to a "direct" dialup connection, not a SLIP or PPP
- connection, which is only a particular kind of TCP/IP connection.
- Attempt this at your own risk, and then only if (a) you have
- error-correcting modems, and (b) the connections between the modems and
- computers are also error-free, perfectly flow-controlled, and free of
- interrupt conflicts. Streaming can be used effectively and to fairly
- good advantage on such connections, but remember that the transfer is
- fatal if even one error is detected (also remember that should a
- binary-mode transfer fail, it can be recovered from the point of
- failure with RESEND).
- To use streaming on an unreliable connection, you must tell both
- Kermits that the connection is reliable:
- kermit -I
- or:
- C-Kermit> set reliable on
- In this case, it will probably be necessary to prefix some control
- characters, for example if your connection is through a terminal server
- that has an escape character. Most Cisco terminal servers, for example,
- require Ctrl-^ (30, as well as its high-bit equivalent, 158) to be
- prefixed. To unprefix these, you'll need to defeat the "clear channel"
- feature:
- C-Kermit> set reliable on
- C-Kermit> set clear-channel off
- C-Kermit> set prefixing none
- C-Kermit> set control prefix 1 13 30 158 ; and whatever else is necessary
- Dialup trials were done using fixed large window and packet sizes. They
- compare uploading and downloading of two common types of files, with
- and without streaming. Configuration:
- HP-9000/715/33 -- 57600bps, RTS/CTS -- USR Courier V.34 --
- V.34+V.42, 31200bps -- USR V.34+ Rackmount -- 57600bps, RTS/CTS --
- Cisco terminal server -- Solaris 2.5.1. Packet size = 8000, Window
- Size = 30, Control Character Unprefixing Minimal (but including the
- Cisco escape character).
- Since this is not a truly reliable connection, a few trials failed when
- a bad packet was received (most likely due to UART overruns); the
- failure was graceful and immediate, and the message was informative.
- The results of ten successful trials uploading and downloading the two
- files with and without streaming are:
- Streaming..
- Off On
- Upload 5194 5565 txt (= C source code, 78K)
- 3135 3406 gz (= gzip file, compressed, 85K)
- Download 5194 5565 txt
- 3041 3406 gz
- Each CPS figure is the mean of 10 results.
- A brief test was also performed on a LAT-based dialout connection from
- a VAX 3100 with VMS 5.5 to a USR Courier V.34 connected to a DECserver
- 700 at 19200 bps. The 1-MB Sparc executable downloaded from a Sun to
- the VAX at 1100cps without streaming and 1900cps with streaming, using
- 8000-byte packets, 30 window slots, and minimal prefixing in both
- cases.
- 4.20.2.5. Streaming on X.25 Connections
- We have only limited access to X.25 networks. One trial was performed
- in which the 1MB Solaris 2.4 Sparc executable was transferred over a
- SunLink X.25 connection; nothing is known about the actual physical
- connection. With a packet length of 8000 and a window size of 30, the
- file transferred at 6400 cps (using a maximum of 6 window slots). With
- the same packet length, but with streaming, it transferred without
- mishap at 6710 cps, about 5% faster.
- 4.20.3. Streaming - Preliminary Conclusions
- The results vary with the particular connection, but are good overall.
- Although numerous lower-level tricks can be used to improve performance
- on specific platforms or connection methods, streaming occurs at a
- high, system-independent level of the Kermit protocol and therefore can
- apply to all types of platforms and (reliable) connections
- transparently.
- 4.21. The TRANSMIT Command
- Prior to C-Kermit 7.0, the TRANSMIT command transmitted in text or
- binary mode according to SET FILE TYPE { TEXT, BINARY }. But now that
- binary mode is likely to be the default for protocol transfers, it is
- evident that this not also an appropriate default for TRANSMIT, since
- binary-mode TRANSMIT is a rather specialized and tricky operation.
- Therefore, TRANSMIT defaults to text mode always, regardless of the
- FILE TYPE setting.
- C-Kermit 7.0 expands the capabilities of the TRANSMIT command by adding
- the following switches (see Section 1.5). The new syntax is:
- TRANSMIT [ switches... ] filename
- Zero or more switches may be included:
- /PIPE
- When /PIPE is included, "filename" is interpreted as a system
- command or program whose output is to be sent. Synonym:
- /COMMAND. Example:
- transmit /pipe finger
- You may enclose the command in braces, but you don't have to:
- xmit /pipe {ls -l | sort -r +0.22 -0.32 | head}
- /BINARY
- Transmits the file (or pipe output) in binary mode.
- /TEXT
- Transmits the file (or pipe output) in line-oriented text mode.
- Current FILE CHARACTER-SET and TERMINAL CHARACTER-SET selections
- govern translation. Default.
- /TRANSPARENT
- Specifies text mode without character-set translation, no matter
- what the FILE and TERMINAL CHARACTER-SET selections are.
- /NOWAIT
- This is equivalent to SET TRANSMIT PROMPT 0, but for this
- TRANSMIT command only. Applies only to text mode; it means to
- not wait for any kind of echo or turnaround character after
- sending a line before sending the next line. (Normally Kermit
- waits for a linefeed.)
- When TRANSMIT ECHO is ON, C-Kermit tries to read back the echo of each
- character that is sent. Prior to C-Kermit 7.0, 1 second was allowed for
- each echo to appear; if it didn't show up in a second, the TRANSMIT
- command would fail. Similarly for the TRANSMIT PROMPT character.
- However, with today's congested Internet connections, etc, more time is
- often needed:
- SET TRANSMIT TIMEOUT number
- Specifies the number of seconds to wait for an echo or the prompt
- character when TRANSMIT PROMPT is nonzero; the default wait is 1
- second. If you specify 0, the wait is indefinite. When a timeout
- interval of 0 is specified, and a desired echo or prompt does not show
- up, the TRANSMIT command will not terminate until or unless you
- interrupt it with Ctrl-C; use SET TRANSMIT TIMEOUT 0 with caution.
- Note: to blast a file out the communications connection without any
- kind of synchronization or timeouts or other manner of checking, use:
- SET TRANSMIT ECHO OFF
- SET TRANSMIT PROMPT 0 (or include the /NOWAIT switch)
- SET TRANSMIT PAUSE 0
- TRANSMIT [ switches ] filename
- In this case, text-file transmission is not-line oriented and large
- blocks can be sent, resulting in a significant performance improvement
- over line-at-at-time transmission. Successful operation depends (even
- more than usual for the TRANSMIT command!) on a clean connection with
- effective flow control.
- For details on TRANSMIT and character sets, see Section 6.6.5.4.
- 4.22. Coping with Faulty Kermit Implementations
- Kermit protocol has been implemented in quite a few third-party
- commercial, shareware, and freeware software packages, with varying
- degrees of success. In most cases operation is satisfactory but slow --
- only the bare minimum subset of the protocol is available -- short
- packets, no sliding windows, no attributes, etc. In other cases, the
- implementation is incorrect, resulting in failures at the initial
- negotiation stage or corrupted files.
- C-Kermit 7.0 and Kermit 95 1.1.19 include some new defense mechanisms
- to help cope with the most common situations. However, bear in mind
- there is only so much we can do in such cases -- the responsibility for
- fixing the problem lies with the maker of the faulty software.
- 4.22.1. Failure to Accept Modern Negotiation Strings
- The published Kermit protocol specification states that new fields can
- be added to the parameter negotiation string. These are to be ignored
- by any Kermit implementation that does not understand them; this is
- what makes the Kermit protocol extensible. Unfortunately, some Kermit
- implementations become confused (or worse) when receiving a negotiation
- string longer than the one they expect. You can try working around such
- problems by telling Kermit to shorten its negotiation string (and thus
- disable the corresponding new features):
- SET SEND NEGOTIATION-STRING-MAX-LENGTH number
- Try a number like 10. If that doesn't work, try 9, 8, 7, 6, and so on.
- 4.22.2. Failure to Negotiate 8th-bit Prefixing
- The published Kermit protocol specification states that 8th-bit
- prefixing (which allows transfer of 8-bit data over a 7-bit connection)
- occurs if the file sender puts a valid prefix character (normally "&")
- in the 8th-bit-prefix field of the negotiation string, and the receiver
- puts either a letter "Y" or the same prefix character. At least one
- faulty Kermit implementation exists that does not accept the letter
- "Y". To force C-Kermit / K-95 to reply with the other Kermit's prefix
- character rather than a "Y", give the following (invisible) command:
- SET Q8FLAG ON
- Use SET Q8FLAG OFF to restore the normal behavior.
- 4.22.3. Corrupt Files
- Refer to Section 4.22.2. Some Kermit implementations mistakenly
- interpret the "Y" as a prefix character. Then, whenever a letter Y
- appears in the data, the Y and the character that follows it are
- replaced by a garbage character. At this writing, we are not sure if
- there is any solution, but try "set send negotiation-string-max-length
- 6" and/or "set q8flag on".
- File corruption can also occur when control characters within the file
- data are sent without prefixing, as at least some are by default in
- C-Kermit 7.0 and K-95. Some Kermit implementations do not handle
- incoming "bare" control characters. To work around, "set prefixing
- all".
- 4.22.4. Spurious Cancellations
- The Kermit protocol specification states that if an ACK to a Data
- packet contains X in its data field, the transfer of the current file
- is canceled, and if it contains a Z, the entire transfer is canceled.
- At least one overzealous Kermit implementation applies this rule to
- non-Data packets as well, the typical symptom being that any attempt to
- transfer a file whose name begins with X or Z results in cancellation.
- This is because the file receiver typically sends back the name under
- which it stored the file (which might not be the same as the name it
- was sent with) in the ACK to the File Header packet. This is
- information only and should not cause cancellation. To work around the
- problem, use:
- SET F-ACK-BUG { ON, OFF }
- ON tells Kermit not to send back the filename in the ACK to the file
- header packet as it normally would do (OFF puts Kermit back to normal
- after using ON).
- A variation on the this bug occurs in an obscure Kermit program for
- MUMPS: When this Kermit program sends a file called (say) FOO.BAR, it
- requires that the ACK to its F packet contain exactly the same name,
- FOO.BAR. However, C-Kermit likes to send back the full pathname,
- causing the MUMPS Kermit to fail. SET F-ACK-BUG ON doesn't help here.
- So a separate command has been added to handle this situation:
- SET F-ACK-PATH { ON, OFF }
- Normally it is ON (regardless of the SET SEND PATHNAMES setting). Use
- SET F-ACK-PATH OFF to instruct Kermit to send back only the filename
- without the path in the ACK to the F packet.
- 4.22.5. Spurious Refusals
- Some Kermit implementations, notably PDP-11 Kermit 3.60 and earlier,
- have bugs in their handling of Attribute packets that can cause
- unwarranted refusal of incoming files, e.g. based on date or size. This
- can be worked around by telling one or both of the Kermit partners to:
- SET ATTRIBUTES OFF
- 4.22.6. Failures during the Data Transfer Phase
- This can be caused by control-character unprefixing (Section
- 4.22.3 ), and fixed by:
- SET PREFIXING ALL
- It can also have numerous other causes, explained in Chapter 10 of
- Using C-Kermit: the connection is not 8-bit transparent (so use
- "set parity space" or somesuch), inadequate flow control, etc. Consult
- the manual.
- 4.22.7. Fractured Filenames
- At least one well-known PC-based communications package negotiates data
- compression, which (according to the protocol specification) applies to
- both the filename and the file data, but then fails to decompress the
- filename. Example: C-Kermit sends a file called R000101.DAT (where
- 000101 might be non-Y2K-wise YYMMDD notation), and the package in
- question stores the files as R~#0101.DAT. Workaround: Tell C-Kermit to
- SET REPEAT COUNTS OFF.
- 4.22.8. Bad File Dates
- At least one well-known PC-based communications package negotiates the
- passing of file timestamps from sender to receiver, but when it is
- sending files, it always gives them a timestamp of 1 February 1970.
- Workaround: tell C-Kermit to SET ATTRIBUTE DATE OFF. You don't get the
- file's real date, but you also don't get 1 Feb 1970; instead the file
- gets the current date and time.
- 4.23. File Transfer Recovery
- Prior to C-Kermit 7.0, RESEND (SEND /RECOVER) and REGET (GET /RECOVER)
- refused to work if FILE TYPE was not BINARY or the /BINARY switch was
- not included. Now these commands include an implied /BINARY switch,
- meaning they set the file type to binary for the duration of the
- command automatically.
- In the client/server arrangement, this also forces the server into
- binary mode (if it is C-Kermit 7.0 or greater, or K95 1.1.19 or
- greater) so the recovery operation proceeds, just as you asked and
- expected.
- BUT... Just as before, the results are correct only under the following
- conditions:
- * If the prior interrupted transfer was also in binary mode; or:
- * If the prior transfer was in text mode and the other computer was a
- "like platform" (e.g. UNIX-to-UNIX, Windows-to-Windows,
- DOS-to-Windows) AND there was no character-set translation (i.e.
- TRANSFER CHARACTER-SET was TRANSPARENT).
- Note that these circumstances are more likely to obtain in C-Kermit
- 7.0, in which:
- * The default FILE TYPE in C-Kermit 7.0 is BINARY.
- * The default FILE INCOMPLETE setting is AUTO, which means KEEP if
- the transfer is in binary mode, DISCARD otherwise.
- * C-Kermit 7.0, Kermit 95 1.1.17, and MS-DOS Kermit 3.15 and later
- can recognize "like platforms" and switch into binary mode
- automatically. Transfers between like platforms are always binary
- unless character-set translation has been requested, and then is
- still binary for all files whose names match a binary pattern,
- unless the automatic mechanisms have been disabled (with a /TEXT
- switch, or with SET TRANSFER MODE MANUAL).
- * SEND /BINARY and GET /BINARY always force binary-mode transfers,
- even when FILE TYPE is TEXT, even when TRANSFER MODE is AUTOMATIC,
- even when PATTERNS are ON and the file's name matches a text
- pattern.
- But also note that the automatic client/server transfer-mode
- adjustments do not work with versions of C-Kermit prior to 7.0 or K95
- prior to 1.1.16.
- If the prior transfer was in text mode:
- * If text-mode transfers between the two platforms are
- "length-changing" (as they are between UNIX -- which terminates
- text lines with LF -- and DOS or Windows -- which terminates text
- lines with CRLF), the recovered file will be corrupt.
- * If text-mode transfers between the two platforms are not
- length-changing, but character-set translation was active in the
- prior transfer, the result will be a file in which the first part
- has translated characters and the second part does not.
- But in C-Kermit 7.0 and K95 1.1.19 and later, incompletely transferred
- text files are not kept unless you change the default. But if you have
- done this, and you have an incompletely transferred text file, you'll
- need to:
- * Transfer the whole file again in text mode, or:
- * Use SEND /STARTING-AT: to recover the transfer at the correct
- point; but you have to find out what that point is, as described in
- the manual.
- Kermit has no way of knowing whether the previous transfer was in text
- or binary mode so it is your responsibility to choose the appropriate
- recovery method.
- If you use C-Kermit to maintain parallel directories on different
- computers, using SET FILE COLLISION to transfer only those files that
- changed since last time, and the files are big enough (or the
- connection slow enough) to require SEND /RECOVER to resume interrupted
- transfers, you should remember that SEND /RECOVER (RESEND) overrides
- all FILE COLLISION settings. Therefore you should use SEND /RECOVER
- (RESEND) only on the file that was interrupted, not the file group. For
- example, if the original transfer was initiated with:
- SEND *
- and was interrupted, then after reestablishing your connection and
- starting the Kermit receiver with SET FILE COLLISION UPDATE on the
- remote end, use the following sequence at the sender to resume the
- transfer:
- SEND /RECOVER name-of-interrupted-file
- and then:
- SEND *
- (In C-Kermit 7.0 and later, \v(filename) contains the name of the file
- most recently transferred, as long you have not EXITed from Kermit or
- changed directory, etc.
- 4.24. FILE COLLISION UPDATE Clarification
- In UNIX, file modification dates are used when comparing the file date
- with the date in the attribute packet. In VMS, however, the file
- creation date is used. These two policies reflect the preferences of
- the two user communities.
- Also, remember that the file date/time given in the attribute packet is
- the local time at the file sender. At present, no timezone conversions
- are defined in or performed by the Kermit protocol. This is primarily
- because this feature was designed at a time when many of the systems
- where Kermit runs had no concept of timezone, and therefore would be
- unable to convert (say, to/from GMT or UTC or Zulu time).
- As a consequence, some unexpected results might occur when transferring
- files across timezones; e.g. commands on the target system that are
- sensitive to file dates might not work (UNIX "make", backups, etc).
- Timezone handling is deferred for a future release.
- 4.25. Autodownload Improvements
- Refer to pages 164-165 ofUsing C-Kermit about the hazards of
- autodownload when C-Kermit is "in the middle". As of C-Kermit 7.0, no
- more hazards. If C-Kermit has TERMINAL AUTODOWNLOAD ON and it detects a
- packet of the current protocol type (Kermit or Zmodem), it "erases" the
- visual aspect of the packet that would be seen by the terminal (or,
- more to the point, the emulator, such as K95). This way, only C-Kermit
- goes into RECEIVE mode, and not also the terminal emulator through
- which C-Kermit is accessed. And therefore, it is no longer necessary to
- SET TERMINAL AUTODOWNLOAD OFF to prevent multiple Kermits from going
- into receive mode at once, but of course it is still necessary to
- ensure that, when you have multiple Kermits in a chain, that the
- desired one receives the autodownload.
- The defaults have not been changed; Kermit 95 still has autodownload ON
- by default, and C-Kermit has it OFF by default.
- 5. CLIENT/SERVER
- 5.0. Hints
- If you use SET SERVER GET-PATH to set up your server, and the GET-PATH
- does not include the server's current directory, clients can become
- quite confused. For example, "remote dir oofa.txt" shows a file named
- oofa.txt, but "get oofa.txt" fails. In this situation, you should
- either DISABLE DIR or make your GET-PATH include the current directory.
- 5.1. New Command-Line Options
- The -G command-line option is like -g (GET), except the incoming file
- is sent to standard output rather than written to disk.
- The -I option ("Internet") is used to tell a remote C-Kermit program
- that you are coming in via Internet Telnet or Rlogin and therefore have
- a reliable connection. The -I option is equivalent to SET RELIABLE ON
- and SET FLOW NONE.
- The -O option ("Only One") tells C-Kermit to enter server mode but then
- exit after the first client operation.
- See Section 9.3 for details.
- 5.2. New Client Commands
- BYE and FINISH no longer try to do anything if a connection is not
- active. Thus a sequence like "hangup" followed by "bye" or "finish"
- will no longer get stuck in a long timeout-and-retransmission cycle,
- nor will it try to open a new connection.
- REMOTE EXIT
- Similar to FINISH, except it ensures that the Kermit server
- program exits back to the operating system or shell prompt.
- (FINISH would return it to its interactive prompt if it was
- started in interactive mode, and would cause it to exit if it
- entered server mode via command-line option.) When C-Kermit is
- to be the server, you can use { ENABLE, DISABLE } EXIT to
- control the client's access to this feature.
- REMOTE MKDIR directory-name
- Tells the client to ask the server to create a directory with
- the given name, which can be absolute or relative. The syntax of
- the directory name depends on the Kermit server (seenext
- section); in all cases, it can be in the syntax of the system
- where the server is running (UNIX, VMS, DOS, etc) but newer
- servers also accept UNIX syntax, no matter what the underlying
- platform. The server will not execute this command if (a) it
- does not understand it, (b) a DISABLE MKDIR command has been
- given, or (c) a DISABLE CWD command has been given; otherwise,
- the command is executed, but will fail if the directory can not
- be created, in which cases most servers will attempt to return a
- message giving the reason for failure. The REMOTE MKDIR command
- succeeds if the remote directory is created, or if it already
- exists and therefore does not need to be created, and fails
- otherwise.
- REMOTE RMDIR directory-name
- Tells the client to ask the server to remove (delete) a
- directory with the given name. The same considerations apply as
- for REMOTE MKDIR.
- REMOTE SET FILE INCOMPLETE { DISCARD, KEEP, AUTO }
- Previously this was only available in its earlier form, REMOTE
- SET INCOMPLETE (no FILE). The earlier form is still available,
- but invisible. Also, AUTO was added, meaning KEEP if in binary
- mode, DISCARD otherwise.
- REMOTE SET TRANSFER MODE { AUTOMATIC, MANUAL }
- Tells the client to ask the server to set the given
- file-transfer mode. Automatic means (roughly): if the client and
- the server are running on the same kind of computer (e.g. both
- are on UNIX), then use binary mode automatically; if the system
- types are different, use some other method to automatically
- determine text or binary mode, such as filename pattern
- matching. MANUAL means, in this context, obey the client's FILE
- TYPE setting (TEXT or BINARY). Synonym: REMOTE SET XFER MODE.
- [ REMOTE ] QUERY KERMIT function(args...)
- Prior to C-Kermit 7.0, the arguments were not evaluated locally.
- Thus it was not possible to have the server run the function
- with client-side variables as arguments. Now:
- define \%a oofa.*
- remote query kermit files(\%a) ; Client's \%a
- remote query kermit files(\\%a) ; Server's \%a
- [ REMOTE ] LOGIN [ user [ password ] ]
- LOGIN is now a synonym for REMOTE LOGIN.
- LOGOUT
- This command, when given in local mode, is equivalent to REMOTE
- LOGOUT. When given at the IKSD prompt, it logs out the IKSD.
- When given at the C-Kermit prompt when it has no connection, it
- does nothing.
- Note that in C-Kermit 7.0, the REMOTE (or R) prefix is not required for
- QUERY, since there is no local QUERY command. The new top-level QUERY
- command does exactly what REMOTE QUERY (RQUERY) does.
- All REMOTE commands now have single-word shortcuts:
- Shortcut Full Form
- RASG REMOTE ASSIGN
- RCD REMOTE CD
- RCOPY REMOTE COPY
- RDEL REMOTE DELETE
- RDIR REMOTE DIRECTORY
- REXIT REMOTE EXIT
- RHELP REMOTE HELP
- RHOST REMOTE HOST
- RPWD REMOTE PWD
- RSET REMOTE SET
- etc.
- The R prefix is not applied to LOGIN because there is already an RLOGIN
- command with a different meaning. It is not applied to LOGOUT either,
- since LOGOUT knows what to do in each case, and for symmetry with
- LOGIN.
- 5.2.1. Remote Procedure Definitions and Calls
- This is nothing new, but it might not be obvious... REMOTE ASSIGN and
- REMOTE QUERY may be used to achieve remote procedure execution. The
- remote procedure can be defined locally or remotely.
- A remote procedure call is accomplished as noted in the previous
- section:
- [ remote ] query kermit function-name(args...)
- This invokes any function that is built in to the Kermit server, e.g.:
- [ remote ] query kermit size(foo.bar)
- returns the size of the remote file, foo.bar.
- Now note that C-Kermit includes an \fexecute() function, allowing it to
- execute any macro as if it were a built-in function. So suppose MYMACRO
- is the name of a macro defined in the server. You can execute it from
- the client as follows (the redundant "remote" prefix is omitted in the
- remaining examples):
- query kermit execute(mymacro arg1 arg2...)
- The return value, if any, is the value of the RETURN command that
- terminated execution of the macro, for example:
- define addtwonumbers return \feval(\%1+\%2)
- The client invocation would be:
- query kermit execute(addtwonumbers 3 4)
- 7
- The result ("7" in this case) is also assigned to the client's
- \v(query) variable.
- To execute a remote system command or command procedure (shell script,
- etc) use:
- query kermit command(name args...)
- Finally, suppose you want the client to send a macro to the server to
- be executed on the server end. This is done as follows:
- remote assign macroname definition
- query kermit execute(macroname arg1 arg2...)
- Quoting is required if the definition contains formal parameters.
- 5.3. New Server Capabilities
- 5.3.1. Creating and Removing Directories
- The C-Kermit 7.0 server responds to REMOTE MKDIR and REMOTE RMDIR
- commands. The directory name may be in either the native format of the
- server's computer, or in UNIX format. For example, a server running on
- VMS with a current directory of [IVAN] can accept commands from the
- client like:
- remote mkdir olga ; Makes [IVAN.OLGA] (nonspecific format)
- remote mkdir .olga ; Makes [IVAN.OLGA] (VMS format without brackets)
- remote mkdir olga/ ; Makes [IVAN.OLGA] (UNIX relative format)
- remote mkdir /ivan/olga ; Makes [IVAN.OLGA] (UNIX absolute format)
- remote mkdir [ivan.olga] ; Makes [IVAN.OLGA] (VMS absolute format)
- remote mkdir [.olga] ; Makes [IVAN.OLGA] (VMS relative format)
- 5.3.1.1. Creating Directories
- If a directory name is given that contains more than one segment that
- does not exist, the server attempts to create all the segments. For
- example, if the client says:
- REMOTE MKDIR letters/angry
- a "letters" subdirectory is created in the server's current directory
- if it does not already exist, and then an "angry" subdirectory is
- created beneath it, if it does not already have one. This can repeated
- to any reasonable depth:
- REMOTE MKDIR a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/z/y/z
- 5.3.1.2. Removing Directories
- When attempting to execute a REMOTE RMDIR, the server can remove only a
- single directory, not an entire sequence or tree. The system service
- that is called to remove the directory generally requires not only that
- the server process has write delete access, but also that the directory
- contain no files.
- In the future, a REMOTE RMDIR /RECURSIVE command (and the accompanying
- protocol) might be added. For now, use the equivalent REMOTE HOST
- command(s), if any.
- 5.3.2. Directory Listings
- Directory listings are generated by C-Kermit itself, rather than by
- running the underlying system's directory command. Some control over
- the listing format can be obtained with the SET OPTIONS DIRECTORY
- command ( Section 4.5.1). The following options affect listings
- sent by the server: /[NO]HEADING, /[NO]DOTFILES, and /[NO]BACKUP. In
- UNIX and VMS, the listing is always sorted by filename. There is, at
- present, no protocol defined for the client to request listing options
- of the server; this might be added in the future.
- The server's directory listings are in the following format:
- Protection or permissions:
- In UNIX and OS-9, this is a 10-character field, left adjusted.
- In VMS it is a 22-character field, left-adjusted. In each case,
- the protection / permission codes are shown in the server
- platform's native format. In other operating systems, this field
- is not shown.
- Size in bytes:
- This is always a 10-character field. The file's size is shown as
- a decimal number, right adjusted in the field. If the file is a
- directory and its size can not be obtained, the size is shown as
- "<DIR>". Two blanks follow this field.
- Date:
- Always in yyyy-mm-dd hh:mm:ss numeric format, and therefore 19
- characters long. If the file's date/time can't be obtained,
- zeros (0) are shown for all the digits. This field is followed
- by two blanks.
- Filename:
- This field extends to the end of the line. Filenames are shown
- relative to the server's current directory. In UNIX, symbolic
- links are shown as they are in an "ls -l" listing as "linkname
- -> filename".
- In UNIX and VMS, listings are returned by the server in alphabetical
- order of filename. There are presently no other sort or selection
- options.
- However, since these are fixed-field listings, all fields can be used
- as sort keys by external sort programs. Note, in particular, that the
- format used for the date allows a normal lexical on that field to
- achieve the date ordering. For example, let's assume we have a UNIX
- client and a UNIX server. In this case, the server's listing has the
- date in columns 22-40, and thus could be sorted by the UNIX sort
- program using "sort +0.22 -0.40" or in reverse order by "sort +0.22
- -0.40r".
- Since the UNIX client can pipe responses to REMOTE commands through
- filters, any desired sorting can be accomplished this way, for example:
- C-Kermit> remote directory | sort +0.22 -0.40
- You can also sort by size:
- C-Kermit> remote directory | sort +0.11 -0.19
- You can use sort options to select reverse or ascending order. "man
- sort" (in UNIX) for more information. And of course, you can pipe these
- listings through any other filter of your choice, such as grep to skip
- unwanted lines.
- 5.4. Syntax for Remote Filenames with Embedded Spaces
- C-Kermit and K95, when in server mode, assume that any spaces in the
- file specification in an incoming GET command are filename separators.
- Thus if the client gives a command like:
- get {oofa.txt oofa.bin}
- or, equivalently:
- mget oofa.txt oofa.bin
- the server tries to send the two files, oofa.txt and oofa.bin. But what
- if you want the server to send you a file named, say:
- D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL
- How does the server know this is supposed to be one file and not seven?
- In this case, you need to the send file name to the server enclosed in
- either curly braces:
- {D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}
- or ASCII doublequotes:
- "D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"
- The method for doing this depends on your client. If your client is
- C-Kermit 7.0, any recent version of Kermit 95, or MS-DOS Kermit 3.16,
- then you have to enclose the name in braces just so the client can
- parse it, so to send braces or doublequotes to the server, you must put
- them inside the first, outside pair of braces. And you also need to
- double the backslashes to prevent them from being interpreted:
- get {{D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL}}
- get {"D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL"}
- To get around the requirement to double backslashes in literal
- filenames, of course you can also use:
- set command quoting off
- get {{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}}
- get {"D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"}
- set command quoting on
- If you are giving a "kermit" command to the UNIX shell, you have to
- observe the shell's quoting rules, something like this:
- kermit -ig "{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}"
- Here, the quotes go on the outside so UNIX will pass the entire
- filename, spaces, braces, and all, as a single argument to Kermit, and
- the backslashes are not doubled because (a) the UNIX shell ignores them
- since they are in a quoted string, and (b) Kermit ignores them since
- the interactive command parser is not activated in this case.
- 5.5. Automatic Orientation Messages upon Directory Change
- C-Kermit 7.0, when acting as a server, can send an orientation message
- to the client whenever the server directory changes. For example, when
- the client gives a REMOTE CD command, the server sends the contents of
- the new directory's "Read Me" file to the client's screen. The
- following commands govern this feature:
- SET SERVER CD-MESSAGE FILE name
- Given to the servr, allows the message-file name to be specified
- at runtime. A list of names to look for can be given in the
- following format:
- {{name1}{name2}{name3}{...}}
- e.g. SET SERVER CD-MESSAGE FILE
- {{./.readme}{README.TXT}{READ.ME}}
- REMOTE SET SERVER CD-MESSAGE { ON, OFF }
- Given to the client, lets the client control whether the server
- sends automatic CD messages.
- SHOW SERVER
- Given to server, includes CD-Message status.
- The default CD message file name is system dependent. SHOW CD or SHOW
- SERVER displays the list. Also see Section 4.5.2.
- 5.6. New Server Controls
- DISABLE ENABLE
- Allows the server to configured such that DISABLEd features can
- not be re-enabled by any means -- e.g. if the client is somehow
- able to get the server into command mode. Once DISABLEd, ENABLE
- can not be re-ENABLEd.
- SET SERVER IDLE-TIMEOUT seconds
- This was available previously in Kermit 95 only. Now it can be
- used in C-Kermit also to specify a maximum number of seconds the
- server is allowed to be idle before exiting server mode. 0
- seconds means no idle timeout. In C-Kermit (but not K-95), SET
- SERVER TIMEOUT and SET SERVER IDLE-TIMEOUT are mutually
- exclusive -- you can have one or the other (or neither), but not
- both. (Server timeouts are for the benefit of primitive Kermit
- clients that are not capable of timing out on their own; to our
- knowledge, no such clients are still in circulation.)
- SET SERVER KEEPALIVE { ON, OFF }
- (See next section).
- 5.7. Timeouts during REMOTE HOST Command Execution
- Prior to C-Kermit 7.0, the C-Kermit server would block waiting for
- output from a system command invoked via REMOTE HOST from the client.
- If the system command took a long time to execute, the client would
- time out and send NAK packets. If the command took too long, the client
- would reach its retry limit and give up. Even if it didn't, the NAKs
- would cause unnecessary retransmissions.
- In version 7.0, the C-Kermit server (VMS and select()-capable UNIX
- versions only), sends "keepalive packets" (empty data packets) once per
- second while waiting for the system command to complete. This procedure
- should be entirely transparent to the Kermit client, and should prevent
- the unwanted timeouts and NAKs. When C-Kermit 7.0 itself (or K95
- 1.1.19) is the client, it prints dots to show the keepalive packets.
- The keepalive feature can be turned off and on with:
- SET SERVER KEEPALIVE { ON, OFF }
- Normally it should be on. Turn it off it if causes trouble with the
- client, or if it seems to slow down the server (as it might on some
- platforms under certain circumstances).
- 6. INTERNATIONAL CHARACTER SETS
- Support for several new single-byte character sets was added in
- C-Kermit 7.0. Unicode / ISO 10646 is not yet supported, but is a high
- priority for forthcoming releases.
- 6.0. ISO 8859-15 Latin Alphabet 9
- To accommodate the Euro currency symbol, and to correct several other
- longstanding problems with ISO Latin Alphabet 1, ISO 8859-15 Latin
- Alphabet 9 was issued in May 1998. It is supported by C-Kermit 7.0 as a
- transfer character set, a file character set, and a terminal character
- set. Translations that preserve the new characters are available
- between Latin-9 and several other sets including:
- PC Code Page 858 (Western European languages, similar to CP850)
- Windows Code Page 1252 (Western European languages, similar to Latin-1)
- Windows Code Page 1250 (Eastern European languages, similar to Latin-2)
- The Latin-9 transfer character set also allows for the OE digraph
- character, used primarily in French, to be preserved in transfers
- involving the DEC MCS or NeXT character sets.
- The Euro character is also present in the Universal Character Set,
- described in Section 6.6.
- 6.1. The HP-Roman8 Character Set
- The HP-Roman8 character set is supported in C-Kermit 6.0 and later but
- was omitted from Table VII-4 in the 2nd Edition of Using C-Kermit due
- to lack of space. It is listed inAppendix III.
- 6.2. Greek Character Sets
- Greek character sets were added in 6.1:
- SET FILE CHARACTER-SET { CP869, ELOT927, GREEK-ISO }
- SET TRANSFER CHARACTER-SET { GREEK-ISO }
- GREEK-ISO is ISO 8859-7, which the same as ELOT 928.
- The new Greek character sets are listed inAppendix III.
- 6.3. Additional Latin-2 Character Sets
- The following have been added as FILE and TERMINAL CHARACTER-SETs:
- MAZOVIA-PC
- A PC code page used in Poland, equivalent to CP437, but with 18
- substitutions needed for Polish.
- CP1250
- The Windows Latin 2 Code Page. Equivalent to ISO 8859-2, but
- with different encoding.
- 6.4. Additional Cyrillic Character Sets
- The following have been added as FILE and TERMINAL CHARACTER-SETs:
- BULGARIA-PC
- This is the Cyrillic PC code page used in Bulgaria, where it is
- called Code Page 856. It is attributed to a company called
- DATEC, Inc, but CP856 is not a proper designation, since it
- refers to a Hebrew Code Page (see the IBM Registry).
- CP855
- This PC Code Page contains all the Cyrillic letters that are
- also in ISO 8859-5, and is therefore useful for non-Russian
- Cyrillic text (Ukrainian, Belarusian, etc), unlike CP866, which
- has a smaller repertoire of Cyrillic letters.
- CP1251
- The Windows Cyrillic Code Page. Equivalent to CP855, but with
- different encoding.
- KOI8R
- An extension to "Old KOI-8" that adds upper and lower case
- Cyrillic letter Io (looks like Roman E with diaeresis) plus a
- selection of box-drawing characters to columns 8 through 11,
- which are vacant in original Old KOI-8. KOI8-R is used for the
- Russian language. It is specified inRFC 1489.
- KOI8U
- A similar extension of Old KOI-8, but for Ukrainian. It is
- specified inRFC 2319.
- 6.5. Automatic Character-Set Switching
- Prior to version 7.0, C-Kermit's file character-set always had to be
- set explicitly. In 7.0 and later, it is set automatically when:
- 1. This feature is enabled (as it is unless you disable it).
- 2. An incoming text-mode transfer includes a transfer-character-set
- announcer and you have not previously given a SET FILE
- CHARACTER-SET command. In this case, C-Kermit switches to an
- appropriate file character set. For example, on an HP-UX
- workstation, an incoming Latin-1 file automatically selects
- HP-Roman8 for the local copy of the file; in Data General AOS/VS,
- it would select DG International.
- 3. You give a SET TRANSFER CHARACTER-SET command without having
- previously specified a FILE CHARACTER-SET. An appropriate file
- character-set is chosen automatically.
- In addition, when you give a SET FILE CHARACTER-SET command, the
- appropriate transfer character-set is automatically chosen, to be used
- when you are sending files (but this does not override the one
- announced by the sender when you are receiving files).
- You might not agree about what is "appropriate", so of course you can
- disable or change all of the above actions.
- You can disable (or re-enable) the new automatic character-set
- switching feature in each direction separately:
- SET RECEIVE CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
- AUTOMATIC is the default, causing the behavior described above
- when an incoming file arrives. Choose MANUAL to defeat this
- behavior and force your current FILE CHARACTER-SET setting to be
- used, no matter what it is. Note that SET RECEIVE CHARACTER-SET
- MANUAL does not disable recognition of the incoming transfer
- character-set announcer, and translation from the corresponding
- character-set to your current file character-set. To disable
- that, use SET ATTRIBUTE CHARACTER-SET OFF.
- SET SEND CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
- Again AUTOMATIC is the default, causing the behavior described
- above when you give a SET { FILE, TRANSFER } CHARACTER-SET
- command. Use MANUAL to allow you to specify the transfer and
- file character-sets independently.
- SHOW CHARACTER-SETS
- Tells settings of { SEND, RECEIVE } CHARACTER-SET-SELECTION.
- Normally, however, it is more convenient to leave automatic switching
- active, and change any associations that are not appropriate for your
- application, area, or country. The commands are:
- SHOW ASSOCIATIONS
- This command lists all the associations in each direction: for
- each possible transfer character-set, it lists the associated
- file character-set, and vice versa. These are two separate and
- independent lists.
- ASSOCIATE TRANSFER-CHARACTER-SET name1 [ name2 ]
- Changes the association for the transfer character-set name1 to
- be the file character-set name2. If name2 is omitted, automatic
- switching is disabled for this transfer character-set only.
- ASSOCIATE FILE-CHARACTER-SET name1 [ name2 ]
- Changes the association for the file character-set name1 to be
- the transfer character-set name2. If name2 is omitted, automatic
- switching is disabled for this file character-set only.
- 6.6. UNICODE
- C-Kermit 7.0 adds support for Unicode, the Universal Character Set,
- for:
- * File Transfer (SEND, RECEIVE, GET, etc)
- * Terminal connection (CONNECT)
- * Unguarded file capture (LOG SESSION)
- * Unguarded file transmission (TRANSMIT)
- * Local file character-set conversion (TRANSLATE)
- C-Kermit is not, however, a "Unicode application" in the sense that its
- commands, messages, or user interface are Unicode. Rather, it is
- "Unicode aware" in its ability to handle and convert Unicode text in
- the course of file transfer and terminal connection, and you can also
- use Kermit to convert local files between Unicode and other character
- sets. TLA's:
- BMP - Base Multilingual Plane
- BOM - Byte Order Mark
- CJK - Chinese, Japanese, and Korean
- ISO - International Standards Organization
- TLA - Three-Letter Acronym
- UCS - Universal Character Set
- UTF - UCS Transformation Format
- Unicode and ISO 10646 are the coordinated and compatible corporate and
- international standards for the Universal Character Set (UCS). Unlike
- single-byte and even most multibyte character sets, the UCS can
- represent all characters in every existing writing system. A flat
- plain-text file encoded in some form of UCS can contain any mixture of
- English, Spanish, Italian, German, Hebrew, Arabic, Greek, Russian,
- Armenian, Georgian, Japanese, Chinese, Korean, Vietnamese, Tibetan,
- Hindi, Bengali, Tamil, Thai, Ethiopic, and so on, plus scientific and
- mathematical notation, as well as texts in Runes, Ogham, Glagolitic,
- and other historic scripts.
- The UCS already covers these scripts and many more, but it's an
- evolving standard with efforts underway to accommodate even more
- languages and writing systems. Support is growing for native UCS use on
- many platforms and in many applications. The goal of the framers of the
- UCS is for it to replace ASCII, the ISO Latin Alphabets, ISCII, VISCII,
- the Chinese, Japanese, and Korean (CJK) multibyte sets, etc, as well as
- the many private character sets in use today, in other words to become
- *the* Universal Character Set.
- Until that time, however, conversions between existing sets and the UCS
- will be necessary when moving text between platforms and applications.
- Now Kermit can help.
- 6.6.1. Overview of Unicode
- For a more complete picture, please visit:
- http://www.unicode.org/
- and access the various online introductions, FAQs, technical reports,
- and other information. For greater depth, order the latest version of
- the published Unicode Standard. The following overview contains a great
- many oversimplifications and perhaps an opinion or two.
- At present, the UCS is a 16-bit (2-byte) character set, but with
- provisions to grow to a 4-byte set. UCS-2 refers to the two-byte set,
- also called the Base Multilingual Plane (BMP), in which each character
- has 16 bits, and therefore there are 2^16 = 65536 possible characters.
- The first 128 characters are the same as US ASCII (C0 control
- characters and DEL included), the next 32 are the C1 control characters
- of ISO 6429, and the next 96 are the Right Half of ISO 8859-1 Latin
- Alphabet 1. The remaining tens of thousands of characters are arranged
- newly for the UCS, usually (but not always) in sections corresponding
- to existing standards, such as ISO Latin/Cyrillic, often plus
- additional characters not appearing in the existing standards due to
- lack of space (or other reasons).
- ISO 10646 allows for additional planes, e.g. for Egyptian hieroglyphics
- or ancient (or other esoteric) CJK characters, but these planes are not
- yet defined and so we will say nothing more about them here, except
- that their use will require the 4-byte form of UCS, called UCS-4, in
- some form (more about "forms" in Section 6.6.2).
- Unicode and ISO 10646 are constantly under revision, mainly to add new
- characters. The Unicode revision is denoted by a version number, such
- as 1.0, 1.1, 2.0, 3.0. The ISO 10646 standard revision is identified by
- Edition (such as ISO 10646-1 1993), plus reference to any amendments.
- The first versions of these standards included encodings for Korean
- Hangul syllables (Jamos); these encodings were changed in version 1.1
- of Unicode and by Amendment 5 to ISO 10646-1. The Unicode Technical
- Committee and the ISO acknowledge that this was a bad thing to do, and
- promise never change encodings or character names again, since this
- poses serious problems for conformance and data interchange.
- A UCS-2 value is customarily written like this:
- U+xxxx
- where "xxxx" represents four hexadecimal digits, 0-9 and A-F. For
- example, U+0041 is "A", U+00C1 is A-acute, U+042F is uppercase Cyrillic
- "Ya", U+FB4F is Hebrew Ligature Alef Lamed, and U+FFFD is the special
- character that means "not a character".
- Most characters from widely-used alphabetic writing systems such as the
- West European ones, Cyrillic, Greek, Hebrew, Vietnamese, etc, are
- available in "precomposed" form; for example Uppercase Latin Letter A
- with Acute Accent is a single character (as it is in Latin-1). However,
- the UCS also permits composition of a base character with one or more
- nonspacing diacritics. This means the same character can be represented
- in more than one way, which can present problems in many application
- areas, including transfer and character-set conversion of text.
- Conversion from ASCII or Latin-1 to UCS-2 text is "trivial": simply
- insert a NUL (0) byte before each ASCII or Latin-1 byte. Converting in
- the reverse direction (provided the UCS-2 file contains only U+0000 to
- U+00FF) is equally simple (if we ignore the issue of composition):
- remove every second (NUL) byte. Conversion of other character sets to
- and from UCS, however, requires tables or algorithms specific to each
- set. Nevertheless, the relatively transparent upwards compatibility
- from ASCII and Latin-1, in which a very large share of the world's
- textual data is encoded, gives the UCS an entree onto existing
- platforms.
- But the 2-byte format and the preponderance of NUL and other control
- bytes in UCS-2 text pose problems for current applications and
- transmission methods. And to make matters worse, different hardware
- platforms store UCS-2 characters in different byte order. Thus a UCS-2
- file transferred by FTP (or accessed via NFS, etc) between two
- computers with different architecture might have its bytes in the wrong
- order (or worse; see Section 6.6.5.1 ).
- 6.6.2. UCS Byte Order
- Consider the number 1. In an 8-bit byte, this would be represented by
- the following series of 0- and 1-bits:
- +-----------------+
- | 0 0 0 0 0 0 0 1 |
- +-----------------+
- Therefore in a 16-bit "word" the representation might be:
- +-----------------+-----------------+
- | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
- +-----------------+-----------------+
- Now consider the number 256, which is 2 to the 8th power. The binary
- representation is 100000000 (1 followed by 8 zeros). 256 would go into
- a 16-bit word like this:
- +-----------------+-----------------+
- | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
- +-----------------+-----------------+
- When a computer works this way, it is said to be Big Endian, meaning it
- puts the most significant (biggest) byte first (on the "left") in a
- 16-bit word, and the least significant byte second (on the right).
- However, some other computers have the opposite arrangement, called
- Little Endian, in which 1 is:
- +-----------------+-----------------+
- | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
- +-----------------+-----------------+
- and 256 is:
- +-----------------+-----------------+
- | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
- +-----------------+-----------------+
- Computers such as Sparc, MIPS, PA-RISC, and PowerPC are Big Endian,
- whereas the PC and the Alpha are Little Endian. Endianness has never
- been an issue with 7- or 8-bit characters, but it is with UCS
- characters. It can be a tricky business to share or transfer a UCS-2
- file between two different kinds of computers.
- To alleviate (but not entirely solve) the problem, UCS-2 files are
- supposed to begin with the Unicode character U+FEFF, Zero-Width
- No-Break Space (ZWNBS). This is a kind of "no-op" (note: any such
- assertion must normally be qualified with many "but ifs" and "excepts"
- which are omitted here in the interest of brevity). If the bytes are
- reversed the ZWNBS becomes U+FFFE, which is not (and never will be) a
- defined UCS character. U+FEFF at the beginning of a UCS file is
- therefore called a Byte Order Mark, or BOM.
- Any application that creates a UCS-2 (or UTF-16, or UCS-4) file should
- include a BOM, and any application that reads one should test for a
- BOM, and if one is found, infer the byte order from it. This is a
- convention, however -- not a standard or a requirement -- and
- applications vary in their ability to handle BOMs and "backwards" UCS-2
- files.
- Note that a BOM is useful only at the beginning of a file. If you
- append one UCS-2 file to another, and both have BOMs, the internal BOM
- is no longer a BOM. And if the byte orders of the two files differ,
- then either the first part or the second will be backwards. (Various
- other undesirable effects might also occur, not discussed here.)
- 6.6.2. UCS Transformation Formats
- UCS textual data can be modified in various ways for transmission or
- storage. Any officially sanctioned method of doing this is called a UCS
- Transformation Format, or UTF. One such method, called UTF-16, is
- essentially identical with UCS-2 except that it designates certain code
- values as "escape sequences" (called surrogate pairs) to access
- characters in other planes without having to use full UCS-4. We won't
- discuss UTF-16 further here, since at the moment there are no other
- planes. Several other UTF's (such as UTF-1, UTF-2, and UTF-7) have
- fallen into disuse and are not discussed here. The most important
- transformation format today is UTF-8.
- UTF-8, so called because it "serializes" UCS-2 data into a stream of
- 8-bit bytes, is designed to allow the UCS to work with present-day
- communications gear, computers, and software. The most important
- properties of UTF-8 are that byte order is constant (no byte swapping)
- and all (7-bit) ASCII characters represent themselves. Therefore
- conversion between ASCII and UTF-8 is no conversion at all, and
- applications or platforms (such as Plan 9 from Bell Labs) that use
- UTF-8 "for everything" can still run traditional ASCII-only
- applications and be accessed from them. In particular, unlike UCS-2,
- ASCII characters are not padded with NUL bytes. But also unlike UCS-2,
- there is no transparency for Latin-1 or any other non-ASCII character
- set. Every non-ASCII UCS-2 character is represented by a sequence of 2
- or 3 UTF-8 bytes. Thus UTF-8 is more compact than UCS-2 for text
- containing a preponderance of ABC's (or other ASCII characters), about
- the same as UCS-2 for other alphabetic scripts (Cyrillic, Roman, Greek,
- etc), and larger than UCS-2 for Chinese, Japanese, and Korean.
- The UTF-8 uncoding of the UCS has been adopted by the Internet as the
- preferred character set for new applications, and is gradually being
- retrofitted into traditional applications like FTP ([550]RFC 2640).
- 6.6.3. Conformance Levels
- Although the Unicode and ISO 10646 standards both describe the same
- character set, these standards differ in many ways, including their
- stated requirements for conformance and their classification of
- conformance levels.
- Kermit has always abided by ISO character-set standards, including ISO
- character-set designation and invocation methods. In adapting Unicode,
- therefore, we had to choose from among the available ISO designations
- which, in turn, correspond with ISO 10646 conformance levels. At
- present, Kermit claims the lowest conformance level, 1, meaning
- (roughly) that it does not handle combining forms and it does not
- handle Korean Hangul Jamos (just as, at present, it does not handle
- Korean in general). Note that ISO 10646 Conformance Levels 1 and 2
- sidestep the issue of the code changes for Korean Hangul by announcing
- non-support for Hangul regardless of encoding.
- ISO 10646 Conformance Level 1 is approximately equivalent to Unicode
- Normalization Form C (described in Unicode Technical Report 15,
- incorporated into Unicode 3.0).
- As noted in Section 6.6.2, Kermit does not claim to support UTF-16
- at the present time, hence the UCS-2 nomenclature. Kermit treats
- surrogates just as if they were any other UCS-2 characters, rather than
- as escapes to other planes, which means that (except when converting
- between UCS-2 and UTF-8) they are translated to "error" characters,
- since (a) no other planes are defined yet (and if they were, no other
- character sets supported by Kermit would encode their characters), and
- (b) no valid surrogate character corresponds to any other UCS-2
- character.
- A minor yet significant aspect of Unicode 3.0 and some recent
- perturbation of ISO 10646-1 (probably Amendment 18, "Symbols and Other
- Characters") is the addition of the Euro Sign at U+20AC. As noted in
- Section 6.0, Kermit's "Euro compliance" includes conversion
- between Latin Alphabet 9 and various PC code pages. Text can also be
- converted between UCS-2 or UTF-8 and any other Euro-compliant character
- set (Latin-9, CP858, CP1250, CP1252) without loss of the Euro Sign.
- 6.6.4. Relationship of Unicode with Kermit's Other Character Sets
- Kermit's character sets are divided into two groups: single-byte sets
- (such as Roman, Hebrew, Cyrillic, Greek) and multibyte (various
- Japanese sets). The two groups are distinct since one normally would
- not expect to convert Kanji ideograms to Roman (or other) letters, or
- vice versa.
- Unicode character-set conversion works with both groups, but obviously
- the result depends on the repertoires of the source and destination
- character-sets both including the characters in the file. For example,
- you can translate a Hungarian text file between Latin-2 and Unicode,
- but not between (say) Unicode and Latin/Greek. By the same token you
- can convert Japanese text from Shift-JIS or EUC or JIS-7 to Unicode and
- back, but you can't convert the same file to (say) Latin-1 if it
- contains Japanese characters.
- JIS-7 is equivalent to DEC Kanji and ISO-2022-JP except that the
- latter two do not support halfwidth Katakana. Kermit treats all
- three of these sets the same way, i.e. as JIS-7.
- As noted, Kermit presently does not handle combining diacritics, and so
- will not correctly convert UCS files that use them into a single-byte
- character set. For example, if a UCS file contains Latin Capital Letter
- A (U+0041) followed by Combining Acute Accent (U+0301), the result will
- be a two-character sequence, A followed by another character. This is
- what is meant by Conformance Level 1. (The situation grows worse with
- multiple diacritics, since they can occur in any order.)
- A higher level of conformance is possible, in which "canonical
- equivalences" are handled via algorithms and databases, at some
- (perhaps considerable) cost in performance, since a fair amount of
- additional code must be executed for every character during data
- transfer (database lookup, sorting of combining sequences into
- canonical order, etc). This can be added in future releases if there is
- a need (but in many cases, pre- and postpostprocessing might be a
- better option).
- Within these constraints, Kermit converts between the UCS and its other
- character sets. For example, a mixture of Russian and English (and/or
- Dutch, or Latin) text can bet converted between the UCS and ISO
- Latin/Cyrillic or KOI-8. But since Kermit does not presently support
- Arabic character-set conversion, the new availability of UCS conversion
- does not mean that Kermit can convert from Arabic UCS text to some
- other character set, because Kermit does not support any other
- character set that includes Arabic. Ditto for Thai, Armenian, Georgian,
- Tibetan, Chinese, Korean, etc. However, Kermit CAN convert Arabic (or
- any other script) between UCS-2 and UTF-8.
- Considering Cyrillic more carefully, note that the UCS also contains
- numerous Cyrillic characters not found in any of the Cyrillic sets (ISO
- Latin/Cyrillic, KOI8, CP866, etc) that Kermit supports; characters
- needed for Abkhasian, Yakut, Tatar, Bashkir, Altaic, Old Church
- Slavonic, etc; UCS text containing any of these historic or "extended"
- Cyrillic characters can not be converted to any of Kermit's current
- single-byte Cyrillic sets without loss. The situation is similar for
- Greek, Hebrew, etc, and even worse for Japanese since Unicode contains
- thousands of Kanjis that are lacking from the Japanese character sets
- based on JIS X 0208, such as EUC-JP, JIS-7, and Shift-JIS.
- In general, when converting from UCS to a single-byte set, there is
- always the possibility of data loss, just as there is when converting
- from any larger set to a smaller one. For example, if a UCS file
- contains Devanagari characters, these characters will be lost when
- converting to (say) Latin-1, just as Roman vowels with acute accents
- are lost when converting from Latin-1 (an 8-bit set) to German ISO 646
- (a 7-bit set).
- 6.6.5. Kermit's Unicode Features
- C-Kermit can convert between UCS-2 or UTF-8 and any of its other
- character sets, and also between UCS-2 and UTF-8. When converting
- between UCS-2 or UTF-8 and a non-Unicode character set (such as
- Latin-1), the UCS Line Separator (LS, U+2028) and Paragraph Separator
- (PS, U+2029) characters are converted to the appropriate line
- terminator (CR, LF, or CRLF). When converting from a non-Unicode set to
- UCS-2 or UTF-8, however, line terminators are not converted to LS or
- PS. This is in accordance with the recommendations of Unicode Technical
- Report #13.
- When C-Kermit starts, it tests the native byte order of the computer.
- You can see the result in the SHOW FEATURES or SHOW FILE display. It's
- also available in the variable \v(byteorder): 0 means Big Endian, 1
- means Little Endian.
- When UCS-2 is involved in file transfer or translation, the following
- commands tell C-Kermit what to do about byte order:
- SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
- This is for reading UCS-2 files that don't have a BOM, and also
- for writing UCS-2 files. If this command is not given, the
- machine's native byte order is used when writing UCS-2 files,
- and also when reading UCS-2 files that don't have a BOM.
- SET FILE UCS BOM { ON, OFF }
- This setting is used when creating UCS-2 files. A BOM is added
- at the beginning by default. Use OFF to not add the BOM. This
- command has no affect when writing files.
- COPY /SWAP-BYTES sourcefile destinationfile
- Use this for fixing a UCS-2 file whose bytes are in the wrong
- order.
- Use SHOW FILE to display the FILE UCS settings.
- Please note, again, that C-Kermit's user interface, including its
- script language, is not internationalized in any way. String
- comparisons, case conversion, and so on, work only for US ASCII
- (comparisons for equality work with other sets, but not
- lexically-greater-or-less-than or caseless comparisons; even
- comparisons for equality can fail when composed characters or byte
- order are involved). String functions such as \findex() and
- \fsubstring() that reference byte positions do just that; they won't
- work with UTF-8 text that contains any non-ASCII characters, and they
- will not work with UCS-2 text at all since they use C strings
- internally, which are NUL-terminated. These are just a few examples to
- illustrate that neither Unicode nor any other character-set beyond
- ASCII is supported at the user-interface, command, or scripting level
- in this version of C-Kermit.
- 6.6.5.1. File Transfer
- Kermit supports both UCS-2 and UTF-8 as file and transfer character
- sets in text-mode file transfer.
- To select UCS-2 or UTF-8 as a file character-set, use:
- SET FILE CHARACTER-SET { UCS2, UTF8 }
- If you want to send a UCS-2 text file (or save an incoming file in
- UCS-2 format), tell Kermit to:
- SET FILE CHARACTER-SET UCS2
- and if you want to send a UTF-8 text file (or store an incoming file in
- UTF-8 format), tell Kermit to:
- SET FILE CHARACTER-SET UTF8
- When sending UCS-2 files, Kermit determines the byte order from the
- BOM, if there is one (and if there is a BOM, it is stripped, i.e. not
- sent). If there is no BOM, the byte order is the one specified in the
- most recent SET FILE UCS BYTE-ORDER command, if any, otherwise the
- computer's native byte order is assumed. When storing incoming files as
- UCS-2, the byte order is according SET FILE UCS BYTE-ORDER, if given,
- otherwise the native one; a BOM is written according to SET FILE UCS
- BOM.
- A transfer character-set should be chosen that includes all of the
- characters in the source file. So, for example, if you are sending a
- UCS-2 file containing only German-language text, your transfer
- character-set can be Latin-1, Latin-2, Latin-9, UCS-2, or UTF-8. But if
- you are sending a file that contains a combination of Hebrew and Greek,
- your transfer character-set must be UCS-2 or UTF-8 if you don't want to
- lose one script or the other. Furthermore, the transfer character-set
- must be one that is supported by the receiving Kermit program. Since
- UCS support is new, it is possible that the other Kermit program (if it
- supports character sets at all) does not support it, but does support
- single-byte sets such as Latin-1, Latin/Cyrillic, etc.
- To select UCS-2 or UTF-8 as a transfer character-set, use:
- SET TRANSFER CHARACTER-SET { UCS2, UTF8 }
- It is up to the receiving Kermit program to convert the transfer format
- to its own local format, if necessary. If it does not understand the
- UTF-8 or UCS-2 transfer character-set, and your file can not be
- adequately represented by any single-byte transfer character-set (such
- as Latin-1 or Latin/Cyrillic) then, if UTF-8 format is acceptable on
- the receiving computer, use UTF-8 as the transfer character-set, with
- the receiver told to "set unknown-char keep", or with the sender told
- to "set attribute char off". If you want the file to be stored in UCS-2
- format at the receiver, send it it binary mode if the source file is
- also UCS-2, or else use the TRANSLATE command (next section) to convert
- it to UCS-2 first, then send it in binary mode. You should not use
- UCS-2 as a transfer character-set in text-mode transfers to Kermit
- programs that don't support it, because they are likely to corrupt the
- result the same way FTP would (see the final paragraph of this
- section).
- When UCS-2 is the transfer character set, it always goes into Kermit
- packets in Big Endian format, with no BOM. As always, the transfer
- character-set is announced by the sender to the receiver. The
- announcement for UCS-2 is "I162" (ISO Registration 162 = UCS-2 Level 1)
- and by definition it is Big Endian (the standards say that when UCS-2
- is serialized into bytes, the order must be Big Endian). The
- announcement for UTF-8 is "I190" (UTF-8 Level 1).
- When receiving a file whose transfer character-set is UCS-2 or UTF-8,
- you must choose the appropriate file character set for the result.
- There is no way Kermit can do this for you automatically, since UCS
- data can be in any script at all, or any combination.
- In general, UTF-8 or UCS-2 should be chosen as a transfer character-set
- if the source file is also encoded in some form of UCS and it contains
- more than one script. But there are other situations where where UTF-8
- or UCS-2 offer advantages. For example, suppose the source file is on a
- NeXTstation and the destination file is on VMS. Both the NeXT and the
- DEC Multinational character sets include the French OE digraph, but
- Latin-1 does not. Therefore French words containing this character
- might not arrive intact when Latin-1 is the transfer character-set, but
- will with UTF-8 or UCS-2, since the UCS includes the OE digraph (but so
- does Latin-9).
- UCS-2 should be chosen as a transfer character-set only for Japanese
- text files that contain a large preponderance of Kanji, since in this
- case (and only this case) UCS-2 (two bytes per Kanji) is more efficient
- than UTF-8 (three bytes per Kanji). The same will be true for Chinese
- and Korean when they are supported by Kermit. UCS-2 should never be
- used as a transfer character-set with a transfer partner that does not
- support UCS-2 since this can cause file corruption (see last paragraph
- in this section).
- Note that Kermit's repeat-count compression is 100% ineffective for
- UCS-2, and is also ineffective for multibyte characters in UTF-8 and
- EUC-JP; this is because repeat-compression is a transport-level
- mechanism that operates on a per-byte basis; it has no knowledge of the
- distinction between a byte and a character.
- When C-Kermit starts, it sets up associations ( Section 6.5) for
- incoming files whose transfer character sets are UCS-2 or UTF-8
- appropriately for the platform so that the file character-set for the
- incoming file is UCS-2 in Windows and UTF-8 elsewhere. Otherwise,
- C-Kermit does not make any default associations for UCS-2 or UTF-8, but
- of course you may add or change associations to suit your needs and
- preferences by including the appropriate ASSOCIATE commands in your
- Kermit startup file. For example, if you are a PC user and deal only
- with text written in Greek and English, you can:
- ASSOCIATE TRANSFER-CHARACTER-SET UTF8 CP869
- ASSOCIATE TRANSFER-CHARACTER-SET UCS2 CP869
- ASSOCIATE FILE-CHARACTER-SET CP869 UTF8
- Note that when file transfer involves conversion between a single-byte
- character set and UCS-2 or UTF-8, the file-transfer thermometer and
- estimated time left might be inaccurate, since they are based on the
- source file size, not the transfer encoding. This is purely a cosmetic
- issue and does not effect the final result. (And is not, strictly
- speaking, a bug; Kermit protocol presently includes no method for the
- sender to furnish an "estimated transfer size" to the receiver, and in
- any case any such guess could be as far off as the file size, given the
- many other factors that come into play, such as compression and
- prefixing).
- A caution about FTP and UCS-2. As noted previously, if you transfer a
- UCS-2 file with FTP in binary mode between two computers with opposite
- Endianness, the result will have its bytes in the wrong order. However,
- if you use FTP to transfer a UCS-2 file in "ascii" (text) mode to ANY
- computer, even if it is identical to yours, the result will be
- corrupted because FTP's line-terminator conversions do not account for
- UCS-2. The same holds when sending from a UCS-aware Kermit program to
- an older Kermit program in text mode with a transfer character-set of
- UCS-2. So use UCS-2 as a transfer character-set ONLY with a UCS-2-aware
- Kermit partner.
- 6.6.5.2. The TRANSLATE Command
- In Kermit versions that have Unicode support included, TRANSLATE now
- always goes through Unicode; that is, the source set is converted to
- UCS-2 and thence to the target set. This is a major improvement, since
- in prior releases, C-Kermit had to pick the "most appropriate" transfer
- character-set as the intermediate set, and this would result in the
- loss of any characters that the source and target sets had in common
- but were lacking from the intermediate set (for example the OE digraph
- when translating from NeXT to DEC MCS through Latin-1). This never
- happens when Unicode is the intermediate set because Unicode is a
- superset of all other character sets supported by Kermit. A more
- dramatic example would be translation between Cyrillic PC code page 866
- and KOI8-R ( Section 6.4); formerly all the line- and box-drawing
- characters would be lost (since ISO 8859-5 does not have any); now the
- ones that these two sets have in common are preserved.
- UCS-2 and UTF-8 are now both supported as source-file and
- destination-file character sets by C-Kermit's TRANSLATE command, for
- example:
- translate oofa.txt ucs2 latin1 oofa-l1.txt
- translates oofa.txt from UCS-2 to Latin-1, storing the result as
- oofa-l1.txt. Similarly:
- translate oofa.txt utf8 latin1 oofa-l1.txt
- translate oofa.txt latin1 ucs2 oofa-ucs2.txt
- translate oofa.txt latin1 utf8 oofa-utf8.txt
- translate oofa.txt ucs2 utf8 oofa-utf8.txt
- translate oofa.txt utf8 ucs2 oofa-ucs2.txt
- Treatment of the UCS-2 BOM is exactly the same as for file transfer.
- Note that if a UCS-2 source file is in the "wrong" byte order and lacks
- a BOM, and you don't tell Kermit about it with SET FILE UCS BYTE-ORDER,
- the result of the translation is total gibberish. Recall that you can
- use COPY /SWAP-BYTES to switch the byte order of an errant UCS-2 file
- (or any other file for that matter, if you can think of a reason to).
- Also note that:
- translate oofa.txt ucs2 ucs2 new.txt
- Produces a result in the native (or SET FILE UCS) byte-order as long as
- oofa.txt has a BOM.
- As a side benefit of the Unicode work, the TRANSLATE command now works
- for the first time also for all Japanese character sets that Kermit
- supports. In other words, if you have a Japanese text file in any of
- the following encodings:
- EUC-JP
- Shift-JIS
- JIS-7
- UCS-2
- UTF-8
- You can use the TRANSLATE command to convert to any other encoding from
- the same list.
- 6.6.5.3. Terminal Connection
- The CONNECT command now allows UTF-8 as a local or remote terminal
- character-set:
- SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
- SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
- SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
- (Recall that Kermit's terminal character-set has two "ends" -- the set
- used on the host to which Kermit is connected, and the set used on the
- local keyboard and screen.)
- UCS-2 is not supported as a terminal character-set (either end) since
- (a) it is not used that way anywhere to our knowledge, and (b) the
- problems of Endianness and the high likelihood of loss of
- synchronization make it impractical. (Telecommunications is
- byte-oriented; if one byte, or any odd number of bytes, is lost because
- of buffer overruns, circuit resets, etc (or likewise if a burst of
- noise appears that takes the guise of an odd number of bytes), the byte
- order of the subsequent data stream will be backwards; unlike UTF-8 and
- traditional byte-based character sets, UCS-2 is not "self
- synchronizing".)
- UTF-8 does not have byte-order or synchronization problems and is
- growing in popularity as a terminal character set as well as in other
- application areas. It allows a single terminal session to use multiple
- scripts (Roman, Cyrillic, Greek, etc) without ISO 2022 character-set
- switching (which terminal emulators like Kermit 95 can handle but few
- host applications understand or use), and meshes nicely with the
- Unicode screen fonts that are beginning to appear.
- UTF-8 was first used in Plan 9 and soon will be available in Linux. It
- will probably spread from there (Unicode in some form is, of course,
- also used in Windows NT, but only internally -- not for access from
- outside).
- To use UTF-8 or any other character set that uses 8-bit bytes in your
- terminal session, be sure to tell C-Kermit to:
- SET TERMINAL BYTESIZE 8
- SET COMMAND BYTESIZE 8
- SET PARITY NONE
- (or use the shortcut command, EIGHTBIT, which does all three at once).
- In a setup where your local Kermit program uses a single-byte character
- set such as PC Code Page 850 and the remote host uses UTF-8:
- SET TERM CHAR UTF8 CP850
- or:
- SET TERM REMOTE CHAR UTF8
- SET TERM LOCAL CHAR CP850
- all works as expected. UTF-8 text on the remote displays correctly on
- your screen, and when you type CP850 characters, they are translated to
- UTF-8 sequences for transmission, and the echo from the host is
- translated from UTF-8 back to CP850. Telnet negotiations and
- autodownload take place before any character-set translation and work
- as before. The session log (if text mode was selected for it) contains
- only the local terminal character-set. And so on.
- Kermit merely supplies translations from UTF-8 to your local terminal
- character-set (this includes treating UTF-8 Line Separator and
- Paragraph separator as CRLF). However, Kermit does does not, at
- present, perform "canonicalization" of composed sequences, nor does it
- automatically execute bidirectionality algorithms for display of
- mixed-direction text (e.g. Hebrew and English). Such presentation
- issues, like all others in the terminal-host regime, are left to the
- host.
- By the way, C-Kermit also allows UTF-8 to be the local end of the
- terminal character-set, but so far this code is not tested, since we
- don't have a UTF-8 console or terminal to work with. However, it can be
- stated without doubt that C-Kermit's key mapping will not work for
- UTF-8 values, since (a) the key map is indexed by 8-bit byte values and
- (b) C-Kermit reads keystrokes a byte at a time (these comments do not
- apply to K95, which has direct access to the keyboard and can read
- "wide" keycodes and uses them to index a "wide" keymap).
- Restrictions: As noted, the CONNECT command does not support UCS-2 as a
- REMOTE TERMINAL character-set. Neither does it support the Japanese
- sets EUC-JP, JIS-7, and Shift-JIS. Support for the Japanese sets (and
- possibly Chinese and Korean too) might be added in a future release.
- Since the TRANSMIT command (next section) uses the same REMOTE TERMINAL
- character-sets as the CONNECT command, it has the same restrictions.
- 6.6.5.4. The TRANSMIT Command
- As described in Chapter 15 ofUsing C-Kermit and Section 4.21
- of this document, the TRANSMIT command can be used to upload a file
- without protocol, more or less as if you were typing it on your
- keyboard while connected to the host. When TRANSMITting in text mode,
- the file's character set is converted to the host's unless you have SET
- TERMINAL CHARACTER-SET TRANSPARENT, or you include the new TRANSMIT
- switch, /TRANSPARENT.
- Before C-Kermit 7.0, the file character-set was assumed to be the same
- as the local end of the terminal character-set, and the TRANSMIT
- command used the same translations as the CONNECT command, ignoring the
- file character-set.
- In C-Kermit 7.0, that assumption (a poor one to begin with) can no
- longer be made, since UCS-2 can be a file character-set but not a
- terminal character-set. So now the file's character-set is given by
- your most recent SET FILE CHARACTER-SET command. The host's character
- set is the remote end of your most recent SET TERMINAL CHARACTER-SET
- command:
- SET TERMINAL CHARACTER-SET remote-set [ local-set ]
- or:
- SET TERMINAL REMOTE-CHARACTER-SET remote-set
- The TRANSMIT command converts each source-file character from the FILE
- character-set to the REMOTE TERMINAL character-set, and then transmits
- the translated characters according to your SET TRANSMIT preferences
- (Chapter 15).
- If you have SET TRANSMIT ECHO ON, and the host is echoing the
- transmitted characters, the echos are converted from the remote
- terminal character-set to the local terminal character-set.
- [ A picture would help... ]
- Confused? Let's work through an example. Suppose your local computer is
- a NeXTstation, on which text files are encoded in the NeXT character
- set, and that the remote computer is a Data General AViiON, which uses
- the Data General International character set. Further suppose that you
- are logged in to the NeXT from a VT220 terminal which uses the DEC
- Multinational character set.
- You need to convert the file from NeXT encoding to DG encoding and
- convert the echoes from DG encoding to DEC encoding. So on the NeXT,
- tell C-Kermit to:
- eightbit
- set file character-set next
- set term character-set dg-international dec-mcs
- transmit /text nextdata.txt
- (This assumes you have some sort of collection process already set up
- on the Data General, such as a text editor or the venerable "cat >
- foo". The EIGHTBIT command is equivalent to SET TERMINAL BYTESIZE 8,
- SET COMMAND BYTESIZE 8, SET PARITY NONE.)
- To further complicate matters, suppose your local terminal character
- set is the same as the remote one, so you don't need terminal
- character-set translation, but you need to TRANSMIT a file that is in a
- different character set and you want it translated to the host set. In
- this case, use SET TERM CHARACTER-SET to actually specify the character
- set used on each end, rather than specifying TRANSPARENT:
- eightbit
- set file character-set ucs2
- set term character-set latin1 latin1
- transmit /text ucs2data.txt
- The distinction between:
- SET TERMINAL CHARACTER-SET xxx yyy
- (where xxx and yyy are the same set) and:
- SET TERMINAL CHARACTER-SET TRANSPARENT
- is new to C-Kermit 7.0, but affects only the TRANSMIT command.
- The TRANSMIT command currently does nothing special with UCS-2/UTF-8
- Line and Paragraph Separator characters; more experience is required to
- find out how these behave in a genuine Unicode terminal-host setting.
- Restrictions: As noted, the TRANSMIT command translates from the FILE
- character-set to the REMOTE TERMINAL character-set. This rules out
- translations to any character set that is not supported as a REMOTE
- TERMINAL character-set, such as UCS-2, EUC-JP, JIS-7, and Shift-JIS.
- 6.6.5.5. Summary of Kermit Unicode Commands
- Specifying file character-set and byte order:
- SET FILE CHARACTER-SET { ..., UCS2, UTF8 }
- REMOTE SET FILE CHARACTER-SET { ..., UCS2, UTF8 } (See next
- section)
- SET FILE UCS BOM { ON, OFF }
- SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
- Specifying the transfer character-set:
- SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
- REMOTE SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
- Specifying the terminal character-set:
- SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
- SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
- SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
- Displaying settings:
- SHOW FILE
- SHOW TRANSFER
- SHOW TERMINAL
- SHOW CHARACTER-SETS
- Commands that use these settings include:
- SEND, RECEIVE, GET, etc.
- CONNECT
- TRANSMIT
- LOG SESSION
- Converting files:
- TRANSLATE infile { ..., UCS-2, UTF-8 } { ..., UCS-2, UTF-8 }
- outfile
- COPY /SWAP-BYTES infile outfile
- 6.7. Client/Server Character-Set Switching
- A simple mechanism has been added to allow the client to change the
- server's FILE CHARACTER-SET:
- REMOTE SET FILE CHARACTER-SET name
- The client asks the server to change its file character-set to
- the one given. The name must match one of the server's file
- character-set names. For convenience, C-Kermit uses its own file
- character-set keyword list for parsing this command so you can
- use ? for help and Tab or Esc for completion. However, since the
- server might have a different repertoire (or even use different
- names for the same sets), C-Kermit accepts any string you supply
- and sends it to the server. The server, if it supports this
- command (C-Kermit 7.0 and K95 1.1.19 do), sets its file
- character-set as requested, and also disables automatic
- character-set switching ( Section 6.5). If the server does
- not support this command or if it does not support the given
- character set, the REMOTE SET FILE CHARACTER-SET command fails.
- Here's an example that sends a Japanese text file encoded in Shift-JIS
- to a server using every combination of Kermit's Japanese-capable file
- and transfer character sets:
- dcl \&x[] = euc ucs2 utf8 ; transfer character-sets
- dcl \&y[] = eu uc ut ; 2-letter abbreviations for them
- dcl \&f[] = shift euc jis7 ucs2 utf8 ; file character-sets
- dcl \&g[] = sj eu j7 uc ut ; 2-letter abbreviations
- set file char shift-jis ; local file character-set is Shift-JIS
- for \%i 1 \fdim(&x) 1 { ; for each transfer character-set...
- set xfer char \&x[\%i] ; set it
- for \%j 1 \fdim(&f) 1 { ; for each remote file character-set...
- remote set file char \&f[\%j] ; set it
- if fail exit 1 SERVER REJECTED CHARSET
- send /text meibo-sj.html meibo-sj-\&y[\%i]-\&g[\%j].txt ; send the fil
- e
- if fail exit 1 TRANSFER FAILED
- }
- }
- The Kermit-370 server does not support REMOTE SET FILE CHARACTER-SET,
- but since it supports REMOTE KERMIT commands, you can get the same
- effect with REMOTE KERMIT SET FILE CHARACTER-SET name.
- 7. SCRIPT PROGRAMMING
- (Also see Section 2.8, Scripting Local Programs.)
- 7.0. Bug Fixes
- The following script programming bugs were fixed in C-Kermit 7.0:
- * IF EXIST and IF DIRECTORY were fixed to properly strip braces from
- around their arguments, so "if directory {C:\Program Files}", etc,
- would work as expected. However, this means that if the file or
- directory name is actually enclosed in braces, the braces must be
- doubled.
- * The READ command did not fail if the READ file wasn't open; now it
- does.
- * The READ command refused to read the last or only line of a file if
- it did not end with a proper line terminator; now it does.
- * The END command, when given from within a SWITCH statement, did not
- exit from the current macro or command file; instead it just
- terminated the SWITCH.
- 7.1. The INPUT Command
- 7.1.1. INPUT Timeouts
- The description of the INPUT command on page 422 fails to mention the
- following two points about the timeout (which apply to C-Kermit 6.0 and
- later):
- 1. "INPUT -1 text" (or "INPUT \%x text", where \%x is any variable
- whose value is -1 or less) means "wait forever". This form of the
- INPUT command fails only if it is interrupted, since it will never
- time out.
- 2. INPUT 0 performs a nonblocking read of material that has already
- arrived but has not yet been read, and succeeds immediately if the
- target string is found, or fails immediately if it is not found.
- The same points apply to MINPUT. REINPUT ignores its timeout parameter.
- 7.1.2. New INPUT Controls
- The following new INPUT controls were added in version 7.0:
- SET INPUT AUTODOWNLOAD { ON, OFF }
- Explained in Section 7.7.
- SET INPUT CANCELLATION { ON, OFF }
- This governs whether an INPUT command can be canceled by
- "pressing any key" on the keyboard. Normally it can be, in which
- case the INPUT command fails immediately and \v(instatus) is set
- to 2, indicating interruption. SET INPUT CANCELLATION OFF
- disables keyboard cancellations; thus if the search text is not
- encountered, the INPUT command will run for its entire timeout
- interval. SET INPUT CANCELLATION OFF does not disable
- interruption by Ctrl-C, however; every command needs an
- emergency exit. (If you really want to disable interruption by
- Ctrl-C, use SET COMMAND INTERRUPTION OFF.)
- Also see Section 7.2 for any new variables related to INPUT.
- 7.1.3. INPUT with Pattern Matching
- C-Kermit 7.0 allows INPUT, MINPUT, and REINPUT targets to be a pattern
- (explained inSections 1.19 and4.9). This solves a
- long-standing problem illustrated by the following scenario: a certain
- company has a bank of TCP/IP modem servers, with hostnames server1,
- server2, server3, and so on. Each server's prompt is its name, followed
- by a colon (:), for example "Server72:". Without INPUT patterns, it
- would be rather difficult to wait for the prompt. The brute force
- approach:
- minput 20 Server1: Server2: Server3: ... (enumerating each one)
- is subject to failure whenever a new server is added. A more subtle
- approach:
- input 20 Server
- if fail ...
- input 2 :
- is liable to false positives, e.g. "Welcome to the XYZ Corp Modem
- Server. Please read the following message:"...
- With patterns, you can match the prompt with "Server*:" (which doesn't
- solve the "false positives" problem, but certainly is more compact than
- the brute force method), or with more specific patterns such as
- "Server[1-9]:" and "Server[1-9][0-9]:", or equivalently:
- Server{[1-9],[1-9][0-9]}:
- meaning the word "Server" followed by a single digit (1-9) or by two
- digits representing a number from 1 to 99, followed by a colon.
- INPUT pattern matching has been added in a way that does not interfere
- with existing scripts. No new commands or switches are used. The simple
- rule is: if an INPUT search target is the argument of the (new)
- \fpattern() function, it is a pattern. Otherwise it is taken literally,
- as before. For example:
- input 5 a*b
- searches for an 'a' followed by an asterisk ('*'), followed by a 'b'.
- But:
- input 5 \fpattern(a*b)
- searches for an 'a' followed by anything at all up to and including the
- first 'b'. This means that any search target to INPUT, MINPUT, or
- REINPUT can be a pattern or a literal string, and in particular that
- MINPUT can accommodate any mixture of patterns and literal strings.
- In selecting patterns, note that:
- * A leading '*' is always implied so there is no need to include one.
- * A trailing '*' is meaningless and ignored.
- * A '*' by itself matches the first character that arrives.
- A syntax note: If your pattern is a selection list, meaning a list of
- alternatives separated by commas and enclosed in braces, then the outer
- braces will be stripped by various levels of parsers, so you must
- include three of each:
- input 10 \fpattern({{{abc,mno,xyz}}})
- Note that this is equivalent to:
- minput 10 abc mno xyz
- except for the setting of the \v(minput) variable.
- And a caution: INPUT pattern matching has a limitation that you
- probably never noticed with literal-string matching, namely that there
- is a limit on the size of the match. For example, if the pattern is
- "a*b", the match will succeed if the 'a' and 'b' are not separated by
- more than (say) 8K bytes, but will fail if they are farther apart than
- that. In such cases, it better to use two INPUTs (e.g. "input 10 a" and
- then "input 100 b").
- 7.1.4. The INPUT Match Result
- The result of any INPUT, MINPUT, or REINPUT command, no matter whether
- the search targets are patterns or literal strings, is available in the
- new \v(inmatch) variable. For example:
- minput 10 cat \fpattern([dh]og)
- if success echo MINPUT matched "\v(inmatch)"
- This is especially useful when a pattern was matched, since it makes
- the string that matched the pattern available to Kermit; there would be
- no way to get it otherwise.
- After an INPUT command, you can view all the INPUT-related variables by
- typing "show variables in" (abbreviate as "sho var in"), which shows
- the values of all built-in variables whose names start with "in".
- 7.2. New or Improved Built-In Variables
- \v(blockcheck)
- Current BLOCK-CHECK setting, 1, 2, 3, or 4. 4 is the code for
- BLANK-FREE-2.
- \v(byteorder)
- The machine's byte order: 0 = Big Endian, 1 = Little Endian.
- \v(cmdbufsize)
- The length of the command buffer, which is the maximum size for
- a macro, a command, a variable, or anything else in C-Kermit's
- script language.
- \v(ctty)
- The device name of C-Kermit's controlling (login) terminal.
- \v(filename)
- Described inSections 4.1 and4.2.
- \v(filenumber)
- Described inSections 4.1 and4.2.
- \v(filespec)
- As of C-Kermit 7.0, contains fully qualified filenames rather
- than (usually) relative ones.
- \v(return)
- Now holds the END n value of the macro that most recently
- returned, in case END was used rather than RETURN.
- \v(editor)
- Pathname of preferred text editor
- \v(editopts)
- Command-line options for editor
- \v(editfile)
- File most recently edited
- \v(browser)
- Pathname of preferred Web browser
- \v(browsopts)
- Command-line options for Web browser
- \v(browsurl)
- URL most recently given to Web browser
- \v(dialtype)
- Type of call most recently placed (see Section 2.1.11).
- \v(kbchar)
- The character, if any, that was typed at the keyboard to to
- interrupt the most recent PAUSE, SLEEP, WAIT, MSLEEP, or INPUT
- command; empty if the most recent such command was not
- interrupted from the keyboard.
- \v(lockdir)
- UNIX only - The name of the UUCP lockfile directory, if known,
- otherwise "(unknown)".
- \v(lockpid)
- UNIX only - PID of process that owns the communication port that
- you tried to open with a SET LINE command that failed because
- the port was in use, otherwise empty. This variable is set with
- every SET LINE command.
- \v(cx_time)
- If no connection (SET HOST, SET LINE, DIAL, TELNET, etc) is
- active, this is 0. If a connection is active, this is the number
- of seconds since the connection was made.
- \v(hwparity)
- If hardware parity is in effect, this variable gives its value,
- such as "even" or "odd" (in which case, the \v(parity) variable
- will be "none"). Otherwise this variable is empty.
- \v(serial)
- Current serial port settings in 8N1 format ( Section 2.10).
- \v(errno)
- In UNIX, the current value of the C runtime errno variable,
- which is quite volatile (meaning that often an "interesting"
- error code can be overwritten by some other library call or
- system service that sets errno before you have a chance to look
- at it). In VMS, the error code returned by the system or library
- call that most recently failed (success codes are not saved).
- Not available in other operating systems.
- \v(errstring)
- The UNIX or VMS system error message that corresponds to
- \v(errno). Not available in all OS's. Also see
- \ferrstring().
- \v(setlinemsg)
- The error message, if any, from the most recent SET LINE, SET
- PORT, SET HOST, TELNET, or other connection-making command. This
- is not necessarily the same as \v(errstring) since these
- commands might fail without generating a system error code, for
- example (in UNIX) because a lockfile existed indicating the
- device was assigned by another user.
- \v(exitstatus)
- The exit status C-Kermit would return if it exited now.
- \v(pexitstat)
- The exit status of the inferior process most recently invoked by
- C-Kermit (by RUN, !, REDIRECT, SEND /COMMAND, etc). In VMS, this
- code can be given to \ferrstring() to get the corresponding
- error message (in UNIX, program/command return codes are not the
- same as system error codes). Not available in operating systems
- other than UNIX and VMS. See Section 4.2.5 for details.
- \v(inmatch)
- The incoming string of characters, if any, that matched the most
- recent INPUT, REINPUT, or MINPUT command.
- \v(intime)
- The number of milliseconds (thousandths of seconds) it took for
- the most recent INPUT command to find its match, or -1 if no
- INPUT command has been given yet. If the INPUT command timed
- out, the value is approximately equal to 1000 times the INPUT
- timeout. If INPUT failed for some other reason, the value is
- undefined (\v(instatus) gives INPUT completion status). If your
- version of C-Kermit is built without high-precision
- floating-point timers, this number will always be a multiple of
- 1000.
- \v(inwait)
- The number of seconds specified as the timeout in the most
- recent INPUT command.
- \v(dialsuffix)
- Dialing suffix for use during PDIAL sequence; seeSection
- 2.1.10.
- \v(pid)
- UNIX, VMS, and K95 only. C-Kermit's primary process ID, numeric,
- decimal. If you want to show it in hex, use \fn2hex(\v(pid)) If
- you want to show it in octal, use \fn2octal(\v(pid)).
- \v(printer)
- Current printer name or SET PRINTER value.
- \v(p_ctl)
- Control prefix char \v(p_8bit) 8-bit prefix char (if parity not
- none)
- \v(p_rpt)
- Repeat prefix char (if repeat compression enabled)
- \v(herald)
- Kermit's version herald
- \v(test)
- Kermit's test version, if any, or 0 if this is not a test
- version. Typical values for test versions are "Alpha.03" or
- "Beta.14".
- \v(sendlist)
- The number of entries in the SEND-LIST, 0 if none. Note: entries
- do not necessarily correspond to files, since an entry might
- contain wildcards. Also note that the value does not go back to
- 0 after the files in the list are sent. To reset this variable,
- use CLEAR SEND-LIST. The purpose of this variable is to
- determine if a SEND command, when given without any filenames,
- will be legal. Example:
- xif \v(sendlist) { send } else { send oofa.txt }
- \v(trigger)
- If the most recent CONNECT session was terminated automatically
- by a trigger, this variable contains the trigger value.
- \v(ty_ln)
- TYPE line number (during TYPE)
- \v(ty_lc)
- TYPE line count (after TYPE)
- \v(ty_mc)
- TYPE match count (after TYPE)
- \v(xferstat)
- Status of most recent file transfer:
- -1: No transfer yet
- 0: Succeeded
- 1: Failed
- \v(xfermsg)
- If the most recent file transfer failed, this is the reason. If
- it succeeded, \v(xfermsg) is an empty string.
- \v(tftime)
- Total elapsed time of most recent file transfer operation, in
- seconds.
- \v(textdir)
- Directory that holds (or is supposed to hold) Kermit text files
- such as installation instructions, release notes, update notes,
- read-me files, "beware" files, etc.
- \v(name)
- The name with which the Kermit program was invoked, e.g.
- "kermit", "wermit", "k95", "k2", etc (see Section 9.1).
- \v(osname)
- Name of operating system on computer where C-Kermit is running,
- obtained at runtime (from uname or equivalent).
- \v(osversion)
- Version of operating system on computer where C-Kermit is
- running, obtained at runtime (from uname or equivalent).
- \v(osrelease)
- Release of operating system on computer where C-Kermit is
- running, obtained at runtime (from uname or equivalent).
- \v(model)
- The specific hardware model of the computer where C-Kermit is
- running, if known.
- \v(math_pi)
- The value of Pi (see Section 7.23)
- \v(math_e)
- The value of e (see Section 7.23)
- \v(math_precision)
- How many significant digits in a floating-point number.
- \v(f_count)
- Result of the most recent FILE COUNT (FCOUNT) command.
- \v(f_error)
- Numeric error code of most recent FILE command.
- \v(f_max)
- Maximum number of files open simultaneously.
- The math constants are given in the precision of underlying computer's
- floating-point arithmetic.
- Note the distinction between \v(osname), \v(osversion), and
- \v(platform); the latter refers to the platform for which and/or upon
- which C-Kermit was built, as opposed to the one on which it is actually
- running. Also note that each operating system can, and probably will,
- interpret and fill in the os* variables differently, or not at all.
- The SHOW VARIABLES command now accepts a variable name, prefix, or
- pattern:
- show variables Shows all variables.
- show variables t Shows all variables that start with "t".
- show variables *ver* Shows all variables whose names contain "ver".
- show variables *ver Ditto (an implied "*" is appended).
- 7.3. New or Improved Built-In Functions
- The following new file-i/o functions are explained inSection
- 1.22.
- \f_status(channel) Status of file open on channel
- \f_pos(channel) Read/write (byte) pointer of given file
- \f_line(channel) Current line of file
- \f_handle(channel) Handle of file
- \f_eof(channel) Whether given file is at EOF
- \f_getchar(channel) Read a char from given file
- \f_getline(channel) Read a line from given file
- \f_getblock(channel,n) Read a block from given file
- \f_putchar(channel,c) Write a char to given file
- \f_putline(channel,string) Write a line to given file
- \f_putblock(channel,string) Write a block to given file
- The following new date-time-related functions are explained in
- Section 1.6:
- \fday() Returns day of week of given date
- \fnday() Returns numeric day of week of given date
- \ftime() Returns time portion of given date-time
- \fntime() Converts time to seconds since midnight
- \fn2time() Converts seconds since midnight to hh:mm:ss
- \fcvtdate(date-time) Converts free-format date to yyyymmdd hh:mm:ss
- \fdayofyear(date-time) Converts date to yyyyddd (day-of-year) format
- \fdoy(date-time) Synonym for \fdayofyear()
- \fdoy2date(dayofyear) Converts yyyyddd to yyyymmdd
- \fmjd(date-time) Converts free-format date to Modified Julian Date
- \fmjd2date(mjd) Converts modified Julian date to yyyymmdd
- The new floating-point arithmetic functions are explained in
- Section 7.23. f1 and f2 are floating-point (real) numbers; d is
- the number of decimal places to show:
- \ffpabsolute(f1,d) Absolute value of f1
- \ffpadd(f1,f2,d) f1 + f1
- \ffpcosine(f1,d) Cosine of f1
- \ffpdivide(f1,f2,d) f1 divided by f2
- \ffpexp(f1,d) e to the f1 power
- \ffpint(f1) Integer part of f1
- \ffplog10(f1,d) Log base 10 of f1
- \ffplogn(f1,d) Natural log of f1
- \ffpmaximum(f1,f2,d) Maximum of f1 and f2
- \ffpminimum(f1,f2,d) Minimum of f1 and f2
- \ffpmodulus(f1,f2,d) Modulus of f1 and f2
- \ffpmultiply(f1,f2,d) Product of f1 and f2
- \ffpraise(f1,f2,d) Raise f1 to power f2
- \ffpround(f1,d) Round f1 to d places
- \ffpsine(f1,d) Sine of f1
- \ffpsqrt(f1,d) Square root of f1
- \ffpsubtract(f1,f2,d) f2 - f1
- \ffptangent(f1,d) Tangent of f1
- Integer number functions:
- \fabsolute(n)
- Absolute value of integer n.
- \frandom(n)
- Returns a random integer between 0 and n-1.
- \fradix(s,n1,n2)
- If the string s is an integer in radix n1, the result is the
- same number expressed in radix n2, where n1 and n2 may be any
- number from 2 through 36, expressed as decimal numbers, or
- variables (etc) that evaluate to decimal numbers. For the source
- and result, the digits of any radix, r, are the first r
- characters in the sequence 0-9,a-z (case doesn't matter for the
- letters). The string s may have a sign, + or -; if it starts
- with a minus (-) sign, the result also has a minus sign.
- The \fradix() function does not work with floating-point numbers. It
- does not reveal the internal storage format of a number; for example,
- \fradix(-1,10,16) is -1, not something like FFFFFFFFFF. If all three
- arguments are not given, or if n1 or n2 are not numbers between 2 and
- 36 inclusive, or s is not a number in radix n1, an error occurs and the
- empty string is returned. \fradix() also does not offer
- extended-precision arithmetic; number values are limited to those
- expressed as a long integer in the architecture of the underlying
- computer, usually 32 or 64 bits. If you give it an argument whose
- absolute value is larger than can be held in an unsigned long, the
- result is -1.
- The next four are shorthand functions for decimal/hexadecimal and
- decimal/octal number conversion:
- \fn2hex(n)
- Returns the hexadecimal (base 16) representation of the integer
- n. This is different from \fhexify(s), which treats its argument
- as a string rather than a number. The result is always
- left-padded with 0's to make its length even. Examples:
- \n2hex(0) = "00" \fhexify(0) = "30"
- \n2hex(255) = "ff" \fhexify(255) = "323535"
- \n2hex(256) = "0100" \fhexify(256) = "323536"
- \fhex2n(x)
- Converts hexadecimal number x to decimal equivalent decimal
- number. This is the inverse of \fn2hex(). Equivalent to
- \fradix(s,16,10).
- \fn2octal(n)
- Returns the octal (base 8) representation of the number n.
- Examples:
- \n2octal(0) = "0"
- \n2oct(255) = "377"
- \n2oct(256) = "400"
- Equivalent to \fradix(n,10,8).
- \foct2n(n)
- Returns the decimal representation of the given octal number, n.
- The inverse of \fn2octal(). Equivalent to \fradix(n,8,10).
- String functions:
- \s(name[n:m])
- Equivalent to \fsubstring(\m(name),n,m) ( Section 7.24).
- \:(name[n:m])
- Equivalent to \fsubstring(name,n,m) (where "name" is any
- \-quantity) ( Section 7.24).
- \fleft(s,n)
- The leftmost ncharacters of string s; equivalent to
- \fsubstring(s,1,n).
- \fstripx(string,char)
- Returns the part of the string up to the rightmost occurrence,
- if any, of the given character. The default character is period
- (.) Examples:
- \fstripx(foo/bar,/) = "foo"
- \fstripx(foo/bar/baz,/) = "foo/bar"
- \fstripx(autoexec.bat,.) = "autoexec"
- \fstripx(autoexec.bat) = "autoexec"
- \fstripx(fstripx(foo/bar/baz,/),/) = "foo"
- \flop(string,character)
- Returns the portion of the string starting after the first
- occurrence of the given character. The default character is
- period (.) Examples:
- \flop(autoexec.bat) = "bat"
- \flop(baz.foo/bar) = "foo/bar"
- \flop(baz.foo/bar,/) = "bar
- \fstripn(string,n)
- Returns the string with ncharacters removed from the end.
- Example:
- \fstripn(12345678,3) = "12345"
- (For more discussion of \fstripx(), \fstripn(), and \flop() see
- Section 4.2.3).
- \fb64encode(s)
- Returns the Base-64 encoding of the string s.
- \fb64decode(s)
- Returns the decoding of the Base-64 string s. Fails if s is not
- a Base-64 string, or if its length is not a multiple of 4. Note
- that if any of the result bytes are null (0), the result string
- stops there. There is no way to represent strings that contain
- null bytes in C-Kermit (the same is true for \funhexify()).
- \fword(s1,n,s2,s3)
- Extracts word number nfrom string s1. By default, a "word" is
- any sequence of ASCII letters or digits; nis 1-based. If n is
- omitted, "1" is used. Examples:
- \fword(one two three) = "one"
- \fword(one two three,1) = "one"
- \fword(one two three,2) = "two"
- \fword(one two three,3) = "three"
- and:
- \fword(\v(dialresult),2) = "31200"
- is "31200" if \v(dialresult) is (e.g.) "CONNECT
- 31200/ARQ/V32/LAPM/V42BIS".
- If you include s2, this replaces the default break set. For
- example, suppose you have a string \%a whose value is:
- $150.00 $300.00 $39.95
- and you want each dollar amount to be a word; use:
- \fword(\%a,\%n,{ })
- This returns dollar amount number \%n, e.g. "$300.00" for \%n =
- 2. "{ }" denotes a space (you must enclose it in braces,
- otherwise it is squeezed out). Note that ASCII control
- characters are always included in the break set; you don't have
- to specify them (and you can't not specify them).
- The optional s3 argument lists characters (even control
- characters) that normally would be considered separators that
- you want included in words. So the dollars-and-cents example
- could also be handled this way:
- \fword(\%a,\%n,,$.)
- in other words, use the default separator list, but remove "$"
- and "." from it so they will be considered part of a word.
- Note that since 8-bit characters are not ASCII, they act as
- break characters unless you put them in the include list.
- Suppose, for example, you have a file in which each line is a
- Tab-separated list of words, numbers, or phrases that might
- contain punctuation, special characters like $ and @, 8-bit bit
- characters, etc (like something that might have been exported
- from a spreadsheet or database), and you want to split only on
- Tab; here is a way (\m(line) is a line read from the file):
- undef keep
- for \%i 1 255 1 {
- if == \%i 9 continue
- .keep := \m(keep)\fchar(\%i)
- }
- while true {
- fread /line \%c line
- if fail break
- .\%n := \fsplit(\m(line),&a,\9,\m(keep))
- ...
- }
- This problem is addressed inC-Kermit 9.0.
- \fsplit(s1,&a,s2,s3)
- This is like \fword(), except instead of extracting and
- returning a particular word from string s1, it counts the words
- and optionally assigns them to the array whose identifying
- letter, a-z, is given after the "&" in the second argument, with
- the first word going into element 1, the second into element 2,
- and so on. The rules regarding break and include lists (s2 and
- s3) are exactly the same as for \fword(). \fsplit() returns the
- number of words that were assigned, which is either the number
- of words in the string, or the dimension of the array, whichever
- is less. If the array is not declared, \fsplit() creates it and
- returns a number which is both the number of words in s1 and the
- dimension of the new array. Examples:
- declare \&w[20] ; (Optional.)
- ...
- read \%s ; \%s is "This is a sentence with seven words."
- ...
- echo "\fsplit(\%s)" ; This would print "7".
- echo "\fsplit(\%s,&w)" ; Ditto, and also assigns them to array \&w[].
- echo "\&w[7]" ; This would print "words".
- If the line contained fields that were delimited by colon (:),
- you would use \fsplit(\%s,&w,:). If the fields were delimited by
- comma, then you would use \fsplit(\%s,&w,{,}); in this case the
- literal comma must be enclosed in braces to distinguish it from
- the comma that separates function arguments. To get a word count
- without loading an array, but still specify break and/or include
- lists, leave the array argument empty:
- echo "\fsplit(\%s,,:)" ; Use colon as the separator.
- WARNINGS:
- 1. If you use the same array repeatedly, \fsplit() leaves any
- trailing members undisturbed. For example:
- dcl \&w[10]
- \fsplit(1 2 3 4 5,&w) ; Sets \&w[1] thru \&w[5].
- \fsplit(a b c,&w) ; Sets \&w[1]-[3] leaving [4]-[5] as they were.
- 2. If you allow \fsplit to create the array (by not declaring it
- first), it is dimensioned to the number of elements it was
- created with:
- \fsplit(1 2 3,&x) ; Creates an array \&x[] with 3 elements.
- \fsplit(a b c d e,&x) ; This overflows the array.
- Thus if you want to use \fsplit() repeatedly on the same array,
- either dimension it in advance to the maximum expected size (and
- then some -- more efficient), or else destroy it after each use
- (to allow for unexpectedly large arguments). Example using a
- dynamic array:
- fopen /read \%c some-file
- if fail ...
- set function error on ; See Section 7.12
- while true {
- dcl \&w[] ; Destroy \&[w] each time thru the loop
- fread /line \%c \%a
- if fail break
- asg \%x \fsplit(\%a,&w)
- if fail ...
- ; (do what you want with \&w[] here...)
- }
- fclose \%c
- \frindex(s1,s2,n)
- The "n" argument to \frindex() now works consistently (in mirror
- image) with the corresponding \findex() argument. In each case,
- the (n-1)-most characters of s2 are ignored in the search; for
- findex, this means the starting position of the search is n (the
- default n is 1, and 0 is treated like 1). For \frindex() it
- means the default starting point is:
- length(s2) - length(s1) - n (with the same defaults for n).
- \fsearch(pattern,string[,position])
- Exactly like \findex(), except with a pattern (seeSection
- 7.9) rather than a literal string.
- \frsearch(pattern,string[,position])
- Exactly like \frindex(), except with a pattern rather than a
- literal string.
- File Functions:
- \ffiles(), \fnextfile()
- It is no longer necessary to copy the file list to an array
- before use, as shown on p.398 ofUsing C-Kermit 2nd
- Edition. \ffiles() and friends now make their own safe copies of
- the file list. Thus constructions like the following are now
- possible:
- for \%i 1 \ffiles(*.txt) 1 { send \fnextfile() }
- The same is true for the new function \frfiles(),
- \fdirectories(), and \frdirectories(), described inSection
- 4.11.3.
- But note that each reference to \fnextfile() still gets you the
- next file. So "if newer \fnextfile() foo.txt send \fnextfile()"
- compares one file's age with that of foo.txt, and then sends an
- entirely different file. If you're going to refer to the same
- file more than once, assign it to a variable:
- asg \%f \fnextfile()
- if newer \%f foo.txt send \%f
- (note: assign, not define).
- Also note that \ffiles(), \frfiles(), \fdirectories(), and
- \frdirectories() all now accept on optional 2nd argument: the
- name of an array to load with the resulting file or directory
- list, explained in Section 4.11.3. So you can also load an
- array with the filelist when you need to refer to the same file
- more than once:
- for \%i 1 \ffiles(*,&a) 1 { if newer \&a[\%i] foo.txt send \&a[\%i] }
- \fpermissions(file)
- Returns the platform-specific permissions string for the file,
- such as "-rw-rw-r--" in UNIX or "(RWE,RWE,RE,E)" in VMS.
- \fdirname(f)
- Given a file specification f, this function returns the complete
- pathname of directory the file is in.
- Array Functions:
- \fdimension(&a)
- Returns the dimension declared for the array whose identifying
- letter, a-z, or special character "_" or "@", is given after the
- "&" in the argument. If the array is not declared, 0 is
- returned. Note that when used with the macro argument vector
- array, \&_[] (see Section 7.5), the value of this function
- is one less than \v(argc), and when used with the C-Kermit
- command-line argument vector array, \&@[], it is equal to the
- \v(args) variable. Examples:
- echo \fdimension(&a) ; Not declared.
- 0
- declare \&a[12] ; Now it's declared.
- echo \fdim(&a)
- 12
- \farraylook(pattern,arrayname)
- Looks in the given array for the pattern and returns the index
- of the first element that matches, if any, or -1 if none match.
- The arrayname can include a range specifier to restrict to
- search to a segment of the array, e.g.
- \farraylook(*xyz*,&a[32:63]). For greater detail see
- Section 7.10.7.
- \ftablelook(keyword,arrayname[,delimiter])
- Looks in the given "table", which must be sorted, for the given
- keyword. Returns the index of the table element that uniquely
- matches the given keyword, or -1 if none match, or -2 if more
- than 1 match. For greater detail see Section 7.10.7.
- Other new functions:
- \fip2hex(s)
- Converts a dotted decimal IP address to an 8-digit hexadecimal
- number. \fip2hex(128.59.39.2) = 803b2702.
- \fhex2ip(x)
- Converts an 8-digit hexadecimal IP address to dotted decimal
- form, e.g. \fhex2ip(803b2702) = 128.59.39.2. The inverse of
- \fip2hex().
- \fcommand()
- \frawcommand()
- These run an external command and return its output; see
- Section 4.2.8.4.
- \fdialconvert(s)
- s is a phone number in either literal or portable format (not a
- dialing directory entry name). The function returns the dial
- string that would actually be used when dialing from the current
- location (after processing country code, area code, and other
- SET DIAL values).
- \ferrstring(n)
- Returns the system error message associated with the (numeric)
- error code n. UNIX and VMS only. Use in conjunction with
- \v(errno) or \v(pexitstat). See Section 4.2.5 for a usage
- example. Note: This function doesn't work in Windows because
- there is not a consistent error-code-to-message mapping; error
- code "x" means something completely different depending on
- whether it comes from the C runtime library, Winsock, a
- Windows-32 API, TAPI, etc,
- \fpattern(s)
- Used in INPUT, REINPUT, and MINPUT commands to denote search
- strings that are to be treated as patterns rather than
- literally.
- Also see Section 7.8 on built-in help for functions.
- 7.4. New IF Conditions
- IF AVAILABLE feature command
- Executes the command if the given feature is available.
- Presently used only to determine if specific authentication and
- encryption options are available. Type "if available ?" to see
- which features may be tested.
- IF FLOAT f1 command
- Executes command if f1 is a legal floating point number (which
- includes integers). Use this to preverify arguments for the
- \ffp...() floating-point arithmetic functions, e.g. "if float
- \%1 echo \ffpint(\%1)".
- IF == n1 n2 command
- Synonym for "if =" (numeric equality). Note that as of C-Kermit
- 7.0, this and all other numeric comparison operators also work
- for floating-point numbers.
- IF != n1 n2 command
- Executes the command if n1 and n2 are both numbers or variables
- containing numbers and the value of n1 is not equal to the value
- of n2. This is equivalent to "if not = n1 n2".
- IF <= n1 n2 command
- Executes the command if n1 and n2 are both numbers or variables
- containing numbers and the value of n1 is less than or equal to
- the value of n2. This is equivalent to "if not > n1 n2".
- IF >= n1 n2 command
- Executes the command if n1 and n2 are both numbers or variables
- containing numbers and the value of n1 is greater than or equal
- to the value of n2. Equivalent to "if not < n1 n2".
- IF COMMAND word command
- Executes the command if word is a built-in C-Kermit command.
- Example:
- if not command copy define { copy run copy \%1 \%2 }".
- This defines a COPY macro that runs an external COPY command if
- COPY is not already a built-in command.
- IF LOCAL command
- Executes the command if Kermit is in local mode, i.e. if it has
- a SET LINE, SET PORT, or SET HOST (TELNET, RLOGIN, etc) device
- or connection open. Does not execute the command if in remote
- mode.
- IF MATCH string pattern command
- Executes the command if the string matches the pattern. For a
- description of the syntax for the pattern, seeSection
- 4.9.1. If you want to test if the string contains pattern, use
- IF \fsearch(pattern,string).
- IF OPEN { DEBUG-LOG, SESSION-LOG, TRANSACTION-LOG, ... } command
- Executes the command if the given file is open, fails if it is
- not open. Type IF OPEN ? for a complete list of files that can
- be checked (all the files that can be opened with the OPEN or
- LOG commands).
- IF QUIET command
- Executes the command if SET QUIET is ON, and does not execute it
- if SET QUIET is OFF. Example: IF NOT QUIET ECHO { This is a
- message.}.
- IF READABLE name
- Succeeds if name is the name of an existing file or directory
- that is readable.
- IF WRITEABLE name
- Succeeds if name is the name of an existing file or directory
- that is writable, e.g.:
- if not writeable \v(lockdir) echo Please read installation instructions!
- IF FLAG command
- This tests a user-settable condition, which can mean anything
- you like. SET FLAG ON causes subsequent IF FLAG commands to
- succeed; SET FLAG OFF causes them to fail. One way to use it
- would be for debugging your scripts; precede any debugging
- statements with IF FLAG. Then SET FLAG on to debug your script,
- SET FLAG OFF to run it without debugging. Another common use is
- for causing an inner loop to cause an outer loop to exit.
- IF C-KERMIT command
- C-Kermit, but not Kermit 95 or MS-DOS Kermit, executes the
- command.
- IF K-95 command
- Kermit 95, but not C-Kermit or MS-DOS Kermit, executes the
- command.
- IF MS-KERMIT command
- MS-DOS Kermit, but not C-Kermit or Kermit 95, executes the
- command.
- 7.5. Using More than Ten Macro Arguments
- The \v(argc) variable now gives the actual number of arguments, even if
- the number is greater than 9:
- C-Kermit> define xx echo \v(argc)
- C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
- 27
- Remember that \v(argc) includes the name of the macro itself, so it is
- always at least 1, and is always 1 greater than the actual number of
- arguments. As in versions 6.0 and earlier, if more than 9 arguments are
- given, only the first nine are assigned to the variables \%1..\%9.
- The \&_[] array, discussed on page 353 ofUsing C-Kermit, 2nd ed,
- now holds all the arguments, up to some implementation-dependent limit
- (64 or greater), rather than only the first 9. To illustrate: the
- following macro tells the number of arguments it was called with and
- then prints them:
- define show_all_args {
- local \%i
- echo \&_[0] - Number of arguments: \feval(\v(argc)-1)
- for \%i 1 \v(argc)-1 1 { echo \flpad(\%i,3). "\&_[\%i]" }
- }
- Within a macro \&_[0], like \%0, contains the name of the macro.
- At top level, the \&_[] array is filled as follows:
- * If the first argument on the C-Kermit command line was a filename,
- or C-Kermit was invoked from a "Kerbang" script (Section
- 7.19), element 0 contains the filename, and elements 1 through
- \v(argc)-1 hold the remaining command-line arguments.
- * Otherwise the program name goes in element 0, and elements 1
- through \v(argc)-1 hold any arguments that were included after "--"
- or "="
- The new \%* variable, when used within a macro, is replaced by the text
- that followed the macro name in the macro invocation. If no arguments
- were given, \%* is replaced by the empty string. Examples:
- C-Kermit> define xx echo [\%*]
- C-Kermit> define \%a oofa
- C-Kermit> xx
- []
- C-Kermit> xx \%a
- [oofa]
- C-Kermit> xx a
- [a]
- C-Kermit> xx a b
- [a b]
- C-Kermit> xx a b c
- [a b c]
- C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
- [a b c d e f g h i j k l m n o p q r s t u v w x y z]
- Note that \%* can not be used at top level, since Kermit does not have
- access to the raw command line (only to its elements separately, after
- they have been processed by the shell and the C library).
- C-Kermit 7.0 also adds a SHIFT command:
- SHIFT [ number ]
- Shifts the macro arguments (except argument 0) the given number
- of places to the left and adjusts \v(argc) accordingly. The
- default number is 1.
- To illustrate, suppose macro XXX is invoked as follows:
- xxx arg1 arg2 arg3
- Then inside XXX, \%1 is "arg1", \%2 is "arg2", and \%3 is "arg3". After
- a SHIFT command is given inside XXX, then \%1 is "arg2", \%2 is "arg3",
- and \%3 is empty. \%0 (the name of the macro) remains unchanged.
- If more than 9 arguments were given, then arguments are shifted into
- the \%1..9 variables from the argument vector array.
- At top level, the SHIFT command operates on the \&_[] array and \%1..9
- variables; the \&@[] array is not affected. See Section 7.16 for
- details.
- The \%* variable is not affected by the SHIFT command.
- 7.6. Clarification of Function Call Syntax
- Spaces are normally stripped from the front and back of each function
- argument; to prevent this enclose the argument in braces:
- \fsplit(\%a,&a,{ })
- However, function calls that contain spaces can make trouble when the
- function is to be used in a "word" field, since space separates words.
- For example:
- for \%i 1 \fsplit(\%a,&a,{ }) 1 {
- echo \%i. "\&a[\%i]"
- }
- In most cases, the trouble can be averted by enclosing the function
- reference in braces:
- for \%i 1 {\fsplit(\%a,&a,{ })} 1 {
- echo \%i. "\&a[\%i]"
- }
- or by replacing spaces with \32 (the ASCII code for space):
- for \%i 1 \fsplit(\%a,&a,\32) 1 {
- echo \%i. "\&a[\%i]"
- }
- Braces are also used in function calls to indicate grouping. For
- example:
- \fsubstring(abcd,2,2) = "bc"
- But suppose "abcd" needed to contain a comma:
- \fsubstring(ab,cd,2,2)
- This would cause an error, since "cd" appears to be the second
- argument, when really you want the first "2" to be the second argument.
- Braces to the rescue:
- \fsubstring({ab,cd},2,2) = "b,"
- Similarly, leading and trailing spaces are stripped from each argument,
- so:
- \fsubstring( abcd ,2,2) = "bc"
- but braces preserve them:
- \fsubstring({ abcd },2,2) = "ab"
- Given these special uses for braces, there is no way to pass literal
- braces to the function itself. For example:
- \fsubstring(ab{cd,2,2)
- causes an error.
- So if you need a function to include braces, define a variable
- containing the string that has braces. Example:
- define \%a ab{cd
- \fsubstring(\%a,2,2) = "b{"
- If the string is to start with a leading brace and end with a closing
- brace, then double braces must appear around the string (which itself
- is enclosed in braces):
- define \%a {{{foo}}}
- \fsubstring(\%a) = "{foo}"
- This also works for any other kind of string:
- define \%a {{ab{cd}}
- echo \fsubstring(\%a) = "ab{cd"
- 7.7. Autodownload during INPUT Command Execution
- As of 6.1 / 1.1.12, C-Kermit can be told to look for incoming Kermit
- (or Zmodem) packets during execution of an INPUT command. By default
- (for consistency with earlier releases), this is not done. You can
- enable this feature with:
- SET INPUT AUTODOWNLOAD ON
- (and disable it again with OFF.)
- One possible use for this feature is as a server mode with a time
- limit:
- INPUT 3600 secret-string-to-end-the-INPUT-command
- In this example, any GET, SEND, or REMOTE commands received within one
- hour (3600 seconds) of when the INPUT command was issued will be
- executed. Here's another example, in which we want to stay open until
- 11:30pm, or until interrupted by seven consecutive Ctrl-C (\3)
- characters:
- INPUT 23:30:00 \3\3\3\3\3\3\3
- The INPUT AUTODOWNLOAD setting is displayed by SHOW SCRIPTS or SHOW
- INPUT.
- 7.8. Built-in Help for Functions.
- Beginning in C-Kermit 7.0, you may obtain a description of the calling
- conventions and return values of any built-in function, such as
- \fsubstring(), with the new HELP FUNCTION command; give the function's
- name without the leading "\f", e.g. "help func substring". You can use
- ?, completion, and abbreviation in the normal manner.
- 7.9. Variable Assignments
- 7.9.1. Assignment Operators
- Programmers accustomed to languages such as C or Fortran might find
- Kermit's method of assigning values to variables unnatural or awkward.
- Beginning in C-Kermit 7.0, you can use the following alternative
- notation:
- .name = value is equivalent to DEFINE name value
- .name := value is equivalent to ASSIGN name value
- .name ::= value is equivalent to ASSIGN name \feval(value)
- When the command begins with a period (.), this indicates an
- assignment. The name can be a macro name, a \%{digit,letter} variable,
- or an array element. There can be space(s) between "." and the name.
- Examples:
- .\%a = This is a string ; Same as "define \%a This is a string"
- echo \%a
- This is a string
- .xxx = \%a ; Same as "define xxx \%a"
- echo \m(xxx)
- \%a
- .xxx := \%a ; Same as "assign xxx \%a"
- echo \m(xxx)
- This is a string
- declare \&a[2] ; Use with arrays...
- define \%i 2
- .\&a[1] = first
- .\&a[\%i] = second
- The following sequence illustrates the differences among three levels
- of evaluation:
- .\%x = 2 ; Define a variable to have a numeric value
- .\%y = (3 + \%x) ; Define another variable as an arithmetic expression
- .xxx = 4 * \%y ; "=" simply copies the right-hand side.
- echo \m(xxx)
- 4 * \%y
- .xxx := 4 * \%y ; ":=" evaluates the variables first, then copies.
- echo \m(xxx)
- 4 * (3 + 2)
- .xxx ::= 4 * \%y ; "::=" evaluates the expression, then copies.
- echo \m(xxx)
- 20
- You can also use this syntax to clear (undefine) a variable:
- .\%a = oofa ; Define the variable
- echo "\%a"
- "oofa"
- .\%a ; Clear the variable
- echo "\%a"
- ""
- Extra credit: Can you guess what happens below when the file "abc" does
- not exist?
- fopen /read \%c abc
- if fail ...
- 7.9.2. New Assignment Commands
- Recall the DEFINE and ASSIGN commands, and their hidden counterparts,
- _DEFINE and _ASSIGN. The former take the variable name literally, the
- latter evaluate the variable-name field to form the variable name
- dynamically. Examples:
- DEFINE \%x foo ; Sets the value of the variable \%x to "foo".
- DEFINE \%a \%x ; Sets the value of the variable \%a to "\%x".
- _DEFINE x_\%a \%x ; Sets the value of the variable x_foo to "\%x".
- ASSIGN \%a \%x ; Sets the value of the variable \%a to the "foo".
- _ASSIGN x_\%a \%x ; Sets the value of the variable x_foo to "foo".
- This concept has been carried over to the remaining variable-assignment
- commands: EVALUATE, INCREMENT, and DECREMENT:
- EVALUATE variablename expression
- Evaluates the arithmetic expression and assigns its value to the
- variable whose name is given. Example: "eval \%a 1+1" assigns
- "2" to \%a.
- _EVALUATE metaname expression
- Evaluates the arithmetic expression and assigns its value to the
- variable whose name is computed from the given metaname.
- Example: "eval foo<\%a>::\%1 \%2 * (\%3 + \%4)" assigns the
- value of "\%2 * (\%3 + \%4)" to the variable whose name is
- computed from "foo<\%a>::\%1".
- INCREMENT variablename [ expression ]
- Evaluates the arithmetic expression and adds its value to the
- value of the variable whose name is given. Example: "increment
- \%a".
- _INCREMENT metaname [ expression ]
- Evaluates the arithmetic expression and adds its value to the
- value of the variable whose name is computed from the given
- metaname. Example: "_increment Words::\%1.count[\%2]".
- DECREMENT variablename [ expression ]
- Evaluates the arithmetic expression and subtracts its value from
- the value of the variable whose name is given.
- _DECREMENT metaname [ expression ]
- Evaluates the arithmetic expression and subtracts its value from
- the value of the variable whose name is computed from the given
- metaname.
- WARNING: The syntax of the EVALUATE command has changed since C-Kermit
- 6.0 and K95 1.1.17. Previously, it did not include a variable name,
- only an expression. To restore the old behavior, use SET EVALUATE OLD.
- To return to the new behavior after restoring the old behavior, use SET
- EVALUATE NEW.
- NOTE: There are no analogs to the "_" commands for the operators
- described in Section 7.9.1; those operators can not be used to
- assign values to variables whose names must be computed.
- 7.10. Arrays
- C-Kermit 7.0 adds lots of new array-related features, and groups them
- together under the NEW ARRAY command:
- ARRAY { CLEAR, COPY, DECLARE, DESTROY, RESIZE, SHOW, SORT }
- In each of the ARRAY commands, wherever an array name is expected,
- "short forms" may be used. For example, all of the following are
- acceptable:
- array show \&a[] (or SHOW ARRAY...)
- array show &a[]
- array show a[]
- array show &a
- array show a
- In addition, ranges are accepted in the ARRAY COPY, ARRAY CLEAR, ARRAY
- SET, ARRAY SHOW, and ARRAY SORT commands:
- array clear \&a[16] ; Clears 16 thru end
- array clear &a[16] ; Ditto
- array clear a[16] ; Ditto
- array clear \&a[16:32] ; Clears 16 thru 32
- array clear &a[16:32] ; Ditto
- array clear a[16:32] ; Ditto
- When using array names as function arguments, you must omit the "\" and
- you must include the "&". You may optionally include empty brackets.
- Examples:
- \fsplit(\%a,a) ; Bad
- \fsplit(\%a,\&a) ; Bad
- \fsplit(\%a,&a[3]) ; Bad
- \fsplit(\%a,&a) ; Good
- \fsplit(\%a,&a[]) ; Good
- 7.10.1. Array Initializers
- Beginning in C-Kermit 7.0, you may initialize an array -- in whole or
- in part -- in its declaration:
- [ ARRAY ] DECLARE array-name[size] [ = ] [ value1 [ value2 [...] ] ]
- For compatibility with versions 5A and 6.0, the ARRAY keyword is
- optional. DECLARE can also be spelled DCL.
- Initializers are (a) optional, (b) start with element 1, (c) must be
- enclosed in braces if they contain spaces, and (d) are evaluated
- according to normal rules by the DECLARE command prior to assignment.
- Thus the assignments made here are the same as those made by the ASSIGN
- command. This allows you to initialize array elements from the values
- of other variables. If you actually want to initialize an array element
- to variable's name, as opposed to its value, use double backslashes (as
- in "\\&a", "\\v(time)", etc).
- The size (dimension) of the array is optional. If the size is omitted,
- as in "\&a[]", then the array sizes itself to the number of
- initializers; if there are no initializers the array is not declared
- or, if it was declared previously, it is destroyed. If a size is given,
- any extra elements in the initialization list are discarded and
- ignored.
- NOTE: Unlike in C, the list of initializers is NOT enclosed in braces.
- Instead, braces are used to group multiple words together. So:
- ARRAY DECLARE \&a[] = { one two three }
- would create an array with two elements (0 and 1), with element 1
- having the value " one two three ".
- Examples:
- ARRAY DECLARE \&a[16]
- Declares the array \&a with 17 elements (0 through 16), in which
- all elements are initially empty. If the array \&a[] existed
- before, the earlier copy is destroyed.
- ARRAY DECLARE &a[16]
- ARRAY DECLARE a[16]
- ARRAY DCL \&a[16]
- ARRAY DCL &a[16]
- ARRAY DCL a[16]
- DECLARE \&a[16]
- DECLARE &a[16]
- DECLARE a[16]
- DCL \&a[16]
- DCL &a[16]
- DCL a[16]
- All of the above are the same as the first example.
- ARRAY DECLARE \&a[16] = alpha beta {gamma delta}
- Declares the array \&a with 17 elements (0 through 16),
- initializing \&a[1] to "alpha", \&a[2] to "beta", and \&a[3] to
- "gamma delta". The remaining elements are empty.
- ARRAY DECLARE \&a[] = alpha beta {gamma delta}
- Same as the previous example, but the array is automatically
- dimensioned to 3.
- ARRAY DECLARE \&a[3] = alpha beta {gamma delta} epsilon zeta
- Too many initializers; only the first three are kept.
- ARRAY DECLARE \&a[0]
- ARRAY DECLARE \&a[]
- ARRAY DECLARE &a[]
- ARRAY DECLARE &a
- ARRAY DECLARE a
- DECLARE \&[0]
- DECLARE a
- DCL a
- All of these are equivalent. Each destroys \&a[] if it exists.
- Declaring an array with a dimension of 0 is the same as ARRAY
- DESTROY arrayname.
- ARRAY DECLARE \&a[] = \%1 \%2 \%3
- Declares the array \&a with 3 elements (0 through 3),
- initializing \&a[1] to the value of \%1, \&a[2] to the value of
- \%2, and \&a[3] to the value of \%3. In this case, any reference
- to one of these array elements is replaced by the value of the
- corresponding \%n variable at the time the declaration was
- executed (immediate evaluation; the array element's value does
- not change if the initializer variable's value changes).
- ARRAY DECLARE \&a[] = \\%1 \\%2 \\%3
- Declares the array \&a with 3 elements (0 through 3),
- initializing \&a[1] to the string "\%1", \&a[2] to "\%2", and
- \&a[3] to "\%3". In this case any reference to one of these
- array elements is replaced by the CURRENT value of the
- corresponding \%n variable (deferred evaluation -- the array
- element's value follows the value of the initializer variable).
- The equal sign (=) preceding the initializer list is optional, but is
- recommended for clarity. If you need to initialize element 1 to a
- literal equal sign, use two of them, separated by a space, as in this
- example:
- ARRAY DECLARE \&a[] = = + - * /
- Remember, element 0 is not initialized by the DECLARE command. To
- initialize element 0, use a regular DEFINE or ASSIGN command:
- ARRAY DECLARE \&a[] one two three four five six seven eight nine
- DEFINE \&a[0] zero
- Finally, remember that every command level has its own local array,
- \&_[], containing all the macro arguments (\%0, \%1, ...) for that
- level. See Section 7.5 for details.
- 7.10.2. Turning a String into an Array of Words
- The \fsplit(s1,&a,s2,s3) function assigns the words of string s1 to
- successive elements of the array (beginning with element 1) whose
- identifying letter, a-z, is given after the "&" in the second argument,
- using break and include characters given in s2 and s3. SeeSection
- 7.3 for details.
- 7.10.3. Arrays of Filenames
- See Section 4.11.3 for news about how \ffiles() and related
- functions can assign a list of filenames to an array. To recapitulate
- briefly here:
- \ffiles(*,&a)
- assigns all files that match the first argument to the array denoted by
- the second argument. If the array has not been declared, it is declared
- automatically, with exactly the number of elements needed to hold the
- file list; if it was previously declared, it is destroyed and reused.
- The filenames are assigned starting at array element 1. Element 0 holds
- the number of files in the list.
- The DIRECTORY command ( Section 4.5.1) can also create filename
- arrays if you give it the /ARRAY: switch; this allows selection
- criteria beyond whether the filename matches the given pattern.
- All functions and commands that create filename arrays store the number
- of filenames, n, as element 0 of the array, and the filenames as
- elements 1 through n.
- 7.10.4. Automatic Arrays
- In a command file or macro, you can now have local (automatic) arrays.
- Just give the name followed by empty subscript brackets (no spaces
- inside the brackets please) in a LOCAL command, and then declare the
- array:
- LOCAL \%a \&a[] oofa
- ARRAY DECLARE \&a[32] = value1 value2 value3 ...
- This declares the scalar variable \%a, the array \&a[], and the macro
- name "oofa" to be local, and then declares the new local copy of \&a[]
- with 32 elements, perhaps assigning some initial values. When C-Kermit
- exits from the command file or macro containing these command, the
- previous \&a[] array is restored (and if there was no \&a[] at any
- higher level, this will still be true). The process can be repeated to
- any level. Thus it is now safe to write scripts or macros containing
- arrays without danger of interfering with global arrays of the same
- name.
- Just as scalars are inherited by lower command levels, so are arrays.
- So, for example, if \&a[] is declared at top level, all lower levels
- will see it unless they include a "local \&a[]" statement, in which
- case all levels at and beneath the level where the LOCAL statement was
- executed will see the local copy. This too can be repeated to any
- level.
- On the other hand, if you DECLARE an array at a lower command level
- without also making it LOCAL, this replaces the copy that was declared
- at the lowest command level above this one.
- 7.10.5. Sorting Arrays
- Although arrays can be sorted using FOR loops as shown on page 383 of
- Using C-Kermit, 2nd Ed., this involves quite a bit of repetitive
- interpretation by the command parser, and so can be slow for large
- arrays. For this reason, C-Kermit 7.0 adds a built-in SORT command:
- ARRAY SORT [ switches ] array [ array2 ]
- Sorts the given array in place. Sorting is strictly lexical
- (string based). The array name can be given fully, e.g. "\&a[]",
- or the "\" and/or "&" and/or brackets can be omitted, e.g.
- "array sort \&a[]", "sort &a", "sort a". Also, a range can be
- indicated in the brackets as noted in Section 7.10, to
- restrict the sort to a range of elements (equivalent to the
- /RANGE switch, described just below), e.g. "array sort
- &a[20:30]".
- A second array may be specified. If it is, and if it is at least as big
- as the first array, it is sorted according to the first array. For a
- sample application, see Section 7.10.10.
- See Section 1.5 for an explanation of switches. The optional
- switches are:
- /CASE:{ON,OFF}
- /CASE:ON means that alphabetic case is significant in
- comparisons; uppercase letters are sorted before lowercase ones.
- /CASE:OFF means case is ignored, e.g. "A" is the same as "a". If
- this switch is not given, sorting is according the current SET
- CASE setting.
- /KEY:n
- Comparison begins at position n(1-based) in each string. If no
- key is given, the entire strings are compared. Only one key can
- be given. If an array element is shorter than the key value, n,
- that element is considered empty for comparison purposes, and
- therefore lexically less than any element at least ncharacters
- long.
- /NUMERIC
- If this switch is included, it means sorting should be numeric,
- rather than lexical. The sort key is the string starting at the
- key position, skipping any leading blanks or tabs, and then as
- much of the string from that point on that fits the definition
- of "numeric", terminating at the first character that does not
- qualify. A numeric string has an optional sign (+ or -) followed
- by one or more digits, and (if your version of Kermit was built
- with floating-point support; see Section 7.23 ) zero or one
- decimal point (period). If both /CASE and /NUMERIC are given,
- /NUMERIC takes precedence.
- /RANGE:n[:m]
- Sort elements nthrough m of the array. By default, the entire
- array from element 1 to its dimensioned size is sorted, which
- might produce surprising results if the array is not full; see
- example in Section 7.10.7. If ":m" is omitted from the
- range, the dimensioned size is used. Thus, to sort an entire
- array, \&a[], including its 0th element, use "sort /range:0 &a".
- You can also sort any desired section of an array, e.g. "sort
- /range:10:20 &a" or "sort /range:\%i:\%j-1 &b". As noted above,
- you can also specify a range in the array-name brackets. If you
- specify a range in the array-name brackets AND with a /RANGE
- switch, the ones in the brackets take precedence.
- /REVERSE
- Sort in reverse order. If this switch is not given, the array is
- sorted in ascending order.
- Remember that numeric switch arguments can be numbers, arithmetic
- expressions, or variables whose values are numbers or expressions, as
- illustrated in the /RANGE examples above.
- A typical sorting application might be to list students' test scores in
- descending order. Suppose you had the following records:
- olaf 65
- olga 98
- ivan 83
- xena 100
- (and so on) stored in array \&s[] (e.g. by reading them from a file as
- illustrated insection 7.10.7). In these records, the student's
- name is in columns 1-9 and the score in 10-12. So to rearrange the list
- in descending order of score:
- sort /key:10 /reverse &s
- Then to list your top five students:
- for \%i 1 5 1 { echo \&s[\%i] }
- Or more simply (see next section):
- show array a[1:5]
- To illustrate the difference between a lexical and a numeric sort,
- suppose you have the following records (the lines that are numbered,
- starting at column 1) in array \&a[]:
- Column 1 2
- 12345678901234567890
- 1. Ivan 10.0 2. Olaf 9.95 3. Olga 101.5
- ARRAY SORT /KEY:10 &a[] would order them 3,1,2, but ARRAY SORT /KEY:10
- /NUMERIC &a[] would order them 2,1,3.
- 7.10.6. Displaying Arrays
- The SHOW ARRAY command (or ARRAY SHOW) now accepts an optional
- array-name argument:
- SHOW ARRAY \&a[]
- (you can leave off the \, the \&, and/or the []'s if you like; "show
- array a" is equivalent to "show array \&a[]"). When an array is
- specified, its dimension is shown and all defined (non-empty) elements
- are listed.
- Example:
- assign \%n \ffiles(*,&a) ; Fill an array with filenames ( Section 4.11.3)
- show array \&a[] ; Show the array we just read
- array show \&a[] ; Same as previous
- array sort \&a[] ; Sort the array
- array show \&a[] ; Show it after sorting
- array show \&a ; Show it again
- array show &a ; Show it again
- array show a ; Show it again
- (The final four commands demonstrate the alternative forms that are
- accepted for the array name.)
- If you SHOW ARRAY without giving an array name, all defined arrays are
- listed by name and dimension, but their contents are not shown.
- You can also show a piece of an array by including a subscript or range
- within the array brackets:
- array show \&a[5] ; Shows \&a[5]
- array show &a[3:8] ; Shows \&a[3] through \&a[8]
- array show a[:\%n-1] ; Shows \&a[0] through \&a[\%n-1]
- 7.10.7. Other Array Operations
- ARRAY DESTROY arrayname
- Destroys and undeclares the named array. Subscripts or ranges
- are not accepted in this command.
- ARRAY COPY array1 array2
- Copies the first array to the second array. If the target array
- has not been declared, it is created automatically with the same
- size as the first. If it has been declared, it will be used as
- declared; if the source array is larger, only as much of it as
- will fit is copied to the target array. Syntax for array1 and
- array2 is as in ARRAY SHOW (SHOW ARRAY). Example:
- .\%n := \ffiles(*,&a) ; Create and load array A with a file list.
- array copy &a &b ; Copy array A to array B.
- The ARRAY COPY command also lets you copy pieces of arrays by
- including range specifiers, as in these examples:
- ARRAY COPY \&a[4:27] \&b
- This copies \&a[] elements 4-27 to \&b[] elements 1-23,
- creating \&b[] if necessary or, if \&b[] is already
- declared, stopping early if its size is less than 23.
- ARRAY COPY \&a[4:27] \&b[12]
- This copies \&a[] elements 4-27 to \&b[] elements 12-35,
- creating \&b[] if necessary or, if \&b[] is already
- declared, stopping early if its size is less than 35.
- ARRAY COPY \&a[4:27] \&b[12:14]
- This copies \&a[] elements 4-6 to \&b[] elements 12-14,
- creating \&b[] if necessary or, if \&b[] is already
- declared, stopping early if its size is less than 14.
- ARRAY COPY \&a[17:] \&b
- This copies all the elements of \&a[] starting with 17
- until the last to \&b[], creating \&b[] if necessary or,
- if \&b[] is already declared, stopping early if \&b[] is
- not big enough. Suppose, for example, you have a script
- whose arguments are string1, string2, and a list of files,
- whose job is to change all occurrences of string1 to
- string2 in each of the files. But if the list of files is
- omitted, then "*" (all files in the current directory) is
- assumed:
- if < \v(argc) 3 exit 1 "Usage: \%0 string1 string2 [ files ]"
- if not def \%3 {
- .n := \ffiles(*,&a)
- } else {
- array copy &_[3:] &a
- .n := \fdim(&a)
- }
- for i 1 n 1 {
- ! cat \&a[i] | sed -e "s|\%1|\%2|g" > /tmp/_x
- rename /tmp/_x \&a[i]
- }
- ARRAY COPY \&a[17] \&b
- Same as previous example.
- ARRAY CLEAR arrayname
- Sets all the elements of the array to the empty value. You may
- also include a range specifier to clear only a selected portion
- of the array; for example "array clear \&a[37:214]". If the
- range is out of bounds, only the part of the array that is in
- bounds is cleared.
- ARRAY SET arrayname [ value ]
- Sets all the elements of the array to the given value. If no
- value is given, the array is cleared. You may also include a
- range specifier to set only a selected portion of the array; for
- example "array set \&a[1:9] -1". If the range is out of bounds,
- only the part of the array that is in bounds is set.
- ARRAY RESIZE arrayname size
- Resizes the given array. If the size is greater than the array's
- current dimension, new empty elements are added to the end. If
- the size is less than the current dimension, the extra elements
- are discarded. Note: If you have stored the array size in
- element 0, ARRAY RESIZE does not change this value. Alternative
- notation: ARRAY RESIZE arrayname[size]. For a practical example,
- see Section 7.10.11.
- \farraylook(pattern,arrayname)
- This function returns the index of the first element of the
- given array that matches the given pattern (for details about
- pattern syntax, seesection 4.9). The array name can
- include a range specification to restrict the search to a given
- segment of the array. If no elements match the pattern, -1 is
- returned.
- \ftablelook(keyword,arrayname[,delimiter])
- Looks in the given "table", which must be sorted, for the given
- keyword. The keyword need not be spelled out in full.
- Pattern-matching characters should not be included as part of
- the keyword. The function returns the index of the table element
- that uniquely matches the given keyword, or -1 if none match, or
- -2 if more than 1 match.
- A "table" is an array that is sorted in lexical order; each of its
- elements may contain multiple fields, delimited by the given delimiter
- character or, if no delimiter is specified, a colon (:).
- The \farraylook() function does exactly what you tell it. If you give
- it a pattern that does not include wildcard characters (such as *, ?,
- etc), it requires an exact match. For example:
- \farraylook(oofa,&a)
- searches for the first element of \&a[] whose value is "oofa". But:
- \farraylook(oofa*,&a)
- finds the first element whose value starts with "oofa", and;
- \farraylook(*oofa,&a)
- finds the first element whose value ends with "oofa", and;
- \farraylook(*oofa*,&a)
- finds the first element whose value contains "oofa".
- Here's a simple demonstration of looking up patterns in arrays:
- local \&a[] \%x \%n
- declare \&a[] = zero one two three four five six seven eight nine ten
- while true {
- .\%x = 1
- .\%n = 0
- ask \%a { Pattern? }
- if not def \%a exit 0 Done.
- while <= \%x \fdim(&a) {
- .\%x := \farraylook(\%a,&a[\%x])
- if ( < \%x 0 ) break
- echo \flpad(\%x,3). \&a[\%x]
- increment \%x
- increment \%n
- }
- if ( < \%n 1 ) echo Pattern not found - "\%a"
- }
- The array need not be sorted. When a pattern is given, a search is
- performed; if there is a match, the matching element's index and the
- element itself are printed, and the search begins again at the next
- element. Thus each matching element is printed. If none match, the
- "Pattern not found" message is printed. The process repeats for as many
- patterns as the user wants to type, and terminates when the user types
- an empty pattern.
- Now let's build a little command parser, consisting of a keyword table,
- and a loop to look up the user's commands in it with \ftablelook(). In
- this case the array elements have "fields" separated by colon (:) -- a
- keyword and a value. Keyword tables must be sorted if \tablelook() is
- to work right, so after declaring and initializing the table array, we
- sort it.
- local \&k[] \%a \%i \%n
- array declare \&k[] = drive:9 do:8 discuss:7 live:6 spend:5 help:4 quit:0
- array sort &k ; Make sure array is sorted
- echo Type "help" for help. ; Print greeting & instructions
- while true { ; Loop to get commands
- undefine \%a
- while not defined \%a { ; Get a command
- ask \%a { Command? }
- }
- .\%n := \ftablelook(\%a,&k) ; Look up the command
- switch \%n { ; Handle errors
- :-1, echo Not found - "\%a" ; Doesn't match
- continue
- :-2, echo Ambiguous - "\%a" ; Matches too many
- continue
- }
- switch \fword(\&k[\%n],2) { ; Dispatch according to value
- :9, echo Driving..., break
- :8, echo Doing..., break
- :7, echo Discussing..., break
- :6, echo Living..., break
- :5, echo Spending..., break
- :4, echo { Commands (may be abbreviated):}
- for \%i 1 \fdim(&k) 1 {
- echo { \%i. \fword(\&k[\%i],1) }
- }
- break
- :0, exit 0 Bye!
- :default, stop 1 Internal error
- }
- }
- In this example, keywords are "drive", "do", "discuss", etc, and their
- values are unique numbers (values need not be numbers, and there need
- not be only one value -- there can be 0, 1, 2, or more of them). The
- user types a command, which can be the whole word (like "help") or any
- abbreviation (like "hel", "he", or just "h"). If this does not match
- any keywords, \ftablelook() returns -1; if it matches more than one (as
- would "d"), it returns -2. Otherwise the array index is returned, 1 or
- higher.
- Given the array index \%n, we can get the table values as follows:
- \fword(\&k[\%n],1) is the keyword (first field)
- \fword(\&k[\%n],2) is the value (second field, in this case a number)
- In our example, we use the value (number) as the SWITCH variable. As
- noted, \fablelook() expects the array elements to contain multiple
- fields separated by colon (:) (or other character that you specify,
- e.g. \ftablelook(\%a,&a,^)) and when matching the keyword, ignores the
- first delimiter and everything after it.
- 7.10.8. Hints for Using Arrays
- C programmers are accustomed to out-of-bounds array references causing
- core dumps or worse. In C-Kermit:
- * A reference to an an out-of-bounds array element returns the empty
- string.
- * An attempt to set the value of an array element that is out of
- bounds or that has not been declared simply fails.
- C programmers expect an array of size n to have elements 0 through n-1.
- Fortran programmers expect the same array to have elements 1 through n.
- C-Kermit accommodates both styles; when you declare an array of size n,
- it has n+1 elements, 0 through n, and you can use the array in your
- accustomed manner, 0-based or 1-based.
- However, note that C-Kermit has certain biases towards 1-based arrays:
- * Assignment of file lists starts with element 1 (Section
- 7.10.3).
- * Assignment by \fsplit() starts with element 1 ( Section 7.3).
- * Array initialization skips the 0th element. To initialize a 0-based
- array, use something like this:
- declare \&a[3] = one two three
- .\&a[0] = zero
- * The ARRAY SORT command skips the 0th element unless you include
- /RANGE:0
- * The SHIFT command ignores element 0 of the \&_[] array.
- The distinction between an array's dimensioned size and the number of
- elements in the array is important when sorting. To illustrate:
- declare \&a[100] ; Declare array &a with 100 elements
- fopen /read \%c oofa.txt ; Open a file
- if fail...
- for \%i 1 \fdim(&a) 1 { ; Read the file into the array
- fread \%c \&a[\%i]
- if fail break
- }
- fclose \%c
- if > \%i \fdim(&a) end 1 File has too many lines for array.
- .\%n ::= \%i - 1
- echo File has \%n line(s).
- Let's say the file had 95 lines. This leaves elements 96-100 of the
- array empty. Now suppose you sort the array and write out the result:
- sort &a ; Sort the whole array
- fopen /write \%o oofa.txt.sorted ; Open an output file
- if fail ...
- for \%i 1 \%n 1 { ; Write out 95 records
- fwrite /line \%o \&a[\%i]
- if fail end 1 Write error
- }
- close write
- You might be surprised at the contents of "oofa.txt.sorted" -- five
- empty elements, 96-100, floated to the top of the array in the sort,
- and since your write loop only had 95 iterations, the final 5 lines of
- the sorted file are lost.
- Therefore, when dealing with partially filled arrays -- especially when
- sorting them -- remember to specify the number of elements. A handy way
- of recording an array's "true" size is to put it in the 0th element.
- That way, it "travels with the array". To illustrate (continuing the
- previous example at the "close read" statement):
- close read
- if > \%i \fdim(&a) end 1 File has too many lines for array.
- .\&a[0] ::= \%i - 1 ; Assign number of lines to \&a[0].
- echo File has \&a[0] line(s).
- sort /range:1:\&a[0] &a
- open write oofa.txt.sorted
- if fail ...
- for \%i 1 \&a[0] 1 {
- writeln file \&a[\%j]
- if fail end 1 Write error
- }
- close write
- Note the SORT switch, /RANGE:1:\&a[0]. This keeps the sort 1-based, and
- uses element 0 of the array as its size indicator.
- Finally, note that even though some commands or functions might put a
- size in array element 0, no built-in functions or commands depend on a
- size actually being there. Thus you are perfectly free to replace the
- size with something else and treat the array as 0-based.
- 7.10.9. Do-It-Yourself Arrays
- Kermit's \&x[] arrays are nice because of the accompanying built-in
- functionality -- ARRAY commands, built-in functions that load and
- search arrays, automatic evaluation of arithmetic expressions within
- the subscript brackets, and so on. Yet they also have certain
- limitations:
- 1. Except when created by dynamic loading (e.g. by \ffiles()) they
- must be declared and dimensioned in advance.
- 2. Indices must be numeric, positive, and in range.
- 3. There can be only one dimension. Matrices or other
- higher-dimensioned arrays are not available.
- But none of this is to say you can't invent any kind of data structure
- you like. In Section 7.9.2 you can see some examples. Here's
- another (courtesy of Dat Thuc Nguyen), in which a pair of matrices is
- created and then added: no dimensioning necessary.
- .row = 4
- .col = 9
- ; MACRO TO PRINT A MATRIX
- define PMATRIX {
- echo Matrix \%1:
- for \%r 1 \m(row) 1 {
- for \%c 1 \m(col) 1 {
- xecho \flpad(\m(\%1[\%r][\%c]),4)
- }
- echo
- }
- echo
- }
- ; CREATE MATRICES A AND B
- for \%r 1 \m(row) 1 {
- for \%c 1 \m(col) 1 {
- _eval A[\%r][\%c] \%r + \%c
- _eval B[\%r][\%c] \%r * \%c
- }
- }
- ; CREATE MATRIX C = SUM OF MATRIX A AND MATRIX B
- for \%r 1 \m(row) 1 {
- for \%c 1 \m(col) 1 {
- _eval C[\%r][\%c] \m(A[\%r][\%c]) + \m(B[\%r][\%c])
- }
- }
- pmatrix A ; Print Matrix A
- pmatrix B ; Print Matrix B
- pmatrix C ; Print Matrix C
- In the example, we use matrix-like notation to create macros with names
- like "A[1][1]", "B[3][7]", and so on.
- 7.10.10. Associative Arrays
- An associative array is a special kind of Do-It-Yourself array. It
- differs from a regular array in that its indices need not be numbers --
- they can be anything at all -- words, filenames, names of months, any
- character string at all, and that it doesn't have to be (and in fact
- can't be) declared. An associative array element is simply a macro
- whose name ends with an index enclosed in angle brackets, for example:
- file<oofa.txt>
- More formally:
- basename<index>
- An associative array is a collection of all associative array elements
- that have the same basename. Any number of associative arrays, each
- with any number of elements, can exist at the same time.
- An associative array element can be assigned a value, such as "1", just
- like any other macro:
- define file<oofa.txt> 1 ; Give "file<oofa.txt>" the value "1".
- or:
- assign file<oofa.txt> \%a ; Give it the value of the variable \%a.
- However, since an associative array element is a macro, it may not have
- an empty (null) value, since assigning an empty value to a macro
- undefines the macro.
- You can refer to the value of an associative array element using the
- familiar notation for macro values:
- echo \m(file<oofa.txt>) ; Echo the value of "file<oofa.txt>".
- Associative arrays are most useful, however, when the value of the
- index is a variable. In that case, you must use the "hidden" forms of
- the DEFINE or ASSIGN commands that evaluate the macro name before
- making the assignment (seeUsing C-Kermit, page 457). Example:
- define \%f oofa.txt
- _define file<\%f> 1
- echo file<\%f> = \m(file<\%f>)
- prints:
- file<oofa.txt> = 1
- and then:
- _increment file<\%f>
- echo file<\%f> = \m(file<\%f>)
- prints:
- file<oofa.txt> = 2
- What are associative arrays good for? The classic example is "word
- counts": finding the number of times each word is used in a text
- without knowing in advance what the words are. Without associative
- arrays, your program would have to build a table of some kind, and
- every time a word was encountered, look it up in the table to find its
- position and counter, or add it to the table if it wasn't found -- a
- time-consuming and laborious process. Associative arrays, however, let
- you use the word itself as the table index and therefore sidestep all
- the table building and lookups.
- Let's work through a practical example. Suppose you have a
- file-transfer log in which each line is composed of a number of
- blank-separated fields, and the 9th field is a filename (which happens
- to be the format of certain FTP server logs, as well as of C-Kermit's
- new FTP-format transaction log, described in Section 4.17.2), for
- example:
- Wed Jul 14 09:35:31 1999 22 xx.mit.edu 13412 /pub/ftp/mm/intro.txt ....
- and you want to find out how many times each file was transferred. The
- following code builds an associative array, file<>, containing the
- counts for each file:
- local name line max \%c \%n ; Declare local variables
- fopen /read \%c /var/log/ftpd.log ; Open the log file ( Section 1.22)
- if fail exit 1 Can't open log ; Check
- while true { ; Loop for each record
- fread /line \%c line ; Read a line
- if fail break ; Check for end of file
- .name := \fword(\m(line),9,{ }) ; Get 9th field = filename (Sec 7.3)
- _increment file<\m(name)> ; Increment its counter (Sec 7.9.2)
- }
- fclose \%c ; Close file when done.
- Note that _INCREMENT (and INCREMENT, and [_]DECREMENT) treat an empty
- (i.e. nonexistent) variable as having a value of 0, and therefore
- creates the variable with a value of 1.
- At this point, if you told Kermit to "show macro file<", it would list
- the associative array. But since you don't necessarily know the names
- of the files in the array, or even how many elements are in the array,
- how can you use it in a script program?
- The idea of creating macro names that include character-string indices
- enclosed in angle brackets is perfectly arbitrary and doesn't depend on
- any Kermit features that weren't already there -- we could just as
- easily have used some other notation, such as "file[index]",
- "file:index", or "file.index", and the code above would have worked
- just as well (with the corresponding syntax adjustments). But to be
- able to use an associative array in a program after the array is built,
- we need a method of accessing all its elements without knowing in
- advance what they are. That's where the chosen notation comes in.
- First of all, any macro name that ends with "<xxx>" (where "xxx" is any
- string) is case sensitive, unlike all other macro names, which are case
- independent. To illustrate, "file<oofa.txt>" and "file<OOFA.TXT>" are
- two distinct macros, whereas "OOFA", "Oofa", and "oofa", when used as
- macro names, are all the same.
- Second, the new \faaconvert() function converts an associative array
- (that is, all macros with names of the form "base<index>" that have the
- same "base" part) into a pair of regular arrays and returns the number
- of elements:
- \faaconvert(name,&a[,&b])
- "name" is the name of the associative array, without the angle brackets
- or index ("file" in our example).
- The second argument is the name of a regular array in which to store
- the indices of the associative array (filenames in our example); if an
- array of this name already exists, it is destroyed unless the array is
- LOCAL. The third argument is the name of another regular array in which
- to store the values (the counts in our example), with the same rules
- about array name collisions. If you care only about the indices and not
- the values, you can omit the third argument to \faaconvert(). In any
- case, the associative array is converted, not copied: its elements are
- moved to the specified regular arrays, so after conversion the original
- associative array is gone.
- As with other array-loading functions, \faaconvert() sets element 0 of
- each array to the number of elements in the array.
- To continue our example:
- .max := 0 ; Maximum count
- .\%n := \faaconvert(file,&a,&b) ; Convert
- for \%i 1 \%n 1 { ; Loop through values
- echo \flpad(\%i,3). \&a[\%i]: \&b[\%i] ; Echo this pair
- if ( > \&b[\%i] \m(max) ) { ; Check for new maximum
- .name := \&a[\%i]
- .max := \&b[\%i]
- }
- }
- echo Most popular file: \m(name), accesses: \m(max)
- This lists the files and counts and then announces which file has the
- highest count.
- Now suppose you want to sort the array pair created from an associative
- array. In our example, \&a[] contains filenames, and \&b[] contains the
- associated counts. Here we take advantage of the ARRAY SORT command's
- ability to sort a second array according to the first one:
- array sort /reverse /numeric &b &a ; Descending sort by count
- Now to see the top five files and their counts:
- echo The top 5 files are:
- for \%i 1 5 1 { ; Loop through top 5 values
- echo \flpad(\%i,3). \&a[\%i]: \&b[\%i] ; Echo this pair
- }
- 7.10.11. Transferring Array Contents to Other Computers
- The SEND /ARRAY:arrayname command ( Section 4.7.1) allows you to
- send the contents of any array, or any contiguous segment of it, in
- either text or binary mode to another computer, using Kermit protocol.
- When used in conjunction with C-Kermit's other features (the array
- features described in this section; the file i/o package from
- Section 1.22; its decision-making, pattern-matching, and string
- manipulation capabilities, and so on) the possibilities are endless:
- extracts of large files, remote database queries, ..., all without
- recourse to system-dependent mechanisms such UNIX pipes and filters,
- thus ensuring cross-platform portability of scripts that use these
- features.
- When sending an array in text mode, Kermit appends a line terminator to
- each array element, even empty ones, and it also converts the character
- set from your current FILE character-set to your current TRANSFER
- character-set, if any. No conversions are made or line terminations
- added in binary mode. For example, the following array:
- dcl \&a[] = One Two Three Four Five Six
- is sent as six lines, one word per line, in text mode, and as the bare
- unterminated string "OneTwoThreeFourFiveSix" in binary mode.
- You should always include a /TEXT or /BINARY switch in any SEND /ARRAY
- command to force the desired transfer mode, otherwise you're likely to
- be surprised by the effects described in Section 4.3.
- Here are some examples:
- send /text /array:\&a[]
- Sends the entire contents of the array \&a[] in text mode. Since
- an as-name is not included, the receiver is told the filename is
- _array_a_.
- send /text /array:&a[]
- send /text /array:a[]
- send /text /array:&a
- send /text /array:a
- These are all equivalent to the previous example.
- send /text /array:&a /as-name:foo.bar
- As above, but the array is sent under the name foo.bar.
- send /text /array:&a[100:199] /as:foo.bar
- As above, but only the elements from 100 through 199 are sent.
- In text-mode transfers, character sets are translated according to your
- current settings, just as for text files. In binary mode, of course,
- there is no character-set translation or other conversion of any kind.
- But remember that array elements can not contain the NUL (ASCII 0)
- character, since they are implemented as NUL-terminated strings.
- Here's an example that shows how to send all the lines (up to 1000 of
- them) from a file animals.txt that contain the words "cat", "dog", or
- "hog" (see Section 4.9 about pattern matching):
- declare \&a[1000]
- fopen /read \%c animals.txt
- if fail exit 1
- .\%i = 0
- while true {
- fread \%c line
- if fail break
- if match {\m(line)} {*{cat,[dh]og}*} {
- increment \%i
- if ( > \%i \fdim(&a) ) break
- .\&a[\%i] := \m(line)
- }
- }
- fclose \%c
- send /array:a[1:\%i] /text
- Note that we are careful to send only the part of the array that was
- filled, not the entire array, because there are likely to be lots of
- unused elements at the end, and these would be sent as blank lines
- otherwise.
- This example raises an interesting question: what if we want to send
- ALL the matching lines, even if there are more than 1000 of them, but
- we don't know the number in advance? Clearly the problem is limited by
- Kermit's (and the computer's) memory. If there are a thousand trillion
- matching lines, they most likely will not fit in memory, and in this
- case the only solution is to write them first to a temporary file on
- mass storage and then send the temporary file and delete it afterwards.
- However, when the selection is likely to fit in memory, the
- once-familiar technique of initial allocation with extents can be used:
- if match {\m(line)} {*{cat,[dh]og}*} {
- increment \%i
- if ( > \%i \fdim(&a) ) {
- array resize a \fdim(&a)+100
- if fail stop 1 MEMORY FULL
- echo NEW DIMENSION: \fdim(&a)
- }
- .\&a[\%i] := \m(line)
- }
- This grows the array in chunks of 100 as needed.
- 7.11. OUTPUT Command Improvements
- LINEOUT [ text ]
- This command is exactly like OUTPUT, except it supplies a
- carriage return at the end of the text. "lineout exit" is
- exactly the same as "output exit\13".
- SET OUTPUT SPECIAL-ESCAPES { ON, OFF }
- This command lets you tell C-Kermit whether to process \N, \L,
- and \B specially in an OUTPUT command, as distinct from other \
- sequences (such as \%a, \13, \v(time), etc). Normally the
- special escapes are handled. Use SET OUTPUT SPECIAL-ESCAPES OFF
- to disable them.
- Disabling special escapes is necessary in situations when you need to
- transmit lines of data and you have no control over what is in the
- lines. For example, a file oofa.txt that contains:
- This is a file
- It has \%a variables in it
- And it has \B in it.
- And it has \L in it.
- And it has \N in it.
- And this is the last line.
- can be sent like this:
- local line
- set output special-escapes off
- fopen /read \%c oofa.txt
- if fail stop 1 Can't open oofa.txt
- while success {
- fread \%c line
- if fail break
- ; Add filtering or processing commands here...
- output \m(line)\13
- }
- 7.12. Function and Variable Diagnostics
- In C-Kermit 6.0 and earlier, the only diagnostic returned by a failing
- function call was an empty value, which (a) could not be distinguished
- from an empty value returned by a successful function call; (b) did not
- give any indication of the cause of failure; and (c) did not cause the
- enclosing statement to fail. C-Kermit 7.0 corrects these deficiencies.
- SET FUNCTION DIAGNOSTICS { ON, OFF }
- when ON, allows built-in functions to return diagnostic messages
- when improperly referenced, instead of an empty string. FUNCTION
- DIAGNOSTICS are ON by default. When OFF, improperly referenced
- functions continue to return an empty string. This command also
- affects built-in variables; in this case, an error message is
- returned only if the variable does not exist. When FUNCTION
- DIAGNOSTICS are ON, the error message is also printed.
- For variables, the only message is:
- <ERROR:NO_SUCH_VARIABLE:\v(name)>
- where "name" is the name of the nonexistent variable.
- For functions, the diagnostic message is:
- <ERROR:message:\fname()>
- where "message" is replaced by a message, and "name" is replaced by the
- function name, e.g. <ERROR:ARG_NOT_NUMERIC:\fmod()>. Messages include:
- ARG_BAD_ARRAY An argument contains a malformed array reference.
- ARG_BAD_DATE An argument contains a malformed date and/or time.
- ARG_BAD_PHONENUM An argument contains a malformed telephone number.
- ARG_BAD_VARIABLE An argument contains a malformed \%x variable.
- ARG_INCOMPLETE An argument is incomplete (e.g. a broken Base64 string).
- ARG_EVAL_FAILURE An argument could not be evaluated (internal error).
- ARG_NOT_ARRAY An argument references an array that is not declared.
- ARG_NOT_NUMERIC An argument that must be integer contains non-digits.
- ARG_NOT_FLOAT An argument has bad floating-point number format.
- ARG_NOT_VARIABLE An argument that must be a variable is not a variable.
- ARG_OUT_OF_RANGE An argument's numeric value is too big or too small,
- or an argument contains illegal characters (e.g. a hex
- or Base-64 string).
- ARG_TOO_LONG An argument's value is too long.
- ARRAY_FAILURE Failure to create an array.
- DIVIDE_BY_ZERO Execution of the function would cause division by zero.
- FLOATING_POINT_OP Execution error in a floating-point operation.
- FILE_NOT_FOUND Filename argument names a file that can't be found.
- FILE_NOT_READABLE Filename argument is not a regular file.
- FILE_NOT_ACCESSIBLE Filename argument names a file that is read-protected.
- FILE_ERROR Other error with filename argument.
- FILE_NOT_OPEN A file function was given a channel that is not open.
- FILE_ERROR_-n A file function got error -n ( Section 1.22).
- LOOKUP_FAILURE Error looking up function (shouldn't happen).
- MALLOC_FAILURE Failure to allocate needed memory (shouldn't happen).
- NAME_AMBIGUOUS The function is not uniquely identified.
- MISSING_ARG A required argument is missing.
- NO_SUCH_FUNCTION An argument references a function that is not defined.
- NO_SUCH_MACRO An argument references a macro that is not defined.
- RESULT_TOO_LONG The result of a function is too long.
- UNKNOWN_FUNCTION Internal error locating function (shouldn't happen).
- Examples:
- assign \%m \fmod()
- ?<ERROR:MISSING_ARG:\fmod()>
- echo "\fcontents(\%m)"
- "<ERROR:MISSING_ARG:\fmod()>"
- echo \fmod(3,x)
- ?<ERROR:ARG_NOT_NUMERIC:\fmod()>
- echo \fmod(3,4-2*2)
- ?<ERROR:DIVIDE_BY_ZERO:\fmod()>
- Notice the use of \fcontents() in echoing the value of a variable that
- contains a returned error message. That's because the error message
- includes the name of the variable or function that failed, so you must
- use \fcontents() to prevent it from being evaluated again -- otherwise
- the same error will occur.
- The handling of function and variable errors is controlled by:
- SET FUNCTION ERROR { ON, OFF }
- Tells whether invalid function calls or variable references
- should cause command errors. FUNCTION ERROR is ON by default.
- When ON, and an error is diagnosed in a built-in function or
- variable, the command that includes the function call or
- variable reference fails. The failing command can be handled in
- the normal way with IF FAILURE / IF SUCCESS, SET TAKE ERROR, or
- SET MACRO ERROR.
- When FUNCTION DIAGNOSTICS is OFF, there is no error message.
- SHOW SCRIPTS displays the current FUNCTION DIAGNOSTICS and ERROR
- settings.
- 7.13. Return Value of Macros
- In C-Kermit 5A and 6.0, there are two ways to return one level from a
- macro: RETURN value and END number text. When RETURN is used, the
- value, which can be a number or a text string, is assigned to
- \v(return). When END was used, however, \v(return) was not set.
- SUCCESS/FAILURE was set according to whether the number was zero, and
- the text was printed, but the actual value of the number was lost.
- In C-Kermit 7.0, the END number is available in the \v(return)
- variable.
- 7.14. The ASSERT, FAIL, and SUCCEED Commands.
- The ASSERT command is just like the IF command, but without a command
- to execute. It simply succeeds or fails, and this can be tested by a
- subsequent IF SUCCESS or IF FAILURE command. Example:
- ASSERT = 1 1
- IF SUCCESS echo 1 = 1.
- The FAIL command does nothing, but always fails. The SUCCEED command
- does nothing, but always succeeds.
- These commands are handy in debugging scripts when you want to induce a
- failure (or success) that normally would not occur, e.g. for testing
- blocks of code that normally are not executed.
- 7.15. Using Alarms
- Alarms may be set in two ways:
- SET ALARM number
- Sets an alarm for the given number of seconds "from now", i.e.
- in the future, relative to when the SET ALARM command was given.
- Examples:
- set alarm 60 ; 60 seconds from now
- set alarm +60 ; The same as "60"
- set alarm -60 ; Not legal - you can't set an alarm in the past.
- set alarm 60*60 ; 60 minutes from now.
- set alarm \%a+10 ; You can use variables, etc.
- SET ALARM hh:mm:ss
- Sets an alarm for the specified time. If the given time is
- earlier than the current time, the alarm is set for the given
- time in the next day. You may give the time in various formats:
- set alarm 15:00:00 ; 3:00:00pm
- set alarm 3:00:00pm ; 3:00:00pm
- set alarm 3:00pm ; 3:00:00pm
- set alarm 3pm ; 3:00:00pm
- SHOW ALARM
- Displays the current alarm, if any, in standard date-time format
- (see Section 1.6): yyyymmdd hh:mm:ss.
- IF ALARM command
- Executes the command if an alarm has been set and the alarm time
- has passed.
- IF ALARM { command-list } [ ELSE { command-list } ]
- Executes the command-list if an alarm has been set and the alarm
- time has passed. Otherwise, if an ELSE part is given, its
- command-list is executed.
- CLEAR ALARM
- Clears the alarm.
- Only one alarm may be set at a time.
- Example: Suppose you have a script that is always running, and that
- transfers files periodically, and that keeps a transaction log. Suppose
- you want to start a new transaction log each day:
- log transactions \v(date).log
- set alarm 00:00:00 ; Set an alarm for midnight
- while true { ; Main script loop
- xif alarm { ; If the alarm time is past...
- close transactions ; Close current log
- log transactions \v(date).log ; Start new one
- pause 1 ; To make sure 00:00:00 is past
- set alarm 00:00:00 ; Set a new alarm
- }
- ; put the rest of the script here...
- }
- Note that IF ALARM -- no matter whether it succeeds or fails -- does
- NOT clear an expired alarm. Thus, once an alarm has expired, every IF
- ALARM will succeed until the alarm is cleared (with the CLEAR ALARM
- command) or reset with a new SET ALARM command.
- 7.16. Passing Arguments to Command Files
- Beginning in version 7.0, C-Kermit accepts arguments on the TAKE
- command line, for example:
- C-Kermit> take oofa.ksc one two {this is three} four
- This automatically sets the variables \%1 through \%9 to the arguments,
- and \%0 to the name of the file, in this case:
- \%0 = /usr/olga/oofa.ksc
- \%1 = one
- \%2 = two
- \%3 = this is three
- \%4 = four
- and \%5..\%9 are undefined (empty). Arguments past the ninth are
- available in the \&_[] argument-vector array ( Section 7.5).
- The variables are those at the current macro level. Thus, if the TAKE
- command is executed from within a macro, the macro's arguments are
- replaced by those given on the TAKE command line (but only if at least
- one argument is given). The command shown above is exactly equivalent
- to:
- assign \%0 /usr/olga/oofa.ksc
- assign \%1 one
- assign \%2 two
- assign \%3 this is three
- assign \%4 four
- assign \%5
- assign \%6
- assign \%7
- assign \%8
- assign \%9
- take oofa.ksc
- Remember, the variables \%0..\%9 are on the macro call stack, and
- command files are independent of the macro stack. Thus, if a command
- file TAKEs another command file and passes arguments to it, the
- variables are changed from that point on for both files, and so forth
- for all levels of nested command files without intervening macro
- invocations.
- It would have been possible to change C-Kermit to use the overall
- command stack, rather than the macro stack, for arguments -- this would
- have made TAKE work exactly like DO, which is "nicer", but it would
- also have broken countless existing scripts. However, the new SHIFT
- command ( Section 7.5) makes it possible to create an alternative
- TAKE command that does indeed save and restore the argument variables
- at its own level around execution of a command file:
- define mtake {
- local \%f
- assign \%f \fcontents(\%1)
- shift
- take \%f
- }
- C-Kermit 7.0 also supports a new, easier way to pass arguments to
- scripts from the system command line:
- kermit filename arg1 arg2 arg3 ...
- in which arg1, arg2, arg3 (etc) are arguments for the script (whose
- filename is given), and are assigned to \%1, \%2, ... \%9. The filename
- is assigned to \%0. This applies equally to "Kerbang" scripts in UNIX
- ( Section 7.19). For example, suppose you have a file called
- "showargs" containing the following lines:
- #!/usr/local/bin/kermit +
- echo Hello from \%0
- show args
- exit
- (except not indented, since the "#!" line must be on the left margin).
- If you give this file execute permission:
- chmod +x showargs
- then you can run it exactly as you would run a UNIX shell script, e.g.:
- $ showargs one two three
- Hello from /usr/olga/showargs
- Top-level arguments (\v(argc) = 4):
- \&_[0] = /usr/olga/showargs
- \&_[1] = one
- \&_[2] = two
- \&_[3] = three
- Furthermore, the \&_[] array now contains the filename, if one was
- given as the first command line argument, or it is a "Kerbang" script,
- in element 0.
- Otherwise element 0 is program name, and elements 1 through \v(argc)-1
- contain the command-line arguments, if any, that appear after "--" or
- "=", if any. This array is saved and restored around macro calls;
- recall that inside macros it contains the macro argument vector
- (allowing you to access arguments programmatically, and to have more
- than 9 of them).
- At top level, notice the difference between the \&@[] and \&_[] arrays.
- The former includes C-Kermit options; the latter omits them.
- 7.17. Dialogs with Timed Responses
- The ASK, ASKQ, GETOK, and GETC commands (let's call them the "ASK-class
- commands") let you write scripts that carry on dialogs with the user,
- asking them for text, a Yes/No answer, or a character, respectively.
- Prior to C-Kermit 7.0, these questions would always wait forever for an
- answer. In C-Kermit 7.0, you may specify a time limit for them with the
- new command:
- SET ASK-TIMER number
- Sets a time-limit on ASK-CLASS commands to the given number of
- seconds. If the number is 0 or less, there is no time limit and
- these commands wait forever for a response. Any timer that is
- established by this command remains in effect for all future
- ASK-class commands until another SET ASK-TIMER command is given
- (e.g. with a value of 0 to disable ASK timeouts).
- IF ASKTIMEOUT command
- An ASK-class command that times out returns a failure status.
- You can test explicitly for a timeout with:
- 7.18. Increased Flexibility of SWITCH Case Labels
- Prior to C-Kermit 7.0 / K95 1.1.19, the case labels in SWITCH
- statements were string constants.
- Now case labels can be variables, function calls, or any mixture of
- these with each other and/or with regular characters.
- Furthermore, after the case label is evaluated, it is treated not as a
- string constant, but as a pattern against which the SWITCH variable is
- matched ( Section 4.9.1).
- This introduces a possible incompatibility with previous releases,
- since the following characters in case labels are no longer taken
- literally:
- \ * ? [ {
- Any scripts that previously included any of these characters in case
- labels must now quote them with backslash (\).
- 7.19. "Kerbang" Scripts
- In UNIX only, Kermit scripts can be stored in files and run "directly",
- without starting Kermit first (as noted on page 467 of the manual),
- just as a shell script can be "run" as if it were a program. This
- section amplifies on that idea a bit, and presents some new aspects of
- version 7.0 that make it easier to write and run Kermit scripts
- directly.
- NOTE: On non-UNIX platforms, such as VMS or Windows, Kerbang scripts
- can be run as "kermit + scriptfilename arg1 arg2 arg3 ...". Windows
- 95/98/NT file associations do not allow for the passing of
- parameters. In VMS, however, you can achieve the Kerbang effect by
- defining a symbol, as in this example:
- $ autotelnet :== "$SYS$TOOLS:KERMIT.EXE + AUTOTELNET.KSC"
- and then running the script like any other command:
- $ autotelnet xyzcorp.com myuserid
- See Section 9.3 for an explanation of the "+" symbol.
- UNIX shell scripts can specify which shell should run them by including
- a "shebang" line at the top, e.g.:
- #!/bin/sh
- (but not indented; the shebang line must be on the left margin). The
- term "shebang" is a contraction of "shell" and "bang". "Bang" is a
- slang word for the exclamation mark ("!"); "shebang" itself is an
- American slang word used in in the phrase "the whole shebang".
- We can run Kermit scripts directly too, by including a "shebang" line
- that names Kermit as the "shell"; thus we call these "Kerbang" scripts.
- This mechanism has been considerably simplified in C-Kermit 7.0 to
- facilitate C-Kermit's use a scripting tool just like any of the UNIX
- shells or scripting languages. The rules are the same as for shell
- scripts:
- 1. The first line of the Kermit script must begin with "#!"
- immediately followed by the full pathname of the program that will
- execute the script (in this case, C-Kermit rather than a UNIX
- shell), followed by any Kermit command-line options. To suppress
- execution of the C-Kermit initialization file and to make command
- line arguments available to the script, the final option should be
- "+":
- #!/usr/local/bin/kermit +
- Some users have reported that in some circumstances a space might
- be necessary after the plus sign; this depends on your shell -- it
- has nothing to do with Kermit. In most cases, no space is needed.
- 2. The file must have execute permission (granted via "chmod +x
- filename").
- When C-Kermit is invoked from a Kerbang script (or from the system
- prompt with a "+" command-line argument, which amounts to the same
- thing), the following special rules apply:
- 1. The C-Kermit initialization file is NOT executed automatically. If
- you want it to be executed, include a TAKE command for it in the
- script, e.g. "take \v(home).kermrc". (In previous releases, the
- initialization file was always executed, with no way to prevent it
- except for the user to include Kermit-specific command line options
- which had nothing to do with the script). Many scripts have no need
- for the standard Kermit initialization file, which is quite lengthy
- and not only delays startup of the script, but also spews forth
- numerous messages that are most likely unrelated to the script.
- 2. If the initialization file is not executed, neither is your
- customization file, since the initialization file is the command
- file from which the customization file is TAKEn. Again, you can
- include a TAKE command for the initialization file if desired, or
- for the customization file by itself, or for any other file.
- 3. C-Kermit does not process command-line arguments at all. Instead,
- it passes all words on the command line after the "+" to the script
- as \%0 (the script name), \%1..\%9 (the first nine arguments), as
- well as in the argument vector array \&_[]. The variable \v(argc)
- is set to the total number of "words" (as passed by the shell to
- Kermit) including the script name. Quoting and grouping rules are
- those of the shell.
- 4. At any point where the script terminates, it must include an EXIT
- command if you want it to exit back to the shell; otherwise
- C-Kermit enters interactive prompting mode when the script
- terminates. The EXIT command can include a numeric status to be
- returned to the shell (0, 1, etc), plus an optional message.
- Here is a simple Kerbang script that prints its arguments:
- #/usr/local/bin/kermit +
- echo Hello from \%0
- for \%i 0 \v(argc)-1 1 {
- echo \%i. "\&_[\%i]"
- }
- exit 0
- Save this file as (say) "showargs", then give it execute permission and
- run it (the \&_[] array is the same as \%0..\%9, but allows you to
- refer to argument variables programmatically; see Section 7.5).
- (Yes, you could substitute SHOW ARGUMENTS for the loop.)
- $ chmod +x showargs
- $ ./showargs one "this is two" three
- The script displays its arguments:
- Hello from /usr/olga/showargs
- 0. "/usr/olga/showargs"
- 1. "one"
- 2. "this is two"
- 3. "three"
- $
- Notice that no banners or greetings are printed and that startup is
- instantaneous, just like a shell script. Also notice that grouping of
- arguments is determined by *shell* quoting rules, not Kermit ones,
- since the command line is parsed by the shell before Kermit ever sees
- it.
- Of course you can put any commands at all into a Kerbang script. It can
- read and write files, make connections, transfer files, anything that
- Kermit can do -- because it *is* Kermit. And of course, Kerbang scripts
- can also be executed from the Kermit prompt (or from another script)
- with a TAKE command; the Kerbang line is ignored since it starts with
- "#", which is a comment introducer to Kermit just as it is to the UNIX
- shell. In VMS and other non-UNIX platforms, the Kerbang line has no
- effect and can be omitted.
- It might be desirable for a script to know whether it has been invoked
- directly from the shell (as a Kerbang script) or by a TAKE command
- given to the Kermit prompt or in a Kermit command file or macro. This
- can be done as in this example:
- #!/usr/local/bin/kermit +
- assign \%m \fbasename(\%0)
- define usage { exit 1 {usage: \%m phonenumber message} }
- define apage { (definition of APAGE...) } ; (Seebook pp.454-456)
- xif equal "\%0" "\v(cmdfil)" {
- if not def \%1 usage
- if not def \%2 usage
- apage {\%1} {\%2}
- exit \v(status)
- }
- In a Kerbang script, \%0 and \v(cmdfile) are the same; both of them are
- the name of the script. When a script is invoked by a Kermit TAKE
- command, \%0 is the name of the Kermit program, but \v(cmdfile) is the
- name of the script. In the example above, a macro called APAGE is
- defined. If the script was invoked directly, the APAGE macro is also
- executed. Otherwise, it is available for subsequent and perhaps
- repeated use later in the Kermit session.
- An especially handy use for Kerbang scripts is to have the
- initialization file itself be one. Since the standard initialization
- file is rather long and time-consuming to execute, it is often overkill
- if you want to start Kermit just to transfer a file. Of course there
- are command-line switches to suppress initialization-file execution,
- etc, but another approach is to "run" the initialization file when you
- want its features (notably the services directory), and run C-Kermit
- directly when you don't. A setup like this requires that (a) the
- C-Kermit initialization file is configured as a Kerbang script (has
- #!/path.../kermit as first line), has execute permission, and is in
- your PATH; and (b) that you don't have a .kermrc file in your login
- directory.
- 7.20. IF and XIF Statement Syntax
- The IF command has been improved in two significant ways in C-Kermit
- 7.0, described in the following subsections. All changes are backwards
- compatible.
- 7.20.1. The IF/XIF Distinction
- The distinction between IF and XIF is no longer important as of
- C-Kermit 7.0. You should be able to use IF in all cases (and of course,
- also XIF for backwards compatibility). In the past, IF was used for
- single-command THEN parts, followed optionally by a separate ELSE
- command:
- IF condition command1 ; THEN part
- ELSE command2 ; ELSE part
- whereas XIF was required if either part had multiple commands:
- XIF condition { command, command, ... } ELSE { command, command, ... }
- The syntactic differences were primarily that IF / ELSE was two
- commands on two separate lines, whereas XIF was one command on one
- line, and that XIF allowed (and in fact required) braces around its
- command lists, whereas IF did not allow them.
- Furthermore, the chaining or nesting of parts and conditions was
- inconsistent. For example, the IF command could be used like this:
- IF condition command
- ELSE IF condition command
- ELSE IF condition command
- ELSE IF condition command
- ...
- but XIF could not. C-Kermit 7.0 accepts the old syntax and executes it
- the same as previous versions, but also accepts a new unified and more
- convenient syntax:
- IF condition command-list [ ELSE command-list ]
- or:
- IF condition command-list
- ELSE command-list
- in which the ELSE part is optional, and where command-list can be a
- single command (with or without braces around it) or a list of commands
- enclosed in braces. Examples:
- Example 1:
- IF condition { command1, command2 } ELSE { command3, command4 }
- Example 2 (same as Example 1):
- IF condition {
- command1
- command2
- } ELSE {
- command3
- command4
- }
- Example 3 (same as 1 and 2):
- IF condition {
- command1
- command2
- }
- ELSE { command3, command4 }
- Example 4 (same as 1-3):
- IF condition {
- command1
- command2
- }
- ELSE {
- command3
- command4
- }
- Example 5 (ELSE can be followed by another command):
- IF condition1 {
- command1
- command2
- } ELSE IF condition2 {
- command3
- command4
- } ELSE {
- command5
- command6
- }
- Example 5 suggests other possibilities:
- IF condition {
- command1
- command2
- } ELSE FOR variable initial final increment {
- command3
- command4
- }
- And this too is possible, except for some non-obvious quoting
- considerations:
- dcl \&a[6] = one two three four five six
- IF < \%n 3 {
- echo \\%n is too small: \%n
- } ELSE FOR \\%i 1 \\%n 1 {
- echo \\%i. \\&a[\\%i]
- }
- (The loop variable must be quoted in this context to prevent premature
- evaluation.)
- Many C programmers prefer to code IF-ELSE, WHILE, FOR, and SWITCH with
- the block-open bracket on its own line. This does not work in Kermit:
- IF condition ; THIS FORMAT DOES NOT NOT WORK
- {
- command1
- command2
- }
- ELSE
- {
- command3
- command4
- }
- Explanation: the Kermit command language is line oriented; each line is
- a command, each command is a line. The first line above, having no hint
- of continuation, is an incomplete command, yet syntactically correct --
- an IF statement with an empty THEN part. Interestingly enough, since
- the next line begins with "{" it is a block that (inC-Kermit 8.0
- and later) is a block that is executed unconditionally. Thus the
- commands in the THEN part are executed regardless of whether the
- condition is true -- not what you wanted!
- The new block syntax used in the IF, WHILE, FOR, and SWITCH commands
- employs certain tricks to allow multiple lines to be treated as a
- single line:
- * Any line ending with "{" (ignoring whitespace and comments) marks
- the beginning of a block;
- * Any line beginning with "}" (ignoring whitespace) marks the end of
- a block;
- * Line breaks within a block separate commands; the comma is implied
- by the line end.
- Thus:
- IF condition {
- command1
- command2
- } ELSE {
- command3
- command4
- }
- is "assembled" into:
- IF condition { command1, command2 } ELSE { command3, command4 }
- Note the addition of commas to separate commands within blocks. As
- always, if you need continue a command onto additional lines, you can
- end the continued lines with the continuation character, "-". You can
- also do this if you want to put opening brackets on their own line:
- IF condition -
- {
- command1
- command2
- }
- ELSE -
- {
- command3
- command4
- }
- 7.20.2. Boolean Expressions (The IF/WHILE Condition)
- Prior to C-Kermit 7.0, the IF and WHILE commands accepted only a single
- Boolean ("true or false") assertion, e.g. "if > \%m 0 command" or "if
- exist filename command". There was no way to form Boolean expressions
- and, in particular, nothing that approached a Boolean OR function (AND
- could be simulated by concatenating IF statements: "if condition1 if
- condition2..").
- C-Kermit 7.0 (and K95 1.1.19) allow grouping of Boolean assertions
- using parentheses and combining them using AND (or &&) and OR (or ||).
- Each of these operators -- including the parentheses -- is a field and
- must be set off by spaces. AND has higher precedence than OR, NOT has
- higher precedence than AND, but parentheses can be used to force any
- desired order of evaluation. The old syntax is still accepted.
- Here are some examples:
- define \%z 0 ; Define some variables
- define \%n 1 ; for use in the examples.
- if > \%n \%z echo \%n is greater. ; Original format - still accepted.
- if ( > \%n \%z ) echo \%n is greater. ; Parentheses may be used in 7.0.
- if ( > \%n \%z && not = \%z 0 ) ... ; Two assertions combined with AND.
- if ( > \%n \%z and not = \%z 0 ) ... ; Same as previous ("and" = "&&").
- if ( > \%n \%z || not = \%z 0 ) ... ; Two assertions combined with OR.
- if ( > \%n \%z or not = \%z 0 ) ... ; Same as previous ("or" = "||").
- if ( > \%n \%z || != \%z 0 ) ... ; Ditto ("!=" = "not =").
- while ( 1 ) { ... } ; Just like C.
- Notice the spaces around all operators including the parentheses --
- these are required. The following examples show how parentheses can be
- used to alter the precedence of the AND and OR operators:
- if ( false || false && false || true ) ,.. ; True
- if ( false || ( false && false ) || true ) ... ; Same as previous
- if ( ( false || false ) && ( false || true ) ) ... ; False
- Similarly for NOT:
- if ( not true && false ) ... ; False (NOT binds to TRUE only)
- if ( ( not true ) && false ) ... ; Same as previous
- if ( not ( true && false ) ) ... ; True (NOT binds to (TRUE && FALSE))
- Notes:
- 1. The syntax of the Boolean expression itself has not changed; each
- expression begins with a keyword or token such as "EXIST", ">", or
- "=", etc; operators such as "<", "=", and ">" do not go between
- their operands but precede them as before; this might be called
- "reverse reverse Polish notation"; it allows deterministic
- on-the-fly parsing of these expressions at the C-Kermit> prompt as
- well as in scripts, and allows ?-help to be given for each item
- when IF or WHILE commands are typed at the prompt.
- 2. Parentheses are required when there is more than one Boolean
- assertion.
- 3. Parentheses are not required, but are allowed, when there is only
- one Boolean assertion.
- 4. Evaluation of Boolean assertions occurs left to right, but the
- resulting Boolean expression is evaluated afterwards according to
- the rules of precedence. All Boolean assertions are always
- evaluated; there is no "early stopping" property and therefore no
- question about when or if side effects will occur -- if any Boolean
- assertion has side effects, they will always occur. (Early stopping
- is, however, possible with theS-Expression IF introduced in
- C-Kermit 8.0.)
- Constructions of arbitrary complexity are possible, within reason.
- Also see Section 7.4 for new IF / WHILE conditions.
- 7.21. Screen Formatting and Cursor Control
- C-Kermit 7.0 adds a simple way to create formatted screens, the SCREEN
- command:
- SCREEN { CLEAR, CLEOL, MOVE-TO row [ column ] }
- Performs screen-formatting actions. Correct operation of these
- commands depends on proper terminal setup on both ends of the
- connection -- mainly that the host terminal type is set to agree
- with the kind of terminal or the emulation you are viewing
- C-Kermit through. The UNIX version uses terminfo or termcap (not
- curses); the VMS version uses SMG; K-95 uses its built in screen
- manager.
- SCREEN CLEAR
- Moves the cursor to home position and clears the entire screen.
- Synonyms: CLEAR COMMAND-SCREEN ALL (K-95 only), CLS, CLEAR
- SCREEN.
- SCREEN CLEOL
- Clears from the current cursor position to the end of the line.
- Synonym: CLEAR COMMAND-SCREEN EOL (K-95 only)
- SCREEN MOVE-TO row column
- Moves the cursor to the indicated row and column. The row and
- column numbers are 1-based, so on a 24x80 screen the home
- position is 1 1 and the lower right corner is 24 80. If a row or
- column number is given that too large for what Kermit or the
- operating system thinks is your screen size, the appropriate
- number is substituted.
- These escape sequences used by these commands depends on the platform.
- In UNIX, your TERM environment variable is used to query the
- terminfo/termcap database; if the query fails, ANSI/VT100 sequences are
- used. In VMS, the SMG library is used, which sends sequences based on
- your VMS terminal type. K95 does its own screen control. On other
- platforms (such as AOS/VS, VOS, etc), screen formatting is not
- supported, and the SCREEN command does nothing.
- The three SCREEN actions can be used in scripts to produce menus,
- formatted screens, dynamic displays, etc. Related variables include:
- \v(terminal) The type terminal C-Kermit thinks you have.
- \v(rows) The number of rows C-Kermit thinks your terminal has.
- \v(columns) The number of columns C-Kermit thinks your terminal has.
- And functions:
- \fscrncurx() The current X coordinate of the cursor (K-95 only).
- \fscrncury() The current Y coordinate of the cursor (K-95 only).
- \fscrnstr(x,y,n) The string of length nat position (x,y) (K-95 only).
- And commands:
- ECHO string Writes string + CRLF at the current cursor position.
- XECHO string Writes string at current cursor position; CRLF not supplied.
- GETC v prompt Issues prompt, reads one character into variable v, no echo.
- And special characters:
- Ctrl-L At the C-Kermit> command prompt, or in a C-Kermit command,
- works like Return or Enter, but also clears the screen
- Example 1: A macro that prints a message \%1 at cursor position
- (\%2,\%3):
- define MSG {
- if not def \%3 def \%3 0 ; Default column to 0
- if > \v(argc) 2 screen move \%2 \%3 ; Move to given row/col (if any)
- screen cleol ; Clear to end of line
- if def \%1 xecho \fcontents(\%1) ; Print message (if any)
- }
- Example 2: A macro put the cursor on the bottom screen line, left
- margin:
- define BOT {
- screen move \v(rows) 0
- }
- Example 3: A macro to center message \%1 on line \%2.
- define CENTER {
- if not def \%2 def \%2 1
- .\%x ::= (\v(cols)-\flen(\%1))/2
- msg {\%1} {\%2} {\%x}
- }
- Example 4: A simple menu (building on Examples 1-3):
- def \%c 0 ; Menu choice variable
- screen clear ; Clear the screen
- center {Welcome to This Menu} 2 ; Display the menu
- msg {Choices:} 4
- msg { 1. File} 6
- msg { 2. Edit} 7
- msg { 3. Exit} 8
- while ( != \%c 3 ) { ; Read and verify choice
- while true { ; Keep trying till we get a good one
- screen move 10 ; Move to line 10
- screen cleol ; Clear this line
- getc \%c {Your choice: } ; Prompt and get and echo 1 character
- xecho \%c
- if ( not numeric \%c ) { msg {Not numeric - "\%c"} 12, continue }
- if ( >= \%c 1 && <= \%c 3 ) break
- msg {Out of range - "\%c"} 12
- }
- switch \%c { ; Valid choice - execute it.
- :1, msg {Filing... } 12, break
- :2, msg {Editing...} 12, break
- :3, msg {Exiting...} 12, break
- }
- }
- echo Bye ; Exit chosen - say goodbye.
- bot ; Leave cursor at screen bottom.
- exit ; And exit.
- Similar scripts can work over the communication connection; substitute
- INPUT and OUTPUT for GETC and ECHO/XECHO.
- 7.22. Evaluating Arithmetic Expressions
- A new arithmetic operator was added to the list recognized by the
- EVALUATE command, the \feval() function, and which can also be used
- anywhere else arithmetic expressions are accepted (numeric command
- fields, array subscripts, etc):
- Prefix "!"
- This operator inverts the "truth value" of the number or
- arithmetic expression that follows. If the value of the operand
- is 0, the result is 1. If the value is nonzero, the result is 0.
- Examples:
- set eval old
- evaluate 0
- 0
- evaluate !0
- 1
- evaluate !3
- 0
- evaluate !(-3)
- 0
- .\%a = 1
- .\%b = 0
- evaluate !(\%a|\%b)
- 0
- evaluate !(\%a&\%b)
- 1
- evaluate !(!(\%a&\%b))
- 0
- Note the distinction between Prefix ! (invert truth value) and Suffix !
- (factorial). Also the distinction between Prefix ! and Prefix ~ (which
- inverts all the bits in its operand). Also note that prefix operators
- (!, -, and ~) can not be adjacent unless you use parentheses to
- separate them, as shown in the final example above.
- 7.23. Floating-Point Arithmetic
- For a more convenient way of dealing with floating-point numbers
- than the one described here, see theC-Kermit 8.0 update notes,
- the section onS-Expressions.
- C-Kermit 7.0 adds limited support for floating-point numbers (numbers
- that have fractional parts, like 3.141592653). This support is provided
- through a small repertoire of functions and in Boolean expressions that
- compare numbers, but does not apply to number parsing in general, or to
- expression evaluation, array subscripts, the INCREMENT and DECREMENT
- commands, or in any context other than those listed in this section.
- A floating point number has an optional sign (+ or -), followed by a
- series of decimal digits containing either zero or one period (.)
- character, which is the decimal point. The use of comma or any other
- character besides period as a decimal point is not supported.
- Scientific notation is not supported either. Examples of legal
- floating-point numbers:
- 0 Integers can be used
- 1 Ditto
- 2. A decimal point without decimal digits
- 3.0 A decimal point with decimal digits
- 3.141592653 Ditto
- -4.0 A negative sign can be included
- +5.0 A positive sign can be included
- Examples of notations that are not accepted:
- 1,000,000 Separators can not be used
- 1.000.000 Ditto (or multiple decimal points)
- 6.022137E23 No scientific notation
- 6.62606868e-34 Ditto
- 12.5+6.25 No "bare" expressions
- You can use IF FLOAT test a string or variable to see if it's in
- acceptable floating-point format. Example:
- ask \%f { Type a number: }
- if not def \%f .\%f = 0.0
- if not float \%f stop 1 Invalid floating-point number: "\%f"
- C-Kermit's floating-point support, like its support for whole numbers
- (integers), relies on the capabilities of the underlying computer. Your
- computer has only a limited amount of precision for numbers, depending
- on its architecture. Thus floating-point numbers that have too many
- digits will not be accurate; adding a very small number to a very large
- one might have no effect at all; and so on. For details, read a text on
- numerical analysis. Example:
- .\%a = 11111111111111111111 ; A long number
- .\%b = 22222222222222222222 ; Another one
- echo \ffpadd(\%a,\%b) ; Add them - the result should be all 3's
- 33333333333333330000.0 ; See the result
- In this example, the computer has 16 digits of precision; after that,
- the (low-order) digits are set to 0, since the computer doesn't know
- what they really are. In fact, the computer returns random digits, but
- Kermit sets all digits beyond the computer's precision to 0.
- C-Kermit's floating-point functions have names of the form
- "\ffpxxx(args)" ("\f" for function, "fp" for floating-point), where
- "xxx" is replaced by the name of the function, such as "sqrt", and
- "args" is the argument list, consisting of one or two floating-point
- numbers (depending on the function), and an optional "d" argument that
- says now many decimal places should be shown in the result. Example:
- \ffpdiv(10,3,1) returns "3.3"
- \ffpdiv(10,3,2) returns "3.33"
- \ffpdiv(10,3,3) returns "3.333"
- and so on, up to the precision of the computer. If the decimal-places
- argument is less than zero, the fractional part of the result is
- truncated:
- \ffpdiv(10,3,-1) returns "3".
- If the decimal-places argument is 0, or is omitted, C-Kermit returns as
- many decimal places as are meaningful in the computer's floating-point
- precision, truncating any extraneous trailing 0's:
- \ffpdiv(10,8) returns "1.25".
- \ffpdiv(10,4) returns "2.5".
- \ffpdiv(10,2) returns "5.0".
- \ffpdiv(10,3) returns "3.333333333333333" (for 16-digit precision).
- There is no way to request that a floating-point function return a
- decimal point but no decimal places. However, this is easy enough to
- accomplish in other ways, for example by supplying it outside the
- function call:
- echo \ffpadd(\%a,\%b,-1).
- Kermit's floating-point functions always round the result for the
- requested number of decimal places when the "d" argument is given and
- has a value greater than 0 (see the description of \ffpround() just
- below).
- Floating-point arguments can be constants in floating-point format or
- variables whose values are floating-point numbers. If a floating-point
- argument is omitted, or is a variable with no value, 0.0 is supplied
- automatically. Example:
- def \%x 999.999
- undef \%y
- echo \ffpmin(\%x,\%y)
- 0.0
- Or equivalently:
- echo \ffpmin(999.999)
- 0.0
- The floating-point functions are:
- \ffpround(f1,d)
- Returns f1 rounded to d decimal places. For this function only,
- d = 0 (or d omitted) has a special meaning: return the integer
- part of f1 rounded according to the fractional part. Examples:
- \ffpround(2.74653,-1) returns "2" (fraction truncated, no rounding).
- \ffpround(2.74653,0) returns "3" (integer part is rounded).
- \ffpround(2.74653) returns "3" (d omitted same as d = 0).
- \ffpround(2.74653,1) returns "2.7".
- \ffpround(2.74653,2) returns "2.75".
- \ffpround(2.74653,3) returns "2.747".
- \ffpround(2.74653,4) returns "2.7465", etc.
- \ffpadd(f1,f2,d)
- Returns the sum of f1 and f2.
- \ffpsubtract(f1,f2,d)
- Subtracts f2 from f1 and returns the result.
- \ffpmultiply(f1,f2,d)
- Returns the product of f1 and f2.
- \ffpdivide(f1,f2,d)
- If f2 is not 0, divides f1 by f2 and returns the quotient.
- If f2 is 0, a DIVIDE_BY_ZERO error occurs.
- \ffpraise(f1,f2,d)
- If f1 = 0 and f2 <= 0, or if f1 < 0 and f2 has a fractional
- part, an ARG_OUT_OF_RANGE error occurs; otherwise f1 raised to
- the f2 power is returned.
- \ffpsqrt(f1,d)
- If f1 >= 0, returns the square root of f1; otherwise
- ARG_OUT_OF_RANGE.
- \ffpabsolute(f1,d)
- Returns the absolute value of f1 (i.e. f1 without a sign). This
- is the floating-point analog of \fabsolute(n1).
- \ffpint(f1)
- Returns the integer part of f1. Equivalent to \ffpround(f1,-1).
- \ffpexp(f1,d)
- The base of natural logarithms, e (2.718282...), raised to the
- f1 power.
- \ffplogn(f1,d)
- The natural logarithm of f1 (the power to which e must be raised
- to obtain f1).
- \ffplog10(f1,d)
- The base-10 logarithm of f1 (the power to which 10 must be
- raised to obtain f1).
- \ffpmodulus(f1,f2,d)
- If f2 is not 0, the remainder after dividing f1 by f2.
- If f2 is 0, a DIVIDE_BY_ZERO error occurs.
- This is the floating-point analog of \fmod(n1,n2).
- \ffpmaximum(f1,f2,d)
- Returns the maximum of f1 and f2. This is the floating-point
- analog of \fmax(n1,n2).
- \ffpminimum(f1,f2,d)
- Returns the minimum of f1 and f2. This is the floating-point
- analog of \fmin(n1,n2).
- \ffpsine(f1,d)
- Returns the sine of f1 radians.
- \ffpcosine(f1,d)
- Returns the cosine of f1 radians.
- \ffptangent(f1,d)
- Returns the tangent of f1 radians.
- Note that all of these functions can be used with integer arguments. If
- you want an integer result, specify d = -1 (to truncate) or feed the
- result to \ffpround(xxx,0) (to round).
- Floating-point numbers (or variables or functions that return them) can
- be used in Boolean expressions (see Section 7.20.2) that compare
- numbers:
- = x y
- != x y
- < x y
- > x y
- <= x y
- >= x y
- In these examples, x and y can be either integers or floating-point
- numbers in any combination. In an arithmetic comparison of an integer
- and a floating-point number, the integer is converted to floating-point
- before the comparison is made. Examples:
- .\%t = 3.000000000
- .\%f = 3.141592653
- .\%i = 3
- if > \%f \%i echo Pi is greater.
- if = \%t \%i echo "\%i" = "\%t".
- A floating-point number can also be used in:
- IF number command
- where the command is executed if the number is nonzero. If the number
- is floating-point, the command is not executed if the number is 0.0,
- and is executed otherwise.
- Floating-point numbers can be sorted using ARRAY SORT /NUMERIC (see
- Section 7.10.5 ).
- Two floating-point constants are provided:
- \v(math_pi) = Pi (3.141592653...)
- \v(math_e) = e, the base of natural logarithms (2.71828...)
- These are given to the computer's precision, e.g. 16 digits. This
- number itself is available in a variable:
- \v(math_precision)
- How many significant digits in a floating-point number.
- 7.24. Tracing Script Execution
- The TRACE command is handy for debugging scripts.
- TRACE [ { /ON, /OFF } ] [ { ASSIGNMENTS, COMMAND-LEVEL, ALL } ]
- Selects tracing of the given object.
- Optional switches are /ON and /OFF. If no switch is given, /ON is
- implied. The trace objects are ASSIGNMENTS, COMMAND-LEVEL, and ALL. The
- default object is ALL, meaning to select all trace objects (besides
- ALL). Thus TRACE by itself selects tracing of everything, as does TRACE
- /ON, and TRACE /OFF turns off all tracing.
- When tracing of ASSIGNMENTS is on, every time the value of any
- user-defined variable or macro changes, C-Kermit prints one of the
- following:
- >>> name: "value"
- The name of the variable or macro followed by the new value in
- quotes. This includes implicit macro-parameter assignments
- during macro invocation.
- >>> name: (undef)
- This indicates that the variable or macro has been undefined.
- <<< name: "value"
- For RETURN statements: the name of the macro and the return
- value.
- <<< name: (null)
- For RETURN statements that include no value or an empty value.
- When tracing of COMMAND-LEVEL is on, C-Kermit prints:
- [n] +F: "name"
- Whenever a command file is entered, where "n" is the command
- level (0 = top); the name of the command file is shown in
- quotes.
- [n] +M: "name"
- Whenever a macro is entered; "n" is the command level. The name
- of the macro is shown in quotes.
- [n] -F: "name"
- Whenever a command file is reentered from below, when a macro or
- command file that it has invoked has returned.
- [n] -M: "name"
- Whenever a macro is reentered from below.
- For other debugging tools, see SHOW ARGS, SHOW STACK, SET TAKE, SET
- MACRO, and of course, ECHO.
- 7.25. Compact Substring Notation
- It is often desirable to extract a substring from a string which is
- stored in a variable, and for this we have the \fsubstring() function,
- which is used like this:
- define \%a 1234567890
- echo \fsubstring(\%a,3,4) ; substring from 3rd character length 4
- 3456
- or like this with macro-named variables:
- define string 1234567890
- echo \fsubstring(\m(string),3,4)
- 3456
- C-Kermit 7.0 adds a pair of alternative compact notations:
- \:(variablename[start:length]) <-- Substring of variable's value
- \s(macroname[start:length]) <-- Substring of macro's definition
- These are exactly equivalent to using \fsubstring(), except more
- compact to write and also faster since evaluation is in one step
- instead of two.
- The "\:()" notation can be used with any Kermit variable, that is,
- almost anything that starts with a backslash:
- \:(\%a[2:6]) <-- equivalent to \fsubstring(\%a,2,6)
- \:(\&x[1][2:6]) <-- equivalent to \fsubstring(\&x[1],2,6)
- \:(\m(foo)[2:6]) <-- equivalent to \fsubstring(\m(foo),2,6)
- \:(\v(time)[2:6]) <-- equivalent to \fsubstring(\v(time),2,6)
- \:(\$(TERM)[2:6]) <-- equivalent to \fsubstring(\$(TERM),2,6)
- \:(ABCDEFGH[2:6]) <-- equivalent to \fsubstring(ABCDEFGH,2,6)
- Whatever appears between the left parenthesis and the left bracket is
- evaluated and then the indicated substring of the result is returned.
- The "\s()" notation is the same, except after evaluating the variable,
- the result is treated as a macro name and is looked up in the macro
- table. Then the indicated substring of the macro definition is
- returned. Example:
- define testing abcdefghijklmnopqrstuvwxyz
- define \%a testing
- \s(testing[2:6]) --> bcdefg
- \:(testing[2:6]) --> esting
- \:(\%a[2:6]) --> esting
- \s(\%a[2:6]) --> bcdefg
- Note that the following two examples are equivalent:
- \:(\m(foo)[2:6])
- \s(foo[2:6])
- The first number in the brackets is the 1-based starting position. If
- it is omitted, or less than 1, it is treated as 1. If it is greater
- than the length of the string, an empty string is returned.
- The second number is the length of the desired substring. If the second
- number is omitted, is less than 0, or would be past the end of the
- string, then "through the end of the string" is assumed. If it is 0,
- the empty string is returned.
- If the brackets are empty or omitted, the original string is returned.
- The starting position and length need not be literal numbers; they can
- also be variables, functions, arithmetic expressions, or even other
- \s() or \:() quantities; anything that evaluates to a number, for
- example:
- \s(block[1025:\fhex2n(\s(block[\%b:\%n+4]))/2])
- Syntactically, \m(name) and \s(name) differ only in that the sequence
- [*] at the end of the name (where * is any sequence of 0 or more
- characters) is treated as substring notation in \s(name), but is
- considered part of the name in \m(name) (to see why, seeSection
- 7.10.9).
- 7.26. New WAIT Command Options
- The WAIT command has been extended to allow waiting for different kinds
- of things (formerly it only waited for modem signals). Now it also can
- wait for file events.
- 7.26.1. Waiting for Modem Signals
- The previous syntax:
- WAIT time { CD, DSR, RTS, RI, ... }
- has changed to:
- WAIT time MODEM-SIGNALS { CD, DSR, RTS, RI, ... }
- However, the previous syntax is still accepted. The behavior is the
- same in either case.
- 7.26.2. Waiting for File Events
- The new WAIT option:
- WAIT time FILE { CREATION, DELETION, MODIFICATION } filename
- lets you tell Kermit to wait the given amount of time (or until the
- given time of day) for a file whose name is filename to be created,
- deleted, or modified, respectively. The filename may not contain
- wildcards. If the specified event does not occur within the time limit,
- or if WAIT CANCELLATION is ON and you interrupt from the keyboard
- before the time is up, the WAIT command fails. If the event is
- MODIFICATION and the file does not exist, the command fails. Otherwise,
- if the given event occurs within the time limit, the command succeeds.
- Examples:
- WAIT 600 FILE DELETION oofa.tmp
- Wait up to 10 minutes for file oofa.tmp to disappear.
- WAIT 23:59:59 FILE MOD orders.db
- Wait until just before midnight for the orders.db file to be
- changed.
- Example: Suppose you want to have the current copy of /etc/motd on your
- screen at all times, and you want to hear a bell whenever it changes:
- def \%f /etc/motd ; The file of interest.
- while 1 { ; Loop forever...
- cls ; Clear the screen.
- echo \%f: \v(date) \v(time)... ; Print 2-line heading...
- echo
- if ( not exist \%f ) { ; If file doesn't exist,
- echo \%f does not exist... ; print message,
- wait 600 file creat \%f ; and wait for it to appear.
- continue
- }
- beep ; Something new - beep.
- type /head:\v(rows-2) \%f ; Display the file
- if fail exit 1 \%f: \ferrstring() ; (checking for errors).
- wait 999 file mod \%f ; Wait for it to change.
- }
- This notices when the file is created, deleted, or modified, and acts
- only then (or when you interrupt it with); the time shown in the
- heading is the time of the most recent event (including when the
- program started).
- See Section 1.10, where the \v(kbchar) variable is explained. This
- lets you modify a loop like the one above to also accept
- single-character commands, which interrupt the WAIT, and dispatch
- accordingly. For example:
- wait 999 file mod \%f ; Wait for the file to change.
- if defined \v(kbchar) { ; Interrupted from keyboard?
- switch \v(kbchar) { ; Handle the keystroke...
- :q, exit ; Q to Quit
- :h, echo blah blah, break ; H for Help
- :default, beep, continue ; Anything else beep and ignore
- }
- }
- This lets you write event-driven applications that wait for up to three
- events at once: a file or modem event, a timeout, and a keystroke.
- 7.27. Relaxed FOR and SWITCH Syntax
- For consistency with the extended IF and WHILE syntax, the FOR and
- SWITCH control lists may (but need not be) enclosed in parentheses:
- FOR ( \%i 1 \%n 1 ) { command-list... }
- SWITCH ( \%c ) { command-list... }
- In the FOR command, the increment item can be omitted if the control
- list is enclosed in parentheses, in which case the increment defaults
- appropriately to 1 or -1, depending on the values of the first two
- variables.
- As with IF, the parentheses around the FOR-command control list must be
- set off by spaces (in the SWITCH command, the spaces are not required
- since the SWITCH expression is a single arithmetic expression).
- Also, outer braces around the command list are supplied automatically
- if you omit them, e.g.:
- FOR ( \%i 1 %n 1 ) echo \%i
- 8. USING OTHER FILE TRANSFER PROTOCOLS
- In C-Kermit 7.0, alternative protocols can be selected using switches.
- Switches are described in Section 1.5; the use of
- protocol-selection switches is described in Section 4.7.1.
- Example:
- send /binary /protocol:zmodem x.tar.gz
- Note that file transfer recovery works only with Kermit and Zmodem
- protocols. With Zmodem, recovery can be initiated only by the sender.
- Only pre-1988 versions of the publicly-distributed sz/rz programs use
- Standard I/O; those released later than that do not use Standard I/O
- and therefore do not work with REDIRECT. However, Omen Technology does
- offer an up-to-date redirectable version called crzsz, which must be
- licensed for use:
- "Unix Crz and Csz support XMODEM, YMODEM, and ZMODEM transfers when
- called by dial-out programs such as Kermit and certain versions of
- cu(1). They are clients designed for this use.
- "Crz and Csz are Copyrighted shareware programs. Use of these
- programs beyond a brief evaluation period requires registration.
- Please print the "mailer.rz" file, fill out the form and return same
- with your registration."
- To use the crzsz programs as your external XYZMODEM programs in
- C-Kermit, follow the instructions in the book, but put a "c" before
- each command, e.g.:
- set protocol zmodem {csz %s} {csz -a %s} crz crz crz crz
- To use Zmodem protocol over Telnet or other non-transparent
- connections, you might need to add the -e (Escape) option:
- set protocol zmodem {csz -e %s} {csz -e -a %s} crz crz crz crz
- 9. COMMAND-LINE OPTIONS
- 9.0. Extended-Format Command-Line Options
- Standard UNIX command line options are a single letter. C-Kermit has
- run out of letters, so new options are in a new extended format:
- --word[:arg]
- where a keyword (rather than a single letter) specifies the function,
- and if an argument is to be included, it is separated by a colon (or
- equal sign). Most of the new extended-format command-line options are
- only for use with the Internet Kermit Service Daemon; see theIKSD
- Administration Guide for details. However, several of them are also
- general in nature:
- --nointerrupts
- Disables keyboard interrupts that are normally enabled, which
- are usually Ctrl-C (to interrupt a command) and Ctrl-Z (UNIX
- only, to suspend C-Kermit).
- --help
- Lists the extended command-line options that are available in
- your version of C-Kermit. If any options seem to be missing,
- that is because your copy of C-Kermit was built with
- compile-time options to deselect them.
- --helpfile:filename
- Specifies the name of a file to be displayed if the user types
- HELP (not followed by a specific command or topic), in place of
- the built-in top-level help text. The file need not fit on one
- screen; more-prompting is used if the file is more than one
- screen long if COMMAND MORE-PROMPTING is ON, as it is by
- default.
- --bannerfile:filename
- The name of a file containing a message to be printed after the
- user logs in, in place of the normal message (Copyright notice,
- "Type HELP or ? for help", "Default transfer mode is...", etc).
- --cdmessage:{on,off,0,1,2}
- For use in the Server-Side Server configuration; whenever the
- client tells the server to change directory, the server sends
- the contents of a "read me" file to the client's screen. This
- feature is On by default, and operates only in client/server
- mode when ON or 1. If set to 2 or higher, it also operates when
- the CD command is given at the IKSD> prompt. Synonym: --cdmsg.
- --cdfile:filename
- When cdmessage is on, this is the name of the "read me" file to
- be sent. Normally you would specify a relative (not absolute)
- name, since the file is opened using the literal name you
- specified, after changing to the new directory. Example:
- --cdfile:READ.ME
- You can also give a list of up to 8 filenames by (a) enclosing
- each filename in braces, and (b) enclosing the entire list in
- braces. Example:
- --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this-
- first}} When a list is given, it is searched from left to right
- and the first file found is displayed. The default list for UNIX
- is:
- {{./.readme}{README.TXT}{READ.ME}}
- 9.1. Command Line Personalities
- Beginning in version 7.0, if the C-Kermit binary is renamed to "telnet"
- (or TELNET.EXE, telnet.pr, etc, depending on the platform), it accepts
- the Telnet command line:
- telnet [ host [ port ] ]
- In Unix, you can achieve the same effect with a symlink:
- cd /usr/bin
- mv telnet oldtelnet
- ln -ls /usr/local/bin/kermit telnet
- When installed in this manner, C-Kermit always reads its initialization
- file. If no host (and therefore no port) is given, C-Kermit starts in
- interactive prompting mode. If a host is given as the first
- command-line argument, C-Kermit makes a connection to it. The host
- argument can be an IP host name or address, or the name of a TCP/IP
- entry in your C-Kermit network directory.
- If a port is given, it is used. If a port is not given, then if the
- hostname was found in your network directory and port was also listed
- there, then that port is used. Otherwise port 23 (the Telnet port) is
- used.
- When C-Kermit is called "telnet" and it is invoked with a hostname on
- the command line, it exits automatically when the connection is closed.
- While the connection is open, however, you may escape back and forth as
- many times as you like, transfer files, etc.
- An rlogin personality is also available, but it is less useful, at
- least in UNIX and VMS, where the Rlogin TCP port is privileged.
- The new variable \v(name) indicates the name with which C-Kermit was
- invoked ("kermit", "wermit", "k95", "telnet", etc).
- 9.2. Built-in Help for Command Line Options
- "kermit -h", given from the system prompt, lists as many command-line
- options as will fit on a standard 24x80 screen. For more comprehensive
- help, use the interactive HELP OPTIONS command that was added in
- C-Kermit 7.0:
- HELP OPTIONS
- Explains how command-line options work, their syntax, etc.
- HELP OPTIONS ALL
- Lists all command-line options and gives brief help about each one.
- HELP OPTION x
- Gives brief help about option "x".
- HELP EXTENDED-OPTIONS
- Lists the available extended-format command-line options.
- HELP EXTENDED-OPTION xxx
- Gives help for the specified extended option.
- 9.3. New Command-Line Options
- Command-line options added since C-Kermit 6.0 are:
- +
- (plus sign by itself): The next argument is the name of a script
- to execute; all subsequent arguments are ignored by C-Kermit
- itself, but passed to the script as top-level copies of \%1,
- \%2, etc; the \&_[] is also set accordingly. \%0 and \&_[0]
- become the name of the script file, rather than the pathname of
- the C-Kermit program, which is its normal value. Primarily for
- use in the top line of "Kerbang" scripts in UNIX (see
- Section 7.19). Example from UNIX command line:
- $ kermit [ regular kermit args ] + filename
- Sample first line of Kerbang script:
- #!/usr/local/bin/kermit +
- --
- (two hyphens surrounded by whitespace) Equivalent to "=", for
- compatibility with UNIX getopt(1,3).
- -G
- GET (like -g), but send the incoming file to standard output.
- Example: "kermit -G oofa.txt | lpr" retrieves a file from your
- local computer (providing it is running a Kermit program that
- supports the autodownload feature and has it enabled) and prints
- it.
- -O
- equivalent to -x (start up in server mode), but exits after the
- first client command has been executed (mnemonic: O = Only One).
- This one is handy replacing "kermit -x" in the "automatically
- start Kermit on the other end" string:
- set protocol kermit {kermit -ir} {kermit -r} {kermit -x}
- since -x leaves the remote Kermit in server mode after the
- transfer, which can be confusing, whereas -O makes it go away
- automatically after the transfer.
- -L
- Recursive, when used in combination with -s (mnemonic: L =
- Levels). In UNIX or other environments where the shell expands
- wildcards itself, the -s argument, if it contains wildcards,
- must be quoted to prevent this, e.g.:
- kermit -L -s "*.c"
- In UNIX only, "kermit -L -s ." means to send the current
- directory tree. SeeSections 4.10 and4.11 about
- recursive file transfer.
- -V
- Equivalent to SET FILE PATTERNS OFF ( Section 4.3) and SET
- TRANSFER MODE MANUAL. In other words, take the FILE TYPE setting
- literally. For example, "kermit -VT oofa.bin" means send the
- file in Text mode, no matter what its name is and no matter
- whether a kindred spirit is recognized at the other end of the
- connection.
- -0
- (digit zero) means "be 100% transparent in CONNECT mode". This
- is equivalent to the following series of commands: SET PARITY
- NONE, SET COMMAND BYTESIZE 8, SET TERMINAL BYTESIZE 8, SET FLOW
- NONE, SET TERM ESCAPE DISABLED, SET TERM CHAR TRANSPARENT, SET
- TERM AUTODOWNLOAD OFF, SET TERM APC OFF, SET TELOPT KERMIT
- REFUSE REFUSE.
- 10. C-KERMIT AND G-KERMIT
- Every multifunctioned and long-lived software program grows in
- complexity and size over time to meet the needs and requests of its
- users and the demands of the underlying technology as it changes.
- Eventually users begin to notice how big the application has grown, how
- much disk space it occupies, how long it takes to load, and they start
- to long for the good old days when it was lean and mean. Not long after
- that they begin asking for a "light" version that only does the basics
- with no frills.
- And so it is with C-Kermit. A "light" version of Kermit was released
- (for UNIX only) in December 1999 under the GNU General Public License;
- thus it is called G-Kermit (for GNU Kermit). All it does is send and
- receive files, period. You can find it at:
- http://www.columbia.edu/kermit/gkermit.html
- Where the C-Kermit 7.0 binary might be anywhere from 1 to 3 million
- bytes in size, the G-Kermit binary ranges from 30K to 100K, depending
- on the underlying architecture (RISC vs CISC, etc).
- G-Kermit and C-Kermit may reside side-by-side on the same computer.
- G-Kermit does not make connections; it does not have a script language;
- it does not translate character sets. G-Kermit may be used instead of
- C-Kermit when:
- * It is on the remote end.
- * Files are to be transferred in binary mode or in text mode without
- character-set translation.
- * File timestamps don't need to be preserved.
- In such cases G-Kermit might be preferred since it generally starts up
- faster, and yet transfers files just as fast on most (but not
- necessarily all) kinds of connections; for example, it supports
- streaming ( Section 4.20).
- G-Kermit is also handy for bootstrapping. It is easier to load on a new
- computer than C-Kermit -- it fits on a floppy diskette with plenty of
- room to spare. Thus if you have (say) an old PC running (say) SCO Xenix
- and no network connection, you can download the Xenix version of
- G-Kermit to (say) a DOS or Windows PC, copy it to diskette, read the
- diskette on Xenix with "dosread", and then use G-Kermit to receive
- C-Kermit (which does not fit on a diskette). If diskettes aren't an
- option, other bootstrapping methods are possible too -- see the
- G-Kermit web page for details.
- III. APPENDICES
- III.1. Character Set Tables
- III.1.1. The Hewlett Packard Roman8 Character Set
- dec col/row oct hex description
- 160 10/00 240 A0 (Undefined)
- 161 10/01 241 A1 A grave
- 162 10/02 242 A2 A circumflex
- 163 10/03 243 A3 E grave
- 164 10/04 244 A4 E circumflex
- 165 10/05 245 A5 E diaeresis
- 166 10/06 246 A6 I circumflex
- 167 10/07 247 A7 I diaeresis
- 168 10/08 250 A8 Acute accent
- 169 10/09 251 A9 Grave accent
- 170 10/10 252 AA Circumflex accent
- 171 10/11 253 AB Diaeresis
- 172 10/12 254 AC Tilde accent
- 173 10/13 255 AD U grave
- 174 10/14 256 AE U circumflex
- 175 10/15 257 AF Lira symbol
- 176 11/00 260 B0 Top bar (macron)
- 177 11/01 261 B1 Y acute
- 178 11/02 262 B2 y acute
- 179 11/03 263 B3 Degree Sign
- 180 11/04 264 B4 C cedilla
- 181 11/05 265 B5 c cedilla
- 182 11/06 266 B6 N tilde
- 183 11/07 267 B7 n tilde
- 184 11/08 270 B8 Inverted exclamation mark
- 185 11/09 271 B9 Inverted question mark
- 186 11/10 272 BA Currency symbol
- 187 11/11 273 BB Pound sterling symbol
- 188 11/12 274 BC Yen symbol
- 189 11/13 275 BD Paragraph
- 190 11/14 276 BE Florin (Guilder) symbol
- 191 11/15 277 BF Cent symbol
- 192 12/00 300 C0 a circumflex
- 193 12/01 301 C1 e circumflex
- 194 12/02 302 C2 o circumflex
- 195 12/03 303 C3 u circumflex
- 196 12/04 304 C4 a acute
- 197 12/05 305 C5 e acute
- 198 12/06 306 C6 o acute
- 199 12/07 307 C7 u acute
- 200 12/08 310 C8 a grave
- 201 12/09 311 C9 e grave
- 202 12/10 312 CA o grave
- 203 12/11 313 CB u grave
- 204 12/12 314 CC a diaeresis
- 205 12/13 315 CD e diaeresis
- 206 12/14 316 CE o diaeresis
- 207 12/15 317 CF u diaeresis
- 208 13/00 320 D0 A ring
- 209 13/01 321 D1 i circumflex
- 210 13/02 322 D2 O with stroke
- 211 13/03 323 D3 AE digraph
- 212 13/04 324 D4 a ring
- 213 13/05 325 D5 i acute
- 214 13/06 326 D6 o with stroke
- 215 13/07 327 D7 ae digraph
- 216 13/08 330 D8 A diaeresis
- 217 13/09 331 D9 i grave
- 218 13/10 332 DA O diaeresis
- 219 13/11 333 DB U diaeresis
- 220 13/12 334 DC E acute
- 221 13/13 335 DD i diaeresis
- 222 13/14 336 DE German sharp s
- 223 13/15 337 DF O circumflex
- 224 14/00 340 E0 A acute
- 225 14/01 341 E1 A tilde
- 226 14/02 342 E2 a tilde
- 227 14/03 343 E3 Icelandic Eth
- 228 14/04 344 E4 Icelandic eth
- 229 14/05 345 E5 I acute
- 230 14/06 346 E6 I grave
- 231 14/07 347 E7 O acute
- 232 14/08 350 E8 O grave
- 233 14/09 351 E9 O tilde
- 234 14/10 352 EA o tilde
- 235 14/11 353 EB S caron
- 236 14/12 354 EC s caron
- 237 14/13 355 ED U acute
- 238 14/14 356 EE Y diaeresis
- 239 14/15 357 EF y diaeresis
- 240 15/00 360 F0 Icelandic Thorn
- 241 15/01 361 F1 Icelandic thorn
- 242 15/02 362 F2 Middle dot
- 243 15/03 363 F3 Greek mu
- 244 15/04 364 F4 Pilcrow sign
- 245 15/05 365 F5 Fraction 3/4
- 246 15/06 366 F6 Long dash, horizontal bar
- 247 15/07 367 F7 Fraction 1/4
- 248 15/08 370 F8 Fraction 1/2
- 249 15/09 371 F9 Feminine ordinal
- 250 15/10 372 FA Masculine ordinal
- 251 15/11 373 FB Left guillemot
- 252 15/12 374 FC Solid box
- 253 15/13 375 FD Right guillemot
- 254 15/14 376 FE Plus or minus sign
- 255 15/15 377 FF (Undefined)
- III.1.2. Greek Character Sets
- III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet = ELOT 928
- dec col/row oct hex description
- 160 10/00 240 A0 No-break space
- 161 10/01 241 A1 Left single quotation mark
- 162 10/02 242 A2 right single quotation mark
- 163 10/03 243 A3 Pound sign
- 164 10/04 244 A4 (UNUSED)
- 165 10/05 245 A5 (UNUSED)
- 166 10/06 246 A6 Broken bar
- 167 10/07 247 A7 Paragraph sign
- 168 10/08 250 A8 Diaeresis (Dialytika)
- 169 10/09 251 A9 Copyright sign
- 170 10/10 252 AA (UNUSED)
- 171 10/11 253 AB Left angle quotation
- 172 10/12 254 AC Not sign
- 173 10/13 255 AD Soft hyphen
- 174 10/14 256 AE (UNUSED)
- 175 10/15 257 AF Horizontal bar (Parenthetiki pavla)
- 176 11/00 260 B0 Degree sign
- 177 11/01 261 B1 Plus-minus sign
- 178 11/02 262 B2 Superscript two
- 179 11/03 263 B3 Superscript three
- 180 11/04 264 B4 Accent (tonos)
- 181 11/05 265 B5 Diaeresis and accent (Dialytika and Tonos)
- 182 11/06 266 B6 Alpha with accent
- 183 11/07 267 B7 Middle dot (Ano Teleia)
- 184 11/08 270 B8 Epsilon with accent
- 185 11/09 271 B9 Eta with accent
- 186 11/10 272 BA Iota with accent
- 187 11/11 273 BB Right angle quotation
- 188 11/12 274 BC Omicron with accent
- 189 11/13 275 BD One half
- 190 11/14 276 BE Upsilon with accent
- 191 11/15 277 BF Omega with accent
- 192 12/00 300 C0 iota with diaeresis and accent
- 193 12/01 301 C1 Alpha
- 194 12/02 302 C2 Beta
- 195 12/03 303 C3 Gamma
- 196 12/04 304 C4 Delta
- 197 12/05 305 C5 Epsilon
- 198 12/06 306 C6 Zeta
- 199 12/07 307 C7 Eta
- 200 12/08 310 C8 Theta
- 201 12/09 311 C9 Iota
- 202 12/10 312 CA Kappa
- 203 12/11 313 CB Lamda
- 204 12/12 314 CC Mu
- 205 12/13 315 CD Nu
- 206 12/14 316 CE Ksi
- 207 12/15 317 CF Omicron
- 208 13/00 320 D0 Pi
- 209 13/01 321 D1 Rho
- 210 13/02 322 D2 (UNUSED)
- 211 13/03 323 D3 Sigma
- 212 13/04 324 D4 Tau
- 213 13/05 325 D5 Upsilon
- 214 13/06 326 D6 Phi
- 215 13/07 327 D7 Khi
- 216 13/08 330 D8 Psi
- 217 13/09 331 D9 Omega
- 218 13/10 332 DA Iota with diaeresis
- 219 13/11 333 DB Upsilon with diaeresis
- 220 13/12 334 DC alpha with accent
- 221 13/13 335 DD epsilon with accent
- 222 13/14 336 DE eta with accent
- 223 13/15 337 DF iota with accent
- 224 14/00 340 E0 upsilon with diaeresis and accent
- 225 14/01 341 E1 alpha
- 226 14/02 342 E2 beta
- 227 14/03 343 E3 gamma
- 228 14/04 344 E4 delta
- 229 14/05 345 E5 epsilon
- 230 14/06 346 E6 zeta
- 231 14/07 347 E7 eta
- 232 14/08 350 E8 theta
- 233 14/09 351 E9 iota
- 234 14/10 352 EA kappa
- 235 14/11 353 EB lamda
- 236 14/12 354 EC mu
- 237 14/13 355 ED nu
- 238 14/14 356 EE ksi
- 239 14/15 357 EF omicron
- 240 15/00 360 F0 pi
- 241 15/01 361 F1 rho
- 242 15/02 362 F2 terminal sigma
- 243 15/03 363 F3 sigma
- 244 15/04 364 F4 tau
- 245 15/05 365 F5 upsilon
- 246 15/06 366 F6 phi
- 247 15/07 367 F7 khi
- 248 15/08 370 F8 psi
- 249 15/09 371 F9 omega
- 250 15/10 372 FA iota with diaeresis
- 251 15/11 373 FB upsilon with diaeresis
- 252 15/12 374 FC omicron with diaeresis
- 253 15/13 375 FD upsilon with accent
- 254 15/14 376 FE omega with accent
- 255 15/15 377 FF (UNUSED)
- III.1.2.2. The ELOT 927 Character Set
- dec col/row oct hex description
- 32 02/00 40 20 SPACE
- 33 02/01 41 21 EXCLAMATION MARK
- 34 02/02 42 22 QUOTATION MARK
- 35 02/03 43 23 NUMBER SIGN
- 36 02/04 44 24 DOLLAR SIGN
- 37 02/05 45 25 PERCENT SIGN
- 38 02/06 46 26 AMPERSAND
- 39 02/07 47 27 APOSTROPHE
- 40 02/08 50 28 LEFT PARENTHESIS
- 41 02/09 51 29 RIGHT PARENTHESIS
- 42 02/10 52 2A ASTERISK
- 43 02/11 53 2B PLUS SIGN
- 44 02/12 54 2C COMMA
- 45 02/13 55 2D HYPHEN, MINUS SIGN
- 46 02/14 56 2E PERIOD, FULL STOP
- 47 02/15 57 2F SOLIDUS, SLASH
- 48 03/00 60 30 DIGIT ZERO
- 49 03/01 61 31 DIGIT ONE
- 50 03/02 62 32 DIGIT TWO
- 51 03/03 63 33 DIGIT THREE
- 52 03/04 64 34 DIGIT FOUR
- 53 03/05 65 35 DIGIT FIVE
- 54 03/06 66 36 DIGIT SIX
- 55 03/07 67 37 DIGIT SEVEN
- 56 03/08 70 38 DIGIT EIGHT
- 57 03/09 71 39 DIGIT NINE
- 58 03/10 72 3A COLON
- 59 03/11 73 3B SEMICOLON
- 60 03/12 74 3C LESS-THAN SIGN, LEFT ANGLE BRACKET
- 61 03/13 75 3D EQUALS SIGN
- 62 03/14 76 3E GREATER-THAN SIGN, RIGHT ANGLE BRACKET
- 63 03/15 77 3F QUESTION MARK
- 64 04/00 100 40 COMMERCIAL AT SIGN
- 65 04/01 101 41 CAPITAL LETTER A
- 66 04/02 102 42 CAPITAL LETTER B
- 67 04/03 103 43 CAPITAL LETTER C
- 68 04/04 104 44 CAPITAL LETTER D
- 69 04/05 105 45 CAPITAL LETTER E
- 70 04/06 106 46 CAPITAL LETTER F
- 71 04/07 107 47 CAPITAL LETTER G
- 72 04/08 110 48 CAPITAL LETTER H
- 73 04/09 111 49 CAPITAL LETTER I
- 74 04/10 112 4A CAPITAL LETTER J
- 75 04/11 113 4B CAPITAL LETTER K
- 76 04/12 114 4C CAPITAL LETTER L
- 77 04/13 115 4D CAPITAL LETTER M
- 78 04/14 116 4E CAPITAL LETTER N
- 79 04/15 117 4F CAPITAL LETTER O
- 80 05/00 120 50 CAPITAL LETTER P
- 81 05/01 121 51 CAPITAL LETTER Q
- 82 05/02 122 52 CAPITAL LETTER R
- 83 05/03 123 53 CAPITAL LETTER S
- 84 05/04 124 54 CAPITAL LETTER T
- 85 05/05 125 55 CAPITAL LETTER U
- 86 05/06 126 56 CAPITAL LETTER V
- 87 05/07 127 57 CAPITAL LETTER W
- 88 05/08 130 58 CAPITAL LETTER X
- 89 05/09 131 59 CAPITAL LETTER Y
- 90 05/10 132 5A CAPITAL LETTER Z
- 91 05/11 133 5B LEFT SQUARE BRACKET
- 92 05/12 134 5C REVERSE SOLIDUS, BACKSLASH
- 93 05/13 135 5D RIGHT SQUARE BRACKET
- 94 05/14 136 5E CIRCUMFLEX ACCENT
- 95 05/15 137 5F UNDERSCORE
- 96 06/00 140 60 ACCENT GRAVE
- 97 06/01 141 61 GREEK LETTER ALPHA
- 98 06/02 142 62 GREEK LETTER BETA
- 99 06/03 143 63 GREEK LETTER GAMMA
- 100 06/04 144 64 GREEK LETTER DELTA
- 101 06/05 145 65 GREEK LETTER EPSILON
- 102 06/06 146 66 GREEK LETTER ZETA
- 103 06/07 147 67 GREEK LETTER ETA
- 104 06/08 150 68 GREEK LETTER THETA
- 105 06/09 151 69 GREEK LETTER IOTA
- 106 06/10 152 6A GREEK LETTER KAPPA
- 107 06/11 153 6B GREEK LETTER LAMDA
- 108 06/12 154 6C GREEK LETTER MU
- 109 06/13 155 6D GREEK LETTER NU
- 110 06/14 156 6E GREEK LETTER KSI
- 111 06/15 157 6F GREEK LETTER OMICRON
- 112 07/00 160 70 GREEK LETTER PI
- 113 07/01 161 71 GREEK LETTER RHO
- 114 07/02 162 72 GREEK LETTER SIGMA
- 115 07/03 163 73 GREEK LETTER TAU
- 116 07/04 164 74 GREEK LETTER UPSILON
- 117 07/05 165 75 GREEK LETTER FI
- 118 07/06 166 76 GREEK LETTER XI
- 119 07/07 167 77 GREEK LETTER PSI
- 120 07/08 170 78 GREEK LETTER OMEGA
- 121 07/09 171 79 SPACE
- 122 07/10 172 7A SPACE
- 123 07/11 173 7B LEFT CURLY BRACKET, LEFT BRACE
- 124 07/12 174 7C VERTICAL LINE, VERTICAL BAR
- 125 07/13 175 7D RIGHT CURLY BRACKET, RIGHT BRACE
- 126 07/14 176 7E TILDE
- 127 07/15 177 7F RUBOUT, DELETE
- III.1.2.3. PC Code Page 869
- (to be filled in...)
- III.2. Updated Country Codes
- Date: Mon, 7 Apr 1997 23:23:49 EDT
- From: Dave Leibold <dleibold@else.net>
- Newsgroups: comp.dcom.telecom
- Subject: Ex-USSR Country Codes Profile
- Organization: TELECOM Digest
- Ex-USSR Country Codes Profile
- 4 April 1997
- Below is a summary of the country codes that have formed in the wake of
- the USSR dissolution, along with some updated findings and reports.
- Additional or corrected information on any of these nations would be
- welcome (c/o dleibold@else.net).
- * Kyrgyz Republic country code 996 will take effect, at least in
- Canada, effective 1 May 1997, according to CRTC Telecom Order
- 97-464, based on Stentor Tariff Notice 433. There is no indication
- whether there will be a permissive dialing period involved or for
- how long such a permissive operation would remain.
- * Country code 992 was reported as a recent assignment for
- Tajikistan, which will be moving from country code 7 at some
- unknown time.
- * Uzbekistan has its own country code assignment, but I have no
- information if this is in service yet or what implementation dates
- have been set.
- * Kazakstan does not have a known separate country code assignment at
- present. It remains in country code 7 for the time being.
- * Russia seems destined to keep country code 7.
- * Recent news reports speak of some agreements forming between Russia
- and Belarus. While there is no outright reunification yet, there is
- expected to be much closer ties between the two nations. Whether
- this will lead to a reunification of telephone codes remains to be
- seen.
- In the table, "Effective" means the date at which the country code
- began service (which could vary according to the nation). "Mandatory"
- means the date at which the country code 7 is invalid for calls to that
- nation. There are a number of question marks since exact dates have not
- been collected in all cases.
- CC Nation Effective Mandatory Notes
- 370 Lithuania 1993? ??? Announced Jan 1993
- 371 Latvia 1993? ???
- 372 Estonia 1 Feb 1993? March 1993?
- 373 Moldova 1993? ??? Announced Jan 1993
- 374 Armenia 1 May 1995 1 July 1995 Announced Jan 1995 (ITU)
- 375 Belarus 16 Apr 1995 1997?
- 380 Ukraine 16 Apr 1995 Oct 1995?
- 7 Kazakstan (no known changes)
- 7 Russia (presumably not changing)
- 992 Tajikistan ??? ??? Announced 1996-7?
- 993 Turkmenistan 3 Jan 1997 3 Apr 1997 Canada as of 29 Nov 1996
- 994 Azerbaijan Sept 1994? ??? Announced 1992
- 995 Georgia 1994? ??? ref: Telecom Digest Oct 1994
- 996 Kyrgyz Republic 1 May 1997 ??? ref: Stentor Canada/CRTC
- 998 Uzbekistan ??? ??? Announced 1996? (ITU)
- Details courtesy Toby Nixon, ITU, Stentor (Canada), CRTC (Canada),
- TELECOM Digest (including information collected for the country code
- listings).
- IV. ERRATA & CORRIGENDA
- The following errors inUsing C-Kermit, Second Edition, first
- printing, have been noted.
- First, some missing acknowledgements for C-Kermit 6.0: JE Jones of
- Microware for help with OS-9, Nigel Roles for his help with Plan 9,
- Lucas Hart for help with VMS and Digital UNIX, Igor Kovalenko for his
- help with QNX. And later, to Susan Kleinmann for her help with Debian
- Linux packaging; Patrick Volkerding for his help with Slackware Linux
- packaging; Jim Knoble for his help with Red Hat Linux packaging; and to
- dozens of others for sending individual C-Kermit binaries for varied
- and diverse platforms.
- Thanks to James Spath for both binaries and reporting many of the typos
- noted below. Also to Dat Thuc Nguyen for spotting several typos.
- PAGE REMARKS
- COVER "COS" is a misprint. There is no COS. Pretend it says "SCO" or "VOS".
- (This is fixed in the second printing.)
- xxi Second line: Fred Smith's affiliation should be Computrition.
- 83 Change "commands other" to "commands as other" (1st paragraph)
- 87 Change "The the" to "The" (2nd paragraph)
- 92 "set modem-type user-defined supra" should be "set modem type ..."
- 95 Change "VI" to "vi" (1st paragraph)
- 96 Change "it it" to "it is" (1st paragraph)
- 97 Change "advantage a literal" to "advantage of a literal" (2nd
- paragraph)
- 102 The call-waiting example would be better as SET DIAL PREFIX *70W
- (rather than "*70,") because the former will not cause an incorrect
- call to be placed with pulse dialing.
- 123 Third paragraph from bottom: "..otherwise if a your local username.."
- should be "..otherwise your local username..".
- 160 Delete the "it" between "and" and "to" (2nd paragraph)
- 185 In "When TRANSFER DISPLAY is OFF, C-Kermit skips the display...",
- "OFF" should be "NONE".
- 187 The last paragraph says the "A command" is ignored, should be "S".
- 194 Change "it known" to "it is known" (4th paragraph).
- 235 In C-Kermit 7.0, the syntax of the GET command changed. MGET now
- must be used to get a list of files and there is no more multiline
- GET command.
- 268 Last paragraph: "effect" should be "affect".
- 275 In the SET PROTOCOL KERMIT description, the following sentence is
- incorrect and should be removed: 'If you omit the commands, the
- default ones are restored: "kermit -ir" and "kermit -r" respectively".
- The correct information is given at the bottom of page 281.
- 279 9th line. The decimal value of ST is 156, not 155.
- 295 In the stepping stones, skip ahead to Chapter 17 on p. 327.
- 298 Table 16-2, Portuguese entry. Column 4/00 should show section sign,
- not acute accent.
- 316 Other languages written in the Hebrew alphabet include Karaim (a Turkic
- language spoken in Lithuania and Poland), Judeo-Kurdish, and Judeo-
- Georgian.
- 332 UNDEFINE definition, change "This just" to "This is just".
- 344 It might be necessary to set the modem's pulse generation rate when
- sending numeric pages; most Hayes compatible modems use the S11
- register for this.
- 350 Delete "is" from between "It" and "ceases" (4th paragraph)
- 351 Top - both occurrences of "print \%a" should be "echo \%a".
- 364 \v(input) and \v(query) out of alphabetical order.
- 378 In the MYSEND macro, "if not \m(rc) goto bad" should be:
- "if \m(rc) goto bad" (remove the "not").
- 382-383 It should be stated that the loop control variable must be of the \%a
- type, or else an array element; macro names can not be used for this.
- 383 In line 3, "\%f[\%i]" should be "\&f[\%i]".
- 383 In the sort example, it should be stated that the array is 1-based.
- 387 Change "You can list" to "You can get a list" (5th paragraph)
- 393 \Fverify() description. The 3rd sentence could be stated more clearly
- as "If all characters in string2 are also in string1, 0 is returned."
- 398 Copying \ffiles() results to an array before is not required as of
- C-Kermit 7.0 (see Section 7.3).
- 403 In "(\%a + 3) * (\%b 5)", a minus sign is missing between b and 5.
- 407 C-Kermit 7.0 no longer supports multiline GET. Change
- "get, \%1, \%2" to "get {\%1} {\%2}" or "get /as:{\%2} {\%1}".
- 409 READ example while loop should be:
- while success { echo \m(line), read line }
- 409 "WRITE file" should be "WRITE keyword" (you can't put a filename there)
- (The same applies to WRITE-LINE / WRITELN).
- 414 \Funhexify() missing from Table 18-3.
- 425 MINPUT definition, change 2nd "text2" to "text3".
- 436 Several lines are missing from the UNIXLOGIN macro listing.
- After the "xif fail" block, insert:
- out \%1\13 ; Send username, carriage return
- inp 5 Password: ; Wait 5 sec for this prompt
- if fail end 1 No password prompt
- pause ; Wait a sec
- out \%2\13 ; Send password
- 440 Change "set terminal byteszie" to "set terminal bytesize".
- Change "input Password:" to "input 10 Password".
- 448 Franchise script: "access line" should be "access \m(line)".
- 453 There are two incorrectly coded IF statements in the DELIVER macro
- definition. Replace both occurrences of "if > \%1 \%3 {" with
- "xif > \%i \%3 {" (replace "if" by "xif" and "\%1" with "\%i").
- 453 "the the" (last paragraph) should be "the".
- 454 EOT (last paragraph) is End of Transmission, not End of Text.
- 457 _DEFINE definition: "name constructed" should be "name is constructed".
- 457 "macro for and" (last paragraph) should be "macro and".
- 459 Should explain that \v(user) is a legal abbreviation of \v(userid).
- 480 Figure II-2 is backwards; the least-significant bit is transmitted
- first, then up to the highest, and the parity bit last.
- 534 The VMS Appendix section on Odd Record Lengths no longer applies;
- C-Kermit 7.0 handles odd record lengths as well as even ones.
- 559 Table VIII-3, Portuguese entry. Column 4/00 should show section sign,
- not acute accent.
- 560-563 HP-Roman8 missing from Table VII-4; there wasn't room to squeeze it in.
- It is listed in section II(6).
- 565 "d stroke" in Table VII-5 has the wrong appearance; the stem should
- be upright. The letter shown in the table is actually a lowercase
- Icelandic eth, which has a curved stem.
- 601-604 BeBox, BeOS, Plan 9, and probably others not listed in trademarks.
- 604 The words "SCRIBE TEXT FORMATTER" appear at the end of the last
- sentence of the first paragraph of the Colophon. They should have
- been in the Index.
- Index: Missing entries: SET { SEND, RECEIVE } PATHNAMES, Call waiting, ...
- \F() Page 605, add also 413-414
- \Fbreak 389
- \Fcapitalize 390
- \Fchecksum 414
- \Fcrc16 414
- \Fexecute 414
- \Fhexify 390
- \Fltrim 391
- \Frepeat 392
- \Fspawn 392
- \Ftod2secs 399
- \v() built_in Page 606, add also 361-364
- \v(_line) 354, 361
- \v(apcactive) 361
- \v(charset) 362
- \v(cpu) 362
- \v(crc16) 357, 362
- \v(d$xxx) add page 362
- \v(dialnumber) 362
- \v(dialresult) 362
- \v(errno) 362
- \v(errstring) 362
- \v(exedir) 362
- \v(inidir) 363
- \v(ipaddress) 363
- \v(keyboard) 363
- \v(macro) 363
- \v(minput) 363
- \v(m_xxx) 94, 363
- \v(password) 364
- \v(query) 364
- \v(prompt) 364
- \v(speed) 356, 364
- \v(startup) 364
- \v(status) 364
- \v(sysid) 364
- \v(system) 364
- \v(fsize) at lower half page 606 should read \v(tfsize)
- \v(xversion) 364
- BEEP Command 40
- SET FLOW 62, 212
- Figure II-5 on page 493. The pin assignments of the Mini Din-8
- connector are not described anywhere. As noted in the text, these tend
- to vary from vendor to vendor. One common arrangement is:
- 1. HSKout (Handshake out -- definition depends on software)
- 2. HSKin (Handshake in or external clock)
- 3. TxD-
- 4. Not used
- 5. RxD-
- 6. TxD+
- 7. Not used
- 8. RxD+
- Note the "balanced pairs" for Receive Data (RxD) and Transmit Data
- (TxD), and the utter lack of modem signals. These connectors follow the
- RS-423 standard, rather than RS-232. In some arrangements, Pin 1 is
- used for DTR and Pin 2 for CD; in others Pin 1 is RTS and Pin 2 is CTS.
- Please send reports of other errors to the authors, as well as
- suggestions for improvements, additional index entries, and any other
- comments:
- kermit@columbia.edu
- APPENDIX V. ADDITIONAL COPYRIGHT NOTICES
- The following copyrights cover some of the source code used in the
- development of C-Kermit, Kermit 95, or Kermit 95 support libraries.
- /*****************************************************************************/
- /* */
- /* Copyright (c) 1995 by Oy Online Solutions Ltd. */
- /* */
- /* Distribution of this source code is strictly forbidden. Use of this */
- /* source code is granted to the University of Columbia C-Kermit project */
- /* to be distributed in binary format only. Please familiarize yourself */
- /* with the accompanying LICENSE.P file. */
- /* */
- /*****************************************************************************/
- used for Xmodem, Ymodem, and Zmodem protocol in Kermit 95 (p95.dll,
- p2.dll)
- Copyright (c) 1997 Stanford University
- The use of this software for revenue-generating purposes may require a
- license from the owners of the underlying intellectual property.
- Specifically, the SRP-3 protocol may not be used for revenue-generating
- purposes without a license.
- Within that constraint, permission to use, copy, modify, and distribute
- this software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notices and this
- permission notice appear in all copies of the software and related
- documentation.
- THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
- ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
- ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- SOFTWARE.
- Used for Secure Remote Password (TM) protocol (SRP) in C-Kermit, Kermit
- 95 (k95.exe, k2.exe, k95crypt.dll, k2crypt.dll)
- Copyright 1990 by the Massachusetts Institute of Technology. All Rights
- Reserved.
- Export of this software from the United States of America may require a
- specific license from the United States Government. It is the
- responsibility of any person or organization contemplating export to
- obtain such a license before exporting.
- WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
- this software and its documentation for any purpose and without fee is
- hereby granted, provided that the above copyright notice appear in all
- copies and that both that copyright notice and this permission notice
- appear in supporting documentation, and that the name of M.I.T. not be
- used in advertising or publicity pertaining to distribution of the
- software without specific, written prior permission. M.I.T. makes no
- representations about the suitability of this software for any purpose.
- It is provided "as is" without express or implied warranty.
- Used for Telnet Authentication Option, Telnet Encryption Option, and
- Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
- k95crypt.dll, k2crypt.dll)
- Copyright (c) 1991, 1993 The Regents of the University of California.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the
- distribution.
- 3. All advertising materials mentioning features or use of this
- software must display the following acknowledgement:
- This product includes software developed by the University of
- California, Berkeley and its contributors.
- 4. Neither the name of the University nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- Used for Telnet Authentication Option, Telnet Encryption Option, and
- Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
- k95crypt.dll, k2crypt.dll)
- Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) All rights
- reserved.
- This package is an DES implementation written by Eric Young
- (eay@cryptsoft.com). The implementation was written so as to conform
- with MIT's libdes.
- This library is free for commercial and non-commercial use as long as
- the following conditions are aheared to. The following conditions apply
- to all code found in this distribution.
- Copyright remains Eric Young's, and as such any Copyright notices in
- the code are not to be removed. If this package is used in a product,
- Eric Young should be given attribution as the author of that the SSL
- library. This can be in the form of a textual message at program
- startup or in documentation (online or textual) provided with the
- package.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- 1. Redistributions of source code must retain the copyright notice,
- this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the
- distribution.
- 3. All advertising materials mentioning features or use of this
- software must display the following acknowledgement: This product
- includes software developed by Eric Young (eay@cryptsoft.com)
- THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- The license and distribution terms for any publically available version
- or derivative of this code cannot be changed. i.e. this code cannot
- simply be copied and put under another distribution license [including
- the GNU Public License.]
- The reason behind this being stated in this direct manner is past
- experience in code simply being copied and the attribution removed from
- it and then being distributed as part of other packages. This
- implementation was a non-trivial and unpaid effort.
- Used DES encryption in Kermit 95 (k95crypt.dll, k2crypt.dll)
- __________________________________________________________________
- * This is version 1.1 of CryptoLib
- *
- * The authors of this software are Jack Lacy, Don Mitchell and Matt Blaze
- * Copyright (c) 1991, 1992, 1993, 1994, 1995 by AT&T.
- * Permission to use, copy, and modify this software without fee
- * is hereby granted, provided that this entire notice is included in
- * all copies of any software which is or includes a copy or
- * modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * NOTE:
- * Some of the algorithms in cryptolib may be covered by patents.
- * It is the responsibility of the user to ensure that any required
- * licenses are obtained.
- *
- *
- * SOME PARTS OF CRYPTOLIB MAY BE RESTRICTED UNDER UNITED STATES EXPORT
- * REGULATIONS.
- *
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- Used for Big Number library in Kermit 95 (k95crypt.dll, k2crypt.dll).
- __________________________________________________________________
- CKERMIT70.TXT
- The Kermit Project
- Columbia University
- 8 Feb 2000
- Last update: 8 Aug 2011
|