1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280 |
- [1]The Columbia Crown The Kermit Project | Columbia University
- 612 West 115th Street, New York NY 10025 USA o [2]kermit@columbia.edu
- ...since 1981
- [3]Home [4]Kermit 95 [5]C-Kermit [6]Scripts [7]Current [8]New [9]FAQ
- [10]Support
- C-Kermit 8.0 Update Notes
- Second Supplement to Using C-Kermit, 2nd Edition
- For C-Kermit 8.0
- As of C-Kermit version: 8.0.211
- Date of C-Kermit release: 10 April 2003
- This file last updated: Mon Sep 13 08:52:36 2010
- * IF YOU ARE READING A PLAIN-TEXT version of this document, note that
- it is a plain-text dump of a Web page. You can visit the original
- (and possibly more up-to-date) Web page here:
- [15]http://www.columbia.edu/kermit/ckermit80.html
- * If you are reading the HTML version of this file with a GUI Web
- browser, the features added since C-Kermit 8.0.201 are shown in red
- if your browser and monitor permit. Features that were new to
- versions 8.0.200 and 201 are in black.
- 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: [16]kermit-support@columbia.edu
- Web: [17]http://www.columbia.edu/kermit/
- Or: [18]http://www.kermit-project.org/
- Or: [19]http://www.columbia.nyc.ny.us/kermit/
- NOTICES
- This document:
- Copyright © 1997, 2002, Frank da Cruz and Christine M. Gianone.
- All rights reserved.
- Kermit 95:
- Copyright © 1995, 2002, Trustees of Columbia University in the
- City of New York. All rights reserved.
- C-Kermit:
- Copyright © 1985, 2002,
- Trustees of Columbia University in the City of New York. All
- rights reserved. See the C-Kermit [20]COPYING.TXT file or the
- copyright text in the [21]ckcmai.c module for disclaimer and
- permissions.
- When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or
- SSL/TLS 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
- [22]Appendix V.
- WHAT IS IN THIS FILE
- This file lists changes made to C-Kermit since version 7.0 was released
- in January 2000. Use this file as a supplement to:
- * The second edition of [23]Using C-Kermit; and:
- * The [24]C-Kermit 7.0 Update Notes. Also available in plain-text
- form as [25]ckermit70.txt.
- until the third edition of Using C-Kermit is published. We apologize
- for the scattered documentation and will consolidate it when we are
- able.
- ADDITIONAL FILES
- Several other files accompany this new Kermit release:
- [26]ckututor.html
- C-Kermit Tutorial (for Unix). Also distributed in Nroff form as
- [27]ckuker.nr, the Unix C-Kermit manual page.
- [28]security.htm
- Discussion of Kermit's new authentication and encryption
- features, updated for C-Kermit 8.0.
- [29]telnet.htm
- Detailed documentation of Kermit's Telnet client, updated for
- C-Kermit 8.0.
- [30]ftpscripts.html
- Tutorial: Writing FTP automation scripts
- [31]ckcbwr.html
- Platform-independent C-Kermit hints and tips. Also distributed
- in plain text form as [32]ckcbwr.txt
- [33]ckubwr.html
- Unix-specific C-Kermit hints and tips. Also distributed in plain
- text form as [34]ckubwr.txt.
- [35]ckvbwr.html
- VMS-specific C-Kermit hints and tips. Also distributed in plain
- text form as [36]ckvbwr.txt.
- [37]ckuins.html
- Unix C-Kermit installation instructions. Also distributed in
- plain text form as [38]ckuins.txt.
- [39]ckvins.html
- VMS C-Kermit installation instructions. Also distributed in
- plain text form as [40]ckvins.txt.
- [41]ckccfg.html
- Compile-time configuration options. Also distributed in plain
- text form as [42]ckccfg.txt.
- [43]ckcplm.html
- C-Kermit Program Logic Manual. Also distributed in plain text
- form as [44]ckcplm.txt.
- [45]iksd.html
- Internet Kermit Service Administrators Guide for Unix.
- [46]skermit.html
- C-Kermit as an SSH Subsystem (SFTP server replacement).
- [ [47]Top ] [ [48]C-Kermit ] [ [49]Kermit Home ]
- CONTENTS
- [50]0. WHAT'S NEW
- [51]1. FIXES SINCE VERSION 7.0.196
- [52]2. SSH AND HTTP
- [53]2.1. SSH Connections
- [54]2.2. HTTP Connections
- [55]2.2.1. HTTP Command Switches
- [56]2.2.2. HTTP Action Commands
- [57]2.2.3. HTTP Headers
- [58]2.2.4. Secure HTTP Connections
- [59]2.2.5. HTTP Variables
- [60]2.2.6. The HTTP Command-Line Personality
- [61]3. THE BUILT-IN FTP CLIENT
- [62]3.1. Making and Managing FTP Connections
- [63]3.1.1. Kermit Command-Line Options for FTP
- [64]3.1.2. The FTP Command-Line Personality
- [65]3.1.3. The FTP URL Interpreter
- [66]3.1.4. Interactive FTP Session Establishment
- [67]3.2. Making Secure FTP Connections
- [68]3.3. Setting FTP Preferences
- [69]3.4. Managing Directories and Files
- [70]3.5. Uploading Files With FTP
- [71]3.5.1. FTP PUT Switches
- [72]3.5.2. Update Mode
- [73]3.5.3. Recovery
- [74]3.6. Downloading Files With FTP
- [75]3.6.1. FTP GET Switches
- [76]3.6.2. Filename Collisions
- [77]3.6.3. Recovery
- [78]3.7. Translating Character Sets
- [79]3.7.1. Character Sets and Uploading
- [80]3.7.2. Character Sets and Downloading
- [81]3.8. FTP Command Shortcuts
- [82]3.9. Dual Sessions
- [83]3.10. Automating FTP Sessions
- [84]3.10.1. FTP-Specific Variables and Functions
- [85]3.10.2. Examples
- [86]3.10.3. Automating Secure FTP Connections
- [87]3.11. Advanced FTP Protocol Features [88]4. FILE SCANNING
- [89]5. FILE AND DIRECTORY NAMES CONTAINING SPACES
- [90]6. OTHER COMMAND PARSING IMPROVEMENTS
- [91]6.1. Grouping Macro Arguments
- [92]6.2. Directory and File Name Completion
- [93]6.3. Passing Arguments to Command Files
- [94]6.4. More-Prompting
- [95]6.5. Commas in Macro Definitions
- [96]6.6. Arrow Keys
- [97]7. NEW COMMANDS AND SWITCHES
- [98]8. SCRIPTING IMPROVEMENTS
- [99]8.1. Performance and Debugging
- [100]8.2. Using Macros as Numeric Variables
- [101]8.3. New IF Conditions
- [102]8.4. The ON_UNKNOWN_COMMAND and ON_CD Macros
- [103]8.5. The SHOW MACRO Command
- [104]8.6. Arrays
- [105]8.7. New or Improved Built-in Variables and Functions
- [106]8.8. The RETURN and END Commands
- [107]8.9. UNDEFINing Groups of Variables
- [108]8.10. The INPUT and MINPUT Commands
- [109]8.11. Learned Scripts
- [110]8.12. Pattern Matching
- [111]8.13. Dates and Times
- [112]8.14. Trapping Keyboard Interruption
- [113]9. S-EXPRESSIONS
- [114]9.1. What is an S-Expression?
- [115]9.2. Integer and Floating-Point-Arithmetic
- [116]9.3. How to Use S-Expressions
- [117]9.4. Summary of Built-in Constants and Operators
- [118]9.5. Variables
- [119]9.6. Assignments and Scope
- [120]9.7. Conditional Expressions
- [121]9.8. Extensibility
- [122]9.9. Examples
- [123]9.10. Differences from Algebraic Notation
- [124]9.11.Differences from Lisp
- [125]10. FILE TRANSFER
- [126]11. MODEMS AND DIALING
- [127]12. TERMINAL CONNECTION
- [128]13. CHARACTER SETS
- [129]14. DIALOUT FROM TELNET TERMINAL SERVERS
- [130]15. COPING WITH BROKEN KERMIT PARTNERS
- [131]16. NEW COMMAND-LINE OPTIONS
- [132]17. LOGS
- [ [133]Top ] [ [134]C-Kermit ] [ [135]Kermit Home ]
- 0. WHAT'S NEW
- The Initialization and Customization Files
- C-Kermit 8.0 now supports specification of the initialization
- file name (path) in an environment variable, CKERMIT_INI. It
- also relies far less than before on the initialization for
- functioning. See [136]Section 5 of the Unix C-Kermit
- [137]installation instructions for details. As of version
- 8.0.201, C-Kermit also executes your customization file (if you
- have one) even if the initialization file was not found.
- Previously, the customization file was executed by a TAKE
- command in the initialization file (and it still is, if an
- initialization is found).
- Incompatible Changes
- As always, we do our best to avoid changes that break existing
- scripts. However, C-Kermit 8.0 does include a rather pervasive
- syntax change that might alter the behavior of scripts that
- depend on the previous behavior. As described in [138]Section 5,
- C-Kermit now accepts doublequotes in most contexts where you
- previously had to use braces to group multiple words into a
- single field, or to force inclusion of leading or trailing
- blanks. Most noticeably, in C-Kermit 7.0 and earlier:
- echo {this is a string}
- would print:
- this is a string
- whereas:
- echo "this is a string"
- printed:
- "this is a string"
- In C-Kermit 8.0, both print:
- this is a string
- To force the doublequotes to be treated as part of the string,
- use either of the following forms:
- echo {"this is a string"}
- echo ""this is a string""
- Similarly, to force braces to be treated as part of the string:
- echo "{this is a string}"
- echo {{this is a string}}
- Other incompatibilities:
- 1. Using the SET HOST command to make HTTP connections is no
- longer supported. Instead, use the new HTTP OPEN command,
- described in [139]Section 2.2.
- C-Kermit 7.1 Alpha.01 (8 December 2000)
- Its major new features are those listed in the [140]Table of
- Contents: the FTP client, file scanning, command parsing and
- scripting improvements, S-Expressions, and support for the
- Telnet Com Port Option, plus wider availability of the Kerberos,
- SSL/TLS, and SRP security options for secure Internet
- connections.
- C-Kermit 7.1.199 Alpha.02 (4 January 2001)
- + C-Kermit now accepts [141]FTP, TELNET, and IKSD URLs as its
- first command-line argument.
- + Character-set translation added to the FTP client for
- [142]filenames.
- + Optional [143]setting of date of incoming files by FTP [M]GET
- from the server date.
- + [144]FTP CHECK filename added to let FTP client check the
- existence of a file on the server.
- + [145]FTP GET /NAMELIST:filename added to get list of server
- filenames into a local file.
- + [146]FTP [M]PUT /SERVER-RENAME:template added to make server
- rename a file as indicated by the template after it has
- arrived completely.
- + FTP [M]GET /SERVER-RENAME:template added to make server rename
- a file as indicated by the template after it has been sent
- completely.
- + FTP [147]VDIRECTORY added for getting verbose directory
- listings from TOPS-20.
- + [148]FTP TYPE TENEX added for transferring 8-bit binary files
- with PDP-10s.
- + Added [149]automatic text/binary mode switching for FTP
- [M]GET, based on filename patterns (e.g. *.zip, *.gz, *.exe
- are binary; *.txt, *.c are text).
- + [150]SET SEND I-PACKETS OFF added for coping with Kermit
- servers that do not support I packets.
- + A new option was added to [151]\fword() and \fsplit() for
- parsing comma-separated lists that might contain empty
- elements.
- + Bug fixes including:
- o {} or "" could not be used as expected to represent the
- empty string.
- o ,- on a line by itself in a macro definition caused
- subsequent statements to be skipped.
- o FTP [M]GET didn't work right if path segments were
- included in the filespec.
- o FTP MGET, if interrupted, did not clear its file list.
- o Various problems with FTP PUT /AS-NAME that nobody
- noticed.
- o Some FTP messages and displays interfered with each
- other.
- o Parsing of YESTERDAY, TODAY, and TOMORROW in date-time
- fields was broken.
- o Automatic old-to-new dialing directory format conversion
- was broken on VMS.
- o Various source-code portability problems fixed.
- + Improvement of various HELP and SHOW messages.
- C-Kermit 7.1.199 Alpha.04 (1 April 2001)
- + Big changes:
- o Changed default modem type from NONE to GENERIC.
- o Generic dialing now sends no init string at all.
- o Changed default terminal bytesize from 7 to 8.
- + New features:
- o SET SESSION-LOG TIMESTAMPED-TEXT for timestamped session
- log.
- + New modem types:
- o Conexant modem family
- o Lucent VENUS chipset
- o PCTel V.90 chipset
- o Zoom V.90
- o Zoom V.92
- + FTP client:
- o FTP OPEN /PASSIVE and /ACTIVE switches added.
- o Now works with servers that that don't include path in
- NLST response.
- o Fixed SEND /RECURSIVE not to follow symlinks (UNIX).
- o SET FTP VERBOSE-MODE default is now OFF instead of ON.
- + Kermit protocol:
- o Fixed what I hope is the last "Receive window full"
- error.
- o SET PREFIXING or SET CONTROL PREFIX now automatically
- sets CLEARCHANNEL OFF.
- o Fixed incorrect report of number of files transferred at
- end of transfer.
- o Fixed SEND /RECURSIVE not to follow symlinks (UNIX).
- + UNIX:
- o HTTP and shadow passwords enabled for SCO 5.0.6.
- o Even with SET FILENAMES CONVERTED, spaces were still
- accepted in incoming filenames; now they are converted to
- underscores.
- o Added support for compile-time mktemp()/mkstemp()
- selection.
- + VMS:
- o Session-log format for scripted sessions fixed.
- + Scripting:
- o Fixed \frdir() not to follow symlinks (UNIX).
- o Fixed \fday() not to dump core for dates prior to 17 Mar
- 1858.
- + General:
- o "Closing blah..." message upon exit could not be
- suppressed.
- o Added /PAGE and /NOPAGE to DELETE switches.
- o Added GO response for DELETE /ASK (delete all the rest
- without asking).
- o Added GO response to "more?" prompt (for multi-page
- screen output).
- o Updated HELP texts.
- C-Kermit 7.1.199 Beta.01 (10 May 2001)
- + FTP client verbosity adjustments.
- + Bug with generic modem dialing pausing several secs fixed.
- + SET HOST /USER:, SET LOGIN USERID, etc, fixed when given no
- user ID.
- + A couple \v(dm_blah) dial modifier variables added.
- + "--version" command-line switch added.
- + Fixed NetBSD serial-port DTR handling.
- + Lots of syntax cleanups for Flexelint and gcc -Wall.
- + Fixed modem-type aliases to not take precedence over real
- names.
- + Fixed funny treatment of doublequotes by ECHO command.
- + Enabled SET SESSION-LOG for VMS and other non-UNIX platforms.
- + Fixed changing direction in command history buffer.
- + Fixed handling of IKSD URLs.
- + Made sure DELETE prints a message if it got any errors.
- C-Kermit 8.0.200 Beta.02 (28 June 2001)
- + Major version number increased from 7 to 8.
- + [152]SSH command.
- + More-consistent Kermit protocol defaults.
- + CONNECT idle timeout and action selection.
- + CONNECT status variable.
- + A way to allocate more space for filename lists.
- + Pseudoterminal handler fixed for late-model Linuxes.
- + Command-line option -dd for timestamped debug log.
- + Download directory now works for external protocols too.
- + GREP /COUNT:variable.
- + SET ATTRIBUTE RECORD-FORMAT { OFF, ON }.
- + Bug fixes.
- C-Kermit 8.0.200 Beta.03 (9 Sep 2001)
- + [153]HTTP 1.1 connections and scripting
- + [154]ON_CTRLC macro for trapping Ctrl-C in scripts
- + [155]Date-time parsing improvements, timezones, comparison,
- arithmetic
- + [156]Pattern-matching improvements
- + FTP improvements
- + SET EXIT HANGUP { ON, OFF }
- + SET FILE EOF { CTRL-Z, LENGTH }
- + ASK[Q] /TIMEOUT
- + Bug fixes
- + New platforms
- C-Kermit 8.0.200 Beta.04 (16 Nov 2001)
- + [157]New Unix man page
- + [158]New Unix installation instructions
- + SET TELOPT policies are now enforced on non-Telnet ports if
- the server begins Telnet negotiations.
- + SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT }.
- + UUCP lockfile creation race condition fixed.
- + Dialout, modem signals, hangup, hardware flow control, etc,
- tested extensively on many platforms, numerous problems fixed.
- + Improved hints when dialing fails.
- + SET STOP-BITS 2 can now be given without SET FLOW HARDWARE.
- + Major improvements in RFC 2217 Telnet Com-Port Control.
- + Improved ability to REDIAL a modem server port.
- + kermit -h now shows the command name in the usage usage
- string.
- + kermit -h now shows ALL command-line options.
- + kermit -s blah, where blah is a symlink, now works.
- + --noperms command-line option = SET ATTRIBUTE PERMISSIONS OFF.
- + HTTP and HTTPS URLs now supported on the command line.
- + An http command-line personality is now available.
- + Initialization file streamlined to load faster, anachronisms
- removed.
- + Updated NEWS, INTRO, HELP text, SHOW commands. In particular,
- see SHOW COMM, HELP SET LINE, HELP WAIT.
- + Date/time arithmetic routines converted from floating-point to
- integer arithmetic (internally) for greater accuracy and
- portability.
- + Quoted strings containing commas no longer break macro
- execution.
- + Dynamic Kermit file-transfer timeouts are now much more
- aggressive.
- + New "hot keys" to turn debug.log on/off during file transfer.
- + Improved hints when file transfer fails.
- + FTP CD orientation messages are now printed.
- + -R now accepted on the FTP command line to request Recursion.
- + -m allows Active or Passive mode to be chosen on the FTP
- command line.
- + -dd on the FTP command line creates a timestamped debug.log.
- + FTP command-line security options filled in.
- + Improved automatic text/binary mode switching for MGET.
- + Removed spurious error messages that sometimes occur during
- MGET.
- + DIRECTORY, GREP, TYPE, HEAD, and TAIL now have a /OUTPUT:file
- option.
- + TYPE /NUMBER adds line numbers.
- + CAT = TYPE /NOPAGE; MORE = TYPE /PAGE.
- + GETOK ?-help fixed.
- + \v(timestamp) (= "\v(ndate) \v(time)")
- + \v(hour) (hour of the day, 0-23)
- + \funix2dospath() converts a UNIX path (/) to a DOS one (\).
- + \fdos2unixpath() converts a DOS (Windows, OS/2) path to a UNIX
- one.
- + \fkeywordval() parses name=value pair, allows macro keyword
- parameters.
- + We now make every attempt to not write passwords to the
- debug.log.
- + New Certificate Authority certificates file, includes the
- Kermit Project at Columbia University so you can access our
- IKSD securely.
- + Secure targets improved and better documented in Unix
- makefile.
- + All Linux (libc and glibc) builds consolidated under "make
- linux".
- + HP-UX makefile targets now have consistent names.
- + New aix50 and aix51 targets added.
- C-Kermit 8.0.200 Final (12 Dec 2001)
- + Remote/local-mode confusion on some platforms introduced in
- Beta.04, fixed.
- + Many of the makefile targets adjusted, new ones added.
- + New "make install" target should please most people.
- + New command: SHOW IKSD.
- + FTP over TLS.
- + Last-minute touchups to text messages, HELP text, etc.
- + Enable modem-signal reading for SCO OSR5 and Unixware 7.
- + Special superfast TRANSMIT /BINARY /NOECHO /NOWAIT mode added.
- + Fixed PBX dialing in unmarked-area-code case.
- + Improved SHOW COMMUNICATIONS tells lockfile directory, typical
- dialout device name.
- + Some FTP OPEN command parsing problems fixed.
- + Some errors in date arithmetic fixed.
- + New command: SET TERMINAL AUTODOWNLOAD { ..., ERROR { STOP,
- CONTINUE } }
- + New command: HELP FIREWALL.
- + SET MODEM HANGUP-METHOD DTR added as synonym for RS232-SIGNAL
- + Support for secure URL protocols added: telnets:, ftps:,
- https:.
- C-Kermit 8.0.201 (8 Feb 2002)
- + Installability as an [159]SSH v2 Subsystem.
- + [160]SET LOCUS command.
- + [161]L-versions of CD, DIR, DELETE, MKDIR, etc, to force local
- execution.
- + [162]USER and ACCOUNT added as synonyms for FTP USER and FTP
- ACCOUNT.
- + [163]SHOW VARIABLES now accepts a list of variables.
- + Rudimentary support for [164]Caller ID when receiving phone
- calls.
- + Up/Down [165]Arrow-key navigation of command history buffer.
- + [166]Automatic execution of customization file if init file is
- missing.
- C-Kermit 8.0.206 Beta.01 (11 Oct 2002)
- New commands:
- o ORIENTATION lists location-related variables and their
- values.
- o KCD changes to special directories by their symbolic
- names ("kcd ?" for a list).
- o SET CD HOME path to specify home directory for CD and KCD
- commands.
- o CONTINUE given at top level is equivalent to END -- handy
- when PROMPT'ed out of a script, to continue the script.
- New switches or operands for existing commands:
- o GETOK /TIMEOUT
- o ASK, ASKQ, GETOK /QUIET (suppresses error message on
- timeout)
- o COPY /APPEND now allows concatenating multiple source
- files into one dest file.
- o SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER, /PASSWORD.
- o DIRECTORY command now accepts multiple filespecs, e.g.
- "dir a b c".
- SET QUIET ON now also applies to:
- o SET HOST connection progress messages.
- o "Press the X or E key to cancel" file-transfer message.
- o REMOTE CD response.
- o REMOTE LOGIN response.
- Improvements and new features:
- o Numerous FTP client fixes and new features, listed below.
- o C-Kermit, when in remote mode at the end of a file
- transfer, now prints a one-line "where" message. Control
- with SET TRANSFER REPORT.
- o Unix makefile "install" target now creates an UNINSTALL
- script.
- o Improved operation and performance on RFC 2217 Telnet
- connections.
- o Improved CONNECT (interactive terminal connection)
- performance.
- o HELP text updated for many commands.
- New or fixed makefile targets:
- o Solaris 9 (several variations)
- o Concurrent PowerMAX
- o Mac OS X 10.2
- o FreeBSD 1.0
- o FreeBSD 4.6, 5.0
- o AIX 5.2, 5.3
- Bugs fixed (general):
- o Failure to run in VMS Batch fixed.
- o LDIRECTORY fixed to run Kermit's built-in DIRECTORY
- command rather than an external one.
- o Fixed Solaris and other SVORPOSIX builds to find out
- their full hostnames rather than just the "uname -n"
- name.
- o Fixed some problems matching strings that start with ".".
- o Fixed some problems matching pattern that contain {a,b,c}
- lists.
- o Fixed erroneous reporting of text-mode reception as
- binary when sender did not report the file size (cosmetic
- only).
- o Many problems with SWITCH statements fixed.
- o Fixed SET OPTIONS DIRECTORY /DOTFILES to work for server
- too.
- o Fixed DELETE to print an error message if the file was
- not found.
- o Fixed SET CONTROL UNPREFIX ALL and SET PREFIXING NONE to
- do the same thing.
- o Fixed bugs executing macros from within the ON_EXIT
- macro.
- o \fday() and \fnday() fixed for dates prior to 17 Nov
- 1858.
- o Serial speed-changing bug in Linux fixed.
- o "Unbalanced braces" script parsing errors when using
- \{number} fixed.
- o "if defined \v(name)" fixed to behave as described in the
- book.
- o Fixed Problems caused by LOCAL variables whose names are
- left substrings of macro names.
- o The INPUT command was fixed to honor the PARITY setting.
- o Fixed bug with COPY to existing file that is longer than
- source file.
- o REINPUT command failed to strip braces/quotes around its
- target string.
- o Network directory lookups didn't work for SSH
- connections.
- o REMOTE SET { FILE, TRANSFER } CHARACTER-SET fixed.
- o Closed some holes whereby an incompletely received file
- was not deleted when SET FILE INCOMPLETE is DISCARD, e.g.
- when the Kermit is hung up upon.
- o SET XFER CHARACTER-SET TRANSPARENT fixed to do the same
- as SET XFER TRANSLATION OFF.
- o SET HOST PTY (e.g. SSH) connection fixed to pass along
- window-size changes.
- o C-Kermit search path for TAKE files was accidentally
- disabled.
- FTP client bugs fixed:
- o Character set translation was broken on little-endian
- (e.g. PC) architectures.
- o FTP PUT /SERVER-RENAME:, /RENAME-TO:, /MOVE-TO: switches
- were sticky.
- o Make SET TRANSFER MODE MANUAL apply to FTP.
- o Make SET FILE INCOMPLETE { KEEP, DISCARD } apply to FTP.
- o FTP MGET /UPDATE handled equal times incorrectly.
- o FTP MGET /RECOVER fixed to ignore file dates, use only
- size.
- o FTP MGET /RECOVER sometimes downloaded files it didn't
- need to.
- o FTP downloads with TRANSFER DISPLAY BRIEF could give
- misleading error messages.
- o FTP MGET temp file not deleted if FTP DEBUG set to OFF
- after it was ON.
- o LOCUS not switched back when FTP connection is lost.
- o Set incoming file date even if it was not completely
- received.
- o FTP MGET sent SIZE and MDTM commands even when it didn't
- have to.
- o FTP MGET sent SIZE and MDTM commands even when it knew
- they wouldn't work.
- o FTP MGET failed if no files were selected for download.
- o FTP MGET a* b* c* would fail to get any c*'s if no b*'s
- existed.
- o Big problems canceling MGET with Ctrl-C.
- o Some extraneous LOCUS dialogs squelched.
- o Some inconsistencies in SET FTP FILENAMES AUTO fixed.
- o Fixed file-descriptor pileup after multiple MGETs when
- using mkstemp().
- o Fixed "mget foo", where foo is a directory name.
- FTP improvements:
- o New [167]FTP protocol features added (FEAT, MLSD).
- o FTP MGET /RECURSIVE now works as expected if server
- supports MLSD.
- o FTP MGET /DATES-DIFFER to download if local and remote
- file dates differ.
- o FTP DATES default changed to ON.
- o FTP MPUT, MGET /EXCEPT now allows up to 64 patterns (up
- from 8).
- o Top-level SITE and PASSIVE commands added for
- convenience.
- o MGET /COLLISION:APPEND /AS-NAME:newfile *.* puts all
- remote files into one local file.
- o SET FTP SERVER-TIME-OFFSET for when server has wrong
- timezone set.
- o Allow for alternative server interpretations of [M]MPUT
- /UNIQUE.
- o SET FTP ANONYMOUS-PASSWORD lets you specify the default
- anonymous password.
- o Allow "GET /RECURSIVE path/file" to force local
- subdirectory creation.
- o SET FTP DISPLAY is like SET TRANSFER DISPLAY but applies
- only to FTP.
- o FTP { ENABLE, DISABLE } new-protocol-feature-name.
- o FTP MGET /NODOTFILES.
- o Debug log now records FTP commands and responses in
- grep-able format.
- [ [168]Top ] [ [169]Contents ] [ [170]C-Kermit ] [ [171]Kermit Home ]
- 1. FIXES SINCE VERSION 7.0.196 First, the changes from 7.0.196 to 7.0.197...
- Source and makefile tweaks to get successful builds on platforms that were
- not available in time for the 7.0 release:
- * 4.2BSD
- * 4.3BSD
- * AIX 4.3
- * AT&T 3B2 and 3B20
- * BeOS 4.5
- * CLIX
- * Interactive UNIX System V/386 R3.2 V4.1.1
- * OS-9/68000
- * OSF/1 1.3.
- * PS/2 AIX 1.2.1
- * SCO OSR5.0.x
- * SCO Xenix 2.3.4
- * SINIX 5.41/Intel
- * Stratus FTX
- * Stratus VOS
- * SunOS 4.1 with X.25
- * Ultrix 4.2
- * Unixware 2.0
- There were no functional changes from 196 to 197.
- Fixes applied after C-Kermit 7.0.197 was released:
- Source code: Big flexelint and "gcc -Wall" audit and cleanup.
- Configuration:
- * Solaris RTS/CTS (hardware flow control) didn't work.
- * BSDI RTS/CTS worked only in one direction.
- * FreeBSD 4.0 with ncurses 5.0 broke interactive command parsing.
- * QNX-32 build lacked -DBIGBUFOK so couldn't execute big macros.
- Connections:
- * SET HOST /PTY didn't work on some platforms.
- * Broken SET HOST /USER:xxx /PASSWORD:yyy /ACCOUNT:zzz switches
- fixed.
- * Transparent printing was broken in Unix.
- * ANSWER 0 (wait forever) didn't work.
- * Some problems in Multitech modem command strings.
- * Spurious "?Sorry, can't condition console terminal" errors.
- * Disabling modem command strings by setting them to nothing broke
- dialing.
- * SET DIAL TIMEOUT value was usually ignored.
- * SET DIAL METHOD PULSE didn't work.
- * Certain modem commands, if changed, not refreshed if modem type
- changed.
- * SET SESSION-LOG command was missing from VMS.
- * VMS session log format fixed for scripts.
- * HANGUP by dropping DTR didn't work in NetBSD.
- * SET FLOW /AUTO versus SET FLOW confusion fixed.
- * Spurious secondary Solaris lockfile removed.
- * SCO OSR5 DTR On/Off hangup.
- * UUCP lockfile race condition.
- Commands and scripts:
- * Missing CAUTIOUS and FAST commands restored.
- * Broken PTY command in late-model Linuxes fixed (API changed).
- * Fixed off-by-one error in command recall when switching direction.
- * Fixed recall of commands that contain '?'.
- * COPY /SWAP-BYTES didn't work on some architectures.
- * Various combinations of COPY switches didn't work.
- * Various problems with COPY or RENAME with a directory name as
- target.
- * SHIFT didn't decrement \v(argc) if used within IF, ELSE, or SWITCH
- block.
- * SHIFT didn't affect the \%* variable.
- * Divide by zero improperly handled in some \function()s.
- * Problems with RETURN from right-recursive functions.
- * FSEEK /LINE \%c LAST didn't work if already at end.
- * Some buffer vulnerabilities and potential memory leaks were
- discovered and fixed.
- * \frdirectory() fixed not to follow symbolic links.
- * SET EXIT WARNING OFF fixed to work when EXIT given in a script.
- * Missing DELETE and MKDIR error message fixed.
- * \fday() core dump for ancient dates fixed.
- File transfer:
- * SEND /COMMAND was broken.
- * CRECEIVE was broken (but RECEIVE /COMMAND was OK).
- * Quoting wildcard chars in filenames didn't work.
- * Problems canceling streaming file transfers with X or Z.
- * Problems shifting between streaming and windowing file transfer.
- * Non-FULL file-transfer displays erroneously said STREAMING when
- not.
- * An active SEND-LIST prevented GET from working.
- * SET SERVER GET-PATH interpretation of relative names like "." was
- wrong.
- * The MAIL command was broken.
- * "kermit -s *" might have skipped some files.
- * Transaction log entries were not made for external protocol
- transfers.
- * File count report fixed to show number of files actually
- transferred.
- * Fixed filename conversion to convert spaces to underscores.
- * Made SET PREFIXING / SET CONTROL PREFIX also adjust CLEARCHANNEL.
- * More "Receive window full" errors fixed.
- * Broken terminal buffering after curses display in Solaris fixed.
- * SET FILE INCOMPLETE DISCARD did not work in all cases.
- * Packet log changed to reformat the start-of-packet character
- printably.
- * Dynamic timeouts could grow ridiculously large.
- Character sets:
- * Hebrew-7 translations missed the letter Tav.
- * C1 area of CP1252 was ignored.
- * SET TRANSFER CHARACTER-SET TRANSPARENT could give garbage
- translations.
- * TRANSLATE might not work on Little Endian architectures.
- * Insufficient range checking in certain TRANSLATE operations.
- The following bugs in C-Kermit 8.0.200 were fixed in 8.0.201:
- * An obscure path through the code could cause the Unix version of
- C-Kermit to dump core during its startup sequence. This happened to
- only one person, but now it's fixed.
- * When C-Kermit 8.0 is in Kermit server mode and the client says "get
- blah", where blah (on the server) is a symlink rather than a real
- file, the server unreasonably refused to send the linked-to file.
- * When C-Kermit is an FTP client and says "get foo/bar" (i.e. a
- filename that includes one or more path segments), it failed to
- accept the incoming file (this happened only with GET, not MGET).
- * Array references should be case insensitive but only lowercase
- array letters were accepted.
- * SHOW VARIABLES dumped core on \v(sexpression) and \v(svalue).
- * Spurious refusals of remote directory listings if the remote
- server's date was set in the past.
- * In AIX, and maybe elsewhere too, Kermit's COPY command always
- failed with "Source and destination are the same file" when the
- destination file didn't exist.
- * The VMS version of C-Kermit did not work in Batch or when SPAWN'd.
- To compound the problem, it also pretty much ignored the -B and -z
- command-line options, whose purpose is to work around such
- problems.
- * C-Kermit 8.0 could not be built on IRIX 5.x.
- * The C-Kermit 8.0 build for QNX6 said it was an "(unknown version)".
- Other fixes are listed in the [172]previous section.
- [ [173]Top ] [ [174]Contents ] [ [175]C-Kermit ] [ [176]Kermit Home ]
- 2. SSH AND HTTP
- 2.1. SSH Connections
- This section does not apply to [177]Kermit 95 2.0, which has its own
- built-in SSH client, which is documented [178]SEPARATELY.
- On most UNIX platforms, C-Kermit can make SSH (Secure SHell) connection
- by running the external SSH command or program through its
- pseudoterminal interface. The command is:
- SSH text
- Tells Kermit to start the external SSH client, passing the given
- text to it on the command line. Normally the text is just the
- hostname, but it can be anything else that is acceptable to the
- ssh client. If the command succeeds, the connection is made and
- Kermit automatically enters CONNECT (terminal) mode. You can use
- the SSH command to make a connection to any host that has an SSH
- server.
- Kermit's SSH command gives you all the features of Kermit on an SSH
- connection: command language, file transfer, character-set translation,
- scripting, and all the rest. By default, C-Kermit invokes SSH with "-e
- none", which disables the ssh escape character and makes the connection
- transparent for purposes of file transfer. You can, however, change the
- SSH invocation to whatever else you might need (an explicit path,
- additional command-line arguments, etc) with:
- SET SSH COMMAND text
- Specifies the system command that Kermit's SSH command should
- use to invoke the external SSH client. Use this command to
- supply a specific path or alternative name, or to include
- different or more command-line options.
- In most cases, these connections work quite well. They can be scripted
- like any other connection, and file transfer goes as fast as, or faster
- than, on a regular Telnet connection. In some cases, however, the
- underlying pseudoterminal driver is a limiting factor, resulting in
- slow or failed file transfers. Sometimes you can work around such
- problems by reducing the Kermit packet length. Note that Kermit does
- not consider SSH connections to be reliable, so it does not offer to
- use streaming in Kermit protocol transfers (but you can force it with
- SET RELIABLE or SET STREAMING if you wish).
- The SSH command is like the TELNET command: it enters CONNECT mode
- automatically when the connection is made. Therefore, to script an SSH
- connection, use:
- set host /pty ssh -e none [ other-options ] host
- if fail ...
- to make the connection.
- Here's a sequence that can be used to make a connection to a given host
- using Telnet if the host accepts it, otherwise SSH:
- if not defined \%1 exit 1 Usage: \%0 host
- set quiet on
- set host \%1 23 /telnet
- if fail {
- set host /pty ssh -l \m(user) -e none \%1
- if fail exit 1 \%1: Telnet and SSH both fail
- echo SSH connection to \%1 successful
- } else {
- echo Telnet connection to \%1 successful
- }
- In SSH v2, it is possible to make an SSH connection direct to a Kermit
- server system if the host administrator has configured the SSH server
- to allow this.
- Since Kermit uses external ssh client software, and since there are
- different ssh clients (and different releases of each one), the exact
- command to be used to make an SSH/Kermit connection can vary. Here is
- the command for the OpenSSH 3.0.2p1 client:
- set host /pipe ssh -e none [ -l username ] -T -s hostname kermit
- Example:
- set host /pipe ssh -e none -l olga -T -s hq.xyzcorp.com kermit
- The SSH client might or might not prompt you for a password or other
- information before it makes the connection; this depends on your SSH
- configuration (your public and private keys, your authorized hosts
- file, etc). Here's a brief synopsis of the OpenSSH client command
- syntax ("man ssh" for details):
- -e none
- This tells the SSH client to use no escape character. Since we
- will be transferring files across the connection, we don't want
- the connection to suddenly block because some character in the
- data.
- -l username
- This is the username on the remote host. You can omit the -l
- option and its argument if your local and remote usernames are
- the same. If they are different, you must supply the remote
- username.
- -T
- This tells the SSH client to tell the SSH server not to allocate
- a pseudoterminal. We are not making a terminal connection, we
- don't need a terminal, and in fact if a terminal were allocated
- on the remote end, the connection would not work.
- -s ... kermit
- This tells the SSH client to tell the SSH server to start the
- specified subsystem ("kermit") once the connection is made. The
- subsystem name comes after the hostname.
- hostname
- The IP host name or address of the desired host.
- You might want to include other or additional ssh command-line options;
- "man ssh" explains what they are. Here are some examples for the
- OpenSSH 3.0.2p1 client:
- -oClearAllForwardings yes
- -oForwardAgent no
- -oForwardX11 no
- -oFallbackToRsh no
- These ensure that a secure connection is used and that the
- connection used for file transfer is not also used for
- forwarding other things that might be specified in the
- ssh_config file.
- -oProtocol 2
- (i.e. SSH v2) Ensures that the negotiated protocol supports
- subsystems.
- Once you have an SSH connection to a Kermit server, it's just like any
- other connection to a Kermit server (and very similar to a connection
- to an FTP server). You give the client file transfer and management
- commands for the server, and the server executes them. Of course you
- can also give the client any other commands you wish.
- [ [180]SSH Kermit Server Subsystem ] [ [181]Kermit 95 Built-in SSH
- Client ]
- 2.2. HTTP Connections
- Hypertext Transfer Protocol, or HTTP, is the application protocol of
- the World Wide Web (WWW), used between Web browsers (clients) and Web
- servers. It allows a client to get files from websites, upload files to
- websites, delete files from websites, get information about website
- directories and files, and interact with server-side CGI scripts.
- C-Kermit includes an HTTP client capable of both clear-text and secure
- HTTP connections, that can do all these tasks and can be automated
- through the Kermit scripting language.
- Although C-Kermit 7.0 could make HTTP connections to Web servers, it
- could do so only when no other connection was open, and the procedure
- was somewhat awkward. C-Kermit 8.0 improves matters by:
- * Allowing an HTTP connection to be open at the same time as a
- regular SET LINE or SET HOST connection, and also at the same time
- as an FTP connection ([182]Section 3);
- * Upgrading the HTTP protocol level from 1.0 to 1.1, thus allowing
- for persistent connections, in which a series of commands can be
- sent on the same connection, rather than only one as in HTTP 1.0
- (and C-Kermit 7.0);
- * Providing for "one-shot" URL-driven HTTP operations such as GET or
- PUT.
- * Providing a distinct HTTP command-line personality.
- Persistent HTTP connections are managed with the following commands:
- HTTP [ switches ] OPEN [ security-options ] host-or-url [ port ]
- Opens a persistent connection to the specified host (IP host
- name or address) on the specified port. If any switches
- (options, listed in the next section) are included, their values
- are saved and used for all subsequent HTTP action commands on
- the same connection. If no port is specified, HTTP (80) is used.
- A Uniform Resource Locator (URL, [183]RFC 1738) can be given
- instead of a hostname (or address) and port (but the URL can not
- include a directory/file path). The security options are
- explained [184]below. The HTTP OPEN command replaces the
- C-Kermit 7.0 SET HOST hostname HTTP command, which no longer
- works with HTTP GET and related commands.
- HTTP CLOSE
- Closes any open HTTP connection and clears any saved switch
- values.
- A URL starts with a protocol name, which must be http or https in this
- case; optionally includes a username and password; and must contain a
- host name or address:
- protocol://[user[.password]]@host[:port][URI]
- HTTP is Hypertext Transfer Protocol. HTTPS is the secure (SSL/TLS)
- version of HTTP. The TCP service port is derived from the protocol
- prefix (so normally the ":port" field is omitted). Thus the URL
- protocol name specifies a default TCP service port and the URL user and
- password fields can take the place of the /USER and /PASSWORD switches
- ([185]Section 2.2.1). The optional URI is a "compact string of
- characters for identifying an abstract or physical resource" ([186]RFC
- 2396), such as a file. It must begin with a slash (/); if the URI is
- omitted, "/" is supplied. Examples:
- http open http://www.columbia.edu/
- Equivalent to http open www.columbia.edu or http open
- www.columbia.edu http.
- http open https://olga.secret@www1.xyzcorp.com/
- Equivalent to http /user:olga /pass:secret open www1.xyzcorp.com
- https.
- Persistence is accomplished unilaterally by C-Kermit 8.0. An HTTP 1.0
- server closes the connection after each action. Although HTTP 1.1
- allows multiple actions on the same connection, an HTTP 1.1 server
- tends to close the connection if it is idle for more than a few
- seconds, to defend itself against denial-of-service attacks. But when
- you use Kermit's HTTP OPEN command to create a connection, Kermit
- reopens it automatically (if necessary) for each HTTP action until you
- close it with HTTP CLOSE, regardless of the server's HTTP protocol
- version, or how many times it closes the connection.
- Firewalls can be negotiated through proxies with the following
- commands:
- SET TCP HTTP-PROXY [ host[:port] ]
- If a host (by hostname or IP address) is specified, Kermit uses
- it as a proxy server when attempting outgoing TCP connections --
- not only HTTP connections, but all TCP/IP connections, Telnet
- and FTP included. This allows Kermit to adapt to the HTTP
- firewall penetration method (as opposed to other methods such as
- SOCKS4). If no hostname or ip-address is specified, any
- previously specified Proxy server is removed. If no port number
- is specified, the "http" service is used. This command must be
- given before the HTTP OPEN command if a proxy is to be used or
- canceled.
- HTTP [ switches ] CONNECT host[:port]
- Instructs the HTTP server to act as a proxy, establishing a
- connection to the specified host (IP hostname or address) on the
- given port (80 = HTTP by default) and to redirect all data
- transmitted between Kermit and itself to the given host for the
- life of the connection. This command is to be used only for
- debugging HTTP proxy connections. If a proxy connection is
- required, instruct Kermit to use the proxy with the SET TCP
- HTTP-PROXY command.
- 2.2.1. HTTP Command Switches
- HTTP switches, like all other switches, are optional. When HTTP
- switches are included with the HTTP OPEN command, they apply
- automatically to this and all subsequent HTTP actions (GET, PUT, ...)
- on the same connection until an HTTP CLOSE command is given. So if you
- include switches (or the equivalent URL fields, such as user and
- password) in the HTTP OPEN command, you can omit them from subsequent
- commands on the same connection. If the connection has closed since
- your last command, it is automatically reopened with the same options.
- If you include switches with an HTTP action command (such as GET or
- PUT), they apply only to that command.
- /USER:name
- To be used in case a page requires a username for access. The
- username is sent with page requests. If it is given with the
- OPEN command it is saved until needed. If a username is included
- in a URL, it overrides the username given in the switch.
- CAUTION: Username and password (and all other information,
- including credit card numbers and other material that you might
- prefer to protect from public view) are sent across the network
- in clear text on regular HTTP connections, but authentication is
- performed securely on HTTPS connections.
- /PASSWORD:text
- To be used in case a web page requires a password for access.
- The password is sent with page requests. If it is given with the
- OPEN command it is saved until needed. If a password is given in
- a URL, it overrides the one given here. CAUTION: (same as for
- /USER:).
- /AGENT:user-agent
- Identifies the client to the server. Overrides the default agent
- string, which is "C-Kermit" (for C-Kermit) or "Kermit-95" (for
- Kermit 95).
- /ARRAY:array-designator
- Tells Kermit to store the response headers in the given array,
- one line per element. The array need not be declared in advance.
- Example: /array:&a.
- /TOSCREEN
- Tells Kermit to display any response text on the screen. It
- applies independently of the output file specification; thus it
- is possible to have the server response go to the screen, a
- file, both, or neither.
- /HEADER:header-item(s)
- Used for specifying any optional headers to be sent with HTTP
- requests.
- /HEADER:tag:value
- To send more than one header, use braces for grouping:
- /HEADER:{{tag:value}{tag:value}...}
- For a list of valid tags and value formats see [187]RFC 2616,
- "Hypertext Transfer Protocol -- HTTP/1.1". A maximum of eight
- headers may be specified.
- 2.2.2. HTTP Action Commands
- HTTP actions can occur within a persistent connection, or they can be
- self-contained ("connectionless"). A persistent HTTP connection begins
- with an HTTP OPEN command, followed by zero or more HTTP action
- commands, and is terminated with an HTTP CLOSE command:
- http open www.columbia.edu
- if failure stop 1 HTTP OPEN failed: \v(http_message)
- http get kermit/index.html
- if failure stop 1 HTTP GET failed: \v(http_message)
- (more actions possible here...)
- http close
- A self-contained HTTP action occurs when a URL is given instead of a
- remote file name to an HTTP action command. In this case, Kermit makes
- the HTTP connection, takes the action, and then closes the connection.
- If an HTTP connection was already open, it is closed silently and
- automatically.
- http get http://www.columbia.edu/kermit/index.html
- Kermit's HTTP action commands are as follows. Switches may be included
- with any of these to override switch (or default) values given in the
- HTTP OPEN command.
- HTTP [ switches ] GET remote-filename [ local-filename ]
- Retrieves the named file from the server specified in the most
- recent HTTP OPEN command for which a corresponding HTTP CLOSE
- command has not been given. The filename may not include
- wildcards (HTTP protocol does not support them). If no HTTP OPEN
- command is in effect, this form of the HTTP GET command fails.
- The default local filename is the same as the remote name, but
- with any pathname stripped. For example, the command http get
- kermit/index.html stores the file in the current local directory
- as index.html. If the /HEADERS: switch is included, information
- about the file is also stored in the specified array (explained
- in [188]Section 2.2.3). All files are transferred in binary
- mode. HTTP does not provide for record-format or character-set
- conversion.
- HTTP [ switches ] GET url [ local-filename ]
- When HTTP GET is given a URL rather than a filename, Kermit
- opens a connection to the designated server (closing any
- previously open HTTP connection), gets the file, and then closes
- the connection. If the URL does not include a filename,
- index.html is supplied. This is the self-contained one-step
- "connectionless" method for getting a file from a Web server.
- The data is not interpreted; HTTP GET is like "lynx -source"
- rather than "lynx -dump".
- In the remaining HTTP action commands, the distinction between a remote
- filename and a URL are the same as in the HTTP GET command.
- HTTP [ switches ] HEAD remote-filename-or-url [ local-filename ]
- Like GET except without actually getting the file; instead it
- retrieves only the headers. If the /ARRAY: or /TOSCREEN switch
- is included, there is no default local output filename but you
- can still specify one. If neither of these switches is included,
- the default local filename is the same as the remote filename,
- but with any path stripped and with ".head" appended. The HEAD
- command can be used in a script with the /ARRAY: switch to
- retrieve information about the requested resource to determine
- whether the resource should actually be retrieved with a
- subsequent GET request.
- HTTP [ switches ] INDEX remote-directory-or-url [ local-filename ]
- Asks the server to send a listing of the files in the given
- server directory. This command is not supported by most Web
- servers. Even when it is supported, there is no standard format
- for the listing.
- HTTP [ switches ] POST [ /MIME-TYPE:type ] source-file
- remote-path-or-url [ result-file ]
- Sends data to a process running on the remote host; the result
- is usually an HTML file but could be anything. The data to be
- posted must be read from a local file (the source-file). If a
- result file is specified, Kermit stores the server's response in
- it.
- HTTP [ switches ] PUT [ MIME-TYPE:type ] local-file [
- remote-file-or-url [ result-file ] ]
- Uploads a local file to the server. Only the name of a single
- file can be given; wildcards (and group transfers) are not
- supported by HTTP protocol. If no remote filename is given, the
- file is sent with the same name as the local file, but with any
- pathname stripped.
- HTTP [ switches ] DELETE remote-file-or-url [ local-result-file ]
- Asks the server to delete the specified single file. If a result
- file is specified, it will contain any response data returned by
- the server.
- Note the limitations of HTTP protocol compared to (say) FTP or Kermit.
- There is no command for changing directories, no standard way to get
- file or directory lists, no way to transfer file groups by using
- wildcard notation, etc, and therefore no good way to (say) fetch all
- pages, descend through subdirectories, perform automatic updates, etc.
- There is no assurance a connection will stay open and, as noted, there
- is no provision for data conversion between unlike platforms. The
- data's MIME headers can be used for postprocessing.
- 2.2.3. HTTP Headers
- Each HTTP request and response contains a set of name/value pairs
- called headers. HTTP headers are specified in [189]RFC 2616. For
- example, an HTTP GET request for /index.html on www.columbia.edu
- contains the following headers:
- GET /index.html HTTP/1.1
- Host: www.columbia.edu:80
- User-agent: C-Kermit 8.0
- Authorization: Basic base64-encoded-username-password
- These might be followed by any others specified with a /HEADERS:
- switch:
- Accept: image/gif, image/x-xbitmap, image/jpeg, *.*
- Accept-Encoding: gzip
- Accept-Language: en
- Accept-Charset: iso-8859-1,utf-8
- Cookie: cookie-data
- The server sends back a short report about the file prior to sending
- the file contents. Example:
- HTTP/1.1 200 OK
- Date: Fri, 24 Aug 2001 21:09:39 GMT
- Server: Apache/1.3.4 (Unix)
- Last-Modified: Mon, 06 Aug 2001 21:16:13 GMT
- ETag: "1fa137-10d7-3b6f091d"
- Accept-Ranges: bytes
- Content-Length: 4311
- Content-Type: text/html
- If you want to have this information available to a Kermit script you
- can use the /ARRAY switch to have Kermit put it in array, one line per
- array element. Example:
- set exit warning off
- http open www.columbia.edu
- if fail exit 1 Can't reach server
- http /array:&a get /index.html
- if fail exit 1 Can't get file
- echo Header lines: \fdim(&a)
- for \%i 1 \fdim(&a) 1 {
- echo \%i. \&a[\%i]
- }
- Note that the "Date:" item is the current date and time; the
- "Last-Modified:" item is the file's modification date and time. An
- example showing how to use this information is presented in
- [190]Section 8.13.7.
- 2.2.4. Secure HTTP Connections
- SSL/TLS (Secure Sockets Layer / Transport Layer Security) is the
- protocol used to secure HTTP, SMTP, and other Internet applications.
- See the [191]C-Kermit Reference Section 5.4 for an introduction to
- SSL/TLS. To make a secure HTTP connection, you need:
- 1. A secure client (a version of C-Kermit or Kermit 95 with SSL/TLS
- security built in). Type "check ssl" at the Kermit prompt to make
- sure you have it.
- 2. A secure server to connect to.
- 3. The CA Root Certificate used to authenticate the server to the
- client. (see [192]Section 15 of the security reference for an
- introduction to certificates).
- And you must make a connection to the secure HTTP port: service name
- HTTPS, port number 443 (as opposed to service HTTP, port 80). You can
- also make secure connections to other ports by including the /TLS or
- /SSL switch with the HTTP OPEN command, if the host supports SSL/TLS on
- the given port:
- The quality of the SSL/TLS connection depends on the cipher suite.
- There are several possibilities:
- Anonymous cipher suite:
- If an anonymous cipher suite is negotiated, the connection is
- encrypted but there is no authentication. This connection is
- subject to a Man-In-The-Middle (MITM) attack.
- X.509 certificate on the server:
- When you connect to certain secure servers, an X.509 certificate
- is returned. This certificate is issued to a special hostname,
- something like www1.xyzcorp.com or wwws.xyzcorp.com (rather than
- the normal www.xyzcorp.com). It is signed by the host's
- Certificate Authority (CA). If the host certificate is
- configured on the client, it can be used to verify the
- certificate received from the server. If the certificate it
- verified as authentic, a check is made to ensure it has not
- expired and it was issued to the host you were attempting to
- connect to. If you had asked to connect to (say) www.xyzcorp.com
- but were given a certificate for www1.xyzcorp.com, you would be
- prompted for permission to continue.
- If the verification succeeded, the connection would be encrypted
- with one-way (server-to-client) authentication. This connection
- is not subject to a MITM attack.
- If a username and password are transmitted over this connection,
- they are not subject to interception. However, the standard
- risks associated with passing the password to the host for
- verification apply; for example, if the host has been
- compromised, the password will be compromised.
- X.509 client certificate:
- If a connection has been established with an X.509 server
- certificate, the server can ask the client to send a certificate
- of its own. This certificate must be verified against a CA Root
- certificate. The certificate itself (or subject info from the
- certificate) is used to determine the authorization for the
- client, and if successful, the username and password need not be
- sent to the server.
- Kerberos 5:
- Instead of using X.509 certificates, Kerberos 5 can be used to
- perform the authentication and key exchange. In this situation,
- there is mutual authentication between the client and server.
- The Kerberos 5 principal is used by the server to look up the
- appropriate authorization data. There is no need to send
- username and password.
- An HTTP connection is made with the HTTP OPEN command:
- HTTP [ switches ] OPEN [ { /SSL, /TLS } ] host [ port ]
- If /SSL or /TLS switches are included (these are synonyms), or
- if the service is HTTPS or the port is 443, a secure connection
- is attempted using the current authentication settings; see HELP
- SET AUTHENTICATION for details ([193]Section 6.2 of the security
- reference). If the no /SSL or /TLS switch is included but the
- port is 443 or the service is HTTPS, a secure connection is
- attempted. If an /SSL or /TLS switch is included but a port is
- not specified, an SSL/TLS connection is attempted on the default
- port (80).
- Certificates are covered in the separate [194]Kermit Security Reference
- for C-Kermit 8.0. You should let Kermit know to verify certificates
- with the SET AUTHENTICATION TLS command. For example:
- SET AUTHENTICATION TLS CRL-DIR directory
- Specifies a directory that contains certificate revocation files
- where each file is named by the hash of the certificate that has
- been revoked.
- SET AUTHENTICATION TLS CRL-FILE filename
- Specifies a file that contains a list of certificate
- revocations.
- SET AUTHENTICATION TLS VERIFY-DIR directory
- Specifies a directory that contains root CA certificate files
- used to verify the certificate chains presented by the peer.
- Each file is named by a hash of the certificate.
- SET AUTHENTICATION TLS VERIFY-FILE filename
- Specifies a file that contains root CA certificates to be used
- for verifying certificate chains.
- SET AUTHENTICATION TLS VERIFY OFF
- Tells Kermit not to require a certificate and accept any
- certificate that is presented regardless of whether it is valid.
- There are many other options; see the security document for details.
- Now suppose you need need to fetch the file denoted by the following
- URL:
- https://myuserid:mypassword@wwws.xyzcorp.com/clients/info/secret.html
- Once you have set up the handling of certificates as desired, you can
- use the following Kermit commands:
- http /user:myuserid /password:mypassword open www1.xyzcorp.com https
- if success {
- http get /clients/info/secret.html
- http close
- }
- As another example, let's say that you have a web form you need to
- populate with three fields: red,white and blue.
- <FORM ACTION="http://www.xyzcorp.com/cgi-bin/form.cgi" METHOD="POST">
- <INPUT NAME="Red">
- <INPUT NAME="White">
- <INPUT NAME="Blue">
- </FORM>
- You can handle this with the HTTP POST command. The data to be posted
- is stored in the local file data.txt.
- Red=seven stripes&White=six stripes&Blue=fifty stars
- and the response from the server will be stored into response.txt.
- http open www.xyzcorp.com http
- if success {
- http /array:c post data.txt /cgi-bin/form.cgi response.txt
- http close
- }
- In this scenario, the Common Gateway Interface (CGI) sends a response
- whether it succeeds or fails in a script-dependent manner. The script
- can either report success and enclose the response data; or it might
- send a 302 Found error which indicates that the "Location:" header
- should be used to determine the URL at which the data can be found.
- 2.2.5. HTTP Variables
- \v(http_code)
- The HTTP protocol code number of the most recent server reply,
- e.g. 404 for "not found".
- \v(http_connected)
- 1 when an HTTP connection is open, 0 when there is no HTTP
- connection.
- \v(http_host)
- If an HTTP connection is open, the hostname:port, e.g.
- www.columbia.edu:80; otherwise, empty.
- \v(http_message)
- Server error message, if any, from most recent HTTP command.
- \v(http_security)
- A list of the security parameters and values for the current
- connection, if any. Empty if the connection is not to a secure
- server, or there is no connection.
- To display all the HTTP variables at once, type SHOW VAR HTTP:
- C-Kermit> http open www.columbia.edu
- C-Kermit> http get lkjlkjlkjlkj
- C-Kermit> sho var http
- \v(http_code) = 404
- \v(http_connected) = 1
- \v(http_host) = www.columbia.edu:80
- \v(http_message) = Not Found
- \v(http_security) = NULL
- C-Kermit>
- 2.2.6. The HTTP Command-Line Personality
- If you invoke C-Kermit with the name "http" or "https", you can use a
- special set of HTTP-specific command-line options. You can do this by
- creating a symbolic linke "http" or "https" to the C-Kermit 8.0
- executable, or by having a separate copy of it called "http" or
- "https". Here's the usage message ("http -h"):
- Usage: ./http host [ options... ]
- -h This message.
- -d Debug to debug.log.
- -S Stay (issue command prompt when done).
- -Y Do not execute Kermit initialization file.
- -q Quiet (suppress most messages).
- -u name Username.
- -P password Password.
- -g pathname Get remote pathname.
- -p pathname Put remote pathname.
- -H pathname Head remote pathname.
- -l pathname Local path for -g, -p, and -H.
- -z opt[=value] Security options...
- cert=file Client certificate file
- certsok Accept all certificates
- key=file Client private key file
- secure Use SSL
- verify=n 0 = none, 1 = peer , 2 = certificate required
- The "host" argument is the name of a Web host, e.g. www.columbia.edu.
- The action options are -p, -g, and -H. If you give an action option,
- Kermit does the action and then exits. If you give a host without an
- action option, Kermit makes an HTTP connection to the host and then
- gives you the C-Kermit prompt. Here's a simple example that fetches a
- publicly readable Web page:
- http www.columbia.edu -g kermit/index.html
- If you need to access a website for which a username and password are
- required, you can supply them on the command line with -u and -P. If
- you include a username but omit the password, Kermit prompts you for
- it:
- http www.columbia.edu -u olga -p kermit/index.html -l index.html
- Password:
- Note that when PUT'ing files to websites, you have to supply both the
- -p (remote pathname) and -l (local path) options.
- If your version of Kermit is built with SSL/TLS security, you can also
- use the -z option to make secure HTTP (https) connections.
- Finally, as noted in [195]Section 16, you can also give a URL instead
- of a host name and options.
- [ [196]Top ] [ [197]Contents ] [ [198]C-Kermit Home ] [ [199]Kermit
- Home ]
- 3. KERMIT'S BUILT-IN FTP CLIENT
- 3.1. [200]Making and Managing FTP Connections
- 3.2. [201]Making Secure FTP Connections
- 3.3. [202]Setting FTP Preferences
- 3.4. [203]Managing Directories and Files
- 3.5. [204]Uploading Files With FTP
- 3.6. [205]Downloading Files With FTP
- 3.7. [206]Translating Character Sets
- 3.8. [207]FTP Command Shortcuts
- 3.9. [208]Dual Sessions
- 3.10. [209]Automating FTP Sessions
- 3.11. [210]Advanced FTP Protocol Features
- Earlier versions of C-Kermit and K95 included an FTP command, but it
- simply invoked an external FTP client. Now, by popular demand, Kermit
- includes its own built-in FTP client that offers the following
- advantages over traditional FTP clients (and its previous interface to
- them):
- * Any of Kermit's built-in [211]security methods can be used to
- establish and conduct secure FTP sessions with [212]FTP servers
- that support these methods. (Security modules can be subject to
- export restrictions.)
- * Kermit's FTP client uses "passive mode" by default to avoid
- blockage by firewalls and network address translators. Of course
- active mode can be chosen too when needed.
- * [213]Character sets can be translated as part of the transfer
- process even when the FTP server does not support character-set
- translation, including to/from the new Internet standard
- international character set, [214]Unicode UTF-8. This includes both
- the file's name and (for text files only) its contents.
- * All of C-Kermit's [215]file-selection mechanisms are available:
- size, date, name patterns and lists, exception lists, etc.
- * [216]Atomic file movement capabilities are provided (delete, move,
- or rename files automatically after successful transfer).
- * The correct file type, "ascii" (i.e. text) or binary, is chosen
- automatically for each file (explained in [217]Section 4), and any
- mixture of text and binary files can be sent in a single operation,
- even across platforms.
- * Update mode ("don't bother transferring files that didn't change
- since last time") and recovery (resumption of an interrupted
- transfer from the point of failure) are available in both
- directions.
- * When uploading files from UNIX to UNIX, the file's permissions can
- be preserved if desired.
- * Recursive directory-tree PUTs are supported between any two
- platforms that have tree-structured file systems. Recursive GETs
- are supported between like platforms if the server cooperates and
- between like or unlike platforms if the server supports MLSD
- ([218]Section 3.11).
- * When receiving files, all of Kermit's file collision actions are
- available: backup, update, refuse, rename, etc.
- * Multi-file transfers can be interrupted on a per-file basis,
- automatically skipping to the next file.
- * FTP sessions are [219]fully scriptable.
- * An entire FTP session (connect, login, CD, upload or download,
- logout) can be specified on the command line without using a
- script.
- * All of Kermit's logging options and formats are available to keep
- an accurate and complete record of each connection and file
- transfer, and to aid in troubleshooting.
- * All of Kermit's file-transfer display options are available
- (fullscreen, brief, CRT, serial, none).
- And best of all:
- * Kermit doesn't give you those annoying per-file prompts every time
- you start a multi-file transfer without remembering to give a
- "prompt" command first :-).
- [ [220]Top ] [ [221]FTP Top ] [ [222]FTP Client Overview ] [ [223]FTP
- Script Tutorial ] [ [224]C-Kermit Home ] [ [225]Kermit Home ]
- 3.1. Making and Managing FTP Connections
- Each copy of Kermit can have one FTP connection open at a time. FTP
- connections are independent of regular terminal connections; a terminal
- connection (serial or network via SET LINE, DIAL, SET HOST, TELNET,
- etc) may be, but need not be, open at the same time as an FTP
- connection, and terminal connections can also be closed, and new
- connections opened, without interfering with the FTP connection (and
- vice versa). Thus, for example, Kermit can have an FTP connection and a
- TELNET connection open to the same host simultaneously, using the
- TELNET connection (e.g.) to send mail or take other desired actions as
- various FTP actions complete. Of course, each copy of Kermit can do
- only one thing at a time, so it can't (for example) transfer a file
- with FTP and another file with Kermit protocol simultaneously.
- A Kermit FTP session can be established by [226]command-line options,
- by [227]URL, or by [228]interactive commands.
- 3.1.1. Kermit Command-Line Options for FTP
- The new command-line option '-9' (sorry, we're out of letters) can be
- used when starting C-Kermit, telling it to make an FTP connection:
- kermit -9 hostname
- or if a non-default FTP port is needed:
- kermit -9 hostname:port
- You can also specify the username on the command line with the -M ("My
- User ID") option that was already there for other connection types:
- kermit -9 hostname -M olga
- If you specify the username on the command line, Kermit uses it when
- making the connection and does not prompt you for it (but it does
- prompt you for the password if one is required).
- Once the connection is made, you get the regular Kermit prompt, and can
- give interactive commands such as the ones described below. When you
- give a BYE command, Kermit closes the session and exits, just as a
- regular FTP client would do. If you don't want Kermit to exit when you
- give a BYE command, include the -S ("Stay") option on the command line.
- Other Kermit command-line options that are not specific to non-FTP
- connections should affect the FTP session in the expected ways; for
- example, -i and -T force binary and text mode transfers, respectively.
- File transfers can not be initiated on the "kermit -9" command line;
- for that you need to use Kermit's FTP personality (next section) or you
- can use URLs ([229]Section 3.1.3).
- 3.1.2. The FTP Command-Line Personality
- If you want to replace your regular FTP client with C-Kermit, you can
- make a link called "ftp" to the C-Kermit binary (or you can store a
- copy of the C-Kermit binary under the name "ftp"). When C-Kermit is
- invoked with a program name of "ftp" (or "FTP", case doesn't matter),
- it assumes the command-line personality of the regular FTP client:
- ftp [ options ] hostname [ port ]
- In this case the options are like those of a regular FTP client:
- -d Debug: enables debug messages and creates a debug.log file.
- -n No autologin: Kermit should not send your user ID automatically.
- -t Packet trace: accepted but is treated the same as -d.
- -v Verbose: accepted but ignored (operation is verbose by default).
- -i Not interactive: accepted but ignored.
- and the hostname can also be a URL (explained in [230]Section 3.1.3).
- To specify a non-default TCP port for the FTP server, include the port
- number or name after the hostname.
- There are also some bonus options that allow you to execute an entire
- FTP session from the shell command line, as long as you don't include
- the -n option. These are not available with regular FTP clients, and at
- least one of these options (-g) conflicts with UNIX ftp (where -g means
- "no globbing", which does not apply to Kermit), and some of them (like
- the options above) also conflict with regular Kermit command-line
- options:
- -m mode = "passive" (default) or "active"
- -Y Don't execute the Kermit initialization file [1]
- -q Quiet, suppresses all but error messages [1]
- -S Stay, don't exit automatically [1]
- -A Autologin anonymously [2]
- -u name Username for autologin [2] (synonym: -M [1])
- -P password Password for autologin (see cautions below) [2]
- -D directory cd after autologin [2]
- -b Binary mode [2]
- -a Text ("ascii") mode [2] (synonym: -T [1])
- -R Recursive (works with -p) [4]
- -p files Files to put (upload) after autologin [2] (synonym: -s [1])
- -g files Files to get (download) after autologin [3]
- [1] Same as Kermit, not available in regular FTP clients.
- [2] Conflicts with Kermit, not available in regular FTP clients.
- [3] Same as Kermit, conflicts with regular FTP clients.
- [4] Conflicts with Kermit, available in some FTP clients.
- Fancier options such as restart, character-set translation, filename
- collision selection, automatic move/rename/delete, etc, are not
- available from the command line; for these you can use the commands
- described in the following sections. The -R option might also work with
- -g (GET) but that depends on the server.
- The following security options are also available, explained in
- [231]Section 3.2:
- -k realm Kerberos 4 realm [4]
- -f Kerberos 5 credentials forwarding [4]
- -x autoencryption mode [4]
- -c cipher SRP cipher type [4]
- -H hash SRP encryption hash [4]
- -z option Security options [4]
- If you include -A or specify a name of "anonymous" or "ftp", you are
- logged in anonymously and, in the absence of -P, Kermit automatically
- supplies a password of "user@host", where "user" is your local user ID,
- and "host" is the hostname of the computer where Kermit is running. If
- you do not include -p or -g, Kermit enters command mode so you can type
- commands or execute them from a script.
- If you include -p or -g, Kermit attempts to transfer the specified
- files and then exits automatically at the end of the transfer unless
- you also included -S (Stay). It uses the "brief" file transfer display
- (one line per file) unless you include the -q option to suppress it.
- When uploading files with -p, Kermit switches automatically between
- text and binary mode for each file.
- When downloading, you can either specify a particular mode (text or
- binary) to be used for all the files, or you can let Kermit select the
- type for each file automatically, based on its name (see [232]Sections
- 3.5 and [233]3.6 for greater detail). In UNIX be sure to quote any
- wildcard characters to prevent the shell from expanding them, as shown
- in the examples just below. Filename collisions are handled according
- Kermit's FILE COLLISION setting (if specified in your Kermit
- customization file; otherwise the default, which is BACKUP).
- It should go without saying that the -P option should be used with
- caution. In addition to the well-known risks of transmitting plaintext
- passwords over the Internet, in this case the password also echos to
- the screen if you type it, and can be seen in ps and w listings that
- show the user's currently active command and command-line arguments.
- Thus command-line FTP sessions are most appropriate for secure or
- anonymous connections (those that do not require passwords).
- Here's an example in which you download the latest C-Kermit "tarball"
- from the Columbia University FTP archive:
- ftp -A kermit.columbia.edu -bg kermit/archives/ckermit.tar.gz
- This assumes that "ftp" is a symbolic link to C-Kermit. It logs you in
- anonymously and gets the ckermit.tar.gz file in binary mode from the
- kermit/archives directory.
- Here's a slightly more ambitious example that illustrates CD'ing to the
- desired server directory to get a group of files in text mode (in this
- case the C-Kermit source files):
- ftp -A kermit.columbia.edu -D kermit/f -ag "ck[cuw]*.[cwh]" makefile
- In this case we CD to the kermit/f directory so we don't have to
- include it in each file specification, and we quote the ck[cuw]*.[cwh]
- specification so the shell doesn't expand it, since we have to pass it
- as-is to the server. Note also that the quotes don't go around the
- entire file list; only around each file specification that needs to be
- quoted.
- Here's one more example, that uploads a debug log file in binary mode
- to the Kermit incoming directory (as we might ask you to do when
- following up on a problem report):
- ftp -A kermit.columbia.edu -D kermit/incoming -bp debug.log
- In this case the -D option is required to tell the server where to put
- the incoming file.
- Unless the -Y option is included, your Kermit initialization file
- (.mykermrc in UNIX, K95.INI in Windows) is executed before the command
- line options, so you can set any FTP-related preferences there, as
- described in the subsequent sections.
- 3.1.3. The FTP URL Interpreter
- If Kermit is invoked with either its regular personality (as "kermit")
- or its FTP personality (as "ftp"), you can also give a URL
- (Universal Resource Locator) instead of a hostname and options,
- with or without a username and password:
- ftp ftp://user:password@host/path
- ftp ftp://user@host/path
- ftp ftp://@host/path (or ftp://:@host/path)
- ftp ftp://host/path
- kermit ftp://host/path
- If the FTP personality is used, the service must be "ftp". In all
- cases, a hostname or address must be included. If a user is included
- but no password, you are prompted for the password. If a path
- (filename) is included:
- * If "@" is included without a user, Kermit prompts for the username
- and password.
- * If no user and no "@" are included, "anonymous" is used.
- * GET is assumed.
- If no path (and no action options) are included, an interactive FTP
- session is started, as in this example:
- ftp ftp://kermit.columbia.edu
- If a path is included, but a username is not included, "anonymous" is
- used and an appropriate user@host password is supplied automatically.
- If authentication is successful, Kermit attempts to GET the file
- indicated by the path or, if the path is the name of a directory, it
- asks the server for a directory listing. In both cases, Kermit
- disconnects from the server and exits after the operation is complete
- (unless you have included the -S option on the command line).
- Here's an example that gets a listing of the Kermit directory at the
- Kermit ftp site:
- ftp ftp://kermit.columbia.edu/kermit/
- This example gets the top-level READ.ME file from the same directory:
- ftp ftp://kermit.columbia.edu/kermit/READ.ME
- Here's the same example, but requesting a text-mode transfer:
- ftp -T ftp://kermit.columbia.edu/kermit/READ.ME
- This illustrates that you can mix command-line options and URLs
- if you desire.
- Here's an example that logs in as a (fictitious) real user to get a
- file:
- ftp ftp://olga@ftp.xyzcorp.com/resume.txt
- The password is not included, so Kermit prompts for it.
- This scheme allows Kermit to be used as the FTP helper of other
- applications, such as Web browsers, with all its advantages over other
- FTP clients (especially the ones that are built in to most Web
- browsers), e.g. that it can be given wildcards, and it can pick text
- and binary mode automatically for each file.
- HINT: suppose somebody sends you an FTP URL in email, or you see it in
- some text. If your terminal screen supports copy/paste, copy the url,
- and then at the shell prompt type "kermit", a space, and then paste the
- URL, e.g.:
- $ kermit ftp://alpha.greenie.net/pub/mgetty/source/1.1/mgetty1.1.27-O
- "$ is the shell prompt; the part you type is underlined, the rest is
- pasted in. Kermit does the rest.
- 3.1.4. Interactive FTP Session Establishment
- As you read this and the following sections, bear in mind that any
- command that can be given at the prompt can also be used in a script
- program. Kermit's script programming language is the same as its
- interactive command language.
- An FTP session is established with the FTP OPEN command:
- FTP [ OPEN ] [ { /SSL, /TLS } ] hostname [ switches ] [ port ]
- Opens an FTP connection to the given host on the given port and,
- if FTP AUTOLOGIN is ON, also logs you in to the server,
- prompting for username and password if necessary. If no port is
- specified, the regular FTP protocol port (21) is used. The OPEN
- keyword is optional (unless the hostname conflicts with one of
- the FTP command keywords, which you can list by typing "ftp ?").
- The hostname can be an IP host name, numeric IP address, or if you have
- a network directory active (SET NETWORK DIRECTORY; see Chapter 6 of
- [235]Using C-Kermit), an entry name in the directory. In the latter
- case, if the given hostname matches exactly one entry, the associated
- name or address is used; if it matches more than one, Kermit cycles
- through them until one is found that can be opened; if it matches none,
- then the hostname is used as-is. If a directory is active but you want
- to bypass directory lookup, include an "=" sign at the beginning of the
- hostname, and/or use a numeric IP address.
- When an FTP connection is opened, the default file-transfer mode is set
- to binary if the client and server platforms are alike (e.g. both of
- them are some kind of UNIX), and to text ("ascii") if they are not
- alike. This has no particular effect for uploading since Kermit
- automatically switches between text and binary mode for each file, but
- might be important for downloading. The connection is also set to
- Stream mode and File structure. Record- or page-oriented file transfers
- are not supported by C-Kermit's FTP client.
- The optional FTP OPEN switches are:
- /ANONYMOUS
- Logs you in anonymously, automatically supplying username
- "anonymous" and user@host as the password, based on your local
- user and host names.
- /NOLOGIN
- Overrides SET FTP AUTOLOGIN ON for this connection only.
- /USER:name
- Uses the given username to log you in, thus avoiding the Name:
- prompt.
- Overrides SET FTP AUTOLOGIN OFF for this connection only.
- /PASSWORD:text
- Uses the given text as your password, thus avoiding the
- Password: prompt. This switch is not recommended for use in
- script files, which would be a security risk.
- /ACCOUNT:text
- Uses the given text as your account (or secondary password,
- depending on the requirements of the server; most servers do not
- require or accept an account name). If an account is not
- supplied, you are not prompted for one.
- /PASSIVE
- Opens the connection in passive mode. Passive mode is the
- default in Kermit's FTP client, unlike in most others, since it
- works better through firewalls. The /PASSIVE and /ACTIVE
- switches apply only to the connection that is being opened, and
- do not affect the global FTP PASSIVE-MODE setting.
- /ACTIVE
- Opens the connection in active mode. Use this switch if the
- server does not support passive mode, or use the command SET FTP
- PASSIVE-MODE OFF.
- /NOINIT
- Added in C-Kermit 8.0.201. Tells C-Kermit not to send REST,
- STRU, FEAT, and MODE commands to the server when the connection
- is opened, since these have been reported to cause confusion in
- certain servers.
- When a username or password is missing, a prompt is issued at the
- controlling terminal and you must type the response; the response can
- not be scripted. Use the switches to avoid prompts, or one of the
- secure authentication methods described in the next section, or see
- [236]SET FTP AUTOLOGIN and the [237]FTP USER and similar commands
- described later in this section.
- Examples:
- ftp open kermit.columbia.edu /anonymous ; Open and log in anonymously
- ftp kermit.columbia.edu /anonymous ; The OPEN keyword can be omitted
- ftp xyzcorp.com ; Open and maybe prompt for username
- ftp xyzcorp.com /user:olga ; Open and log in as olga
- ftp testing.abccorp.com 449 ; Specify a special TCP port number
- ftp testing.abccorp.com /user:olaf /password:secret 449
- The FTP OPEN command succeeds if a connection was opened to the server
- (even if the given username and password were not valid) and fails
- otherwise (see [238]Section 3.8 for details).
- When your FTP session is complete, you can terminate it as follows:
- FTP BYE
- Closes the FTP connection if one was open. The FTP prefix can be
- omitted if no other connection is open at the same time (see
- [239]Section 3.8 for details). If a connection log is active, an
- FTP record is written to it. If Kermit was started with the -9
- command-line option or with its FTP command-line personality,
- and the -S (Stay) option was not given, AND there is no other
- active connection, the FTP BYE command also exits, just as it
- does on a regular FTP client. Synonyms: FTP CLOSE, FTP QUIT (but
- if the FTP prefix is omitted from QUIT, this becomes the regular
- Kermit QUIT command, which is equivalent to EXIT; i.e. it closes
- the connection and exits from Kermit).
- The following commands can be used to achieve greater control over the
- connection and login process:
- SET FTP ANONYMOUS-PASSWORD text
- Allows you to choose the password text to be sent automatically
- by Kermit when you open an FTP connection with the /ANONYMOUS
- switch.
- SET FTP AUTOLOGIN { ON, OFF }
- If you give this command prior to opening an FTP connection, it
- controls whether Kermit tries to log you in automatically as
- part of the connection process. Normally ON, which means the
- username and password are sent automatically (and prompted for
- if they are not yet known). When OFF, FTP OPEN connects to the
- server without logging in. OFF is equivalent to the -n
- command-line option when using Kermit's FTP command-line
- personality.
- FTP USER name [ password [ account ] ]
- Used to log in to an FTP server to which a connection has been
- made without autologin, or when autologin failed. If the
- password is furnished on the command line, it is used; otherwise
- you are prompted for a password. An account may also be
- furnished if required by the server; it is not required by
- Kermit and is not prompted for if omitted. Synonyms: USER, FTP
- LOGIN.
- FTP ACCOUNT text
- Sends an account name to a server that supports accounts. If the
- server does not support accounts, an error response occurs. If
- the server does support accounts, the account is accepted if it
- is valid and rejected if it is not. The account might be used
- for charging purposes or it might be a secondary password, or it
- might be used for any other purpose, such as an access password
- for a particular disk. Servers that support accounts might or
- might not allow or require the account to be sent prior to
- login; usually it is sent after login, if at all. Synonym:
- ACCOUNT.
- Example:
- set ftp autologin off ; One thing at a time please
- ftp xyzcorp.com ; Try to make the connection
- if fail exit 1 FTP connection failed ; Check that it was made
- ftp user olga secret ; Now log in to the server
- if fail exit 1 FTP login failed ; Check that it worked
- ftp account 103896854 ; Login OK - send account
- if fail echo WARNING - FTP ACCT failed ; Warn if problem
- ... ; (have session here)
- bye ; Log out and disconnect
- The following commands are used to control or get information about the
- FTP connection. Any particular FTP server does not necessarily support
- all of them.
- FTP RESET
- Terminates a user session but leaves the connection open,
- allowing a new login via FTP USER.
- FTP IDLE [ number ]
- Most FTP servers automatically log you out and and disconnect
- your session if there has been no activity for a certain amount
- of time. Use this command to ask the server to set its idle
- limit to the given number of seconds. Omit the number to ask the
- server to inform you of its current idle limit.
- FTP STATUS [ filename ]
- Asks the FTP server to send information about the current
- session. The result is a free-format report that might include
- server identification, username and login time, FTP protocol
- settings, and file-transfer statistics. If a filename is given,
- the server is supposed to send detailed information about the
- file.
- FTP SYSTEM
- Asks the FTP server to identify its operating system (Listed in
- Internet Assigned Numbers, Operating System Names). Examples:
- UNIX, VMS, VM/CMS, WINDOWS-NT. Unfortunately many variations are
- allowed (e.g. LINUX-2.0, LINUX-2.2, FREEBSD, ULTRIX, etc,
- instead of UNIX; WINDOWS-NT-3, WINDOWS-NT-3.5, WINDOWS-NT-3.51,
- WINDOWS-NT-4, etc). The report might also include other
- information like "Type L8", "Type I", or "Type A", indicating
- the file-transfer mode.
- FTP HELP [ keyword [ keyword [ ... ] ]
- Asks the server to list the commands it supports. The response
- is usually cryptic, listing FTP command mnemonics, not the
- commands used by the client (since the server has no way of
- knowing anything about the client's user interface). For
- example, the PUT command is STOR in FTP protocol. If a keyword
- is given, which should be an FTP protocol command,
- slightly-more- detailed help is given about the corresponding
- command (if the FTP server supports this feature). Examples:
- "ftp help", "ftp help stor".
- FTP SITE text
- (Advanced) Sends an FTP SITE (site-specific) command. Usually
- this means that the FTP server is asked to run an external
- command with the given arguments. You might be able to find out
- what SITE commands are available by sending "ftp help site" to
- the server, but in general the availability of and response to
- SITE commands is (not surprisingly) site specific.
- FTP QUOTE text
- (Advanced) Sends an FTP command in FTP protocol format. Use this
- command to send commands to the server that the FTP client might
- not know about.
- SHOW FTP
- Lists client (Kermit) FTP settings and information. Also SHOW
- CONNECTION, SHOW COMMUNICATIONS.
- HELP FTP [ keyword ]
- Asks Kermit to list and describe its built-in FTP commands.
- HELP SET FTP [ keyword ]
- Asks Kermit to list and describe its built-in SET FTP commands.
- [ [240]Top ] [ [241]FTP Top ] [ [242]C-Kermit Home ] [ [243]Kermit Home
- ]
- 3.1.5. Making Proxy Connections
- The simplist form of firewall traversal is the HTTP CONNECT command.
- The CONNECT command was implemented to allow a public web server which
- usually resides on the boundary between the public and private networks
- to forward HTTP requests from clients on the private network to public
- web sites. In order to allow secure web connections to be established,
- the CONNECT command works by authenticating the client with a
- username/password and then establishing a tunnel to the desired host.
- Many web servers support the CONNECT command and it can be configured
- to allow outgoing connections to authenticated user to any TCP/IP
- hostname/port combination accessible to the web server. The limitations
- of HTTP CONNECT is that it can only be used for outgoing connections
- for protocols that are implemented using TCP/IP. Protocols such as
- Kerberos authentication that use UDP/IP cannot be tunneled using HTTP
- CONNECT.
- Kermit provides support for the use of HTTP CONNECT proxy services with
- the command:
- SET TCP HTTP-PROXY [/USER:username /PASSWORD:password] hostname/ip-address[:po
- rt]
- When a port is not specified the default port configured on the HTTP
- server is used. This is frequently port 443. When a hostname is
- specified, it is resolved using the DNS available to the web server.
- 3.2. Making Secure FTP Connections
- Also see: [244]Accessing IBM Information Exchange with Kermit.
- In the previous section, you can see several examples of traditional
- insecure authentication: username and password sent across the network
- in clear text. Of course this is bad practice on at least two counts:
- (1) storing passwords in files (such as script files) gives access to
- the target systems to anybody who can obtain read access to your
- scripts; and (2) sending this information over the network leaves it
- open to interception by network sniffers or compromised hosts.
- Because of the increasing need for security on the Internet, FTP
- servers are beginning to appear that offer secure forms of
- authentication, in which no information is sent over the network that
- would allow anyone who intercepts it to usurp your identity and gain
- your access rights.
- Kermit provides an equivalent form of FTP security for each type of
- IETF standard security implemented in Telnet. These include
- GSSAPI-KERBEROS5, KERBEROS4, Secure Remote Password (SRP), and
- Transport Layer Security (SSL and TLS). It does not presently include
- SSL tunneling nor any form of SSH v1 or v2. When Kermit is built with
- the necessary libraries, secure FTP connections are attempted by
- default, in which all connections are authenticated and the command and
- data channels are private.
- The use of authentication and encryption for FTP connections can be
- adjusted with the commands listed below, which are available only if
- your version of Kermit was built with the corresponding security
- options and libraries:
- SET FTP AUTHTYPE { AUTOMATIC, GSSAPI-KRB5, KERBEROS4, SRP, SSL, TLS }
- Specifies an ordered list of authentication methods to be
- attempted when AUTOAUTHENTICATION is ON. The default list is:
- GSSAPI-KRB5, SRP, KERBEROS_V4, TLS, SSL. If none of the selected
- methods are supported by the server, an insecure login is used
- as a fallback. Note, by the way, that SSL or TLS can be used to
- secure an anonymous connection.
- SET FTP AUTOAUTHENTICATION { ON, OFF }
- Tells whether authentication should be negotiated by the FTP
- OPEN command. Default is ON. Use SET FTP AUTOAUTHENTICATION OFF
- to force a clear-text, unencrypted connection to FTP servers
- (such as the one at the Kermit FTP site) that normally would try
- to negotiate secure authentication and encryption.
- SET FTP AUTOENCRYPTION { ON, OFF }
- Tells whether encryption (privacy) should be negotiated by the
- FTP OPEN command, which can happen only if secure authentication
- is also negotiated. Default is ON.
- SET FTP AUTOLOGIN { ON, OFF }
- Tells Kermit whether to try logging in automatically when you
- make an FTP connection, as opposed to letting you do it "by
- hand" with the FTP USER command.
- SET FTP COMMAND-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE }
- Determines the level of protection applied to the command
- channel:
- CLEAR Data is sent in plaintext and not protected against tampering.
- CONFIDENTIAL Data is encrypted but not protected against tampering.
- PRIVATE Data is encrypted and is protected against tampering.
- SAFE Data is sent in plaintext but protected against tampering.
- The default is PRIVATE.
- SET FTP CREDENTIAL-FORWARDING { ON, OFF }
- Tells whether end-user credentials are to be forwarded to the
- server if supported by the authentication method (GSSAPI-KRB5
- only). This is often required to allow access to distributed
- file systems (e.g. AFS.)
- SET FTP DATA-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE }
- Tells what level of protection is applied to subsequent data
- channels. The meanings of the protection-level keywords are the
- same as for SET FTP COMMAND-PROTECTION-LEVEL. The default is
- PRIVATE.
- SET FTP SRP CIPHER name
- Specifies the cipher to be used for encryption when SRP
- authentication is in use. The list of possible choices is
- computed based on the capabilities of the local SRP library and
- includes NONE plus zero or more of the following:
- BLOWFISH_ECB CAST5_ECB DES_ECB DES3_ECB
- BLOWFISH_CBC CAST5_CBC DES_CBC DES3_CBC
- BLOWFISH_CFB64 CAST5_CFB64 DES_CFB64 DES3_CFB64
- BLOWFISH_OFB64 CAST5_OFB64 DES_OFB64 DES3_OFB64
- The default is DES3_ECB.
- SET FTP SRP HASH name
- Specifies the hash to be used for data protection when SRP
- authentication is in use. The choices are MD5 and SHA. The
- default is SHA.
- Command-line options:
- -k name
- Specifies the realm to be used with Kerberos 4 authentication (=
- SET AUTH K4 REALM name).
- -f
- Enables forwarding of Kerberos 5 credentials to the host when
- using GSSAPI authentication (= SET AUTH K5 FORWARDABLE ON).
- -x
- Enables autoencryption (= SET FTP AUTOENCRYPTION ON).
- -c cipher
- Specifies the kind of cipher to be used for encryption with SRP
- authentication. Equivalent to SET FTP SRP CIPHER, with the same
- choices. If this option is not given, CAST5_CBC is used.
- -H hash
- Specifies the hash to be used for encryption with SRP
- authentication. Equivalent to SET FTP SRP HASH, with the same
- choices. If this option is not given, SHA is used.
- -z debug
- Turns on SSL/TLS debugging.
- -z secure
- Requires secure connection.
- -z certsok
- Says to accept all certificates without checking validity.
- -z verify=n
- Sets certificate verification mode to the given number, n:
- 0 = no verification
- 1 = verify certificate if presented
- 2 = require verification of certificate
- -z cert=filename
- Specifies a file containing a client certificate to be presented
- to the FTP server.
- -z key=filename
- Specifies a file containing a private key matching the client
- certificate.
- -z !krb4
- (nokrb4) Disables the use of Kerberos 4.
- -z !gss
- -z nogss
- Disables the use of GSSAPI - Kerberos 5.
- -z !srp
- -z nosrp
- Disables use of SRP.
- -z !ssl
- -z nossl
- Disables the use of SSL.
- -z !tls
- -z notls
- Disables the use of TLS.
- Caution: If your FTP connection is secured via AUTH TLS, it is not
- possible to interrupt a file transfer. This is a limitation of all
- known FTP servers that support AUTH TLS.
- Note that when using certain security methods, such as SSL or TLS, you
- may be prompted to confirm or verify certain actions or conditions, for
- example, whether to accept self-signed certificates. This can interfere
- with unattended operation of scripts; see [245]Section 3.10.
- [ [246]Top ] [ [247]FTP Top ] [ [248]C-Kermit Home ] [ [249]Kermit Home
- ]
- 3.3. Setting FTP Preferences
- FTP preferences can be set globally and persistently with the commands
- in the following sections; many of these can also be overridden on a
- per-command basis with switches that have the same name.
- 3.3.1. Logs, Messages, and Other Feedback
- You can control the amount of feedback received from your FTP session
- with the commands in this section. First, you can create a log of your
- FTP transfers with the following commands:
- SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF }
- Selects the log format. VERBOSE is the default, and is described
- in [250]the manual. FTP chooses a WU-FTPD format, the same as is
- used by the popular FTP server. BRIEF creates per-file records
- in comma-separated-list format. For greater detail, see
- [251]Section 4.17 of the [252]C-Kermit 7.0 Update Notes.
- LOG TRANSACTIONS filename
- Records FTP (or Kermit, or any other protocol) uploads and
- downloads in the given file using the format selected by the
- most recent SET TRANSACTION-LOG command, if any, or else the
- default format.
- FTP screen messages and displays are controlled by the following
- commands:
- SET TRANSFER DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF }
- FTP transfers use Kermit's normal file-transfer display styles.
- Use this command to choose the desired format; the default on
- most platforms is FULLSCREEN. The display is automatically
- disabled if Kermit is running in the background or in batch.
- BRIEF is always used for command-line initiated transfers
- (unless suppressed by -q). While a file-transfer is in progress,
- you can interrupt it in the normal Kermit way by typing one of
- the following keys or key combinations:
- X - Cancel current file but go on to the next one (if any).
- Z - Cancel the entire transfer. Ctrl-L or Ctrl-W - Refresh
- the file-transfer display (if any).
- SET FTP DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF }
- Like SET TRANSFER DISPLAY, but applies only to FTP connections,
- and does not affect Kermit- or other protocol file transfers.
- SET QUIET { ON, OFF }
- This command applies to Kermit in general, not just FTP. OFF by
- default; when ON, it suppresses most messages from most commands
- as well as the file-transfer display.
- SET FTP PROGRESS-MESSAGES { ON, OFF }
- Tells whether Kermit should print locally-generated feedback
- messages for each non-file-transfer command. ON by default.
- SET FTP VERBOSE-MODE { ON, OFF }
- Tells whether to display all responses from the FTP server. OFF
- by default. This shows all responses to all commands, except
- when the file-transfer display is active, and unless you have
- SET QUIET ON. When OFF, responses are shown only for commands
- such as FTP PWD whose purpose is to display a response.
- SET FTP DEBUG { ON, OFF }
- Tells whether local client debugging information should be
- displayed. OFF by default. When ON, the commands that are sent
- to the server are shown, as well as its responses (even if
- VERBOSE-MODE is OFF), plus additional informational messages are
- printed regarding the progress of secure operations. Also, the
- temporary file created by the [253]MGET command is not deleted
- so you can see what's in it.
- Set all of these to OFF when silent running is desired.
- 3.3.2. Operational Preferences
- FTP DISABLE new-protocol-feature-name
- FTP ENABLE new-protocol-feature-name
- Explained in [254]Section 3.11.
- SET FTP AUTOLOGIN { ON, OFF }
- If you give this command prior to opening an FTP connection, it
- controls whether Kermit tries to log you in automatically as
- part of the connection process. Normally ON, which means the
- username and password are sent automatically (and prompted for
- if they are not yet known). When OFF, FTP OPEN connects to the
- server without logging in. OFF is equivalent to the -n
- command-line option when using Kermit's FTP command-line
- personality. See [255]Section 3.1.4 for usage.
- SET FTP PASSIVE-MODE { ON, OFF }
- ON by default, to avoid random TCP port assignment for data
- connections, which can prevent FTP protocol from working through
- firewalls and network address translators (for more on these
- topics, see the [256]Kermit security reference. Set to OFF in
- case the FTP server does not support passive mode, or in case
- the client has problems with it (it has been observed, for
- example, that when using passive mode, the SCO XENIX 2.3.4
- TCP/IP stack hangs in the connect() call forever). Synonyms:
- PASSIVE [ ON ], PASSIVE OFF, PASV [ ON ], PASV OFF.
- SET FTP SEND-PORT-COMMANDS { ON, OFF }
- This command determines whether the FTP client sends a new PORT
- command to the server when accepting incoming data connections
- (as when not using passive mode.) When PASSIVE-MODE is OFF and
- SET SEND-PORT is OFF, the port that was originally specified is
- reused. This is the default behavior for normal FTP clients but
- it is not compatible with many firewalls.
- SET FTP CHARACTER-SET-TRANSLATION { ON, OFF }
- Whether to translate character sets when transferring files with
- FTP (explained in [257]Section 3.7). OFF by default.
- SET FTP SERVER-CHARACTER-SET name
- Tells Kermit the character set used by the FTP server, UTF-8 by
- default ([258]Section 3.7).
- SET FTP SERVER-TIME-OFFSET delta-time
- Tells Kermit to apply the given [259]delta time to file
- timestamps provided by the server for its files; for use when
- (for example) the server does not have its timezone set
- correctly.
- SET FTP ERROR-ACTION { PROCEED, QUIT }
- When transferring a group of files with FTP, and an error occurs
- with one of the files, Kermit normally goes on the next file.
- Use SET FTP ERROR-ACTION to QUIT to make Kermit stop the
- transfer immediately and fail if an error occurs with any single
- file in the group. Example: you have given Kermit a list of
- files to send, and one of the files can not be found, or read
- permission is denied. Note that canceling a file by typing 'X'
- during transfer is not considered an error (if you want to
- cancel the entire transfer, type 'Z' or Ctrl-C).
- SET FTP PERMISSIONS { AUTO, ON, OFF }
- When uploading files with PUT or MPUT, this tells whether Kermit
- should send each file's permissions. The default is OFF, which
- means not to send permissions, in which case the uploaded file's
- permissions are set by the FTP server according to its own
- criteria. ON means to send them, AUTO means to send them only if
- the client (Kermit) and server are on like platforms (e.g. both
- UNIX). This command has no effect when downloading, since the
- FTP protocol does not include a way for the server to inform the
- client of a file's permissions. Also see [260]FTP PUT
- /PERMISSIONS. Note that setting permissions after uploading is
- likely to work (correctly or at all) only when the client and
- server platforms are alike (e.g. both of them are some form of
- UNIX). Also note that Windows files don't have permissions. Also
- see [261]FTP CHMOD.
- SET FTP DATES { ON, OFF }
- When downloading files with GET or MGET, this tells whether
- Kermit should try to set the received file's date from the
- server's date. FTP DATES is ON by default. Note, however, that
- FTP protocol does not allow date preservation when uploading. So
- at best, SET FTP DATES ON can work only when downloading, and
- then only when the server agrees to furnish file dates.
- SET FTP FILENAMES { AUTO, CONVERTED, LITERAL }
- When uploading (sending) files, this tells whether to convert
- outbound filenames to "common form". This means allowing only
- one period in a name, uppercasing any lowercase letters,
- replacing spaces by underscores, etc. AUTOMATIC is the default,
- meaning LITERAL when client and server are the same type of
- system (e.g. UNIX) and CONVERTED otherwise. Special case: if the
- setting is AUTOMATIC and the client is not UNIX and the server
- identifies itself as UNIX, Kermit uses a less-strict form of
- conversion, in which lowercase letters are not uppercased and
- the filename can contain any number of periods, but spaces are
- still converted to underscore. When receiving, conversion
- generally means to change all-uppercase names to lowercase and
- spaces to underscore.
- SET FTP UNIQUE-SERVER-NAMES { ON, OFF }
- Applies only to uploads. Tells the server to create new, unique
- names for incoming files that have the same names as existing
- files. OFF by default, in which case the server overwrites
- existing files with new files of the same name. When ON, the
- server uses its own built-in method for creating new names for
- incoming files; for example, appending a period (.) and a number
- to the name. CAUTION: Use this option only if you do not need to
- refer to the file after it is uploaded, since FTP protocol
- provides no mechanism for the client to find out what name was
- assigned by the server.
- SET FTP COLLISION { ... }
- When downloading, what to do if an incoming file has the same
- name as an existing file. Options are the same as for SET FILE
- COLLISION. If this command is not given, Kermit's regular FILE
- COLLISION setting is used. If this command is given, it
- overrides the FILE COLLISION setting for FTP transfers only. See
- [262]Section 3.6.2 for details.
- SET FTP TYPE { TEXT, BINARY, TENEX }
- Changes the default transfer mode. When sending (uploading)
- files, this command has no effect unless you disable automatic
- text/binary mode switching ([263]Section 4) with SET FILE SCAN
- OFF or SET TRANSFER MODE MANUAL. When receiving (downloading)
- files, this command establishes the transfer mode to be used
- when a filename does not match any of Kermit's text or binary
- filename patterns, unless you use SET FTP GET-FILETYPE-SWITCHING
- or SET TRANSFER MODE MANUAL to disable automatic switching, in
- which case, this command establishes the transfer mode for all
- downloaded files. In all cases, however, the FTP TYPE can be
- overridden in any GET or PUT command by including a /TEXT
- (/ASCII), /BINARY, or /TENEX switch. The FTP TYPE is independent
- of the Kermit FILE TYPE setting. TENEX is used for sending 8-bit
- binary files to 36-bit platforms such as TOPS-10, TOPS-20, and
- TENEX, and getting them back again. Synonym: ASCII = TEXT. Note:
- there is also an FTP TYPE command, which does what SET FTP TYPE
- does but also sends a TYPE command to the server immediately if
- the given type is different from the current one.
- If you want want specific FTP preference settings to be in effect for
- all your Kermit FTP sessions, put the desired SET FTP commands in your
- Kermit customization file (~/.mykermrc in UNIX, K95CUSTOM.INI in
- Windows).
- [ [264]Top ] [ [265]FTP Top ] [ [266]C-Kermit Home ] [ [267]Kermit Home
- ]
- 3.4. Managing Directories and Files
- In Kermit, commands for directory and file management can refer to:
- * The local computer
- * A remote computer when you have a connection to a Kermit server or
- IKSD.
- * A remote computer when you have a connection to an FTP server.
- (There can also be an HTTP connection, but the commands in this section
- don't apply to HTTP connections.)
- Thus in general, each such command comes in three forms:
- 1. With no prefix in C-Kermit 8.0.200, it refers to the local computer
- (CD, DIR, etc). In C-Kermit 8.0.201 and later, however, the "locus"
- switches to automatically to the remote FTP server when you make an
- FTP connection (see the SET LOCUS description [268]Section 7); thus
- C-Kermit 8.0.201 acts almost exactly like a regular FTP client when
- it has an FTP connection, yet still acts like itself on other kinds
- of connections.
- 2. With the REMOTE prefix, it is for a Kermit server (REMOTE CD,
- REMOTE DIR).
- 3. With the FTP prefix, it's for an FTP server (FTP CD, FTP DIR).
- 4. Also see [269]Section 3.8, which explains "R-commands" and
- "L-commands".
- Kermit's FTP file and directory management commands are as follows.
- When an R-command is included in the Synonyms list, be sure to read
- [270]Section 3.8 about rules for use of R-commands.
- FTP CD [ directory ]
- Tells the FTP server to change its default (working) directory
- to the one given, which usually must be expressed in the syntax
- of the server platform (UNIX, VMS, etc). If the directory is not
- specified, the result depends on the FTP server -- it might
- complain that the command is illegal, or it might change to your
- original login directory. Synonyms: FTP CWD (Change Wording
- Directory); RCD.
- FTP CDUP
- Tells the FTP server to change its default (working) directory
- to the parent directory of its current one (equivalent to
- "cd .." in UNIX, or "cd [-]" in VMS). Synonyms: RCDUP, FTP UP.
- FTP PWD
- Asks the FTP server to report ("print") its current working
- directory. Synonym: RPWD.
- FTP MKDIR directory
- Asks the FTP server to create the directory whose name is given.
- In general, the name must be in the syntax of the server's file
- system, and it must be either absolute (a full pathname) or
- relative to the server's current (working) directory. This
- command fails if the directory can't be created for any reason,
- including that it exists already. Synonym: RMKDIR.
- FTP RMDIR directory
- Asks the FTP server to remove the directory whose name is given.
- The rules are the same as for MKDIR, plus in most cases, the
- server will not remove any directory unless it is empty.
- Synonym: RRMDIR.
- FTP DIRECTORY [ filespec ] [ redirectors ]
- Tells the FTP server to send a directory listing of the
- specified files. If no filespec is given, the server lists all
- files in its current working directory. The results are in
- whatever format the server chooses to send them. You can use
- UNIX-like redirectors to send the listing to a file or a
- pipeline, exactly as with the regular Kermit client/server
- REMOTE DIRECTORY command ([271]Using C-Kermit, Chapter 11).
- Synonym: RDIRECTORY. Examples:
- ftp dir ; Show listing of all files on screen
- ftp dir *.txt ; List *.txt files on screen
- ftp dir *.txt > somefile ; Put listing in somefile
- ftp dir *.txt >> somefile ; Append listing to somefile
- ftp dir *.txt | sort > somefile ; Put sorted listing in somefile
- ftp dir | more ; Runs list through "more"
- ftp dir | sort | more ; Runs list through "sort" and "more"
- FTP VDIRECTORY [ filespec ] [ redirectors ]
- "Verbose" directory. This is an alternative FTP DIRECTORY
- command primarily for use with DECSYSTEM-20 (TOPS-20) FTP
- servers, which send only filenames when given a DIRECTORY
- command; the VDIRECTORY command makes them also send file sizes,
- dates, and attributes.
- FTP CHECK filespec
- Asks the FTP server whether the given file exists or, if the
- filespec contains wildcards, if any files match, and this
- command succeeds or fails accordingly.
- FTP MODTIME filename
- Asks the FTP server, via the not-yet-standard FTP MDTM command,
- to send the modification date and time of the given file. The
- response should be a numeric string in the format:
- yyyymmddhhmmssxxxxx... where yyyy is the year, mm is the month,
- dd is the day, hh is the hour (0-23), mm is the minute, ss is
- the second, and xxx... is the optional fraction of the second (0
- or more digits). The date and time is expressed in UTC (GMT,
- Zulu, Zero-Meridian). The result is available programmatically
- in the [272]\v(ftp_message) variable, and is understandable by
- Kermit's date-time switches and functions. For example, suppose
- we want to upload all local files that are newer than a
- particular file on the server:
- C-Kermit> ftp modtime signpost
- C-Kermit> echo \v(ftp_message)
- 20010807113542.014
- C-Kermit> ftp mput /after:\v(ftp_message)GMT *
- Note that we must append "GMT" to the date-time string to let
- the /AFTER switch know the time is GMT rather than local.
- FTP SIZE filename
- Asks the FTP server to send the size (in bytes) of the given
- file. The result might vary depending on whether the current FTP
- TYPE is binary or text ("ascii"). For a reliable byte count, do
- FTP TYPE BINARY first. The result is available programmatically
- in the [273]\v(ftp_message) variable.
- FTP CHMOD permissions filename
- Tells the FTP server to set the permissions (protection) of the
- given file to the ones given. The permissions and filename must
- be given in whatever syntax is required by the server. Example
- (for a UNIX-based FTP server):
- ftp chmod 664 oofa.txt
- Not all servers support this command. For non-UNIX-based
- servers, you might need to use FTP QUOTE or FTP SITE and the
- appropriate platform-specific FTP server command.
- FTP UMASK [ number ]
- This command is probably specific to UNIX-based servers; it sets
- the UNIX "umask", which is the default permissions mask for new
- (in this case, incoming) files. Crudely put, the UNIX umask is
- an octal representation of a binary number in in which a 1 bit
- stands for a permission bit that must be 0, and a 0 bit stands
- for a permission bit that can be 0 or 1 depending on other
- factors, such as the permissions of the parent directory.
- Example: "umask 007" requires that new files are created without
- read/write/execute world permission. If the number is not
- specified, the server's current umask is reported.
- FTP RENAME filename newname
- Asks the FTP server to rename the file whose name is "filename"
- to "newname". Works only for one file; can not be used with
- wildcards. The server's interpretation of "newname" can vary (in
- some cases it must be a filename, in others perhaps it can also
- be a directory name, in which case if the filename denote a
- regular file, the file might be moved to the given directory).
- Some servers might allow files to be renamed ("moved") between
- physical disks or partitions, others might not. Synonym:
- RRENAME.
- FTP DELETE [ switches ] filespec [ filespec [ ... ] ]
- Tells the FTP server to delete the file or files listed. Each
- file specification may, but need not, contain wildcard
- characters to match multiple files. File specifications and
- wildcard syntax must be those of the server. Any file
- specifications that contain spaces must be enclosed in braces or
- doublequotes. FTP DELETE switches are:
- /ERROR-ACTION: /FILENAMES: /NOBACKUPFILES /QUIET
- /EXCEPT: /LARGER-THAN: /NODOTFILES /NOPAGE
- /PAGE /RECURSIVE /SMALLER-THAN:
- When used with FTP DELETE, the /RECURSIVE switch deletes files
- but not directories, and furthermore depends on the server
- providing recursive file lists, which is not the normal
- behavior. For further details, see the descriptions of these
- switches in [274]Section 3.6. Synonyms: FTP MDELETE (Kermit
- makes no distinction between DELETE and MDELETE); RDELETE.
- FTP TYPE { TEXT, BINARY, TENEX }
- Tells the FTP server to change its file-transfer type to the one
- given, immediately. See [275]SET FTP TYPE for details.
- [ [276]Top ] [ [277]FTP Top ] [ [278]C-Kermit Home ] [ [279]Kermit Home
- ]
- 3.5. Uploading Files With FTP
- Uploading means sending files from the client (Kermit) to the FTP
- server. The basic command for uploading files with FTP is PUT:
- FTP PUT [ switches ] [ filespec [ as-name ] ]
- Uploads (sends) the file or files that match the file
- specification, which may include wildcards, to the server. If no
- filespec is given, the names of files to send are taken from the
- /LISTFILE: file, if any, otherwise from the SEND-LIST, if any.
- Unless you go out of your way to prevent it, Kermit determines
- the transfer mode (text or binary) for each file automatically,
- and switches automatically on a per-file basis. If an as-name is
- given, the file is sent under that name instead of its own (if
- an as-name is given with a wildcard filespec, the result is a
- bit more complicated, and is explained later in this section).
- Unlike normal FTP clients, Kermit does not prompt you by default (or at
- all) for each file; it just sends them, just as it does with Kermit
- protocol. The filespec can be a literal filename or a Kermit pattern,
- described in:
- [280]http://www.columbia.edu/kermit/ckermit70.html#x4.9
- Kermit patterns are equivalent to C-Shell patterns and provide a fair
- amount of flexibility in selecting which files to send, which is
- augmented by the file-selection switches presented in [281]Section
- 3.5.1.
- FTP MPUT [ switches ] filespec [ filespec [ ... ] ]
- FTP MPUT is just like FTP PUT except it allows you to give more
- than one file specification, and it does not allow an as-name in
- the file list. However, as-names can be given to either PUT or
- MPUT with the /AS-NAME: switch.
- If a PUT or MPUT command results in one file being uploaded, it
- succeeds if the file is uploaded completely and fails otherwise. If
- more than one file is selected for upload, success or failure depends
- on the [282]FTP ERROR-ACTION setting; if it is PROCEED (the default
- setting), then the [M]PUT command succeeds if at least one of the files
- was completely uploaded, and fails otherwise, If FTP ERROR-ACTION is
- QUIT, the [M]PUT command succeeds if all selected files were uploaded
- successfully, and fails if any file failed.
- FTP uploads may be interrupted just like Kermit uploads. While the
- transfer is in progress, type:
- X to interrupt the current file and go on to the next file.
- Z to cancel the current file and all remaining files.
- ^C (Control-C): Like Z, but might act more quickly.
- MPUT may be used as in regular FTP clients, but it is not required to
- send multiple files; in Kermit it is required only if you want to give
- multiple file specifications. Examples:
- ftp put oofa.txt ; Send a single file oofa.txt
- ftp put oofa.txt budget.txt ; Send single file oofa.txt as budget.txt
- ftp put *.txt ; Send all *.txt files
- ftp mput *.txt ; Send all *.txt files (same as "put *.txt")
- ftp mput *.txt foo.bar ; Send all *.txt files plus foo.bar
- The distinction between PUT and MPUT is important only when more than
- one filespec is given, just like the distinction between Kermit SEND
- and MSEND:
- ftp put oofa.txt budget.txt ; Send oofa.txt AS budget.txt
- ftp mput oofa.txt budget.txt ; Send oofa.txt AND budget.txt
- If the source file specification includes any path segments, for
- example:
- put /tmp/oofa.txt
- put subdir/another/andanother/oofa.txt
- the path portion is stripped from the filename that is sent to the
- server. However, if an as-name contains a path, it is retained.
- Examples:
- ftp put /usr/doc/oofa.txt ; Send as "oofa.txt".
- ftp put oofa.txt /tmp/oofa.txt ; Send as "/tmp/oofa.txt"
- The latter example sends the file oofa.txt from your current local
- directory to the server's /tmp directory. This works only if the server
- uses the same directory notation that you used in the as-name AND the
- given directory already exists on the server AND if you have write
- access to it.
- Use caution when uploading from a case-sensitive file system, such as
- UNIX, to a file system that is not case sensitive, such as Windows or
- VMS. If you have two files in UNIX, AA and aa and upload both of them,
- the second one will overwrite the first. The only way around this
- provided by FTP protocol is its "unique server names" feature (SET FTP
- UNIQUE-SERVER-NAMES or the /UNIQUE switch described below).
- 3.5.1. FTP PUT Switches
- FTP PUT and MPUT are similar in format and behavior to the regular
- Kermit SEND and MSEND commands, and they allow most of the same
- optional switches:
- C-Kermit>ftp put ? Filename, or switch, one of the following:
- /after: /larger-than: /rename-to:
- /array: /listfile: /server-character-set:
- /as-name: /local-character-set: /server-rename-to:
- /before: /move-to: /simulate
- /binary /nobackupfiles /smaller-than:
- /command /nodotfiles /tenex
- /delete /nofollowlinks /text
- /dotfiles /not-after: /transparent
- /error-action: /not-before: /type:
- /except: /permissions: /update
- /filenames: /quiet /unique-server-names
- /filter: /recover
- /followlinks /recursive
- Since most of these switches are common to Kermit's SEND and MSEND
- commands, they described only briefly here. For greater detail see:
- [283]http://www.columbia.edu/kermit/ckermit70.html#x1.5 (explanation
- of switches)
- [284]http://www.columbia.edu/kermit/ckermit70.html#x4.7
- (file-transfer switches)
- First the file-selection switches:
- /AFTER:date-time
- /BEFORE:date-time
- /NOT-AFTER:date-time
- /NOT-BEFORE:date-time
- Only send those files modified on or after or before the given
- date and time. These switches can be combined to select files
- modified between two date/times. Various date-time formats are
- accepted; if the date-time contains spaces, it must be enclosed
- in braces or doublequotes. See
- [285]http://www.columbia.edu/kermit/ckermit70.html#x1.6 and
- [286]Section 8.13 of this document for details about date-time
- formats. Examples:
- ftp put /after:{1 jan 2000 0:00:00} *
- ftp put /after:-5days *
- /LARGER-THAN:number
- /SMALLER-THAN:number
- Only send files larger (smaller) than the given number of bytes
- (octets). These switches can be combined to select files in a
- certain size range.
- /TYPE:{TEXT,BINARY}
- Only send files that are the given type, which is determined for
- each file just before sending it by file scanning. BINARY
- includes TENEX; if you have included a /TENEX switch, or
- previously given a [SET] FTP TYPE TENEX command, binary files
- are sent in TENEX, rather than BINARY mode.
- /[NO]DOTFILES
- [Don't] include files whose names begin with dot (.). By
- default, such files are not included unless your filespec
- explicitly mentions them.
- /NOBACKUPFILES
- Don't include files whose names end with .~nnn~, where nnn is a
- number, e.g. oofa.txt.~27~. These are backup files created by
- Kermit, EMACS, and other applications. By default, backup files
- are included.
- /NOFOLLOWLINKS
- (UNIX only) Skip over symbolic links rather than following them
- (default). This applies to wildcard and/or recursive [M]PUTs; if
- a single filename is given, and it happens to be a symbolic
- link, the file it points to is sent.
- /FOLLOWLINKS
- (UNIX only) Always follow (resolve) symbolic links, even in
- wildcard or recursive [M]PUTs. Use with caution. Watch out for
- circular links, endless loops, etc.
- /EXCEPT:pattern
- Exception list -- don't send files whose names match the given
- pattern. See [287]Section 1.5.4 of the [288]C-Kermit 7.0 Update
- Notes for details. If you want to exclude a directory from a
- recursive [M]PUT, use /EXCEPT:{dirname/*}.
- /RECURSIVE
- Sends the desired files from the current (or given) directory,
- plus all directories beneath it, including empty directories,
- replicating the directory structure on the server. No special
- capabilities are required in the server, but of course your
- login ID on the server must have the appropriate access and
- permission to create directories. Recursive PUTs work not only
- between like platforms (e.g. UNIX to UNIX) but also between
- unlike ones (e.g. UNIX to VMS or Windows), in which case
- text-file format differences are handled by Kermit's automatic
- text/binary mode switching ([289]Section 4) and character-set
- translation ([290]Section 3.7). Synonym: /SUBDIRECTORIES.
- /UPDATE
- Send only files that have changed since last time ([291]Section
- 3.5.2).
- /ARRAY:arrayname
- The "file" to be sent is an array, or a segment of one, rather
- than a real file. In this case the other selection switches
- don't apply. The array contents are sent in text mode, and each
- array element is treated as a line. Example:
- ftp put /as-name:array.txt /array:&a
- (or, to send a segment of the array, /array:&a[100:199]). If you
- don't include an /AS-NAME, a name of "_array_x_" is used (where
- x is the array letter). If you include this switch, most other
- switches are meaningless and ignored.
- /COMMAND
- The "file" to be sent is the standard output of a command,
- rather than a real file. It is sent in text or binary mode
- according to the prevailing FTP TYPE, which can be overridden
- with a /TEXT or /BINARY switch. Example: Example:
- ftp put /command /as-name:{userlist} {finger | sort -r}
- /LISTFILE:filename
- Tells Kermit to obtain the list of files to be sent from the
- file whose name is given. This file must contain one file
- specification (which may be wild) per line. If the list includes
- files from different directories, such as a recursive listing of
- a directory tree, the paths are recreated on the server (if
- possible) if you include the /RECURSIVE switch; otherwise all
- the files are sent to the current directory on the server.
- Now the other switches:
- /AS-NAME:text
- If a single file is being sent, send it with the given text as
- its name. If multiple files are being sent, the text must be a
- template that includes variables such as \v(filename),
- \v(filenumber), \v(ntime), to allow dynamic creation of each
- name. The same applies to the as-name field of the FTP PUT
- command. If this switch is not included (and an as-name is not
- included as the second filename to PUT), each file is sent with
- its own name.
- /BINARY
- /TEXT
- /TENEX
- Forces this upload to take place in the given mode, regardless
- of the current FTP TYPE setting, and without automatic
- text/binary switching. /ASCII is a synonym for /TEXT.
- /FILTER:command
- Specifies that the file(s) is/are to be passed through the given
- command or pipeline on their way to the server. Example:
- ftp put /binary /filter:{gzip -c \v(filename)} /as-name:\v(filename).gz *
- /TRANSPARENT
- /LOCAL-CHARACTER-SET:name
- /SERVER-CHARACTER-SET:name
- Character-set translation for text files, explained in
- [292]Section 3.7.
- /ERROR-ACTION:{PROCEED,QUIT}
- Overrides the prevailing [293]FTP ERROR-ACTION for the duration
- of this PUT or MPUT command only.
- /RECOVER
- Resume an interrupted transfer where from the point of
- interruption (explained in [294]Section 3.5.2). Synonym:
- /RESTART.
- /DELETE
- Tells Kermit to delete each source file immediately after, and
- only if, it has been uploaded completely and successfully. This,
- in effect, moves the file from the client to the server.
- /MOVE-TO:directory
- Tells Kermit to move each source file to the named local
- directory after, and only if, it has been uploaded completely
- and successfully.
- /RENAME-TO:template
- Tells Kermit to rename each (local) source file according to the
- given template after, and only if, it has been uploaded
- completely and successfully. The template works as in /AS-NAME.
- /SERVER-RENAME-TO:template
- Tells Kermit to ask the server to rename each file according to
- the given template as soon as, and only if, it has been received
- completely and successfully. The template works as in /AS-NAME.
- Requires write and rename access on the server, so doesn't
- usually work with (e.g.) anonymous uploads to public incoming
- areas where the permissions don't allow renaming. Examples:
- ftp mput /server-rename:\v(filename).ok *
- Appends ".ok" to each filename on the server when it's
- finished uploading.
- ftp mput /as-name:\v(filename).tmp /server-rename:\v(filename) *
- This is the reverse of the previous example; it uses a
- temporary name while uploading is in progress and reverts
- the file to its real name when uploading is complete.
- ftp mput /as-name:\v(filename)
- /server-rename:../final/\v(filename) *
- Moves the file from the working directory to a final
- directory when the upload is complete, but in this case
- you have to know the pathname syntax of the server. If the
- rename fails, the [M]PUT command fails according to the
- [295]FTP ERROR-ACTION selection.
- /FILENAMES:{AUTOMATIC,CONVERTED,LITERAL}
- Overrides the [296]FTP FILENAMES setting for this upload only.
- /PERMISSIONS:{ON,OFF}
- Overrides the [297]FTP PERMISSIONS setting for this upload only.
- /UNIQUE
- Tells Kermit to tell the server to give [298]unique names to
- incoming files that would otherwise overwrite existing files
- that have the same name. This switch conflicts with /UPDATE,
- /RECOVER, /PERMISSIONS, and /SERVER-RENAME since the client has
- no way of knowing the name assigned by the server.
- /QUIET
- Don't display file-transfer progress or statistics.
- /SIMULATE
- Shows which files would be sent without actually sending them.
- Useful (for example) with /UPDATE (next section). The results
- are shown in the file-transfer display (if it is not disabled)
- and in the transaction log (if one is active). Hint: use SET
- TRANSFER DISPLAY BRIEF.
- 3.5.2. Update Mode
- When you include the /UPDATE switch, this means to skip sending any
- file that already exists on the server if the local file's modification
- date/time is not later than that of the corresponding file on the
- server. Here is a typical application for update mode: Suppose that on
- Computer A, you maintain a large set of files (say, a collection of Web
- pages and graphics images, or the source files for a software
- application), and you need to keep a parallel copy on another Computer,
- B. Of course you could upload the entire collection every day:
- cd source-directory
- ftp computerb.xyzcorp.com
- ( authentication details... )
- ftp cd target-directory
- ftp put [ switches ] *
- But if the total size is large or the network slow, this would be
- unnecessarily time-consuming. Worse, if other users or sites had to
- update whenever new files appeared in B's directory, this would cause
- them unnecessary work. By including the /UPDATE switch:
- ftp put /update [ other-switches ] *
- only those files that changed since last time are uploaded. Here's how
- it works. For each local file that is selected for uploading:
- * The remote filename is determined in the normal way, according to
- the [299]FTP FILENAMES setting, /FILENAMES switch, or the as-name,
- if any.
- * Kermit sends an MDTM (modification time) command for the
- corresponding remote filename to the server.
- * If the server does not understand the MDTM command, the file is
- sent.
- * If the server can't find a file with the given name, the file is
- sent.
- * If the local file's modification time is later than that of the
- remote file, the file is sent.
- * Otherwise -- the remote file exists but its modification time is
- equal to or earlier than that of the local file -- the file is
- skipped.
- All time comparisons take place in Coordinated Universal Time
- (UTC)([300]1), also known as GMT or Zulu time: Timezone 0; standard
- time, without daylight savings.
- WARNING: Some FTP servers, such as Novell NWFTPD.NLM, ignore or
- misimplement the FTP specification and send local time rather than
- UTC.
- Update mode is useful only when always used in the same direction. When
- you upload (PUT) a file with FTP, the destination file receives the
- current timestamp on the server's computer, not the original file's
- timestamp ([301]2). If you try to FTP PUT /UPDATE the same file again,
- it will be skipped (as expected) since the remote copy is newer.
- However, if you try to FTP GET /UPDATE the same file ([302]Section
- 3.6), it will be transferred for the same reason.
- To check the availability of PUT /UPDATE on a particular connection,
- issue an FTP MODTIME command for a file that is known to exist on the
- server. If it succeeds, PUT /UPDATE should work and in that case, you
- can run a procedure like the one above every day: the first time, it
- sends all the files; after that, it sends only the ones that changed.
- If a transaction log is active, a notation is included for any files
- that are skipped.
- Notes:
- 1. Why is Coordinated Universal Time abbreviated UTC? From the
- [303]National Institute of Standards and Technology FAQ: "In 1970
- the Coordinated Universal Time system was devised by an
- international advisory group of technical experts within the
- International Telecommunication Union (ITU). The ITU felt it was
- best to designate a single abbreviation for use in all languages in
- order to minimize confusion. Since unanimous agreement could not be
- achieved on using either the English word order, CUT, or the French
- word order, TUC, the acronym UTC was chosen as a compromise."
- 2. The Kermit FTP client is unusual in that, when downloading only, it
- can set the received file's date from the file's date on the
- server, but this should not affect the update feature. When
- uploading to an FTP server, however, there is no mechanism for the
- client to set the date of the uploaded file on the server.
- 3.5.3 Recovery
- Suppose that while you are uploading a large file over a slow
- connection, the connection is lost before the entire file is
- transferred. With most FTP clients, you would have to start over, thus
- resending the portion of the file that was sent already, and that is
- already on the server. But Kermit's /RECOVER switch (Synonym: /RESTART)
- lets you continue an interrupted transfer from the point of failure,
- thus transferring only the part that wasn't sent already. The
- prerequisites for recovery are:
- * The transfer must be in BINARY mode, or else the client and server
- must reside on like systems (e.g. both on some form of UNIX).
- * The FTP server must support the SIZE command.
- Here's how it works. When you include the /RECOVER switch:
- * Kermit checks for conflicting switches, such as /UPDATE and
- /UNIQUE; if /RECOVER is given with these switches an error occurs.
- If /RECOVER is given in other circumstances where it could serve no
- useful purpose (e.g. with arrays, pipes, or filters), it is
- ignored.
- If the switch is accepted, then for each selected file:
- * If it is not binary (determined by scanning) and the client and
- server are not on like platforms, recovery is canceled (the entire
- file is sent). Otherwise:
- * A SIZE command is sent for the file (using its remote name). If the
- reply indicates the file was not found, or the SIZE command was not
- understood, or any other kind of error, recovery is canceled.
- Otherwise:
- * A MDTM (modification time) command is sent for the file. If a valid
- reply is received, and the modification time of the local file is
- later than that of the remote file, recovery is canceled.
- Otherwise:
- * If the sizes of the two files are identical, the file is not sent.
- Otherwise:
- * Kermit seeks to the recovery spot in the local file, tells the
- server to APPEND the data which is about to arrive to the remote
- file, and then sends the data starting at the recovery point.
- To safeguard file integrity, recovery is not attempted unless all the
- preconditions are met. For the widest possible usefulness, APPEND is
- used rather than RESTART. For stream transfers (the only kind that
- Kermit supports) the results are the same.
- By design, the /RECOVER switch can be included with any FTP PUT or MPUT
- command, even if it specifies a group of files. This allows you to
- resume an interrupted batch transfer from where it left off. The files
- that were already completely sent are skipped, the file that was
- interrupted is recovered, and the remaining files are uploaded.
- By the way, it doesn't matter how the original partial file was
- uploaded -- FTP, Kermit, Zmodem, etc: as long as the preconditions are
- met, it can be recovered with FTP PUT /RECOVER, or for that matter also
- using Kermit protocol and SEND /RECOVER.
- A word of caution, however, when the original upload was in text mode
- with character-set translation ([304]Section 3.7):
- * If the original upload involved a translation from one single-byte
- character set to another (e.g. Code Page 850 to Latin-1), recovery
- is safe if you specify the same translations for the recovery. If
- you don't, the resulting file will contain a mixture of character
- sets.
- * If the original upload involved a translation that changed the size
- of the file (e.g. from an alphabetic Code Page or Latin Alphabet to
- Unicode, or vice versa), recovery is NOT safe, even if you specify
- the same translations.
- Kermit has no way of knowing anything about the previous upload. As a
- safeguard, an error occurs if you include /RECOVER and also specify a
- character-set of UCS2 or UTF8, since recovery can't possibly work in
- that situation. Otherwise, it's up to you to avoid unsafe recovery
- operations.
- [ [305]Top ] [ [306]FTP Top ] [ [307]C-Kermit Home ] [ [308]Kermit Home
- ]
- 3.6. Downloading Files With FTP
- Although uploading files with Kermit's FTP client is just as easy and
- flexible as sending files with Kermit protocol, the same is not always
- true for downloading because FTP servers lack some of the capabilities
- of a Kermit server:
- * If you want to get more than one file, you have to use MGET, not
- GET, since the underlying FTP protocol is different in the two
- cases. Kermit can't "autodetect" which one you mean, as it can with
- PUT and MPUT, since it can't be expected to know the wildcard
- syntax of the remote platform and/or FTP server (the same is true
- for all other FTP clients). To complicate matters, FTP protocol now
- includes two underlying mechanisms (NLST and MLSD) for
- accomplishing MGET operations and, as explained in [309]Section
- 3.11, the two behave differently.
- * Automatic text-binary mode switching is not done by the server. It
- can be done by the client (Kermit), but in this case it is not
- based on a file scan (since there is no way for Kermit prescan a
- server file), but rather on the filename, using C-Kermit 7.0
- [310]filename patterns.
- * Some options that are available with FTP PUT can not be used with
- FTP [M]GET or don't work the same way:
- /PERMISSIONS (FTP protocol has no mechanism for this).
- /[NOT-]BEFORE, /[NOT-]AFTER (because of the timezone problem).
- /RECOVER works only in binary mode. /RECURSIVE has limited
- utility.
- The commands for downloading are:
- SET FILE DOWNLOAD-DIRECTORY [ directory ]
- As with Kermit transfers, this command, if given, tells C-Kermit
- where to store incoming files in the absence of a specific
- as-name. If not given, incoming files are stored as indicated by
- the as-name, if any, otherwise in the current directory, just as
- with Kermit transfers. The more verbose transfer display formats
- give the full pathname of each received file, and, in case you
- have trouble finding a downloaded file afterwards, its full path
- is also listed in the transaction log (if you kept one), and you
- can also ask Kermit where it went with the [311]WHERE command.
- SET FTP GET-FILETYPE-SWITCHING { ON, OFF }
- ON by default, causing Kermit to switch automatically into text
- or binary mode for each file based on whether its name matches a
- text pattern or binary pattern. Set this OFF, or use a /TEXT,
- /BINARY, or /TENEX switch to defeat this feature. Use SHOW
- PATTERNS to see the current pattern list.
- [ FTP ] GET [ switches ] filename [ as-name ]
- Asks the server to send the given file, and if it comes, stores
- it locally under the given as-name, if any, otherwise under its
- original name (modified according to the selected filename
- conversion option), in your download directory, if you have
- specified one, otherwise in the directory indicated in the
- as-name, if any, otherwise in your current directory. If you
- accidentally use a wildcard in the filename ("get *.txt") the
- server will reply with a message like "File not found" (unless
- there is a file whose name actually is "*.txt"). If FTP
- GET-FILETYPE-SWITCHING is ON, and in the absence of any GET
- switches to override it, the file is transferred in binary mode
- if it matches any of Kermit's binary name patterns, and in text
- mode if it matches any of Kermit's text name patterns, and in
- the prevailing FTP TYPE if it matches none of these patterns.
- [ FTP ] MGET [ switches ] filespec [ filespec [ filespec [ ... ] ] ]
- Like GET, but for multiple files. One or more file
- specifications can be given, and any or all (or none) of them
- can contain wildcards or can be directory names. The file list
- may not include an as-name, but you can still give one with the
- /AS-NAME: switch.
- In both the FTP GET and MGET commands, any filenames that contain
- spaces must be enclosed in braces or doublequotes (see [312]Section 5
- for details).
- FTP downloads may be interrupted just like Kermit transfers. While the
- transfer is in progress, type:
- * X to interrupt the current file and go on to the next file.
- * Z (or Control-C) to cancel the current file and all remaining
- files.
- Before proceeding, a brief word about temporary files. In FTP protocol,
- the MGET command works by requesting a file list from the server, and
- then (internally) issuing a GET command (FTP RETR protocol directive)
- for each file. The file list returned by the server can be any size at
- all, so in case it is huge, we don't store it in memory; instead we put
- it in a temporary file. For troubleshooting purposes, you should be
- aware of two points:
- 1. The location of the temporary file is chosen according the TMP or
- TEMP environment variables. If neither of these variables is
- defined, you might need to define it. In case there is not enough
- space on the indicated disk or partition for the server's file
- list, you might need to either clean up the temporary area, or
- redefine the environment variable to indicate a different area that
- has sufficient space.
- 2. If you want to look at the list yourself, use SET FTP DEBUG ON.
- This tells Kermit to (a) give you the full pathname of the
- temporary file at the end of each MGET command, and (b) not to
- delete it, as it normally does.
- 3.6.1. FTP GET Switches
- The following switches are available with FTP GET and MGET:
- /TEXT
- Specifies a text-mode transfer. Overrides the global FTP TYPE
- setting and filename pattern-matching for the duration of the
- current command only, All files are downloaded in text mode.
- Synonym: /ASCII.
- /BINARY
- Specifies a binary-mode transfer. Overrides the global FTP TYPE
- setting and filename pattern-matching for the duration of the
- current command only. All files are downloaded in binary mode.
- /TENEX
- Like /BINARY but specifies a special binary transfer mode to be
- used when getting 8-bit binary files from a 36-bit platform such
- as TOPS-10, TOPS-20, or TENEX. All files are downloaded in the
- special binary mode.
- /RECOVER
- This instructs Kermit to try to recover an incomplete download
- from the point of failure. Works only in binary mode, and only
- if the server supports the (not-yet-standard) FTP "REST"
- directive. See [313]Section 3.6.3 for details. Synonym:
- /RESTART.
- /FILENAMES:{CONVERTED,LITERAL}
- Overrides the [314]FTP FILENAMES (filename conversion) setting
- for this download only, forcing incoming filenames to be either
- converted or taken literally.
- /AS-NAME:text
- For GET, this is equivalent to giving an as-name after the
- filename. For MGET, this is the only way to specify alternative
- names for the incoming files. With MGET, the /AS-NAME text
- should (must) contain a Kermit variable, usually \v(filename) or
- \v(filenumber). Example:
- mget /text /as-name:\v(filename).new *.c
- This gets all ".c" files and stores them with "
- .new" appended to their names. See the [315]C-Kermit 7.0 Update
- Notes for details.
- /COMMAND
- This specifies that the incoming file is to be written to the
- standard input of a command, rather than to a file. The command
- name is the as-name from the GET command or the /AS-NAME
- argument. If you need to refer to the incoming file's name in
- the command, use \v(filename). See the description of the
- regular Kermit [316]GET /COMMAND command for details and
- examples.
- /QUIET
- Transfers the files quietly; don't put up a file-transfer
- display.
- /ERROR-ACTION:{QUIT,PROCEED}
- This switch affects only MGET. If an error occurs with a
- particular file, this tells whether to go on to the next file
- (PROCEED) or to stop right away and fail (QUIT). The default is
- PROCEED.
- The file selection switches are:
- /EXCEPT:{pattern} or /EXCEPT:{{pattern}{pattern}{...}}
- Exception list for MGET; skip downloading any file whose name
- matches any of the given patterns (when using the second format,
- up to 64 patterns may be specified).
- /SMALLER-THAN:number
- Download only files whose size is smaller than the given number
- of bytes (octets). Requires that the FTP server support the SIZE
- or MLSD directive.
- /LARGER-THAN:number
- Download only files whose size is greater than the given number
- of bytes. Requires that the FTP server support the SIZE or MLSD
- directive.
- /NOBACKUPFILES
- During MGET, don't download any files whose names end with
- backup suffixes (.~n~ where n is a number).
- /NODOTFILES
- During MGET, don't download any files whose names begin with
- period (.). Equivalent to /EXCEPT:{.*}.
- /LISTFILE:local-filename
- The given file contains a list of files to GET, one per line.
- Filenames in the listfile can contain wildcard characters in the
- syntax of the server. There is no limit on the number of lines
- in the listfile.
- /NAMELIST:local-filename
- If this switch is given, then instead of actually retrieving the
- selected files, the GET command retrieves a list of the names of
- the files that would be retrieved, and places it in the
- specified file. The resulting file is an ordinary text file,
- with one filename per line, suitable for reading by a person, or
- processing by a computer program, including Kermit itself (FOPEN
- / FREAD / FWRITE / FCLOSE), and as /FILELIST: file. If the
- filename is omitted or given as "-" (dash, hyphen), the list
- goes to the screen. NOTE: if you want a copy of the complete
- list sent by the server, use SET FTP DEBUG ON, perform an MGET,
- and the temporary file containing the list will be kept rather
- than deleted (and Kermit tells you its name).
- /UPDATE, /COLLISION:keyword
- Explained in [318]Section 3.6.2.
- /RECURSIVE
- This means to try to download an entire directory tree, rather
- than just files from a particular directory. In fact, FTP
- protocol does not provide a method to request a recursive
- download (unless the server supports MLSD; see [319]Section
- 3.11), so this works only if the FTP server does it anyway,
- without being asked, as some do. In this case, Kermit detects
- that names in the returned file list contain directory
- separators, and therefore attempts to create the needed
- directories as the files arrive. But this can work only if the
- server is on the same kind of platform as the client, so the
- pathname syntax can be recognized, and also because the server
- does not switch between text and binary mode, which would be
- vital for cross-platform transfers. Use with caution. Synonym:
- /SUBDIRECTORIES.
- Even when the server does not provide recursive file lists,
- [M]GET /RECURSIVE forces Kermit to replicate any directory
- structure implied or expressed by the server's file list. For
- example:
- get somepath/somefile
- Gets the file named somefile from the server's somepath
- directory and puts it Kermit's current (or download) directory,
- whereas:
- get /recursive somepath/somefile
- creates the path locally and then puts the file in it. Similarly
- for MGET:
- mget */data/*
- downloads all the files in all the data subdirectories of all
- the subdirectories of the server's current directory and stores
- them locally in Kermit's current (or download) directory,
- whereas:
- mget /recursive */data/*
- re-creates the server's directory structure locally.
- The FTP protocol does not include explicit mechanisms for recursion, so
- Kermit builds upon what is available. Although an Internet draft
- describes a mechanism ("MLSD") that would allow protocol-driven
- recursion, similar to Kermit's File Attribute packets (circa 1984), it
- has not yet attained RFC or standard status, and servers are not yet
- widely available that offer this feature. In the meantime, the
- effectiveness of MGET /RECURSIVE depends on the FTP server
- implementation. If the server returns a recursive list in response to
- the standard NLST command (whose behavior is ill-defined), Kermit's FTP
- MGET /RECURSIVE command uses it to re-create the remote directory tree
- locally. If the server supports MLSD, C-Kermit 8.0.206 and Kermit 95
- 2.1 and later are able to sense it automatically and use it, as
- described below in [320]Section 3.11.
- The /BEFORE:, /AFTER:, /NOT-BEFORE:, and /NOT-AFTER: switches are not
- available for downloading because of the confusion with timezones.
- Would the given times be in the local timezone, the server's timezone,
- or GMT? The FTP server's directory listings show its own local times
- but since we don't know what timezone the server is in, there's no way
- to reconcile our local times with the server's. Similarly, /PERMISSIONS
- can't be preserved in downloads because FTP protocol provides no means
- of querying the server for a file's permission.
- Source-file disposition switches:
- /DELETE
- Each file that is downloaded successfully is to be deleted from
- the server. Requires the appropriate file access rights on the
- server.
- /SERVER-RENAME-TO:template
- Asks the server to rename each (remote) source file immediately
- after, and only if, it is sent correctly. See [321]PUT
- /SERVER-RENAME-TO: for details.
- Destination-file disposition switches:
- /TO-SCREEN
- Displays the incoming file on the screen rather than storing it
- on disk. If this switch is given, the /RENAME-TO and /MOVE-TO
- switches are ignored, the file-transfer display is suppressed,
- and the given file(s) is/are shown on the screen. Can be used
- with /FILTER, e.g.
- get /text /to-screen /filter:more oofa.txt
- In fact, you should always use /TO-SCREEN with /FILTER or
- /COMMAND when the command would result in displaying the
- incoming file on the screen; otherwise C-Kermit would have no
- way of knowing to suppress its file transfer display (since it
- can't be expected to know what the command or filter does).
- /RENAME-TO:template
- Each file that is downloaded is to be renamed as indicated if
- and only if it was received completely and without error. The
- template can be literal text or can contain variables that are
- evaluated for each file. For MGET, the text must contain
- variables; for GET it can be a literal string. The \v(filename)
- variable contains the name of the current file, so:
- ftp mget /rename-to:\v(filename).ok *
- causes each file that is successfully downloaded to have ".ok"
- appended to its name. For details see [322]Section 4.1 of the
- [323]C-Kermit 7.0 Update Notes.
- /MOVE-TO:text
- Just like /RENAME-TO:, except the text denotes the name of a
- directory to which successfully downloaded files are to be
- moved. If the directory does not exist, it is created.
- The file transfer display does not show the /MOVE-TO or /RENAME-TO
- value, since the incoming file has not yet been moved or renamed.
- 3.6.2. Filename Collisions
- What should happen if an incoming file has the same name as an existing
- file in the same directory? By default, Kermit's FILE COLLISION setting
- applies: BACKUP, RENAME, UPDATE, DISCARD, etc, as described in
- [324]Using C-Kermit. Kermit's default FILE COLLISION setting is BACKUP
- (rename the existing file and store the incoming file under its own
- name) and therefore this is also the default FTP collision action.
- The name under which an incoming file is to be stored is determined as
- follows:
- * If an as-name was given, the as-name is used. Otherwise:
- * If the client and server platforms are alike or [325]FTP FILENAMES
- is set to LITERAL (or the /FILENAMES:LITERAL switch was given for
- this download), the incoming filename is used literally. Otherwise:
- * The incoming filename is converted to a form that is friendly to
- the local platform. For UNIX, for example, incoming filenames that
- are all uppercase (as they might be from, say, VMS or an IBM
- mainframe) are converted to lowercase.
- If the resulting name coincides with the name of a local file that
- already exists, we have a filename collision. Collisions are handled
- according to the currently selected collision action:
- SET FTP COLLISION { BACKUP, RENAME, UPDATE, DISCARD, APPEND, OVERWRITE
- }
- This establishes a filename collision for FTP, separate from the
- Kermit one. The initial FTP collision setting is inherited from
- Kermit's FILE COLLISION setting when the first FTP command is
- given, but subsequent changes to Kermit's FILE COLLISION setting
- do not affect the FTP COLLISION setting. SHOW FTP tells the
- current FTP COLLISION setting.
- FTP GET /COLLISION:{BACKUP,RENAME,UPDATE,DISCARD,APPEND,OVERWRITE}
- Overrides the current FTP COLLISION action for this download
- only.
- FTP GET /UPDATE
- This is equivalent to GET /COLLISION:UPDATE, and is included for
- symmetry with PUT /UPDATE
- FTP GET /UPDATE and /COLLISION:UPDATE mean to download only those files
- whose modification dates on the server are later than those on the
- client. Date-time comparisons are done in Coordinated Universal Time
- (UTC, GMT, ZULU). The command:
- FTP MGET /COLLISION:APPEND /AS-NAME:newfilename *.*
- Downloads all matching remote files into a single local file (in
- whatever order the server sends them).
- 3.6.3. Recovery
- Recovery is available for downloads too, but there are some differences
- from the uploading case described in [326]Section 3.5.3:
- * The transfer must be in BINARY mode. It can not be in text mode,
- even if the FTP server is on the same kind of platform as Kermit,
- and even if there is no character-set translation. The original
- download must also have been in binary mode.
- * The FTP server must support the REST ("restart") directive.
- Unfortunately, this is not a standard command; at this writing, it
- is described only in an Internet Draft, not an RFC or Internet
- Standard, but nevertheless it is found in several popular FTP
- servers, such as [327]ProFTPD.
- Here's how download recovery works:
- * Kermit checks for conflicting switches, such as /UPDATE, /COMMAND,
- or /FILTER. If /RECOVER is given with these switches an error
- occurs.
- * The prevailing transfer mode (SET FTP TYPE) must be BINARY. If it
- is not, the /BINARY switch must have been included with the FTP
- [M]GET command.
- If the /RECOVER switch is accepted, then for each selected file:
- * A SIZE command is sent for the file (using its remote name). If the
- reply indicates the file was not found, or the SIZE command was not
- understood, or any other kind of error, recovery is canceled (i.e.
- the entire file is downloaded).
- * If the sizes of the two files are identical, the file is not sent.
- Otherwise:
- * Kermit sends the REST directive to the server, indicating the size
- of the local file. If the server responds affirmatively, Kermit
- opens the local file in append mode and appends the incoming data
- to it. Otherwise, recovery is canceled and the entire file is
- downloaded.
- The /RECOVER switch can be included with any FTP GET or MGET command,
- even if it specifies a group of files. This lets you resume an
- interrupted batch transfer from where it left off. The files that were
- already completely sent are skipped, the file that was interrupted is
- recovered, and the remaining files are uploaded. BUT... unlike with
- uploading, where this can be done with any mixture of text and binary
- files, when downloading, it can only be done if all the files are
- binary.
- It doesn't matter how the original partial file was downloaded -- FTP,
- Kermit, HTTP, Zmodem, etc: as long as the preconditions are met, it can
- be recovered with FTP [M]GET /RECOVER, or for that matter also with GET
- /RECOVER (using Kermit protocol).
- [ [328]Top ] [ [329]FTP Top ] [ [330]C-Kermit Home ] [ [331]Kermit Home
- ]
- 3.7. Translating Character Sets
- A possibly unique feature of Kermit's FTP client is its ability to
- convert character sets when transferring files in text mode,
- independent of the capabilities of the FTP server, as well as to
- translate the character sets of filenames regardless of transfer mode.
- For compatibility with existing FTP clients, and because there is a
- certain performance penalty, Kermit won't do this unless you ask for
- it. If you enable this feature, you need to inform Kermit of the
- character set (to be) used on the server and in some cases (explained
- below) also the local file character set. This discussion assumes you
- know a bit about character sets (as you must if you have to use them);
- see Chapter 16 of [332]Using C-Kermit for a detailed treatment. The
- Kermit commands for FTP character-set conversion are:
- SET FTP CHARACTER-SET-TRANSLATION { ON, OFF }
- Whether to translate character sets when transferring text files
- with FTP. OFF by default. Set this to ON to enable character-set
- translation for subsequent FTP uploads and downloads.
- SET FTP SERVER-CHARACTER-SET [333]name
- Text character set (to be) used by the server. Most FTP servers
- are ignorant of character sets, so all translations are done
- unilaterally by Kermit's FTP client. This means that when
- downloading files, you must know in advance the character-set
- used in the files you are downloading (and in their names). When
- uploading, you must specify the character-set to which local
- filenames and text-file contents are to be translated for
- transmission to the server. If you SET FTP
- CHARACTER-SET-TRANSLATION ON but do not specify an FTP
- SERVER-CHARACTER-SET, [334]UTF8 is used, since this is the new
- Internet standard international character set; it is upwards
- compatible with ASCII and it encompasses most written languages
- and therefore does not favor any particular group of people, as
- any other default would do. If you SET FTP SERVER-CHARACTER-SET
- to something (anything) when FTP CHARACTER-SET TRANSLATION is
- OFF, this also sets the latter ON.
- SET FILE CHARACTER-SET [335]name
- This is the regular Kermit (non-FTP-specific) command for
- identifying the character set (to be) used in local text files
- and filenames.
- TO REITERATE: If you SET FTP CHARACTER-SET TRANSLATION ON but do not
- specify an FTP SERVER-CHARACTER-SET, outbound text files are converted
- to UTF-8 and inbound text files are assumed to be UTF-8. If this is not
- appropriate, be sure to also specify the desired FTP
- SERVER-CHARACTER-SET.
- You can use "special" (non-ASCII) characters in filenames in all the
- client / server file management commands (FTP MKDIR, RMDIR, DIRECTORY,
- VDIRECTORY, DELETE, etc), and also in file-transfer commands. When
- giving commands such as FTP DIR (RDIR) and FTP PWD (RPWD), the reply is
- translated too, so you can read it. In this example, the client and
- server use entirely different codes to represent the special characters
- of German:
- C-Kermit> ftp xyzcorp.de /anonymous
- C-Kermit> set ftp server-character-set latin1
- C-Kermit> set file character-set german
- C-Kermit> rcd Städte
- C-Kermit> rpwd
- "/pub/ftp/Städte is current directory"
- C-Kermit> rdir
- -rw-rw---- 1 olaf 54018 Jan 6 17:58 Adenbüttel.txt
- -rw-rw---- 1 ursula 373 Jan 5 15:19 Aßlar.txt
- -rw-rw---- 1 gisbert 482 Jan 5 15:20 Blowatz.txt
- -rw-rw---- 1 gudrun 124 Jan 5 15:19 Böblingen.txt
- -rw-rw---- 1 olga 14348 Jan 7 14:23 Köln.txt
- When the client and server file systems use different character sets,
- you should take care to use only those characters that the two sets
- share in common when creating filenames or text-file contents. For
- example, PC code pages contain a lot line- and box-drawing characters,
- and sometimes "smart quotes", etc, that are not found in ISO standard
- 8-bit character sets. You should be especially careful to avoid using
- such characters in filenames.
- [ [336]C-Kermit Character Sets ]
- 3.7.1. Character Sets and Uploading
- Kermit's PUT and MPUT commands include full file-scanning capabilities,
- as described in [337]Section 4. Thus if FTP CHARACTER-SET-TRANSLATION
- is ON and your character-set associations are set up appropriately,
- Kermit automatically switches on a per-file basis between text and
- binary mode, and for each text file between your chosen 7-bit text
- character set (e.g. ASCII or ISO 646 German), 8-bit text (e.g. Latin-1
- or Japanese EUC), UCS-2, and UTF-8, and converts each of these
- automatically to the server character-set, and furthermore
- automatically differentiates between the Little and Big Endian forms of
- UCS-2, always sending in Big Endian form.
- WARNING: It is not advisable to use UCS-2 (or any Unicode
- transformation other than UTF-8) "on the wire", i.e. as a server
- character set. Most FTP servers are not able to cope with it, since
- it contains lots of 0 (NUL) characters. If you do use it, Kermit
- does not translate filenames to or from UCS-2, for reasons well
- known to C programmers (for example, UNIX APIs assume filename
- strings are NUL-terminated). [338]UTF-8 is the preferred (and
- standard) Unicode format for the Internet.
- FTP character-set translations differ from the regular Kermit ones by
- not restricting translations to a file-character-set /
- transfer-character-set pair. You can have Kermit's FTP client translate
- between any pair of character sets it knows about. You can see the list
- of supported character sets by typing either of the following:
- set ftp server-character-set ?
- set file character-set ?
- A typical list looks like this:
- C-Kermit>set file char ? One of the following:
- ascii cp869-greek hebrew-7 mazovia-pc
- british cyrillic-iso hebrew-iso next-multinational
- bulgaria-pc danish hp-roman8 norwegian
- canadian-french dec-kanji hungarian portuguese
- cp1250 dec-multinational iso2022jp-kanji shift-jis-kanji
- cp1251-cyrillic dg-international italian short-koi
- cp1252 dutch jis7-kanji spanish
- cp437 elot927-greek koi8 swedish
- cp850 elot928-greek koi8r swiss
- cp852 euc-jp koi8u ucs2
- cp855-cyrillic finnish latin1-iso utf8
- cp858 french latin2-iso
- cp862-hebrew german latin9-iso
- cp866-cyrillic greek-iso macintosh-latin
- C-Kermit>
- Thus you can translate not only between private sets (like PC code
- pages) and standard ones (like Latin-1) as in Kermit protocol, but also
- between any given pair of private sets (e.g. CP852 and Mazovia). All
- conversions go through Unicode as the intermediate character set,
- resulting in a minimum of character loss, since Unicode is a superset
- of all other character sets known to Kermit.
- In addition to the SET commands listed above, the FTP PUT and MPUT
- commands include switches that apply only to the current command:
- /LOCAL-CHARACTER-SET:name
- /SERVER-CHARACTER-SET:name
- Use these switches to force a particular translation. These
- switches override the global FTP CHARACTER-SET-TRANSLATION and
- SERVER-CHARACTER-SET settings and also character-set
- differentiation by file scanning for the duration of the PUT or
- MPUT command. The file scan is still performed, however, to
- determine whether the file is text or binary; thus these
- switches do not affect binary files unless you also include the
- /TEXT switch to force all files to be treated as text.
- In other words, if you include one or both of these switches with a PUT
- or MPUT command, they are used. Similarly, the /TRANSPARENT switch
- disables character-set translation for the PUT or MPUT command despite
- the prevailing FTP CHARACTER-SET-TRANSLATION and SERVER-CHARACTER-SET
- settings.
- When uploading, the FILE CHARACTER-SET setting is ignored unless you
- have forced Kermit not to [340]scan local files by including a /TEXT or
- /BINARY switch with your [M]PUT command, or by disabling automatic
- text/binary switching in some other way.
- Examples:
- 1. Suppose you have a CP852 (East European) text file that you want to
- upload and store in ISO Latin Alphabet 2 encoding:
- ftp put /local-char:cp852 /server-char:latin2 magyar.txt
- 2. Suppose you always want your text files converted to Latin-2 when
- uploading with FTP. Then put:
- set ftp server-character-set latin2
- in your Kermit customization file, and then you can omit the
- /SERVER-CHARACTER-SET: switch from your FTP PUT commands:
- ftp put /local-char:cp852 magyar.txt
- 3. Now suppose that all the text files on your PC are written in
- Hungarian, but they have a variety of encodings, and you don't want
- to have to include the /LOCAL-CHARACTER-SET: switch on every FTP
- PUT command, or (more to the point) you want to be able to send a
- mixture of these files all at once. Put these commands in your
- Kermit customization file:
- set ftp server-character-set latin2 ; ISO 8859-2
- set file default 7-bit-character-set hungarian ; ISO 646 Hungarian
- set file default 8-bit-character-set cp852 ; PC East European Code Page
- and now PUT and MPUT will automatically detect and switch among ISO
- 646 Hungarian, Code Page 852, UTF-8, and UCS-2 encodings,
- translating each one to Latin-2 for uploading:
- ftp put *.txt
- And since binary files are also detected automatically, the latter can
- be simplified to:
- ftp put *
- even when "*" matches a diverse collection of binary and text files,
- because translations are skipped automatically for binary files.
- 3.7.2. Character Sets and Downloading
- The commands and switches are the same as for uploading, but automatic
- character-set switching works differently, since Kermit can't scan the
- server files in advance. Instead, the transfer mode (text or binary) is
- based on the filenames; each name is compared with Kermit's list of
- text name patterns and binary name patterns. If the name matches a
- binary pattern (for example, if the filename is oofa.tar.gz and one of
- the filename patterns is "*.gz"), the file is downloaded in binary
- mode; otherwise if it matches a text pattern (e.g. oofa.txt matches
- "*.txt"), it is transferred in text ("ascii") mode. Otherwise, it is
- transferred in the prevailing FTP TYPE.
- In C-Kermit 8.0, the pattern lists used with FTP GET are not the same
- lists used with Kermit transfers, and can not be viewed with SHOW
- PATTERNS, nor adjusted with ADD and REMOVE TEXT-PATTERNS and
- BINARY-PATTERNS, or SET FILE TEXT-PATTERNS and BINARY-PATTERNS.
- Configuration of the FTP patterns list will be added in a future
- release.
- Examples:
- get /server-char:latin1 /local-char:cp850 Grüße.txt
- In this command, the filename contains special characters, which
- you enter using whatever character set your local computer uses,
- in this case PC Code Page 850 (cp850). The command tells Kermit
- (in case it didn't know already from its FILE CHARACTER-SET
- setting) that the local character set is cp850 and the server's
- character-set is ISO 8859-1 Latin Alphabet 1 (latin1). Kermit
- translates the filename from cp850 to latin1 and sends the
- latin1 name to the server. Since it's a text file (matches
- "*.txt"), its contents are translated to cp850 on arrival, and
- it is saved with a cp850 name.
- mget /text /server:latin1 /local:utf8 *.txt
- This command:
- + Tells C-Kermit that the server's files are encoded in ISO
- 8859-1 Latin Alphabet 1.
- + Tells C-Kermit to translate the incoming files into Unicode
- UTF-8 for storage.
- + Asks the server to send all ".txt" files in text mode.
- mget /server:latin1 /local:utf8 *
- Tells Kermit to get all files from the server's directory,
- switching between text and binary mode based on the filename.
- The names of all the files are translated (to UTF-8 in this
- case), but contents are translated (also to UTF-8) only for text
- files.
- Note that any pair of 8-bit character sets is likely to have some
- incompatibilities. Any characters in the source file that do not have
- equivalents in the destination file's character set are converted to
- question marks. This applies to both filenames and to text file
- contents.
- Also note that the server's ability to accept special characters in
- filenames depends on the particular server. For example:
- get Grüße.txt
- works with WU-FTPD, but:
- mget Grüß*.txt
- does not.
- 3.7.3. RFC2640
- [341]RFC2640, July 1999, specifies a method by which the FTP client and
- server can negotiate the use of UTF8. However, RFC2640-capable servers
- are rare to nonexistent at this writing, and in any case you don't need
- them to be able to transfer text in UTF8. C-Kermit lets you upload and
- download text files in any character set it knows about, converting to
- or from any other character set it knows about, without the knowledge,
- permission, or cooperation of the server, and regardless of its
- capabilities.
- [ [342]Top ] [ [343]FTP Top ] [ [344]C-Kermit Home ] [ [345]Kermit Home
- ]
- 3.8. FTP Command Shortcuts
- C-Kermit's FTP client coexists with other C-Kermit functions by
- requiring the "ftp" prefix for each FTP-related command: FTP OPEN, FTP
- GET, FTP BYE, and so on. For interactive use, however, this can be
- rather awkward and sometimes surprising, for example when a GET command
- starts a Kermit GET rather than an FTP GET. In fact, many Kermit
- commands might just as easily apply to an FTP connection: GET, PUT
- (SEND), BYE, and CLOSE. The following command lets you choose how these
- commands are interpreted:
- SET GET-PUT-REMOTE { AUTO, KERMIT, FTP }
- Controls the orientation of GET, PUT, REMOTE and other
- file-transfer and client/server commands that might apply to
- either Kermit or FTP. The default setting is AUTO, meaning that
- these commands apply to FTP if an FTP connection is open, and to
- Kermit otherwise. KERMIT means they always apply to Kermit, FTP
- means they always apply to FTP.
- Here is a complete list of affected commands:
- Kermit Command FTP Equivalent
- (none) FTP [ OPEN ]
- LOGIN FTP USER
- LOGOUT FTP RESET
- BYE FTP BYE
- FINISH FTP BYE
- CLOSE FTP BYE
- HANGUP FTP BYE
- BINARY FTP TYPE BINARY
- TEXT (or ASCII) FTP TYPE ASCII
- SEND (or PUT) FTP PUT
- MSEND (or MPUT) FTP MPUT
- RESEND FTP PUT /RECOVER
- CSEND FTP PUT /COMMAND
- GET FTP GET
- MGET FTP MGET
- REGET FTP GET /RECOVER
- REMOTE HELP (RHELP) FTP HELP
- REMOTE CD (RCD) FTP CD (CWD)
- REMOTE PWD (RPWD) FTP PWD
- REMOTE DIRECTORY (RDIR) FTP DIRECTORY
- REMOTE DELETE (RDEL) FTP DELETE
- REMOTE MKDIR (RMKDIR) FTP MKDIR
- REMOTE RMDIR (RRMDIR) FTP RMDIR
- REMOTE RENAME (RRENAME) FTP RENAME
- REMOTE TYPE (RTYPE) FTP TYPE
- REMOTE EXIT (REXIT) FTP BYE
- The commands in the right-hand column always access FTP. The commands
- in the left column can access either Kermit protocol or FTP:
- * When GET-PUT-REMOTE is set to KERMIT, or to AUTO when there is no
- FTP connection, the commands in the left-hand column access Kermit
- protocol, and those right-hand column are required for FTP.
- * When GET-PUT-REMOTE is set to FTP, or to AUTO when there is an
- active FTP connection, the commands in the left-hand column access
- the FTP connection and can not be used to access Kermit protocol.
- In this case, if you want to be able to use both Kermit protocol
- and the FTP connection, you must SET GET-PUT-REMOTE KERMIT, and
- then use the FTP commands in the right-hand column to access the
- FTP connection.
- Note that file-management commands such as DIRECTORY, DELETE, CD, PWD,
- MKDIR, RMDIR, HELP, RENAME, COPY, TYPE, and so on, always apply
- locally, no matter what kind of connection you have. This is the
- opposite of most FTP clients, where these commands are intended for the
- server, and require an "L" prefix for local execution (e.g. "dir" gets
- a directory listing from the server, "ldir" gets a local directory
- listing). To illustrate with the CD command and a typical UNIX FTP
- client:
- Client Server Change Local Directory Change Remote Directory
- FTP FTP lcd cd (cwd)
- Kermit Kermit cd rcd, remote cd
- Kermit FTP cd ftp cd, rcd, remote cd
- Also note that not all REMOTE commands are useful with FTP, since FTP
- servers do not offer the corresponding functions. These include:
- * REMOTE ASSIGN - FTP servers don't have variables
- * REMOTE COPY - FTP servers don't copy files
- * REMOTE HOST - FTP servers don't execute host (shell) commands
- * REMOTE KERMIT - FTP servers don't execute Kermit commands
- * REMOTE PRINT - FTP servers don't print files
- * REMOTE QUERY - FTP servers don't have variables
- * REMOTE SET - FTP servers don't have Kermit settings
- * REMOTE WHO - FTP servers don't send user lists
- Finally note that command shortcuts do not apply to the HELP command.
- For help about an FTP command, use (for example) "help ftp delete", not
- "help delete" or "help rdelete".
- [ [346]Top ] [ [347]FTP Top ] [ [348]C-Kermit Home ] [ [349]Kermit Home
- ]
- 3.9. Dual Sessions
- You can have an FTP session open at the same time as a regular Kermit
- SET LINE or SET HOST (terminal) session. In this case, the default SET
- GET-PUT-REMOTE AUTO setting should ensure that all "two-faced" commands
- like GET, PUT, REMOTE, HANGUP, BYE, etc, apply to the Kermit session,
- and all commands for the FTP session must include the FTP prefix. To be
- absolutely certain, you can use SET GET-PUT-REMOTE KERMIT.
- ftp foo.bar.baz.com
- if fail ...
- (log in)
- set host foo.bar.baz.com
- if fail ...
- (log in)
- Now you have both an FTP and Telnet connection to the same host (of
- course they could also be to different hosts, and you could also have a
- direct or dialed serial connection instead of a Telnet connection). Now
- assuming you have a Kermit server on the far end of the Kermit
- connection:
- rcd incoming ; Changes Kermit server's directory (= REMOTE CD)
- ftp cd incoming ; Changes FTP server's directory
- put oofa.txt ; Sends a file on the Kermit connection
- ftp put oofa.txt ; Sends a file on the FTP connection
- bye ; Shuts down the Kermit connection
- ftp bye ; Shuts down the FTP connection
- Note that PUT and SEND are synonyms for both FTP and Kermit
- connections.
- You can also establish dual sessions on the Kermit command line:
- kermit -j host1 -9 host2
- This makes a Telnet connection to host1 and an FTP connection to host2.
- [ [350]Top ] [ [351]FTP Top ] [ [352]C-Kermit Home ] [ [353]Kermit Home
- ]
- 3.10. Automating FTP Sessions
- Most of Kermit's scripting features can be used to make and control FTP
- sessions: FOR and WHILE loops, IF-ELSE and SWITCH constructions,
- variables, arrays, built-in functions, and all the rest. You can't use
- INPUT, MINPUT, OUTPUT, CLEAR, or SCRIPT on an FTP session, but these
- are not needed since the FTP protocol is well defined.
- 3.10.1. FTP-Specific Variables and Functions
- The following variable tells whether an FTP connection is open:
- \v(ftp_connected)
- 1 if there is an active FTP connection, 0 if there isn't.
- The FTP OPEN command sets:
- \v(ftp_host)
- The host to which the most recent FTP connection was made.
- \v(ftp_security)
- The security method negotiated for the current FTP session. The
- value is "NULL" when no security is used. Other possibilities
- are GSSAPI, KERBEROS_V4, SSL, TLS, and SRP. Also see
- \v(authname), \v(authstate), and \v(authtype). See [355]3.2.
- Making Secure FTP Connections.
- \v(ftp_server)
- The OS type (UNIX, VMS, etc) of the FTP server host.
- The FTP USER command (or FTP OPEN /USER:, or FTP with automatic login)
- sets:
- \v(ftp_loggedin)
- 1 if you are logged in to an FTP server, 0 if you are not.
- The current COMMAND-PROTECTION-LEVEL and DATA-PROTECTION-LEVEL values
- are reflected in:
- \v(ftp_cpl)
- \v(ftp_dpl)
- The values are "clear", "confidential", "safe" or "private". See
- [356]3.2. Making Secure FTP Connections.
- The FTP GET-PUT-REMOTE setting is reflected in:
- \v(ftp_getputremote)
- The values are "auto", "ftp", or "kermit".
- Every FTP command sets the \v(success) variable, as well as the
- following two FTP-specific variables:
- \v(ftp_code)
- The standardized numeric FTP protocol code from the server's
- response to the last client command, a 3-digit decimal number
- defined in [357]RFC959. Briefly:
- 1xx = Positive Preliminary Reply
- 2xx = Positive Completion Reply
- 3xx = Positive Intermediate Reply
- 4xx = Transient Negative Completion Reply
- 5xx = Permanent Negative Completion Reply
- \v(ftp_message)
- The text message, if any, from the server's response to the last
- client command. If the most recent response had multiple lines,
- this variable has only the final line. These messages are not
- standardized and vary in format and content from server to
- server. Synonym: \v(ftp_msg).
- FTP file transfers set the regular Kermit transfer status variables:
- \v(cps) Characters per second of most recent transfer.
- \v(filespec) File specification used in most recent transfer.
- \v(fsize) Size of file most recently transferred.
- \v(tfsize) Total size of file group most recently transferred.
- \v(xferstatus) Status of most recent transfer (0 = success, 1 = failure).
- \v(tftime) Elapsed time of most recent transfer, in seconds.
- During an FTP transfer, the per-file variables are:
- \v(filename) Name of current file.
- \v(filenumber) Ordinal file number in group (1, 2, 3, ...)
- 3.10.2. Examples
- Let's begin with a simple example showing how to log in, send some
- files, and log out:
- define error if fail { ftp bye, stop 1 Error: \%1 }
- set transact brief
- log t
- ftp ftp.xyzcorp.com /anonymous
- if fail stop 1 Connection failed
- if not \v(ftp_loggedin) stop 1 Login failed
- ftp cd incoming
- error {ftp cd}
- cd upload
- error {local cd}
- ftp put /delete *
- error {put}
- ftp bye
- First we define an error handling macro to be used after the connection
- is made. Then we set up a brief-format transaction log to keep a record
- of our file transfers. Then we make a connection to the host and log in
- anonymously. The "if fail" command checks whether the connection was
- made. The "if not" command checks whether login was successful.
- Obviously the script should not continue unless both tests succeed.
- Next we change to the server's 'incoming' directory and to our own
- 'upload' directory, and send all the files that are in it (they can be
- any mixture of text and binary files), deleting each source file
- automatically after it is successfully uploaded. Each of these
- operations is checked with the ERROR macro, which prevents the script
- from continuing past a failure.
- Finally we close the FTP session with the "bye" command.
- Just like any other Kermit script, this one can be used in many ways:
- * It can be stored in a file, and Kermit can be told to TAKE the
- file.
- * In UNIX, it can be a "[358]kerbang" script and therefore run
- directly from the shell prompt or as a cron job.
- We could have used command shortcuts like "rcd", "put", and "bye", but
- since they can be ambiguous under certain circumstances, it is better
- to avoid them in scripts; they are intended mainly for convenience
- during interactive use. However, if you wish to use the shortcuts in a
- script, you can do it this way (error handling omitted for brevity):
- local \%t ; Declare a local temporary variable
- assign \%t \v(ftp_getputremote) ; Save current FTP GET-PUT-REMOTE setting
- set ftp get-put-remote ftp ; Choose FTP orientation
- ftp xyzcorp.com /anonymous ; Open an FTP connection
- get oofa.txt ; GET a file
- put foo.bar ; PUT a file
- rdel yesterday.log ; Delete a file on the server
- bye ; Log out and disconnect from server.
- set ftp get-put-remote \%t ; Restore previous GET-PUT-REMOTE setting
- Of course, FTP scripts can also be written as macros. This lets you
- pass parameters such as hostnames, usernames, and filenames to them:
- define doftpget {
- if < \v(argc) 4 end 1 Usage: \%0 host user remotefile [ localfile ]
- ftp \%1 /user:\%2
- if fail end 1 FTP OPEN \%1 failed
- if not \v(ftp_loggedin) end 1 FTP LOGIN failed
- ftp get {\%3} {\%4}
- if fail end 1 FTP GET \%3 failed
- ftp bye
- }
- Add this definition to your Kermit customization file, and it will
- always be available when you start Kermit. This macro lets you download
- a file with FTP by giving a single command, e.g.:
- doftpget xyzcorp.com anonymous oofa.txt
- 3.10.3. Automating Secure FTP Sessions
- Often when making secure connections, you are prompted interactively
- for certain information or permission to proceed. These prompts can
- stop an automated procedure. To avoid them, you must give the
- appropriate commands to disable them, and/or supply the prompted-for
- information beforehand. Here are a few hints:
- * Make sure that SET TAKE ERROR and SET MACRO ERROR are both OFF.
- This is the default, but in case you have set either one of these
- ON in your script or initialization file, this makes the script
- halt on any kind of error. Normally you would want to check each
- operation for success or failure and take appropriate action.
- * On SSL and TLS connections, you may be asked whether it is OK to
- proceed with a connection to server that presents a self-signed
- certificate. You can use the SET AUTHENTICATION SSL (or TLS) VERIFY
- or SET AUTH SSL (or TLS) CERTS-OK commands to avoid this prompt by
- not requesting a certificate from the peer.
- * (More to be added...)
- [ [359]Top ] [ [360]FTP Top ] [ [361]FTP Script Tutorial ] [
- [362]C-Kermit Home ] [ [363]Kermit Home ]
- 3.11. Advanced FTP Protocol Features
- The remainder of the FTP documentation (through the end of Section 3)
- is new to C-Kermit 8.0.206, but we leave it in black to prevent
- headaches. Except for titles.
- * [364]TERMINOLOGY
- * [365]FEATURE NEGOTIATION
- * [366]USING MGET: NLST VERSUS MLSD
- * [367]EXAMPLES
- * [368]REFERENCES
- The new releases of [369]C-Kermit (8.0.206) and [370]Kermit 95 (2.1)
- support new FTP protocol features from RFC 2389 as well as most of
- what's in the Elz and Hethmon Extensions to FTP Internet Draft (see
- [371]References). Some of these features, such as SIZE (request a
- file's size), MDTM (request file's modification time), and REST
- (restart interrupted transfer) have been widely implemented in FTP
- clients and servers for years (as well as in the initial release of the
- Kermit FTP clients). Others such as FEAT and MLSD are rarely seen and
- are new to the upcoming Kermit releases. TVFS (Trivial Virtual File
- Store) is supported implicitly, and the UTF-8 character-set is already
- fully supported at the protocol and data-interchange level.
- For Kermit users, the main benefit of the new FTP protocol extensions
- is the ability to do recursive downloads. But the extensions also
- introduce complications and tradeoffs that you should be aware of. Of
- course Kermit tries to "do the right thing" automatically in every case
- for backwards compatibility. But (as noted later) some cases are
- inherently ambiguous and/or can result in nasty surprises, and for
- those situations new commands and switches are available to give you
- precise control over Kermit's behavior, in case the defaults don't
- produce the desired results.
- 3.11.1. Terminology
- Command-line FTP clients such as Kermit (as well as the traditional FTP
- programs found on Unix, VMS, ..., even Windows) have commands like PUT,
- MPUT, GET, MGET, and BYE, which they convert into zero or more FTP
- protocol commands, such as NLST, RETR, QUIT. For clarity, we'll use
- "command" to refer to commands given by the user to the FTP client, and
- "directive" for FTP protocol commands sent by the FTP client to the FTP
- server.
- 3.11.2. Feature Negotiation
- New FTP protocol features are negotiated by the client sending a FEAT
- directive and the server responding with a list of (new) features it
- supports, or else with an error indication if it does not support the
- FEAT directive at all, in which case the client has to guess which new
- features it supports (Kermit guesses that it supports SIZE and MDTM but
- not MLST). Note that the MLST feature includes MLSD, which is not
- listed separately as a feature.
- Guessing is nice when it works, but sometimes it doesn't, and some FTP
- servers become confused when you send them a directive they don't
- understand, or they do something you didn't want, sometimes to the
- point of closing the connection. For this reason, Kermit lets you
- override default or negotiated features with the following new
- commands:
- FTP { ENABLE, DISABLE } FEAT
- Enables or disables the automatic sending of a FEAT directive
- upon connection to an FTP server. Note that FTP [ OPEN ] /NOINIT
- also inhibits sending the FEAT directive (and several others)
- for the connection being OPEN'd, but without necessarily
- disabling FEAT for subsequent connections in the same Kermit
- instance. FEAT is ENABLED by default, in which case many FTP
- servers are likely to reply:
- 500 'FEAT': command not understood
- which is normally harmless (but you never know). (In C-Kermit
- 8.0.208, this error message is suppressed unless you SET FTP
- DEBUG ON.)
- FTP ENABLE { MDTM, MLST, SIZE }
- Enables the given directive for implicit use by the FTP GET and
- MGET commands in case it has been disabled or erroneously
- omitted by the server in its FEAT response. Note: MLSD can be
- used in the FTP ENABLE and DISABLE commands as a synonym for
- MLST. YOU MUST GIVE THIS COMMAND AFTER MAKING THE FTP
- CONNECTION.
- FTP DISABLE { MDTM, MLST, SIZE }
- Disables implicit use of the given directive by GET or MGET in
- case it causes problems; for example, because it makes multifile
- downloads take too long or the server announces it erroneously
- or misimplements it. Use DISABLE FEAT before making a connection
- to prevent Kermit from sending the FEAT directive as part of its
- initial sequence. Note that disabling FEAT, SIZE, or MDTM does
- not prevent you from executing explicit FTP FEATURES, FTP SIZE,
- or FTP MODTIME commands. Also note that disabling SIZE prevents
- PUT /RESTART (recovery of interrupted uploads) from working. YOU
- MUST GIVE THIS COMMAND AFTER MAKING THE FTP CONNECTION.
- To enable or disable more than one feature, use multiple FTP ENABLE or
- FTP DISABLE commands. The SHOW FTP command shows which features are
- currently enabled and disabled.
- FTP FEATURES
- This command sends a FEAT directive to the server. In case you
- have been disabling and enabling different features, this
- resynchronizes Kermit's feature list with the server's. If the
- server does not support the FEAT directive, Kermit's feature
- list is not changed.
- FTP OPTIONS directive
- Informational only: the server tells what options, if any, it
- supports for the given directive, e.g. MLST. Fails if the server
- does not support the OPTS directive or if the directive for
- which options are requested is not valid. The directive is
- case-insensitive.
- FTP SIZE filename
- Sends a SIZE directive to the server for the given file. The
- filename must not contain wildcards. The server responds with an
- error if the file can't be found, is not accessible, or the SIZE
- directive is not supported, otherwise with the length of the
- file in bytes, which Kermit displays and also makes available to
- you in its \v(ftp_message) variable. If the directive is
- successful, Kermit (re-)enables it for internal use by the GET
- and MGET directives on this connection.
- FTP MODTIME filename
- Works just like the SIZE directive except it sends an MDTM
- directive. Upon success, the server sends modification date-time
- string, which Kermit interprets for you and also makes available
- in its \v(ftp_message) variable.
- Whenever a SIZE or MDTM directive is sent implicitly and rejected by
- the server because it is unknown, Kermit automatically disables it.
- 3.11.3. Using MGET: NLST versus MLSD
- When you give an MGET command to an FTP client, it sends a request to
- the FTP server for a list of files, and then upon successful receipt of
- the list, goes through it and issues a RETR (retrieve) directive for
- each file on the list (or possibly only for selected files).
- With the new FTP protocol extensions, now there are two ways to get the
- list of files: the NLST directive, which has been part of FTP protocol
- since the beginning, and the new MLSD directive, which is new and not
- yet widely implemented. When NLST is used and you give a command like
- "mget *.txt", the FTP client sends:
- NLST *.txt
- and the server sends back a list of the files whose names match, e.g.
- foo.txt
- bar.txt
- baz.txt
- Then when downloading each file, the client sends SIZE (if it wants
- have a percent-done display) and MDTM (if it wants to set the
- downloaded file's timestamp to match that of the original), as well as
- RETR (to retrieve the file).
- But when MLSD is used, the client is not supposed to send the filename
- or wildcard to the server; instead it sends an MLSD directive with no
- argument (or the name of a directory), and the server sends back a list
- of all the files in the current or given directory; then the client
- goes through the list and checks each file to see if it matches the
- given pattern, the rationale being that the user knows only the local
- conventions for wildcards and not necessarily the server's conventions.
- So with NLST the server interprets wildcards; with MLSD the client
- does.
- The interpretation of NLST wildcards by the server is not
- necessarily required or even envisioned by the FTP protocol
- definition (RFC 959), but in practice most clients and servers work
- this way.
- The principal advantage of MLSD is that instead of sending back a
- simple list of filenames, it sends back a kind of database in which
- each entry contains a filename together with information about the
- file: type, size, timestamp, and so on; for example:
- size=0;type=dir;perm=el;modify=20020409191530; bin
- size=3919312;type=file;perm=r;modify=20000310140400; bar.txt
- size=6686176;type=file;perm=r;modify=20001215181000; baz.txt
- size=3820092;type=file;perm=r;modify=20000310140300; foo.txt
- size=27439;type=file;perm=r;modify=20020923151312; foo.zip
- (etc etc...)
- (If the format of the file list were the only difference between NLST
- and MLSD, the discussion would be finished: it would always be better
- to use MLSD when available, and the MGET user interface would need no
- changes. But there's a lot more to MLSD than the file-list format; read
- on...)
- The client learns whether the server supports MLSD in FEAT exchange.
- But the fact that the server supports MLSD doesn't mean the client
- should always use it. It is better to use MLSD:
- * On connections where the server imposes a time penalty for every
- command, e.g. the Red Hat Rawhide server. With MLSD, the client
- needs to send only one command (RETR) per file, whereas NLST
- requires three (SIZE, RETR, and MDTM). Suppose there is a 30-second
- delay for each command and 1000 files are to be fetched; in that
- case, MLSD saves 60,000 seconds = 1000 minutes = 16 hours and 40
- minutes.
- * For recursive downloads since there is no dependable way to
- download directory trees with NLST.
- But it is better to use NLST:
- * If you want only a couple short files out of a large directory. In
- this case, NLST is the better choice since the server sends a list
- of only the files you want, not a list of (say) a million files,
- which can make a big difference on slow connections. For example,
- suppose your wildcard matches three files of 1K each, but the
- million-file listing is 80MB long, and your connection is through a
- modem. The overhead of using MLSD is practically infinite.
- * If the server supports wildcarding features not known to the
- client, but that can be used to achieve desirable effects otherwise
- unobtainable, such as "[dir...]*.txt" in VMS or AOS/VS "except"
- clauses.
- * If you have been given a wildcard string by an FTP site
- administrator for fetching a specific group of files out of a
- larger directory, e.g. "mget ck[cuw]*.[cwh] makefile", that is
- expected to work with any client (an FTP site administrator can't
- be expected to know the wildcard syntax of every FTP client).
- But when using MLSD there are complications:
- * MLSD wants either a blank argument (meaning the current directory)
- or else the name of a specific directory. The client must not send
- it a wildcard or a filename.
- * But if the user's command is "mget xxx", how does the client know
- whether to send "xxx" in the MLSD directive? It might be the name
- of a directory on on the server, in which case it should be sent,
- or it might be the name of a file on the server (or a wildcard), in
- which case it must not be sent. Since the client knows its own
- wildcard syntax, then in most cases it would be right to send
- "MLSD" with no argument if xxx is wild, and to send "MLSD xxx" if
- it is not.
- * But suppose the server's file system allows filename characters
- that correspond with the client's wildcard syntax? For example:
- "[abc]" could be either a valid VMS directory name or a wildcard
- pattern used by the FTP client. What should the client do with
- "mget [abc]"? In this case there must be a way for the user to
- force sending the MGET argument as the MLSD argument.
- * If "xxx" is a regular file in the server's current directory, "mget
- xxx" works with NLST but not with MLSD.
- To further complicate matters, NLST can (in theory) work just like
- MLSD: if sent with a blank argument or a directory name, it is supposed
- to return a complete list of files in the current or given directory,
- which the client can match locally against some pattern. It is not
- known if any FTP server or client does this but nevertheless, it should
- be possible since this behavior can be inferred from RFC 959.
- In view of these considerations, and given the need to preserve the
- traditional FTP client command structure and behavior so the software
- will be usable by most people:
- 1. The MGET command should produce the expected result in the common
- cases, regardless of whether NLST or MLSD is used underneath.
- 2. For anomalous cases, the user needs a way to control whether the
- MGET argument is sent to the server or kept for local use.
- 3. At the same time, the user might need a way to send a directory
- name to the server, independent of any wildcard pattern.
- 4. The user needs a way to force NLST or MLSD for a given MGET
- command.
- By default, Kermit's MGET command uses MLSD if MLST is reported by the
- server in its FEAT list. When MLSD is used, the filespec is sent to the
- server if it is not wild (according to Kermit's own definition of
- "wild" since it can't possibly know the server's definition). If the
- filespec is wild it is held for local use to select files from the list
- returned by the server. If MLST is not reported by the server or is
- disabled, Kermit sends the MGET filespec with the NLST directive.
- The default behavior can be overridden globally with FTP DISABLE MLST,
- which forces Kermit to use NLST to get file lists. And then for
- situations in which MLSD is enabled, the following MGET switches can be
- used to override the defaults for a specific MGET operation:
- /NLST
- Forces the client to send NLST. Example:
- mget /nlst foo.*
- /MLSD
- Forces the client to send MLSD (even if MLST is disabled).
- Example:
- mget /mlsd foo.*
- /MATCH:pattern
- When this switch is given, it forces the client to hold the
- pattern for local use against the returned file list. If a
- remote filespec is also given (e.g. the "blah" in "mget
- /match:*.txt blah"), then it is sent as the NLST or MLSD
- argument, presumably to specify the directory whose files are to
- be listed. When the /MATCH switch is not given, the MGET
- filespec is sent to the server if the directive is NLST or if
- the filespec is not wild. Examples:
- Command: With NLST: With MLSD:
- mget NLST MLSD
- mget *.txt NLST *.txt MLSD
- mget foo NLST foo MLSD foo
- mget /match:*.txt NLST MLSD
- mget /match:*.txt foo NLST foo MLSD foo
- In other words, the pattern is always interpreted locally unless MGET
- uses NLST and no /MATCH switch was given.
- 3.11.4. Examples
- 3.11.4.1. Downloading a Single File
- There are no choices here, just use the FTP GET command. Kermit always
- sends the RETR directive, and possibly SIZE and/or MDTM. The small
- advantage of using MLST in this case is outweighed by the risk and
- effort of coding a special case.
- 3.11.4.2. Downloading a Group of Files from a Single Directory
- This case presents tradeoffs, especially on slow connections:
- * For downloading all or most of the files in a directory, MLSD is
- better because it eliminates the need to send SIZE and MDTM for
- each file. No special actions are required in this case; Kermit
- uses MLSD automatically if the server supports it (unless you have
- disabled it).
- * For a small number of files from a large directory, NLST is better
- because it bypasses downloading of a potentially huge file list
- prior to the files themselves. If you have a connection to a server
- that supports MLSD, use the /NLST switch to force NLST:
- mget /nlst t[1234].h
- * If the server supports MLSD but does not support separate SIZE or
- MDTM directives, and you need the size and/or timestamp
- information, MLSD is better; no special actions required.
- * If the server supports MLSD but does not support the "size" and
- "modify" facts, but it does support the SIZE or MDTM directives,
- and you need the size and/or timestamp information, NLST is better.
- 3.11.4.3. Downloading a Directory Tree
- MLSD is the only choice for recursive downloads; they rarely, if ever,
- work with NLST (the few cases where they do work rely on extra-protocol
- "secret" notations for the NLST argument). No special actions are
- required to force MLSD when the server supports it, unless you have
- disabled it. Examples:
- MGET /RECURSIVE
- This tells the server to send all files and directories in the
- tree rooted at its current directory.
- MGET /RECURSIVE *.txt
- This tells the server to send all *.txt files in the tree rooted
- at its current directory.
- MGET /MLSD /RECURSIVE *.txt
- Same as the previous example but forces Kermit to send MLSD in
- case it was disabled, or in case the server is known to support
- it even though it did not announce it in its FEAT listing.
- MGET /RECURSIVE /MATCH:*.zip archives
- Tells the server to send all ZIP files in the tree rooted at its
- "archives" directory.
- MGET /RECURSIVE /MATCH:* [abc]
- The server is running on VMS and you want it to send all the
- files in the directory tree rooted at [ABC]. But since "[abc]"
- looks just like a wildcard, you have to include a /MATCH: switch
- to force Kermit to send "[abc]" as the MLSD argument.
- In all cases in which the /RECURSIVE switch is included, the server's
- tree is duplicated locally.
- Although MLSD allows recursion and NLST does not, the MLSD
- specification places a heavy burden on the client; the obvious,
- straightforward, and elegant implementation (depth-first, the one
- that Kermit currently uses) requires as many open temporary files as
- the server's directory tree is deep, and therefore client resource
- exhaustion -- e.g. exceeding the maximum number of open files -- is
- a danger. Unfortunately MLSD was not designed with recursion in
- mind. (Breadth-first traversal could be problematic due to lack of
- sufficient navigation information.)
- Of course all of Kermit's other MGET switches can be used too, e.g. for
- finer-grained file selection (by date, size, etc), for moving or
- renaming files as they arrive, to override Kermit's automatic per-file
- text/binary mode switching, to pass the incoming files through a
- filter, to convert text-file character sets, and so on.
- 3.11.4.4. NLST/MLSD Summary Table
- Here's a table summarizing MGET behavior when the server supports both
- NLST and MLSD. /NLST and /MLSD switches are included for clarity to
- indicate which protocol is being used, and the expected effects. In
- practice you can omit the /NLST and /MLSD switches and the Kermit
- client chooses the appropriate or desired protocol as described above.
- Sample commands presume a Unix file system on the server, but of course
- the server can have any file system or syntax at all.
- User's Command FTP Sends Remarks
- mget /nlst NLST Gets a list of all the files in the server's current
- and downloads each file. The list includes names only, so Kermit also
- must send SIZE and MDTM directives if size and timestamp information is
- required (this is always true of NLST). Sending NLST without an
- argument is allowed by the RFC959 NLST definition and by the Kermit FTP
- client, but might not work with other clients, and also might not work
- with every server.
- mget /nlst foo NLST foo If "foo" is a directory, this gets a list of
- all the files from the server's "foo" directory and downloads each
- file; otherwise this downloads the file named "foo" (if any) from the
- server's current directory.
- mget /nlst *.txt NLST *.txt Gets a list of the files in the server's
- current directory whose names match the pattern *.txt, and then
- downloads each file from the list. Because we are using NLST, we send
- the filespec (*.txt) to the server and the server interprets any
- wildcards.
- mget /nlst foo/*.txt NLST foo/*.txt Gets a list of the files in the
- server's "foo" directory whose names match the pattern *.txt, and then
- downloads each file from the list (server interprets wildcards).
- mget /nlst /match:*.txt NLST Gets a list of all the files in the
- server's current directory and then downloads each one whose name
- matches the pattern *.txt (client interprets wildcards).
- mget /nlst /match:*.txt foo NLST foo Gets a list of all the files in
- the server's "foo" directory and then downloads each one whose name
- matches the pattern *.txt (client interprets wildcards).
- mget /mlsd MLSD Gets a list of all the files from the server's current
- directory and then downloads each one. The list might include size and
- timestamp information, in which case Kermit does not need to send SIZE
- and MDTM directives for each file (this is always true of MLSD).
- mget /mlsd foo MLSD foo Gets a list of all the files from the server's
- "foo" directory (where the string "foo" does not contain wildcards) and
- then downloads each one. If "foo" is a regular file and not a
- directory, this command is supposed to fail, but some servers have been
- observed that send the file.
- mget /mlsd *.txt MLSD Gets a list of all the files from the server's
- current directory and then downloads only the ones whose names match
- the pattern "*.txt". Because we are using MLSD and the MGET filespec is
- wild, we do not send the filespec to the server, but treat it as though
- it had been given in a /MATCH: switch and use it locally to match the
- names in the list.
- mget /mlsd foo/*.txt MLSD This one won't work because MLSD requires
- that the notions of server directory and filename-matching pattern be
- separated. However, the client, which can't be expected to know the
- server's file-system syntax, winds up sending a request that the server
- will (or should) reject.
- mget /mlsd /match:*.txt MLSD Gets a list of all the files from the
- server's current directory and then downloads only the ones whose names
- match the pattern "*.txt" (client interprets wildcards).
- mget /mlsd /match:*.txt foo MLSD foo If "foo" is a directory on the
- server, this gets a list of all the files from the server's "foo"
- directory and then downloads only the ones whose names match the
- pattern "*.txt" (client interprets wildcards). This leaves the server
- CD'd to the "foo" directory; there's no way the client can restore the
- server's original directory because MLSD doesn't give that information,
- and since the client can not be expected to know the server's
- file-system syntax, it would not be safe to guess. If "foo" is a
- regular file, MLSD fails.
- mget /mlsd foo bar MLSD This one is problematic. You're supposed to be
- able to give MGET a list a filespecs; in this case we name two
- directories. The client must change the server's directory to "foo" to
- get the list of files, and then the files themselves. But then it has
- no way to return to the server's previous directory in order to do the
- same for "bar", as explained in the previous example.
- mget /mlsd /match:* [abc] MLSD [abc] Including a /MATCH: switch forces
- [abc] to be sent to the server even though the client would normally
- think it was a wildcard and hold it for local interpretation. In this
- example, [abc] might be a VMS directory name.
- mget /mlsd /match:* t*.h MLSD t*.h Contrary to the MLSD specification,
- some MLSD-capable FTP servers do interpret wildcards. This form of the
- MGET command can be used to force a wildcard to be sent to the server
- for interpretation.
- When MLSD is used implicitly (that is, without an /MLSD switch given to
- force the use of MLSD) and an MGET command such as "mget foo/*.txt"
- fails, Kermit automatically falls back to NLST and tries again.
- 3.11.5. References
- 1. Postel, J., and J. Reynolds, File Transfer Protocol (FTP), RFC 959,
- October 1985: [372]ftp://ftp.isi.edu/in-notes/rfc959.txt.
- 2. Hethmon, P, and R. Elz, Feature negotiation mechanism for the File
- Transfer Protocol, RFC 2389, August 1998:
- [373]ftp://ftp.isi.edu/in-notes/rfc2389.txt.
- 3. Elz, R, and P. Hethmon, Extensions to FTP, Internet Draft
- draft-ietf-ftpext-mlst-16.txt, September 2002:
- [374]http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16.
- txt.
- 4. [375]The Kermit FTP Client (overview).
- [ [376]Top ] [ [377]FTP Top ] [ [378]C-Kermit Home ] [ [379]Kermit Home
- ]
- 4. FILE SCANNING
- A new feature called file scanning is used in various contexts to
- determine if a file is text or binary, and if it is text, what kind of
- text. The overhead of file scanning is surprisingly tolerable, usually
- about a quarter second per file. File scanning is now used instead of
- filename patterns unless you SET FILE SCAN OFF, which restores the
- previous behavior.
- The primary benefit of file scanning is in file transfer. For all
- practical purposes, now you can stop worrying about whether a file
- should be sent in binary or text mode, or about sending mixtures of
- text and binary files in a single operation, or configuring and
- fine-tuning your lists of binary-file and text-file name patterns: now
- it all just works.
- File scanning is done by the file sender, which determines the type of
- each file before it sends it and informs the receiver (Kermit or FTP
- server) of the type. File scanning is NOT done by the receiver, because
- it is the sender's responsibility to determine each file's type, send
- the file in the right mode, and inform the receiver of the mode. If
- both transfer partners are capable of this (or any other) form of
- automatic text/binary mode switching, then files can be sent in both
- directions with no worries about corruption due to inappropriate
- transfer mode. (As noted in [380]Section 3, FTP servers don't do this,
- so this discussion does not apply when using Kermit to download from an
- FTP server.)
- The rest of this section is mainly for the curious. If you don't read
- it and simply accept all defaults, every file you send should go in the
- appropriate mode automatically. As always, however, for character-set
- translation to work for 7- and 8-bit character-set files, the
- appropriate SET FILE CHARACTER-SET command(s) must have been executed
- to identify their encoding (Kermit's default file character-set is
- neutral ASCII except on platforms like HP-UX or DG/UX, where the
- default file character-set is known). And of course, receiving is
- another matter -- obviously the other Kermit must also send each file
- in the appropriate mode.
- Scanning is more reliable than filename patterns simply because
- filenames are not reliable indicators of the file's contents. Classic
- examples include ".doc" files, which are binary if Microsoft Word
- documents but text on most other platforms, and ".com" files, which are
- binary on DOS and Windows but text on VMS. Anyway, nobody knows the
- naming conventions (if any) of all the applications (and persons!) on
- your computer. Scanning, on the other hand, determines each file's type
- by inspecting its contents rather than just looking at its name.
- Also, file patterns -- even when they work as intended -- categorize
- each file only as text or binary, whereas file scanning can make finer
- distinctions:
- BINARY
- Binary data, not to be converted in any way. Examples include
- binary machine code (executable programs), graphics images (GIF,
- JPG, etc), compressed files (Z, GZ, etc), archives and packages
- (ZIP, TAR, RPM, etc), object files and libraries (OBJ, DLL,
- etc).
- 7-BIT TEXT
- Text encoded in a 7-bit character set such as ASCII or one of
- the ISO 646 national versions. Kermit has no way to tell which
- character is used, only that it's 7-bit text. Typical examples
- include program source code, README files, Perl or Kermit
- scripts, plain-text email, HTML, TeX, and various textual
- encodings of binary files: Hex, Base64, etc. When sending such
- files, the FILE DEFAULT 7BIT-CHARACTER-SET is used as the file
- character-set, and then the appropriate transfer character set
- is chosen from the associations list (ASSOCIATE, SHOW
- ASSOCIATIONS).
- 8-BIT TEXT
- Text encoded in an 8-bit character set such as Latin-1, Latin-2,
- Latin/Hebrew, Latin/Cyrillic, KOI8, HP-Roman8, JIS X 0208, Code
- Page 437, or Code Page 1252. Again, Kermit has no way of knowing
- which particular set is in use, only that it's 8-bit text. When
- sending such files, the FILE DEFAULT 8BIT-CHARACTER-SET is used
- as the file character-set, and then the appropriate transfer
- character set is chosen from the associations list.
- UCS2 TEXT
- Unicode in its basic form, 16 bits (2 octets) per character.
- When sending such files, UCS2 is the file character-set and the
- byte order is identified automatically; the appropriate transfer
- character set is chosen from the associations list. Normally
- this would be UTF8. UTF-16 is not supported yet; Kermit's
- Unicode translations are restricted to Plane 0, the Base
- Multilingual Plane (BMP).
- UTF8 TEXT
- Unicode in its 8-bit transformation format. When sending such
- files, UTF8 is the file character-set; the appropriate transfer
- character set is chosen from the associations list, normally
- UCS2 or UTF8.
- File scanning is available in UNIX C-Kermit, in K-95, and to a limited
- extent, in VMS C-Kermit (full scanning is problematic in VMS because
- even plain-text files might contain binary record-format information).
- The relevant commands are:
- SET TRANSFER MODE { AUTOMATIC, MANUAL }
- Tells whether the file-transfer mode (text or binary) should be
- set by automatic or "manual" means. AUTOMATIC is the default,
- which allows any of the automatic methods that are enabled to do
- their jobs: FILE SCAN, FILE PATTERNS, peer recognition, etc.
- MANUAL lets you control the transfer mode with the SET FILE TYPE
- commands. As always, /TEXT and /BINARY switches on your
- file-transfer commands override all other methods; if you give
- one of these switches, scanning is not done. SHOW TRANSFER
- displays the current TRANSFER MODE setting.
- SET FILE SCAN { ON [ number ], OFF }
- Turns this feature on and off. It's ON by default. When OFF, the
- previous rules apply (SET FILE PATTERNS, etc). When ON is given,
- you can also specify a number of bytes to be scanned. The
- default is 49152 (= 48K). If a negative number is given, the
- entire file is scanned, no matter how big, for maximum certainty
- (for example, a PostScript file that appears to be plain text
- might include an embedded graphic past the normal scanning
- limit). SHOW FILE displays the current FILE SCAN setting.
- SET FILE DEFAULT 7BIT-CHARACTER-SET name
- Tells the 7-bit character-set to use if scanning identifies a
- 7-bit text file, e.g. GERMAN. SHOW FILE displays the current SET
- FILE DEFAULT settings. So does SHOW CHARACTER-SETS.
- SET FILE DEFAULT 8BIT-CHARACTER-SET name
- Tells the 8-bit character-set to use if scanning identifies an
- 8-bit text file, e.g. LATIN1. SHOW FILE and SHOW CHARACTER-SET
- display this.
- ASSOCIATE FILE-CHARACTER-SET fcs tcs
- When sending files and a file character-set (fcs) is identified
- by scanning, this tells C-Kermit which transfer character-set
- (tcs) to translate it to. It also allows C-Kermit to set the
- appropriate transfer character-set automatically whenever you
- give a SET FILE CHARACTER-SET command.
- ASSOCIATE TRANSFER-CHARACTER-SET tcs fcs
- When receiving files and a file arrives whose transfer
- character-set (tcs) is announced by the sender, this command
- tells C-Kermit which file character-set (fcs) to translate it
- to. It also allows C-Kermit to set the appropriate file
- character-set whenever you give a SET TRANSFER CHARACTER-SET
- command.
- SET FILE CHARACTER-SET name
- When given for a 7-bit set, also sets FILE DEFAULT
- 7BIT-CHARACTER-SET to the same set. When given for an 8-bit set,
- also sets FILE DEFAULT 8BIT-CHARACTER-SET to the same set. If an
- ASSOCIATE FILE-CHARACTER-SET command has been given for this
- set, also sets the corresponding transfer character-set.
- DIRECTORY /XFERMODE [ filespec ]
- Performs a file scan of the given files, listing the result for
- each file. If FILE SCAN is OFF but PATTERNS are ON, the result
- shown according to the current FILE TEXT-PATTERNS and
- BINARY-PATTERNS, and are restricted to (B) and (T). When FILE
- SCAN is ON, the results are:
- (B) Binary
- (T)(7BIT) Text: 7-bit
- (T)(8BIT) Text: 8-bit
- (T)(UTF8) Text: Unicode UTF8
- (T)(UCS2BE) Text: Unicode UCS2 Big Endian
- (T)(UCS2LE) Text: Unicode UCS2 Little Endian
- So you can use DIR /XFER to get a preview of how each file in a
- selected group will be transferred. Everything to the right of
- the (B) or (T) is new. If FILE SCAN is OFF, you only get the (B)
- or (T) as before.
- Note: Big and Little Endian refer to the ordering of bytes
- within a computer word. Big Endian architecture is standard and
- is used on most non-PC computers. Little Endian architecture is
- used on PCs.
- To illustrate file-transfer with scanning, suppose you have a directory
- containing a mixture of text and binary files, and each text file can
- be 7-bit German ISO 646, 8-bit Latin-1, or Unicode in any of the
- following forms: UCS2 Little Endian, UCS2 Big Endian, or UTF8
- ([381]UTF-16 is not supported yet). Assuming all the built-in defaults
- are in effect, the following three commands do the job:
- set file char german ; This sets the default for 7-bit text files
- set file char latin1 ; This sets the default for 8-bit text files
- send *
- Each file is sent in the appropriate mode (text or binary), with text
- files converted to the appropriate transfer character-set and labeled
- so the receiver can convert them according to its own local
- conventions.
- By the way, what if you want to inhibit character-set translation but
- still allow automatic text/binary mode switching? Previously, you could
- simply SET TRANSFER CHARACTER-SET TRANSPARENT. But now with file
- scanning, the file and transfer character-sets are set automatically
- per file. A new command was added for this purpose:
- SET TRANSFER TRANSLATION { ON, OFF }
- Enables and disables file-transfer character-set translation. It
- is enabled by default.
- When TRANSFER TRANSLATION is OFF but FILE SCAN is ON, files are still
- scanned to see if they are text or binary, but no character-set
- translation is done when they text: only the normal record-format
- conversion.
- Like all SET commands, SET TRANSFER TRANSLATION is global and
- persistent. You can also force a particular file-transfer command
- (SEND, MSEND, GET, RECEIVE, TRANSMIT, etc) to not translate without
- affecting the global translation settings by including the new
- /TRANSPARENT switch, e.g.
- send /transparent oofa.txt
- As of C-Kermit 8.0.206, SET TRANSFER CHARACTER-SET TRANSPARENT implies
- SET TRANSFER TRANSLATION OFF.
- File scanning is also used in the TYPE command. The source file type
- and character set are determined as above, and then the file is
- automatically converted to your display character-set, line by line. In
- Kermit 95, the display character-set is Unicode, perhaps converted to
- your current console code page; in other versions of C-Kermit, it is
- your current file character-set. Thus if you have the following set
- appropriately:
- SET FILE CHARACTER-SET (necessary in Unix but not K95)
- SET FILE DEFAULT 7BIT CHARACTER-SET
- SET FILE DEFAULT 8BIT CHARACTER-SET
- then you should be able to TYPE any text file and see something
- reasonable. For example, in Unix, if your DEFAULT 7BIT-CHARACTER-SET is
- ITALIAN and your DEFAULT 8BIT-CHARACTER-SET is LATIN1, and your FILE
- CHARACTER-SET is LATIN1, you can TYPE an Italian ISO 646 file, a
- Latin-1 file, or any kind of Unicode file, and have it translated
- automatically to Latin-1 for your display.
- In the GUI version of Kermit 95, you can see mixtures of many different
- scripts if the file is UTF8 or UCS2: Roman, Cyrillic, Hebrew, Greek,
- Armenian, Georgian, etc, all on the same screen at once.
- File scanning also adds a new criterion for file selection, i.e. to
- select only text (or binary) files. Several commands now include a new
- switch, /TYPE:{BINARY,TEXT,ALL}. BINARY means select only binary
- regular files (not directories). TEXT means select only text files. ALL
- means don't scan; select all files. Examples:
- SEND /TYPE:BINARY *.*
- Sends only binary files, skipping over text files.
- NOTE: File scanning is NOT done when using external protocols (because
- the external protocol programs, such as sz, are processing each file,
- not Kermit).
- DIRECTORY /TYPE:TEXT
- Lists only text files but not binary files.
- DELETE /TYPE:BINARY foo.*
- Deletes all foo.* files that are regular binary files but does
- not delete any text files.
- CHMOD /TYPE:BINARY 775 *
- (UNIX) Changes the permissions of all binary files to 775.
- When FILE SCAN is OFF and FILE PATTERNS are ON, behavior is as before
- with PATTERNS ON, but with some improvements:
- * Pathnames are now stripped prior to pattern matching.
- * Backup suffixes (like .~3~) are stripped prior to pattern matching.
- [ [382]Top ] [ [383]Contents ] [ [384]C-Kermit Home ] [ [385]Kermit
- Home ]
- 5. FILE AND DIRECTORY NAMES CONTAINING SPACES
- Prior to the introduction of the graphical user interface (GUI), it was
- inconceivable that file or directory names could contain spaces,
- because space is a field delimiter in all command languages. GUIs,
- however, use dialog boxes for filenames, so there is never any question
- of distinguishing a filename from adjacent fields -- because there are
- no adjacent fields -- and therefore it has become quite common on
- computers that have GUIs to have file and directory names composed of
- multiple words. Of course this poses problems for command shells and
- other text-oriented programs.
- Most command shells address these problems by allowing such names to be
- enclosed in doublequotes, e.g.:
- cd "c:\Program Files"
- C-Kermit previously used braces for this:
- cd {c:\Program Files}
- which was not what most people expected. And even when braces were
- used, Kermit had difficulties with completion, file menus, and so
- forth, within braced fields.
- C-Kermit 8.0 allows either doublequotes or braces to be used for
- grouping:
- send "this file"
- send {this file}
- rename "this file" "that file"
- rename {this file} "that file"
- rename "this file" {that file}
- cd {Program Files}
- cd "Program Files"
- Note that the doublequotes or brackets must enclose the whole file or
- directory specification:
- "c:\My Directory"
- not:
- c:\"My Directory"
- In C-Kermit 8.0, you can also use completion on these filenames, in
- which case Kermit supplies the quotes (or braces) automatically.
- Example (in which the current directory contains only one file whose
- name starts with "th" and its full name is "this file" (without the
- quotes, but with the space)):
- cat th<Tab>
- Kermit repaints the filename field like this:
- cat "this file"
- That is, it backspaces over the original "th" and then writes the
- filename in doublequotes.
- If completion is only partial, Kermit still supplies the quotes, but in
- this case also beeps. To continue the filename, you must first
- backspace over the closing quote. The closing quote is supplied in this
- case to make sure that you can see the spaces, especially if they are
- trailing. For example, if the current directory contains two files
- whose names start with "th", and their fill names are "this file" and
- "this other file":
- cat th<Tab>
- Kermit prints:
- cat "this "<Beep>
- If it didn't print the closing quote, you would probably wonder why it
- was beeping.
- Also, if you begin a filename field with a doublequote or opening
- brace, now you can use completion or get ?-help; this was never
- possible before.
- C-Kermit>type "thi? Input file specification, one of the following:
- this file this other file
- C-Kermit>type "thi_
- [ [386]Top ] [ [387]Contents ] [ [388]C-Kermit Home ] [ [389]Kermit
- Home ]
- 6. OTHER COMMAND PARSING IMPROVEMENTS
- 6.1. Grouping Macro Arguments
- Doublequotes now can be used in macro invocations to group arguments
- containing spaces, where previously only braces could be used:
- define xx show args
- xx one "this is two" three
- Result:
- Macro arguments at level 0 (\v(argc) = 4):
- \%0 = xx
- \%1 = one
- \%2 = this is two
- \%3 = three
- Also, you can now quote braces and quotes in macro args (this didn't
- work before). Examples:
- xx "{" ; The argument is a single left brace
- xx {"} ; The argument is a doublequote character
- In case this new behavior interferes with your scripts, you can restore
- the previous behavior with:
- SET COMMAND DOUBLEQUOTING OFF
- 6.2. Directory and File Name Completion
- C-Kermit 8.0 also includes better completion for directory names, e.g.
- in the CD command. If the name typed so far uniquely matches a
- directory name, it is completed (as before), but now if the directory
- contains any subdirectories, completion is partial (allowing you to
- supply additional path segments without backspacing); otherwise it is
- complete.
- Completion has also been improved for file and directory names that
- contain not only spaces (as described above) but also "metacharacters"
- such as asterisk (*) and tilde (~): now the field is repainted if
- necessary. For example, if the current directory contains only one file
- whose name contains "blah", then in:
- type *blah<Tab>
- "*blah" is replaced by the filename. In earlier releases, the part
- typed so far was left on the command line (and in the history buffer),
- so even when the original command worked, the recalled version would
- not. Similarly for ~ (the nearly-universal Unix notation for username):
- type ~olga/x<Tab>
- is repainted as (e.g.):
- type /users/home/olga/x(Beep)
- Speaking of command history, the new SHOW HISTORY command shows your
- command history and recall buffer. SAVE COMMAND HISTORY saves it into a
- file of your choice.
- 6.3. Passing Arguments to Command Files
- The method for passing arguments to command files has been improved.
- Prior to C-Kermit 7.0 there was no provision for doing this. In
- C-Kermit 7.0, the TAKE command was changed to allow arguments to be
- given after the filename:
- take commandfile arg1 arg2 ...
- This was accomplished by replacing the current \%1, \%2, etc, with the
- given arguments, since a new set of macro argument variables is created
- only when a macro is executed, not a command file. It is much more
- intuitive, however, if arguments to command files worked like those to
- macros: the command file sees the arguments as its own \%1, \%2, etc,
- but the caller's variables are not disturbed. C-Kermit 8.0 accomplishes
- this by automatically creating an intermediate temporary macro to start
- the command file (if any arguments were given), thus creating a new
- level of arguments as expected.
- 6.4. More-Prompting
- The familiar --more?-- prompt that appears at the end of each screenful
- of command-response output now accepts a new answer: G (Go) meaning
- "show all the rest without pausing and asking me any more questions". P
- (Proceed) is a synonym for G.
- 6.5. Commas in Macro Definitions
- As noted in the [390]C-Kermit manual, comma is used to separate
- commands in a macro definition. Even when the macro is defined on
- multiple lines using curly-brace block-structure notation without
- commas, the definition is still stored internally as a comma-separated
- list of commands. Therefore special tricks are needed to include a
- comma in a command. The classic example is:
- define foo {
- (some command)
- if fail echo Sorry, blah failed...
- }
- This would result in Kermit trying to execute a "blah" command. This
- could always be handled by enclosing the text in braces:
- define foo {
- (some command)
- if fail echo {Sorry, blah failed...}
- }
- but doublequotes (more intuitive) should have worked too. Now they do:
- define foo {
- (some command)
- if fail echo "Sorry, blah failed..."
- }
- 6.6. Arrow Keys
- As of version 8.0.201, C-Kermit on most platforms lets you access the
- command history buffer with arrow keys, just as you always could with
- control characters. The restrictions are:
- 1. Only Up and Down arrow keys are accepted.
- 2. Only 7-bit ANSI arrow-key sequences are understood (ESC followed by
- [ or uppercase letter O, followed by uppercase letter A or (up) B
- (down).
- This change was made to facilitate command recall in Linux-based PDAs
- that don't have a Control key, or at least not one that's easily (or
- always) accessible, such as the Sharp Zaurus SL5500.
- [ [391]Top ] [ [392]Contents ] [ [393]C-Kermit Home ] [ [394]Kermit
- Home ]
- 7. NEW COMMANDS AND SWITCHES
- See [395]Section 4 for more about file scanning and the /TYPE: switch.
- ASK[Q] [ /TIMEOUT:number /QUIET /DEFAULT:text ] variable [ prompt ]
- The new optional /TIMEOUT: switch for ASK and ASKQ causes the
- command to time out and and fail if no response is given within
- the specified number of seconds, 1 or greater (0 or less means
- no timeout, wait forever). This works just like SET ASK-TIMER,
- except its effect is local to the ASK command with which it is
- given and it does not disturb the global ask timer setting. The
- new /QUIET switch tells Kermit not to print an error message if
- the ASK or ASKQ command times out waiting for a response.
- Version 8.0.211 adds the /DEFAULT:text switch for ASK-Class
- commands (ASK, ASKQ, and GETOK). This lets you supply a default
- answer in case the user supplies an empty answer or the
- /TIMEOUT: switch was included and the time limit expired without
- an answer. In both these cases, the command succeeds.
- CAT filename
- Equivalent to TYPE /NOPAGE.
- CDUP
- Changes Kermit's local working directory to the parent of the
- current one. Equivalent to "cd .." in UNIX or Windows, "cd [-]"
- in VMS, "cd ^" in AOS/VS, etc; in other words, it's a
- platform-independent way of moving one level up in a directory
- tree.
- CHMOD [ switches ] permission files
- UNIX only. Sets file permissions for one or more files or
- directories. The permission must be given as an octal number,
- e.g. 664, 755. Switches: /DIRECTORIES, /FILES, /NOLIST, /PAGE,
- /DOTFILES, /LIST, /NOPAGE, /RECURSIVE, /TYPE:{TEXT,BINARY,ALL},
- /SIMULATE. The /TYPE: switch allows selection of only text or
- binary files. For example, if you have a mixture of source files
- and executables, you can use "chmod /files /type:text 664" to
- give owner/group read/write and world read permission to the
- text files, and "chmod /files /type:binary 775" to give the same
- plus execute permission to the executables. Use /SIMULATE to see
- which files would be affected, without actually changing their
- permissions.
- CLEAR KEYBOARD-BUFFER
- Flushes any as-yet unread characters from the keyboard input
- buffer. Useful for flushing typeahead in scripts.
- CONTINUE
- When given at an interactive command prompt that was reached by
- issuing a PROMPT command (described in this section) from a
- script, this command returns to the script, continuing its
- execution at the command after the PROMPT command. In this
- context, CONTINUE is simply a more-intuitive synonym for END.
- COPY, RENAME, and TRANSLATE
- These commands now work on file groups if the target filename is
- a directory, e.g. "copy oofa.* ..", "rename * ~olga/tmp/"
- COPY /APPEND source destination
- The source file specification can now include wildcards, in
- which case all of the source files that match will go into the
- destination file in alphabetical order by name.
- DELETE /ASK
- Asks permission to delete each file before deleting it. In
- C-Kermit 7.0, the answers were "yes" (or "ok") and "no".
- C-Kermit 8.0 adds "go" (meaning, delete all the rest without
- asking) and "quit" (cancel the DELETE command and return to the
- prompt).
- DELETE /DIRECTORIES
- Deletes not only files but also directories.
- DELETE /RECURSIVE
- Deletes all files that match the given file specification in the
- current (or given) directory and all directories beneath it.
- DELETE /SUMMARY
- Prints only the number of files deleted and total size freed,
- without listing each file.
- DELETE /TREE
- Shorthand for DELETE /RECURSIVE /DIRECTORIES /DOTFILES/.
- Equivalent to Windows DELTREE or Unix "rm -Rf". If no file
- specification is given, the contents of the current directory,
- plus all of its subdirectories and their contents, are deleted.
- DELETE /TYPE:BINARY
- Delete only regular binary files (requires FILE SCAN ON).
- DELETE /TYPE:TEXT
- Delete only regular text files (requires FILE SCAN ON).
- DIRECTORY [ switches ] [ filespec [ filespec [ filespec ... ] ] ]
- The DIRECTORY command now accepts more than one file
- specification; e.g. "directory moon.txt sun.doc stars.*".
- DIRECTORY /NORECURSIVE xxx
- If xxx is a directory name, forces listing of the directory
- itself rather than its contents.
- DIRECTORY /FOLLOWLINKS xxx
- (UNIX only) Tells the DIRECTORY command to follow symbolic
- links. This not the default because it can cause endless loops.
- DIRECTORY /NOFOLLOWLINKS xxx
- (UNIX only) Tells the DIRECTORY command not to follow symbolic
- links, but rather, merely to list them. This is the default.
- DIRECTORY /OUTPUT:filename
- Sends the results of the DIRECTORY command to the given file.
- DIRECTORY /SUMMARY
- Prints only the number of directories and files and the total
- size, without listing each file.
- DIRECTORY /TYPE:{TEXT,BINARY}
- Shows only files of the selected type, based on file scan.
- DIRECTORY /XFERMODE
- Now shows results of file scan (see [396]Section 4).
- FOPEN [ switches ] channel filename
- As of version 8.0.211, FOPEN allows /dev/tty as a filename in
- Unix-based operating systems.
- FREAD /TRIM
- (8.0.211) Trims any trailing blanks or tabs from the item (such
- as a line of text) that it has read.
- FREAD /UNTABIFY
- (8.0.211) Converts Horizontal Tab characters to the appropriate
- number of spaces, based on VT100-like tab stops (1,9,17,25,...).
- GREP [ switches ] pattern files
- Similar to Unix grep command: displays file lines that match the
- given [397]pattern. Switches:
- /COUNT[:variable]
- Don't show the matching lines, just tell how many lines
- match. If a variable name is specified, the count is
- stored in the given variable.
- /DOTFILES
- Include files whose names begin with dot.
- /LINENUMBERS
- Show line numbers of matching lines.
- /NAMEONLY
- only list the names of files that contain matching lines,
- but not the lines themselves.
- /NOBACKUP
- Skip backup files.
- /NOCASE
- Ignore alphabetic case while pattern matching.
- /NODOTFILES
- skip files whose names start with dot (period).
- /NOLIST
- Suppress output but set SUCCESS or FAILURE according to
- search result.
- /NOMATCH
- Look for lines that do not match the pattern.
- /NOPAGE
- Don't pause between screens of output.
- /OUTPUT:filename
- Write results into the given file.
- /PAGE
- Pause between screens of output.
- /RECURSIVE
- Search files in subdirectories too.
- /TYPE:{TEXT,BINARY}
- Search only files of the specified type.
- Synonyms: FIND, SEARCH.
- GETOK /TIMEOUT:n /QUIET /DEFAULT:text
- The new /QUIET switch instructs GETOK, when given a timeout, not
- to print an error message if it times out. As of 8.0.211, a
- default answer can be supplied (see ASK).
- HEAD [ switches ] filename
- Equivalent to TYPE /HEAD [ other-switches ] filename.
- HELP DATE
- Explains date-time formats, including timezone notation and
- delta times.
- HELP FIREWALLS
- Explains the firewall negotiation capabilities of your version
- of Kermit.
- KCD [ symbolic-directory-name ]
- Changes Kermit's working directory to the named symbolic
- directory, such as such as exedir, inidir, startup, download, or
- and home. Type "kcd ?" for a list of symbolic directory names
- known to your copy of Kermit, or give the new ORIENTATION
- command for a more detailed explanation. If you give a KCD
- command without a directory name, Kermit returns to its "home"
- directory, which is determined in some way that depends on the
- underlying operating system, but which you can redefine with the
- (new) SET CD HOME command. Your home directory is shown by SHOW
- CD and it's also the value of the \v(home) variable.
- LICENSE
- Displays the C-Kermit license.
- L-commands
- When Kermit has a connection to a Kermit or FTP server, file
- management commands such as CD, DIRECTORY, and DELETE might be
- intended for the local computer or the remote server. C-Kermit
- 8.0.200 and earlier always executes these commands on the local
- computer. If you want them executed by the remote server, you
- have to prefix them with REMOTE (e.g. REMOTE CD) or use special
- R-command aliases (e.g. RCD = REMOTE CD, RDIR = REMOTE DIR,
- etc). But this feels unnatural to FTP users, who expect
- unprefixed file management commands to be executed by the remote
- server, rather than locally. C-Kermit 8.0.201 adds automatic
- locus switching to present an FTP-like interface for FTP
- connections and the normal Kermit interface for Kermit
- connections, and a SET LOCUS command (described below) to
- control whether or how this is done. For when LOCUS is REMOTE, a
- new set of commands was added for local management: LCD (Local
- CD), LDIR (Local DIR), etc. These are described below under SET
- LOCUS.
- MORE filename
- Equivalent to TYPE /PAGE.
- ORIENTATION
- Displays symbolic directory names and the corresponding variable
- names and values. The symbolic names, such as exedir, inidir,
- startup, download, and home, can be used as arguments to the new
- KCD command.
- PROMPT [ text ]
- For use in a macro or command file: enters interactive command
- mode within the current context ([398]Section 8.1). If the
- optional text is included, the prompt is set to it. The text can
- include variables, functions, etc, as in the SET PROMPT command.
- They are evaluated each time the prompt is printed. Unlike the
- SET PROMPT command, the text argument applies only to the
- current command level. Thus you can have different prompts at
- different levels.
- REMOTE SET MATCH { DOTFILE, FIFO } { ON, OFF }
- Allows the client to tell the server whether wildcards sent to
- the server should match dot files (files whose names begin with
- period) or FIFOs (named pipes). See SET MATCH.
- SET ATTRIBUTE RECORD-FORMAT { ON, OFF }
- Allows control of the Kermit's Record-Format attribute. Set this
- to OFF in case incoming file are refused due to unknown or
- invalid record formats if you want to accept the file anyway
- (and, perhaps, postprocess it to fix its record format).
- SET CD HOME [ directory ]
- Specifies the target directory for the CD and KCD commands, when
- they are given without an argument, and also sets the value of
- the \v(home) variable.
- SET EXIT HANGUP { OFF, ON }
- Normally ON, meaning that when Kermit exits, it also explicitly
- hangs up the current SET LINE / SET PORT serial port according
- to the current SET MODEM TYPE and SET MODEM HANGUP METHOD, and
- closes the port device if it was opened by Kermit in the first
- place (as opposed to inherited). SET EXIT HANGUP OFF tells
- Kermit not to do this. This can't prevent the operating system
- from closing the device when Kermit exits (and it's a "last
- close") but if the port or modem have been conditioned to
- somehow ignore the close and keep the connection open, at least
- Kermit itself won't do anything explicit to hang it up or close
- it.
- SET FILE EOF { CTRL-Z, LENGTH }
- Specifies the end-of-file detection method to be used by
- C-Kermit when sending and receiving text files, and in the TYPE
- and similar text-file oriented commands. The normal and default
- method is LENGTH. You can specify CTRL-Z when handling CP/M or
- MS-DOS format text files, in which a Ctrl-Z (ASCII 26) character
- within the file marks the end of the file.
- SET FILE LISTSIZE number
- Allocates space for the given number of filenames to be filled
- in by the wildcard expander. The current number is shown by SHOW
- FILE. If you give a command that includes a filename containing
- a wildcard (such as "*") that matches more files that Kermit's
- list has room for, you can adjust the list size with this
- command.
- SET FILE STRINGSPACE number
- Allocates space for the given amount of filename strings for use
- by the wildcard expander. The current number is shown by SHOW
- FILE. The number is the total number of bytes of all the file
- specifications that match the given wildcard.
- If you need to process a bigger list of files than your computer has
- memory for, you might be able use an external file list. The Kermit
- SEND and the FTP PUT and GET commands accept a /LISTFILE: switch,
- which gives the name of a file that contains the list of files to be
- transferred. Example for UNIX:
- !find . -print | grep / > /tmp/names
- ftp put /update /recursive /listfile:/tmp/names
- SET LOCUS { AUTO, LOCAL, REMOTE }
- Added in C-Kermit 8.0.201. Sets the locus for unprefixed file
- management commands such as CD, DIRECTORY, MKDIR, etc. When
- LOCUS is LOCAL these commands act locally and a REMOTE (or R)
- prefix (e.g. REMOTE CD, RCD, RDIR) is required to send file
- management commands to a remote server. When LOCUS is REMOTE, an
- L prefix is required to issue local file management commands
- (e.g. LCD, LDIR). The word LOCAL can't be used as a prefix since
- it is already used for declaring local variables. LOCUS applies
- to all types of connections, and thus is orthogonal to SET
- GET-PUT-REMOTE, which selects between Kermit and FTP for remote
- file-transfer and management commands. The default LOCUS is
- AUTO, which means we switch to REMOTE whenever an FTP connection
- is made, and to LOCAL whenever a non-FTP connection is made, and
- switch back accordingly whenever a connection is closed. So by
- default, Kermit behaves in its traditional manner unless you
- make an FTP connection, in which case it acts like a regular FTP
- client (but better :-) LOCUS applies to the following
- commands:
- Unprefixed Remote Local Description
- CD (CWD) RCD LCD Change (Working) Directory
- CDUP RCDUP LCDUP CD Up
- PWD RPWD LPWD Print Working Directory
- DIRECTORY RDIR LDIR Request a directory listing
- DELETE RDEL LDEL Delete (a) file(s)
- RENAME RREN LREN Rename a file
- MKDIR RMKDIR LMKDIR Create a directory
- RMDIR RRMDIR LRMDIR Remove a directory
- SET MATCH { DOTFILE, FIFO } { ON, OFF }
- Whether C-Kermit filename patterns (wildcards) should match
- filenames that start with dot (period), or (Unix only) FIFOs
- (named pipes). The defaults are to skip dotfiles in Unix but
- match them elsewhere, and to skip FIFOs. Applies to both
- interactive use and to server mode, when the server receives
- wildcards, e.g. in a GET command. Also see REMOTE SET MATCH.
- SET OPTIONS DIRECTORY /DOTFILES
- Now works for server listings too (UNIX only). Give this command
- prior to having Kermit enter server mode, and then it will show
- files whose names begin with dot (period) when sent a REMOTE
- DIRECTORY command.
- SET QUIET ON
- (as well as the -q command-line option) Now applies also to:
- + SET HOST connection progress messages.
- + "Press the X or E key to cancel" file-transfer message.
- + REMOTE CD response.
- + REMOTE LOGIN response.
- SET RECEIVE PERMISSIONS { ON, OFF }
- Tells C-Kermit whether to set the permissions of incoming files
- (received with Kermit protocol) from the permissions supplied in
- the file's Attribute packet (if any). Normally ON. Also see SET
- SEND PERMISSIONS.
- SET ROOT directory
- Like UNIX chroot, without requiring privilege. Sets the root for
- file access, does not allow reference to or creation of files
- outside the root, and can't be undone.
- SET SEND PERMISSIONS { ON, OFF }
- Tells C-Kermit whether to include file permissions in the
- attributes it includes with each file when sending with Kermit
- protocol. Also see SET RECEIVE PERMISSIONS.
- SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER:name /PASSWORD:text
- These commands now allow specification of username and password.
- SET TERMINAL . . .
- (See [399]Section 12.)
- SET TRANSFER MESSAGE [ text ]
- Sets an initial text message to be displayed in the
- file-transfer display. The transfer message is automatically
- deleted once used, so must be set each time a message a desired.
- Any variables in the message are evaluated at the time the SET
- command is given. If the optional text is omitted, any transfer
- message that is currently set is removed. Synonym: SET XFER MSG.
- SHOW TRANSFER displays it if it has been set but not yet used.
- SHOW COMMUNICATIONS
- In C-Kermit 8.0, SHOW COMMUNICATIONS, when given in remote mode
- (i.e. before any connection has been established), tells the
- typical dialout device name for the particular platform on which
- it's running (e.g. TXA0: for VMS, or /dev/cua0p0 for HP-UX). On
- Unix platforms, it also tells the name of the lockfile
- directory. This way, you have an idea of what the SET LINE
- device name should look like, and if the SET LINE command fails,
- you know the name of the directory or device that is protected
- against you.
- SHOW VARIABLES [ name [ name [ ... ] ] ]
- In C-Kermit 8.0.201 you can request values of a list of built-in
- (\v(xxx)) variables. Each name is a pattern, as before, but now
- it a free pattern rather than an anchored one (explained in
- [400]Section 8.12) so now "show var date time" shows the values
- of all variables whose names include the strings "date" or
- "time".
- TAIL [ switches ] filename
- Equivalent to TYPE /TAIL [ other-switches ] filename.
- TRANSMIT /NOECHO [ other switches ] filename
- The /NOECHO switch is equivalent to giving the command SET
- TRANSMIT ECHO OFF prior to the TRANSMIT command, except the
- switch affects only the command with which it was given and does
- not affect the prevailing global setting.
- TRANSMIT /NOWAIT [ other switches ] filename
- The /NOWAIT switch is equivalent to giving the command SET
- TRANSMIT PROMPT 0 prior to the TRANSMIT command, except the
- switch affects only the command with which it was given and does
- not affect the prevailing global setting.
- TRANSMIT /NOWAIT /NOECHO /BINARY [ other switches ] filename
- When the TRANSMIT command is given with the /NOWAIT, /NOECHO,
- and /BINARY switches, this activates a special "blast the whole
- file out the communications connection all at once" mode that
- Kermit didn't have prior to version 8.0. There has been
- increasing demand for this type of transmission with the advent
- of devices that expect image (e.g. .JPG) or sound (e.g. .MP3)
- files as raw input. The obvious question is: how does the
- receiving device know when it has the whole file? This depends
- on the device, of course; usually after a certain amount of time
- elapses with nothing arriving, or else when Kermit hangs up or
- closes the connection.
- TYPE /CHARACTER-SET:name
- Allows you to specify the character set in which the file to be
- typed is encoded.
- TYPE /NUMBER
- Adds line numbers.
- TYPE /OUTPUT:filename
- Sends the results of the TYPE command to the given file.
- TYPE /TRANSLATE-TO:name
- Used in conjunction with TYPE /CHARACTER-SET:xxx; allows you to
- specify the character set in which the file is to be displayed.
- TYPE /TRANSPARENT
- Used to disable character-set translation in the TYPE command,
- which otherwise can take place automatically based on file
- scanning, even when /CHARACTER-SET and /TRANSLATE-TO switches
- are not given.
- VOID text
- Parses the text, evaluating any backslash items in it (such as
- function calls) but doesn't do anything further, except possibly
- printing error messages. Useful for invoking functions that have
- side effects without using or printing their direct results,
- e.g. "void \fsplit(\%a,&a)".
- Symbolic Links in UNIX
- The UNIX versions of C-Kermit have had /FOLLOWLINKS and /NOFOLLOWLINKS
- switches added to several commands to control the treatment of symbolic
- links. Different commands deal differently with symbolic links:
- Kermit SEND, FTP MPUT
- /NOFOLLOWLINKS is the default, which means symbolic links are
- skipped entirely. The alternative, /FOLLOWLINKS, should be used
- with caution, since an innocent link might point to a whole file
- system, or it might cause a loop. There is no way in Kermit or
- FTP protocol to send the link itself. We either skip them or
- follow them; we can't duplicate them.
- DIRECTORY
- /NOFOLLOWLINKS is the default, which means the DIRECTORY command
- lists symbolic links in a way that shows they are links, but it
- does not follow them. The alternative, /FOLLOWLINKS, follows
- links and gives information about the linked-to directories and
- files.
- DELETE, RMDIR
- The DELETE command does not have link-specific switches. DELETE
- never follows links. If you tell Kermit to delete a symbolic
- link, it deletes the link itself, not the linked-to file. Ditto
- for RMDIR.
- COPY
- The COPY command behaves just like the UNIX cp command; it
- always follows links.
- RENAME
- The RENAME command behaves just like the UNIX mv command; it
- operates on links directly rather than following.
- [ [401]Top ] [ [402]Contents ] [ [403]C-Kermit Home ] [ [404]Kermit
- Home ]
- 8. OTHER SCRIPTING IMPROVEMENTS
- 8.1. Performance and Debugging
- A command cache for frequently used commands plus some related
- optimizations increases the speed of compute-bound scripts by anywhere
- from 50% to 1000%.
- The new PROMPT command can be used to set breakpoints for debugging
- scripts. If executed in a command file or macro, it gives you an
- interactive command prompt in the current context of the script, with
- all its variables, arguments, command stack, etc, available for
- examination or change, and the ability to resume the script at any
- point (END resumes it, Ctrl-C or STOP cancels it and returns to top
- level).
- The new Ctrl-C trapping feature ([405]Section 8.14) lets you intercept
- interruption of scripts. This can be used in combination with the
- PROMPT command to debug scripts. Example:
- define ON_CTRLC {
- echo INTERRUPTED BY CTRL-C...
- echo The command stack has not yet been rolled back:
- show stack
- echo Type Ctrl-C again or use the END command to return to top level.
- prompt Debug>
- }
- Adding this ON_CTRL definition to your script lets you interrupt it at
- any point and get prompt that is issued at the current command level,
- so you can query local variables, etc.
- [ [406]Top ] [ [407]Contents ] [ [408]C-Kermit Home ] [ [409]Kermit
- Home ]
- 8.2. Using Macros as Numeric Variables
- A macro is a way to assign a value to a name, and then use the name to
- refer to the value. Macros are used in two ways in Kermit: as
- "subroutines" or functions composed of Kermit commands, which are
- executed, or as variables to hold arbitrary values -- text, numbers,
- filenames, etc.
- When a macro is to be executed, its name is given as if it were a
- C-Kermit command, optionally preceded by the word "do". When a macro is
- used as a variable, it must be "escaped" with \m(xxx) (or equivalent
- function, e.g. \s(xxx), \:(xxx), \fdefinition(xxx)), where xxx is the
- macro name, for example:
- define filename /usr/olga/oofa.txt
- send \m(filename)
- Of course variables can also hold numbers:
- define size 17
- declare \&a[\m(size)]
- ...
- define index 3
- if ( == \m(index) 3 ) echo The third value is: \&a[\m(index)]
- evaluate index (\m(index) * 4)
- if ( > \m(index) \m(size) ) echo Out of range!
- But these are contexts in which only numbers are valid. C-Kermit 8.0
- has been changed to treat non-escaped non-numeric items in strictly
- numeric contexts as macro names. So it is now possible (but not
- required) to omit the \m(...) notation and just use the macro name in
- these contexts:
- define size 17
- declare \&a[size]
- ...
- define index 3
- if ( == index 3 ) echo The third value is: \&a[index]
- evaluate index (index * 4)
- if ( > index size ) echo Out of range!
- This is especially nice for loops that deal with arrays. Here, for
- example, is a loop that reverses the order of the elements in an array.
- Whereas formerly it was necessary to write:
- .\%n ::= \fdim(&a)
- for \%i 1 \%n/2 1 {
- .tmp := \&a[\%n-\%i+1]
- .\&a[\%n-\%i+1] := \&a[\%i]
- .\&a[\%i] := \m(tmp)
- }
- Recoding this to use macro names "i" and "n" instead of the backslash
- variables \%i and \%n, we have:
- .n ::= \fdim(&a)
- for i 1 n/2 1 {
- .tmp := \&a[n-i+1]
- .\&a[n-i+1] := \&a[i]
- .\&a[i] := \m(tmp)
- }
- which reduces the backslash count to less than half. The final
- statement in the loop could be written ".\&a[i] ::= tmp" if the array
- contained only numbers (since ::= indicates arithmetic expression
- evaluation).
- Also, now you can use floating-point numbers in integer contexts (such
- as array subscripts), in which case they are truncated to an integer
- value (i.e. the fractional part is discarded).
- Examples of numeric contexts include:
- * Array subscripts.
- * Any numeric function argument.
- * Right-hand side of ::= assignments.
- * EVALUATE command or \fevaluate() function expression.
- * The INCREMENT or DECREMENT by-value.
- * IF =, >, <, !=, >=, and <= comparands.
- * The IF number construct.
- * FOR-loop variables.
- * STOP, END, and EXIT status codes.
- * The INPUT timeout value.
- * PAUSE, WAIT, SLEEP, MSLEEP intervals.
- * The SHIFT argument.
- * Numeric switch arguments, e.g. TYPE /WIDTH:number, SEND
- /LARGER:number.
- * SCREEN MOVE-TO row and column number.
- * Various SET DIAL parameters (timeout, retry limit, etc).
- * Various SET SEND or RECEIVE parameters (packet length, window size,
- etc).
- * Various other SET parameters.
- and:
- * S-Expressions (explained in [410]Section 9).
- Macro names used in numeric contexts must not include mathematical
- operators. Although it is legal to create a macro called "foo+bar", in
- a numeric context this would be taken as the sum of the values of "foo"
- and "bar". Any such conflict can be avoided, of course, by enclosing
- the macro name in \m(...).
- [ [411]Top ] [ [412]Contents ] [ [413]C-Kermit Home ] [ [414]Kermit
- Home ]
- 8.3. New IF Conditions
- Several new IF conditions are available:
- IF DECLARED arrayname
- Explained in [415]Section 8.6.
- IF KBHIT
- Allows a script to test whether a key was pressed without
- actually trying to read it.
- IF KERBANG (Unix only)
- True if Kermit was started from a Kerbang script. This is useful
- for knowing how to interpret the \&@[] and \&_[] argument vector
- arrays, and under what conditions to exit.
- IF INTEGER n
- This is just a synonym for IF NUMERIC, which is true if n
- contains only digits (or, if n is a variable, its value contains
- only digits).
- By contrast, IF FLOAT n succeeds if n is a floating-point number OR an
- integer (or a variable with floating-point or integer value).
- Therefore, IF FLOAT should be used whenever any kind of number is
- acceptable, whereas IF INTEGER (or IF NUMERIC) when only an integer can
- be used.
- [ [416]Top ] [ [417]Contents ] [ [418]C-Kermit Home ] [ [419]Kermit
- Home ]
- 8.4. The ON_UNKNOWN_COMMAND Macro
- The new ON_UNKNOWN_COMMAND macro, if defined, is executed whenever you
- give a command that is not known to C-Kermit; any operands are passed
- as arguments. Here are some sample definitions:
- DEF ON_UNKNOWN_COMMAND telnet \%1 ; Treat unknown commands as hostnames
- DEF ON_UNKNOWN_COMMAND dial \%1 ; Treat unknown commands phone numbers
- DEF ON_UNKNOWN_COMMAND take \%1 ; Treat unknown commands as filenames
- DEF ON_UNKNOWN_COMMAND !\%* ; Treat unknown commands as shell commands
- The ON_CD macro, if defined, is executed whenever Kermit is given a CD
- (change directory) command (8.0.211). Upon entry to this macro, the
- directory has already changed and the new directory string is available
- in the \v(directory) variable, and also as the first argument (\%1).
- [ [420]Top ] [ [421]Contents ] [ [422]C-Kermit Home ] [ [423]Kermit
- Home ]
- 8.5. The SHOW MACRO Command
- The SHOW MACRO command has been changed to accept more than one macro
- name:
- (setq a 1 b 2 c 3)
- show mac a b c
- a = 1
- b = 2
- c = 3
- An exact match is required for each name (except that case doesn't
- matter). If you include wildcard characters, however, a pattern match
- is performed:
- show mac [a-c]*x
- shows all macros whose names start with a, b, or c, and end with x.
- [ [424]Top ] [ [425]Contents ] [ [426]C-Kermit Home ] [ [427]Kermit
- Home ]
- 8.6. Arrays
- A clarification regarding references to array names (as opposed to
- array elements): You can use array-name "abbreviations" like &a only in
- contexts that expect array names, like ARRAY commands or array-name
- function arguments such as the second argument of \fsplit(). In a LOCAL
- statement, however, you have to write \&a[], since "local &a" might
- refer to a macro named "&a".
- In function arguments, however, you MUST use the abbreviated form:
- \fsplit(\%a,&a) or \fsplit(\%a,&a[]). If you include the backslash (as
- in "\fsplit(\%a,\&a[])") a parse error occurs.
- Here are the new array-related commands:
- IF DECLARED arrayname
- Allows a script to test whether an array has been declared. The
- arrayname can be a non-array backslash variable such as \%1 or
- \m(name), in which case it is evaluated first, and the result is
- treated as the array name. Otherwise, arrayname is treated as in
- the ARRAY commands: it can be a, &a, &a[], \&a, \&a[], \&a[3],
- \&a[3:9], etc, with the appropriate results in each case.
- Synonym: IF DCL.
- UNDECLARE arrayname
- UNDECLARE is a new top-level command to undeclare an array.
- Previously this could only be done with "declare \&a[0]" (i.e.
- re-declare the array with a dimension of 0).
- ARRAY LINK linkname arrayname
- Creates a symbolic link from the array named by linkname (which
- must be the name of an array that is not yet declared in the
- current context) to the array named by arrayname (which must the
- name of a currently declared array that is not itself a link, or
- a variable containing the name of such an array). The two names
- indicate the same array: if you change an array element, the
- change is reflected in the link too, and vice versa. If you
- undeclare the link, the real array is unaffected. If you
- undeclare the real array, all links to it disappear. If you
- resize an array (directly or through a link), all links to it
- are updated automatically.
- Array links let you pass array names as arguments to macros. For
- example, suppose you had a program that needed to uppercase all the
- elements of different arrays at different times. You could write a
- macro to do this, with the array name as an argument. But without array
- links, there would be no way to refer to the argument array within the
- macro. Array links make it easy:
- define arrayupper {
- local \&e[] \%i
- array link \&e[] \%1
- for i 1 \fdim(&e) 1 { .\&e[i] := \fupper(\&e[i]) }
- }
- declare \&a[] = these are some words
- arrayupper &a
- show array &a
- The macro declares the array link LOCAL, which means it doesn't
- conflict with any array of the same name that might exist outside the
- macro, and that the link is destroyed automatically when the macro
- exits. This works, by the way, even if the link name and the macro
- argument name are the same, as long as the link is declared LOCAL.
- As noted, you can't make a link to a nonexistent array. So when writing
- a macro whose job is to create an array whose name is passed as an
- argument, you must declare the array first (the size doesn't matter as
- long as it's greater than 0). Example:
- define tryme { ; Demonstration macro
- local \&e[] ; We only need this inside the macro
- array link \&e[] \%1 ; Make local link
- shift ; Shift argument list
- void \fsplit(\%*,&e) ; Split remainder of arg list into array
- }
- declare \&a[1] ; Declare target array in advance
- tryme &a here are some words ; Invoke the macro with array name and words
- show array a ; See the results
- One final improvement allows the macro itself to declare the array
- (this was not possible in earlier Kermit releases): if the array name
- in the DECLARE command is a variable (and not an array name), or
- includes variables, the resulting value is used as the array name. So:
- define tryme { ; Demonstration macro
- declare \%1[1] ; Preliminary declaration for target array
- local \&e[] ; We only need this inside the macro
- array link \&e[] \%1 ; Make local link
- shift ; Shift argument list
- void \fsplit(\%*,&e) ; Split remainder of arg list into array
- }
- tryme &a here are some words ; Invoke the macro with array name and words
- show array a ; See the results
- The SHOW ARRAY command now indicates whether an array name is a link.
- Also see the descriptions of [428]\fjoin() and [429]\fsplit(), plus
- [430]Section 8.10 on the MINPUT command, which shows how an entire
- array (or segment of it) can be used as the MINPUT target list.
- [ [431]Top ] [ [432]Contents ] [ [433]C-Kermit Home ] [ [434]Kermit
- Home ]
- 8.7. New or Improved Built-in Variables and Functions
- The following new built-in variables are available:
- \v(buildid) A date string like "20000808" indicating when C-Kermit was b
- uilt.
- \v(ftime) Current time, secs since midnight, including fraction of sec
- ond.
- \v(iprompt) The current SET PROMPT value
- \v(sexp) The most recent S-Expression (see [435]Section 9)
- \v(sdepth) The current S-Expression invocation depth ([436]Section 9)
- \v(svalue) The value of the most recent S-Expression ([437]Section 9)
- \v(ftp_code) Most recent FTP response code ([438]Section 3)
- \v(ftp_connected) FTP connection status ([439]Section 3)
- \v(ftp_cpl) FTP Command Protection Level ([440]Section 3.2)
- \v(ftp_dpl) FTP Data Protection Level ([441]Section 3.2)
- \v(ftp_getputremote) The current SET GET-PUT-REMOTE setting ([442]Section 3.8)
- \v(ftp_host) Name or IP address of FTP server ([443]Section 3)
- \v(ftp_loggedin) FTP login status ([444]Section 3)
- \v(ftp_message) Most recent FTP response message ([445]Section 3)
- \v(ftp_security) FTP Security method ([446]Section 3.2)
- \v(ftp_server) OS type of FTP server ([447]Section 3)
- \v(http_code) Most recent HTTP response code
- \v(http_connected) HTTP connection status
- \v(http_host) Name or IP address of HTTP server
- \v(http_message) Most recent HTTP response message
- \v(http_security) TLS cipher used to secure the HTTP session
- \v(hour) Hour of the day, 0 to 23.
- \v(timestamp) Equivalent to "\v(ndate) \v(time)".
- \v(log_debug) Current debug log file, if any.
- \v(log_packet) Current packet log file, if any.
- \v(log_session) Current session log file, if any.
- \v(log_transaction) Current transaction log file, if any.
- \v(log_connection) Current connection log file, if any.
- The following new or improved built-in functions are available:
- \fcmdstack() Allows programmatic access to the command stack.
- \fcvtdate() [448]Section 8.13, format options added
- \fdelta2secs() [449]Section 8.13
- \fdostounixpath(s1) Converts a DOS filename to Unix format.
- \fsplit() Now allows grouping/nesting in source string.
- \fword() Allows the same grouping and nesting.
- \fjoin(&a,s1,n1,n2) Copies an array into a single string.
- \fsubstitute(s1,s2,s3) Substitutes characters within a string.
- \freplace() Has new 4th "occurrence" argument.
- \fsexpression() Evaluates an S-Expression (explained in [450]Section 9
- ).
- \ftrim(), \fltrim() Now trim CR and LF by default, as well as SP and Tab.
- \funixtodospath(s1) Converts a Unix filename to DOS format.
- \fkeywordval(s1,c1) Assigns values to keywords (macros) (explained below).
- Most functions that have "2" in their names to stand for the word "to"
- can now also be written with "to", e.g. "\fdelta2secs(),"
- \fdeltatosecs()."
- \funtabify(string)
- (New to 8.0.211) Replaces Horizontal Tab characters in the given
- string with spaces based on VT100-like tab stops.
- \fverify(s1,s2,n)
- As of version 8.0.211, returns -1 if s2 is an empty string.
- Previously it returned 0, making \fverify(abc,\%a) look as if
- \%a was a string composed of a's, b's, and/or c's when in fact
- it contained nothing.
- \fcode(string)
- As of version 8.0.211, returns 0 if string is empty or missing.
- Previously it returned the empty string, which made it unsafe to
- use in arithmetic or boolean expressions.
- \v(inscale)
- New to version 8.0.211, its value is the INPUT SCALE-FACTOR
- ([451]Section 8.10), default 1.0.
- 8.7.1. The \fkeywordval() Function
- \fkeywordval(s1,c1) is new to C-Kermit 8.0. Given a string s1 of the
- form "name=value", it creates a macro with the given name and assigns
- it the given value. If no value appears after the equal sign, any
- existing macro of the given name is undefined. Blanks are automatically
- trimmed from around the name and value. The optional c1 parameter is
- the assignment operator character, equal sign (=) by default. This
- function is handy for processing keyword parameters or any other form
- of parameter-value pair. Suppose, for example, you want to write a
- macro that accepts keyword parameters rather than positional ones:
- define MYDIAL {
- local \%i modem hangup method device speed number
- def number 5551234 ; Assign default parameter values
- def speed 57600
- def modem usrobotics
- def hangup rs232
- def method tone
- def country 1
- for \%i 1 \v(argc)-1 1 { ; Parse any keyword parameters...
- if not \fkeywordval(\&_[\%i]) end 1 Bad parameter: "\&_[\%i]"
- }
- set dial country \m(country)
- set modem type \m(modem)
- set modem hang \m(hangup)
- set dial method \m(tone)
- set line \m(device)
- if fail stop 1
- set speed \m(speed)
- if fail stop 1
- show comm
- set dial display on
- dial \m(number)
- if success connect
- }
- In this example, all the defaults are set up inside the macro, and
- therefore it can be invoked with no parameters at all. But if you want
- to have the macro dial a different number, you can supply it as
- follows:
- mydial number=7654321
- You can supply any number of keyword parameters, and you can give them
- in any order:
- mydial number=7654321 hangup=modem speed=115200
- 8.7.2. The \fsplit(), \fjoin(), and \fword() Functions
- \fjoin(&a,s1,n1,n2) is also new; it creates a string from an array (or
- a piece of one). &a is the name of the array (a range specifier can be
- included); s1 is a character or string to separate each element in the
- result string (can be omitted, in which case the elements are not
- separated at all), and n1 is a grouping mask, explained below. If s1 is
- empty or not specified, the array elements are separated with spaces.
- If you want the elements concatenated with no separator, include a
- nonzero n2 argument. Given the array:
- declare \&a[] = 0 1 2 3 4 5 6 7 8 9
- you can get effects like this:
- \fjoin(&a) 0 1 2 3 4 5 6 7 8 9
- \fjoin(&a,:) 0:1:2:3:4:5:6:7:8:9
- \fjoin(&a,{,}) 0,1,2,3,4,5,6,7,8,9
- \fjoin(&a,...) 0...1...2...3...4...5...6...7...8...9
- \fjoin(&a,,,1) 0123456789
- \fsplit(), \fword(), \fstripb(), and \fjoin() accept a "grouping mask"
- argument, n1, which is a number from 0 to 63, in which:
- 1 = "" doublequotes
- 2 = {} braces
- 4 = '' singlequotes
- 8 = () parentheses
- 16 = [] square brackets
- 32 = <> angle brackets
- These can be OR'd (added) together to make any number 0-63 (-1 is
- treated the same as 63, 0 means no grouping). If a bit is on, the
- corresponding kind of grouping is selected. (If more than 1 bit is set
- for \fjoin(), only the lowest-order one is used.)
- If you include the same character in the grouping mask and the include
- list, the grouping mask takes precedence. Example:
- def \%a a "b c d" e
- \fsplit(\%a,&a[],,,-1) = 3 <-- doublequote used for grouping
- \fsplit(\%a,&a[],,",-1) = 3 <-- doublequote still used for grouping
- Nesting of matched left and right grouping characters (parentheses,
- braces, and brackets, but not quotes) is recognized. Example:
- def \%a a (b c <d e [f g {h i} j k] l m> n o) p
- \fsplit(\%a,&a,,,0) = 16 (no grouping)
- \fsplit(\%a,&a,,,2) = 15 (braces only)
- \fsplit(\%a,&a,,,16) = 11 (square brackets only)
- \fsplit(\%a,&a,,,32) = 7 (angle brackets only)
- \fsplit(\%a,&a,,,63) = 3 (all)
- \fsplit(\%a,&a,,,-1) = 3 (all)
- \fsplit() and \fjoin() are "reciprocal" functions. You can split a
- string up into an array and join it back into a new string that is
- equivalent, as long as \fsplit() and \fjoin() are given equivalent
- grouping masks, except that the type of braces might change. Example:
- def \%a a {b c [d e] f g} "h i" j <k l> m
- echo STRING=[\%a]
- echo WORDS=\fsplit(\%a,&a,,,-1)
- show array a
- asg \%b \fjoin(&a,{ },2)
- echo JOIN =[\%b]
- echo WORDS=\fsplit(\%b,&b,,,-1)
- show array b
- The arrays a and b are identical. The strings a and b are as follows:
- \%a: a {b c [d e] f g} "h i" j <k l> m
- \%b: a {b c [d e] f g} {h i} j {k l} m
- It is possible to quote separator grouping characters with backslash to
- override their grouping function. And of course to include backslash
- itself in the string, it must be quoted too. Furthermore, each
- backslash must be doubled, so the command parser will still pass one
- backslash to \fsplit() for each two that it sees. Here are some
- examples using \fsplit() with a grouping mask of 8 (treat parentheses
- as grouping characters).
- String Result
- a b c d e f 6
- a b\\ c d e f 5
- a b (c d e) f 4
- a b \\(c d e\\) f 6
- a b \\\\(c d e\\\\) f 7
- \fsplit() has also been changed to create its array (if one is given)
- each time it is called, so now it can be conveniently called in a loop
- without having to redeclare the array each time.
- Incidentally... Sometimes you might want to invoke \fsplit() in a
- situation where you don't care about its return value, e.g. when you
- just want to fill the array. Now you can "call" \fsplit() or any other
- function with the new [452]VOID command:
- void \fsplit(\%a,&a)
- \fsplit() and \fjoin() also accept a new, optional 6th argument, an
- options flag, a number that can specify a number of options. So far
- there is just one option, whose value is 1:
- separator-flag
- Normally separators are collapsed. So, for example,
- \fword(Three little words,2)
- returns "little" (the second word). Space is a separator, but
- there are multiple spaces between each word. If the value 1 is
- included in the option flag, however, each separator counts. If
- two separators are adjacent, an empty word is produced between
- them. This is useful for parsing (e.g.) comma-separated lists
- exported from databases or spreadsheets.
- 8.7.3. The \fcmdstack() Function
- The new \fcmdstack() function gives access to the command stack:
- \fcmdstack(n1,n2)
- Arguments: n1 is the command stack level. If omitted, the
- current level, \v(cmdlevel), is used. n2 is a function code
- specifying the desired type of information:
- 0 (default) = name of object at level n1.
- 1 (nonzero) = object type (0 = prompt; 1 = command file; 2 = macro).
- The default for n2 is 0.
- The name associated with prompt is "(prompt)". Here's a loop that can
- be included in a macro or command file to show the stack (similar to
- what the SHOW STACK command does):
- for \%i \v(cmdlevel) 0 -1 {
- echo \%i. [\fcmdstack(\%i,1)] \fcmdstack(\%i,0)
- }
- In this connection, note that \v(cmdfile) always indicates the most
- recently invoked active command file (if any), even if that file is
- executing a macro. Similarly, \v(macro) indicates the most recently
- invoked macro (if any), even if the current command source is not a
- macro. The name of the "caller" of the currently executing object
- (command file or macro) is:
- \fcmdstack(\v(cmdlevel)-1)
- and its type is:
- \fcmdstack(\v(cmdlevel)-1,1)
- To find the name of the macro that invoked the currently executing
- object, even if one or more intermediate command files (or prompting
- levels) are involved, use a loop like this:
- for \%i \v(cmdlevel)-1 0 -1 {
- if = \fcmdstack(\%i,1) 2 echo CALLER = \fcmdstack(\%i,0)
- }
- Of course if you make a macro to do this, the macro must account for
- its own additional level:
- define CALLER {
- for \%i \v(cmdlevel)-2 0 -1 {
- if = \fcmdstack(\%i,1) 2 return \fcmdstack(\%i,0)
- }
- return "(none)"
- }
- The built-in variable \v(cmdsource) gives the current command source as
- a word ("prompt", "file", or "macro").
- 8.7.4. The VOID Command
- VOID is like ECHO in that all functions and variables in its argument
- text are evaluated. but it doesn't print anything (except possibly an
- error message if a function was invocation contained or resulted in any
- errors). VOID sets FAILURE if it encounters any errors, SUCCESS
- otherwise.
- [ [453]Top ] [ [454]Contents ] [ [455]C-Kermit Home ] [ [456]Kermit
- Home ]
- 8.8. The RETURN and END Commands
- The execution of a macro is terminated in any of the following ways:
- * With an END [ number [ message ] ] command. If a number is given,
- the macro succeeds if the number is 0, and fails if it is not zero;
- if a number is not given, the macro succeeds.
- * With a STOP command, which works just like END except it peels back
- the command stack all the way to top level.
- * With a RETURN [ text ] command, in which case the macro always
- succeeds.
- * By running out of commands to execute, in which case the macro
- succeeds or fails according the most recently executed command that
- sets success or failure.
- The same considerations apply to command files invoked by the TAKE
- command.
- If a macro does not execute any commands that set success or failure,
- then invoking the macro does not change the current SUCCESS/FAILURE
- status. It follows, then, that the mere invocation of a macro does not
- change the SUCCESS/FAILURE status either. This makes it possible to
- write macros to react to the status of other commands (or macros), for
- example:
- define CHKLINE {
- if success end 0
- stop 1 SET LINE failed - please try another device.
- }
- set modem type usrobotics
- set line /dev/cua0
- chkline
- set speed 57600
- dial 7654321
- By the way, none of this is news. But it was not explicitly documented
- before, and C-Kermit 7.0 and earlier did not always handle the RETURN
- statement as it should have.
- [ [457]Top ] [ [458]Contents ] [ [459]C-Kermit Home ] [ [460]Kermit
- Home ]
- 8.9. UNDEFINing Groups of Variables
- The UNDEFINE command, which previously accepted one variable name, now
- accepts a list of them, and also accepts wildcard notation to allow
- deletion of variables that match a given pattern.
- UNDEFINE [ switches ] name [ name [ name [ ... ] ] ]
- Undefines the variables whose names are given. Up to 64 names
- may be given in one UNDEFINE command.
- If you omit the switches and include only one name, the UNDEFINE
- command works as before.
- Switches include:
- /MATCHING
- Specifies that the names given are to treated as patterns rather
- than literal variable names. Note: pattern matching can't be
- used with array references; use the ARRAY command to manipulate
- arrays and subarrays.
- /LIST
- List the name of each variable to be undefined, and whether it
- was undefined successfully ("ok" or "error"), plus a summary
- count at the end.
- /SIMULATE
- List the names of the variables that would be deleted without
- actually deleting them. Implies /LIST.
- The UNDEFINE command fails if there were any errors and succeeds
- otherwise.
- The new _UNDEFINE command is like UNDEFINE, except the names are
- assumed to be variable names themselves, which contain the names (or
- parts of them) of the variables to be undefined. For example, if you
- have the following definitions:
- define \%a foo
- define foo This is some text
- then:
- undef \%a
- undefines the variable \%a, but:
- _undef \%a
- undefines the macro foo.
- Normal Kermit patterns are used for matching; metacharacters include
- asterisk, question mark, braces, and square brackets. Thus, when using
- the /MATCHING switch, if the names of the macros you want to undefine
- contain any of these characters, you must quote them with backslash to
- force them to be taken literally. Also note that \%* is not the name of
- a variable; it is a special notation used within a macro for "all my
- arguments". The command "undef /match \%*" deletes all \%x variables,
- where x is 0..9 and a..z. Use "undef /match \%[0-9]" to delete macro
- argument variables or "undef /match \%[i-n]" to delete a range of \%x
- variables.
- [ [461]Top ] [ [462]Contents ] [ [463]C-Kermit Home ] [ [464]Kermit
- Home ]
- 8.10. The INPUT and MINPUT Commands
- As of C-Kermit 8.0.211, the INPUT and MINPUT commands accept a switch:
- [M]INPUT /NOMATCH timeout
- The /NOMATCH switch allows INPUT or MINPUT to read incoming
- material for the specified amount of time, without attempting to
- match it with any text or patterns. When this switch is
- included, the [M]INPUT command succeeds when the timeout
- interval expires, with \v(instatus) set to 1, meaning "timed
- out", or fails upon interruption or i/o error.
- Also in version 8.0.211, there is a new way to apply a scale factor to
- [M]INPUT timeouts:
- SET INPUT SCALE-FACTOR floating-point-number
- This scales all [M]INPUT timeouts by the given factor, allowing
- time-sensitive scripts to be adjusted to changing conditions
- such as congested networks or different-speed modems without
- having to change each INPUT-class command. This affects only
- those timeouts that are given in seconds, not as wall-clock
- times. Although the scale factor can have a fractional part, the
- INPUT timeout is still an integer. The new built-in variable
- \v(inscale) tells the current INPUT SCALE-FACTOR.
- The MINPUT command can be used to search the incoming data stream for
- several targets simultaneously. For example:
- MINPUT 8 one two three
- waits up to 8 seconds for one of the words "one", "two", or "three" to
- arrive. Words can be grouped to indicate targets that contain spaces:
- MINPUT 8 nineteen twenty "twenty one"
- And of course you can also use variables in place of (or as part of)
- the target names:
- MINPUT 8 \%a \&x[3] \m(foo)
- Until now you had to know the number of targets in advance when writing
- the MINPUT statement. Each of the examples above has exactly three
- targets.
- But suppose your script needs to look for a variable number of targets.
- For this you can use arrays and \fjoin(), described in [465]Section
- 8.7. Any number of \fjoin() invocations can be included in the MINPUT
- target list, and each one is expanded into the appropriate number of
- separate targets each time the MINPUT command is executed. Example:
- declare \&a[10] = one two three
- minput 10 foo \fjoin(&a) bar
- This declares an array of ten elements, and assigns values to the first
- three of them. The MINPUT command looks for these three (as well as the
- words "foo" and "bar"). Later, if you assign additional elements to the
- array, the same MINPUT command also looks for the new elements.
- If an array element contains spaces, each word becomes a separate
- target. To create one target per array element, use \fjoin()'s grouping
- feature:
- dcl \&a[] = {aaa bbb} {ccc ddd} {xxx yyy zzz}
- minput 10 \fjoin(&a) <-- 7 targets
- minput 10 \fjoin(&a,,2) <-- 3 targets
- [ [466]Top ] [ [467]Contents ] [ [468]C-Kermit Home ] [ [469]Kermit
- Home ]
- 8.11. Learned Scripts
- C-Kermit now includes a simple script recorder that monitors your
- commands, plus your actions during CONNECT mode, and automatically
- generates a script program that mimics what it observed. You should
- think of this feature as a script-writing ASSISTANT since, as you will
- see [470]later in this section, the result generally needs some editing
- to make it both secure and flexible. The script recorder is controlled
- by the new LEARN command:
- LEARN [ /ON /OFF /CLOSE ] [ filename ]
- If you give a filename, the file is opened for subsequent
- recording. The /ON switch enables recording to the current file
- (if any); /OFF disables recording. /CLOSE closes the current
- script recording file (if any). If you give a filename without
- any switches, /ON is assumed.
- The /OFF and /ON switches let you turn recording off and on during a
- session without closing the file.
- When recording:
- * All commands that you type (or recall) at the prompt are recorded
- in the file except:
- + LEARN commands are not recorded.
- + The CONNECT command is not recorded.
- + The TELNET command is converted to SET HOST /NETWORK:TCP.
- * Commands obtained from macros or command files are not recorded.
- * During CONNECT:
- + Every line you type is converted to an OUTPUT command.
- + The last prompt before any line you type becomes an INPUT
- command.
- + Timeouts are calculated automatically for each INPUT command.
- + A PAUSE command is inserted before each OUTPUT command just to
- be safe.
- Thus the script recorder is inherently line-oriented. It can't be used
- to script character-oriented interactions like typing Space to a
- "More?" prompt or editing a text file with VI or EMACS.
- But it has advantages too; for example it takes control characters into
- account that might not be visible to you otherwise, and it
- automatically converts control characters in both the input and output
- streams to the appropriate notation. It can tell, for example that the
- "$ " prompt on the left margin in UNIX is really {\{13}\{10}$ },
- whereas in VMS it might be {\{13}\{10}\{13}$ }. These sequences are
- detected and recorded automatically.
- A learned script should execute correctly when you give a TAKE command
- for it. However, it is usually appropriate to edit the script a bit.
- The most important change would be to remove any passwords from it. For
- example, if the script contains:
- INPUT 9 {\{13}\{10}Password: }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT bigsecret\{13}
- you should replace this by something like:
- INPUT 9 {\{13}\{10}Password: }
- IF FAIL STOP 1 INPUT timeout
- ASKQ pswd Please type your password:
- PAUSE 1
- OUTPUT \m(pswd)\{13}
- The LEARN command can't do this for you since it knows nothing about
- "content"; it only knows about lines and can't be expected to parse or
- understand them -- after all, the Password prompt might be in some
- other language. So remember: if you use the LEARN command to record a
- login script, be sure edit the resulting file to remove any passwords.
- Also be sure to delete any backup copies your editor or OS might have
- made of the file.
- Other manual adjustments might also be appropriate:
- * If the target of an INPUT command can vary, you can replace the
- INPUT command with MINPUT and the appropriate target list, and/or
- the target with a \fpattern(). For example, suppose you are dialing
- a number that can be answered by any one of 100 terminal servers,
- whose prompts are ts-00>, ts-01>, ts-02>, ... ts-99>. The script
- records a particular one of these, but you want it to work for all
- of them, so change (e.g.):
- INPUT 10 ts-23> ; or whatever
- to:
- INPUT 10 \fpattern(ts-[0-9][0-9]>)
- * The INPUT timeout values are conservative, but they are based only
- on a single observation; you might need to tune them.
- * The PAUSE commands might not be necessary, or the PAUSE interval
- might need adjustment.
- * In case you made typographical errors during recording, they are
- incorporated in your script; you can edit them out if you want to.
- Here is a sample script generated by Kermit ("learn vms.ksc") in which
- a Telnet connection is made to a VMS computer, the user logs in, starts
- Kermit on VMS, sends it a file, and then logs out:
- ; Scriptfile: vms.ksc
- ; Directory: /usr/olga
- ; Recorded: 20001124 15:21:23
- SET HOST /NETWORK:TCP vms.xyzcorp.com
- IF FAIL STOP 1 Connection failed
- INPUT 7 {\{13}\{10}\{13}Username: }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT olga\{13}
- INPUT 3 {\{13}\{10}\{13}Password: }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT secret\{13}
- INPUT 18 {\{13}\{10}\{13}$ }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT set default [.incoming]\{13}
- INPUT 12 {\{13}\{10}\{13}$ }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT kermit\{13}
- INPUT 15 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>}
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT receive\{13}
- send myfile.txt
- INPUT 18 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>}
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT exit\{13}
- INPUT 6 {\{13}\{10}\{13}$ }
- IF FAIL STOP 1 INPUT timeout
- PAUSE 1
- OUTPUT logout\{13}
- close
- exit
- The commands generated by Kermit during CONNECT (INPUT, IF FAIL, PAUSE,
- and OUTPUT) have uppercase keywords; the commands typed by the user are
- in whatever form the user typed them (in this case, lowercase).
- [ [471]Top ] [ [472]Contents ] [ [473]C-Kermit Home ] [ [474]Kermit
- Home ]
- 8.12. Pattern Matching
- A pattern is a character string that is used to match other strings.
- Patterns can contain metacharacters that represent special actions like
- "match any single character", "match zero or more characters", "match
- any single character from a list", and so on. The best known
- application of patterns is in file specifications that contain
- wildcards, as in "send *.txt", meaning "send all files whose names end
- with .txt".
- Patterns are also used in increasingly many other ways, to the extent
- it is useful to point out certain important distinctions in the ways in
- which they are used:
- Anchored Patterns
- If an anchored pattern does not begin with "*", it must match
- the beginning of the string, and if it does not end with "*", it
- must match the end of the string. For example, the anchored
- pattern "abc" matches only the string "abc", not "abcde" or
- "xyzabc" or "abcabc". The anchored pattern "abc*" matches any
- string that starts with "abc"; the anchored pattern "*abc"
- matches any string that ends with "abc"; the anchored pattern
- "*abc*" matches any string that contains "abc" (including any
- that start and/or end with it).
- Floating Patterns
- A floating pattern matches any string that contains a substring
- that matches the pattern. In other words, a floating pattern has
- an implied "*" at the beginning and end. You can anchor a
- floating pattern to the beginning by starting it with "^", and
- you can anchor it to the end by ending it with "$" (see examples
- below).
- Wildcards
- A wildcard is an anchored pattern that has the additional
- property that "*" does not match directory separators.
- This terminology lets us describe Kermit's commands with a bit more
- precision. When a pattern is used for matching filenames, it is a
- wildcard, except in the TEXT-PATTERNS and BINARY-PATTERNS lists and
- /EXCEPT: clauses, in which case directory separators are not
- significant (for example, a BINARY-PATTERN of "*.exe" matches any file
- whose name ends in .exe, no matter how deeply it might be buried in
- subdirectories). When Kermit parses a file specification directly,
- however, it uses the strict wildcard definition. For example, "send
- a*b" sends all files whose names start with "a" and end with "b" in the
- current directory, and not any files whose names end with "b" that
- happen to be in subdirectories whose names start with "a". And as
- noted, wildcards are anchored, so "delete foo" deletes the file named
- "foo", and not all files whose names happen to contain "foo".
- Most other patterns are anchored. For example:
- if match abc bc ...
- does not succeed (and you would be surprised if it did!). In fact, the
- only floating patterns are the ones used by commands or functions that
- search for patterns in files, arrays, or strings. These include:
- * The GREP and TYPE /MATCH commands.
- * The \fsearch(), \frsearch(), and \farraylook() functions.
- Thus these are the only contexts in which explicit anchors ("^" and
- "$") may be used:
- grep abc *.txt
- Prints all lines containing "abc" in all files whose names end
- with ".txt".
- grep ^abc *.txt
- Prints all lines that start with "abc" in all ".txt" files.
- grep abc$ *.txt
- Prints all lines that end with "abc" in all ".txt" files.
- grep ^a*z$ *.txt
- Prints all lines that start with "a" and end with "z" in all
- ".txt" files.
- Similarly for TYPE /PAGE, /fsearch(), /frsearch(), and \farraylook().
- Here is a brief summary of anchored and floating pattern equivalences:
- Anchored Floating
- abc ^abc$
- *abc abc$
- abc* ^abc
- *abc* abc
- [ [475]Top ] [ [476]Contents ] [ [477]C-Kermit Home ] [ [478]Kermit
- Home ]
- 8.13. Dates and Times
- C-Kermit's comprehension of date-time formats is considerably expanded
- in version 8.0. Any command that reads dates, including the DATE
- command itself, or any switch, such as the /BEFORE: and /AFTER:
- switches, or any function such as \fcvtdate(), now can understand dates
- and times expressed in any ISO 8601 format, in Unix "asctime" format,
- in FTP MDTM format, and in practically any format used in RFC 822 or
- RFC 2822 electronic mail, with or without timezones, and in a great
- many other formats as well. HELP DATE briefly summarizes the acceptable
- date-time formats.
- Furthermore, C-Kermit 8.0 includes a new and easy-to-use form of
- date-time arithmetic, in which any date or time can be combined with a
- "delta time", to add or subtract the desired time interval (years,
- months, weeks, days, hours, minutes, seconds) to/from the given date.
- And new functions are available to compare dates and to compute their
- differences.
- As you can imagine, all this requires quite a bit of "syntax". The
- basic format is:
- [ date ] [ time ] [ delta ]
- Each field is optional, but in most cases (depending on the context)
- there must be at least one field. If a date is given, it must come
- first. If no date is given, the current date is assumed. If no time is
- given, an appropriate time is supplied depending on whether a date was
- supplied. If no delta is given, no arithmetic is done. If a delta is
- given without a date or time, the current date and time are used as the
- base.
- Date-time-delta fields are likely to contain spaces (although they need
- not; space-free forms are always available). Therefore, in most
- contexts -- and notably as switch arguments -- date-time information
- must be enclosed in braces or doublequotes, for example:
- send /after:"8-Aug-2001 12:00 UTC" *.txt
- Kermit's standard internal format for dates and times is:
- yyyymmdd hh:mm:ss
- for example:
- 20010208 10:28:01
- Date-times can always be given in this format. yyyy is the 4-digit
- year, mm is the two-digit month (1-12; supply leading zero for
- Jan-Sep), dd is the 2-digit day (leading zero for 1-9), hh is the hour
- (0-23), mm the minute (0-59), ss the second (0-59), each with leading
- zero if less than the field width. The date and time can be separated
- by a space, an underscore, a colon, or the letter T. The time is in
- 24-hour format. Thus the various quantities are at the following fixed
- positions:
- Position Contents
- 1-4 Year (4 digits, 0000-9999)
- 5-6 Month (2 digits, 1-12)
- 7-8 Day (2 digits, 1-31)
- 9 Date-Time Separator (space, :, _, or the letter T)
- 10-11 Hour (2 digits, 0-23)
- 12 Hour-Minute Separator (colon)
- 13-14 Minute (2 digits, 0-59)
- 15 Minute-Second Separator (colon)
- 16-17 Second (2 digits, 0-59)
- Example:
- 19800526 13:07:12 26 May 1980, 13:07:12 (1:07:12PM)
- This is the format produced by the DATE command and by any function
- that returns a date-time. It is suitable for lexical comparison and
- sorting, and for use as a date-time in any Kermit command. When this
- format is given as input to a command or function, various date-time
- separators (as noted) are accepted:
- 19800526 13:07:12 26 May 1980, 13:07:12 (1:07:12PM)
- 20010208_10:28:35 2 February 2001, 10:28:35 AM
- 18580101:12:00:00 1 January 1858, noon
- 20110208T00:00:00 2 February 2011, midnight
- Certain other special date-time formats that are encountered on
- computer networks are recognized:
- Asctime Format
- This is a fixed format used by Unix, named after Unix's
- asctime() ("ASCII time") function. It is always exactly 24
- characters long. Example: Fri Aug 10 16:38:01 2001
- Asctime with Timezone
- This is like Asctime format, but includes a 3-character timezone
- between the time and year. It is exactly 28 characters long.
- Example: Fri Aug 10 16:38:01 GMT 2001
- E-Mail Format
- E-mail date-time formats are defined in [479]RFC 2822 with a
- fair amount of flexibility and options. The following examples
- are typical of e-mails and HTTP (web-page) headers:
- Sat, 14 Jul 2001 11:49:29 (No timezone)
- Fri, 24 Mar 2000 14:19:59 EST (Symbolic timezone)
- Tue, 26 Jun 2001 10:19:45 -0400 (EDT) (GMT Offset + comment)
- FTP MDTM Format
- This is the date-time format supplied by FTP servers that
- support the (not yet standard but widely used nevertheless) MDTM
- command, by which the FTP client asks for a file's modification
- time:
- yyyymmddhhmmss[.ffff]
- where yyyy is the 4-digit year, mm is the 2-digit month, and so
- on, exactly 14 digits long. An optional fractional part
- (fraction of second) may also be included, separated by a
- decimal point (period). Kermit rounds to the nearest second.
- Example:
- 20020208102835.515 (8 February 2002 10:28:36 AM)
- 8.13.1. The Date
- The date, if given, must precede the time and/or delta, and can be in
- many, many formats. For starters, you can use several symbolic date
- names in place of actual dates:
- NOW
- This is replaced by the current date and time. The time can not
- be overriden (if you want to supply a specific time, use TODAY
- rather than NOW).
- TODAY
- This is replaced by the current date and a default time of
- 00:00:00 is supplied, but can be overridden by a specific time;
- for example, if today is 8 February 2002, then "TODAY" is
- "20020802 00:00:00" but "TODAY 10:28" is "20020802 10:28:00".
- TOMORROW
- Like TODAY, but one day later (if today is 8 February 2002, then
- "TOMORROW" is "20020803 00:00:00" but "TOMORROW 16:30" is
- "20020803 16:30:00").
- YESTERDAY
- Like TODAY, but one day earlier.
- MONDAY, TUESDAY, WEDNESDAY, ..., SUNDAY
- The date on the given day of the week, today or later. A default
- time of 00:00:00 is supplied but can be overridden. Example:
- "SATURDAY 12:00" means next Saturday (or today, if today is
- Saturday) at noon.
- You can give an explicit date in almost any conceivable format, but
- there are some rules:
- * If a date is given, it must have three fields: day, month, and
- year; the order can vary (except that the month can not be last).
- * If names are used for days, months, etc, they must be English.
- * The year must lie between 0000 and 9999, inclusive.
- * All calendar calculations use Gregorian dating, so calculated dates
- for years prior to 1582 (or later, depending on the country) will
- not agree with historical dates. Other forms of dating (e.g.
- Hebrew, Chinese) are not supported.
- Various date-field separators are accepted: hyphen, slash, space,
- underscore, period. The same field separator (if any) must be used in
- both places; for example 18-Sep-2001 but not 18-Sep/2001. Months can be
- numeric (1-12) or English names or abbreviations. Month name
- abbreviations are normally three letters, e.g. Apr, May, Jun, Jul.
- Capitalization doesn't matter.
- Here are a few examples:
- 18 Sep 2001 (English month, abbreviated)
- 18 September 2001 (English month, spelled out)
- 2001 Sept 18 (Year, month, day)
- 18-Sep-2001 (With hyphens)
- 18/09/2001 (All numeric with slashes)
- 18.09.2001 (Ditto, with periods)
- 18_09_2001 (Ditto, with underscores)
- 09/18/2001 (See below)
- 2001/09/18 (See below)
- September 18, 2001 (Correspondence style)
- Sep-18-2001 (Month-day-year)
- 20010918 (Numeric, no separators)
- You can also include the day of the week with a specific date, in which
- case it is accepted (if it is a valid day name), but not verified to
- agree with the given date:
- Tue, 18 Sep 2001 (Abbreviated, with comma)
- Tue,18 Sep 2001 (Comma but no space)
- Tue 18 Sep 2001 (Abbreviated, no comma)
- Tuesday 18 Sep 2001 (Spelled out)
- Tuesday, 18 Sep 2001 (etc)
- Friday, 18 Sep 2001 (Accepted even if not Friday)
- In all-numeric dates with the year last, such as 18/09/2001, Kermit
- identifies the year because it's 4 digits, then decides which of the
- other two numbers is the month or day based on its value. If both are
- 12 or less and are unequal, the date is ambiguous and is rejected. In
- all-numeric dates with the year first, the second field is always the
- month and the third is the day. The month never comes last. A date with
- no separators is accepted only if it is all numeric and has exactly
- eight digits, and is assumed to be in yyyymmdd format.
- 20010918 (18-Sep-2001 00:00:00)
- or 14 digits (as in FTP MDTM format):
- 20010918123456 (18-Sep-2001 12:34:56)
- You can always avoid ambiguity by putting the year first, or by using
- an English, rather than numeric, month. A date such as 09/08/2001 would
- be ambiguous but 2001/09/08 is not, nor is 09-Aug-2001.
- Until the late 1990s, it was common to encounter 2-digit years, and
- these are found to this day in old e-mails and other documents. Kermit
- accepts these dates if they have English months, and interprets them
- according to the windowing rules of [480]RFC 2822: "If a two digit year
- is encountered whose value is between 00 and 49, the year is
- interpreted by adding 2000, ending up with a value between 2000 and
- 2049. If a two digit year is encountered with a value between 50 and
- 99, or any three digit year is encountered, the year is interpreted by
- adding 1900."
- If you need to specify a year prior to 1000, use leading zeros to
- ensure it is not misinterpreted as a "non-Y2K-compliant" modern year:
- 7-Oct-77 (19771007 00:00:00)
- 7-Oct-0077 (00771007 00:00:00)
- 8.13.2. The Time
- The basic time format is hh:mm:dd; that is hours, minutes, seconds,
- separated by colons, perhaps with an optional fractional second
- separated by a decimal point (period). The hours are in 24-hour format;
- 12 is noon, 13 is 1pm, and so on. Fields omitted from the right default
- to zero. Fields can be omitted from the left or middle by including the
- field's terminating colon. Examples:
- 11:59:59 (11:59:59 AM)
- 11:59 (11:59:00 AM)
- 11 (11:00:00 AM)
- 11:59:59.33 (11:59:59 AM)
- 11:59:59.66 (Noon)
- 03:21:00 (3:21:00 AM)
- 3:21:00 (3:21:00 AM)
- 15:21:00 (3:21:00 PM)
- :21:00 (00:21:00 AM)
- ::01 (00:00:01 AM)
- 11::59 (11:00:59 AM)
- Leading zeros can be omitted, but it is customary and more readable to
- keep them in the minute and second fields:
- 03:02:01 (03:02:01 AM)
- 3:02:01 (03:02:01 AM)
- 3:2:1 (03:02:01 AM)
- AM/PM notation is accepted if you wish to use it:
- 11:59:59 (11:59:59 AM)
- 11:59:59AM (11:59:59 AM)
- 11:59:59A.M. (11:59:59 AM)
- 11:59:59am (11:59:59 AM)
- 11:59:59a.m. (11:59:59 AM)
- 11:59:59PM (11:59:59 PM = 23:59:59)
- 11:59:59P.M. (11:59:59 PM = 23:59:59)
- 11:59:59pm (11:59:59 PM = 23:59:59)
- 11:59:59p.m. (11:59:59 PM = 23:59:59)
- You can omit the colons if you wish, in which case Kermit uses the
- following rules to interpret the time:
- 1. 6 digits is hh:mm:ss, e.g. 123456 is 12:34:56.
- 2. 5 digits is h:mm:ss, e.g. 12345 is 1:23:45.
- 3. 4 digits is hh:mm, e.g. 1234 is 12:34.
- 4. 3 digits is h:mm, e.g. 123 is 1:23.
- 5. 2 digits is hh, e.g. 12 is 12:00.
- 6. 1 digit is h (the hour), e.g. 1 is 1:00.
- Examples:
- 1 (01:00:00 AM)
- 10 (10:00:00 AM)
- 230 (02:30:00 AM)
- 230pm (02:30:00 PM = 14:30:00)
- 1115 (11:15:00 AM)
- 2315 (11:15:00 PM = 23:15:00 PM)
- 23150 (02:31:50 AM)
- 231500 (23:15:00 PM)
- 8.13.3. Time Zones
- If a time is given, it can (but need not) be followed by a time zone
- designator. If no time zone is included, the time is treated as local
- time and no timezone conversions are performed.
- The preferred time zone designator is the UTC Offset, as specified in
- [481]RFC 2822: a plus sign or minus sign immediately followed by
- exactly four decimal digits, signifying the difference in hh (hours)
- and mm (minutes) from Universal Coordinated Time (UTC, also known as
- Greenwich Mean Time, or GMT), with negative numbers to the West and
- positive numbers to the East. For example:
- Fri, 13 Jul 2001 12:54:29 -0700
- indicates a local time of 12:54:29 that is 07 hours and 00 minutes
- behind (less than, East of) Universal Time. The space is optional, so
- the example could also be written as:
- Fri, 13 Jul 2001 12:54:29-0700
- The following symbolic time zones are also accepted, as specified by
- [482]RFC 2822 and/or in ISO 8601:
- GMT = +0000 Greenwich Mean Time
- Z = +0000 Zulu (Zero Meridian) Time
- UTC = +0000 Universal Coordinated Time
- UT = +0000 Universal Time
- EDT = -0400 Eastern (USA) Daylight Time
- EST = -0500 Eastern (USA) Standard Time
- CDT = -0500 Central (USA) Daylight Time
- CST = -0600 Central (USA) Standard Time
- MDT = -0600 Mountain (USA) Daylight Time
- MST = -0700 Mountain (USA) Standard Time
- PDT = -0700 Pacific (USA) Daylight Time
- PST = -0800 Pacific (USA) Standard Time
- Note that GMT, Z, UTC, and UT all express the same concept: standard
- (not daylight) time at the Zero Meridian. UTC, by the way, is an
- international standard symbol and does not correspond to the order of
- the English words, Universal Coordinated Time, but it happens to have
- the same initial letters as these words. Of course hundreds of other
- symbolic timezones and variations exist, but they are not standardized,
- and are therefore not supported by Kermit.
- When a time zone is included with a time, the time is converted to
- local time. In case the conversion crosses a midnight boundary, the
- date is adjusted accordingly. Examples converting to EST (Eastern USA
- Standard Time = -0500):
- 11:30:00 = 11:30:00
- 11:30:00 EST = 11:30:00
- 11:30:00 GMT = 06:30:00
- 11:30:00 PST = 14:30:00
- 11:30:00Z = 06:30:00
- 11:30PM GMT = 18:30:00
- 11:30 -0500 = 11:30:00
- 11:30 -0800 = 08:30:00
- 11:30 +0200 = 04:30:00
- Unlike most of Kermit's other date-time conversions, timezone knowledge
- (specifically, the offset of local time from UTC) is embodied in the
- underlying operating system, not in Kermit itself, and any conversion
- errors in this department are the fault of the OS. For example, most
- UNIX platforms do not perform conversions for years prior to 1970.
- 8.13.4. Delta Time
- Date/time expressions can be composed of a date and/or time and a delta
- time, or a delta time by itself. When a delta time is given by itself,
- it is relative to the current local date and time. Delta times have the
- following general format:
- {+,-}[number units][hh[:mm[:ss]]]
- In other words, a delta time always starts with a plus or minus sign,
- which is followed by a "part1", a "part2", or both. The "part1", if
- given, specifies a number of days, weeks, months, or years; "part2"
- specifies a time in hh:mm:ss notation. In arithmetic terms, these
- represents some number of days or other big time units, and then a
- fraction of a day expressed as hours, minutes, and seconds; these are
- to be added to or subtracted from the given (or implied) date and time.
- The syntax is somewhat flexible, as shown by the following examples:
- +1 day (Plus one day)
- +1day (Ditto)
- +1d (Ditto)
- + 1 day (Ditto)
- + 1 day 3:00 (Plus one day and 3 hours)
- +1d3:00 (Ditto)
- +1d3 (Ditto)
- +3:00:00 (Plus 3 hours)
- +3:00 (Ditto)
- +3 (Ditto)
- +2 days (Plus 2 days)
- -12 days 7:14:22 (Minus 12 days, 7 hours, 14 minutes, and 22 seconds)
- The words "week", "month", and "year" can be used like "day" in the
- examples above. A week is exactly equivalent to 7 days. When months are
- specified, the numeric month number of the date is incremented or
- decremented by the given number, and the year and day adjusted
- accordingly if necessary (for example, 31-Jan-2001 +1month =
- 03-Mar-2001 because February does not have 31 days). When years are
- specified, they are added or subtracted to the base year. Examples
- (assuming the current date is 10-Aug-2001 and the current time is
- 19:21:11):
- 18-Sep-2001 +1day (20010918 00:00:00)
- today +1day (20010811 00:00:00)
- now+1d (20010811 19:21:11)
- + 1 day (20010811 19:21:11)
- + 1 day 3:14:42 (20010811 22:35:54)
- + 7 weeks (20010928 19:21:11)
- +1d3:14:42 (20010811 22:35:54)
- +1w3:14:42 (20010817 22:35:54)
- +1m3:14:42 (20010910 22:35:54)
- +1y3:14:42 (20020810 22:35:54)
- 2 feb 2001 + 10 years (20110208 00:00:00)
- 2001-02-08 +10y12 (20110208 12:00:00)
- 31-dec-1999 23:59:59+00:00:01 (20000101 00:00:00)
- 28-feb-1996 +1day (19960229 00:00:00) (leap year)
- 28-feb-1997 +1day (19970301 00:00:00) (nonleap year)
- 28-feb-1997 +1month (19970328 00:00:00)
- 28-feb-1997 +1month 11:59:59 (19970328 11:59:59)
- 28-feb-1997 +20years (20170228 00:00:00)
- 28-feb-1997 +8000years (99970228 00:00:00)
- For compatibility with VMS, the following special delta-time format is
- also accepted:
- +number-hh:mm:ss
- -number-hh:mm:ss
- (no spaces). The hyphen after the number indicates days. It corresponds
- exactly to the Kermit notation:
- +numberdhh:mm:ss
- -numberdhh:mm:ss
- The following forms all indicate exactly the same date and time:
- 18-Sep-2001 12:34:56 +1-3:23:01
- 18-Sep-2001 12:34:56 +1d3:23:01
- 18-Sep-2001 12:34:56 +1 day 3:23:01
- and mean "add a day plus 3 hours, 23 minutes, and 1 second" to the
- given date.
- Note that delta times are not at all the same as UTC offsets; the
- former specifies an adjustment to the given date/time and the latter
- specifies that the local time is a particular distance from Universal
- Time, for example:
- 11-Aug-2001 12:34:56 -0800 (20010811 16:34:56 -- UTC Offset)
- 11-Aug-2001 12:34:56 -08:00 (20010811 04:34:56 -- Delta time)
- If you give a time followed by a modifier that starts with a + or -
- sign, how does Kermit know whether it's a UTC offset or a delta time?
- It is treated as a UTC offset if the sign is followed by exactly four
- decimal digits; otherwise it is a delta time. Examples (for USA Eastern
- Daylight Time):
- 11-Aug-2001 12:34:56 -0800 (20010811 16:34:56 -- UTC Offset)
- 11-Aug-2001 12:34:56 -08:00 (20010811 04:34:56 -- Delta time)
- 11-Aug-2001 12:34:56 -800 (20010811 04:34:56 -- Delta time)
- 11-Aug-2001 12:34:56 -8 (20010811 04:34:56 -- Delta time)
- The first example says that at some unknown place which is 8 hours
- ahead of Universal Time, the time is 12:34:56, and this corresponds to
- 16:34:56 in Eastern Daylight time. The second example says to subtract
- 8 hours from the local time. The third and fourth are delta times
- because, even though a colon is not included, the time does not consist
- of exactly 4 digits.
- When a delta time is written after a timezone, however, there is no
- ambiguity and no syntax distinction is required:
- 11-Aug-2001 12:34:56 -0800 -0800 (20010811 08:34:56)
- 11-Aug-2001 12:34:56 -0800 -08:00 (Ditto)
- 11-Aug-2001 12:34:56 -08:00 -08:00 (Illegal)
- 8.13.5. The DATE Command
- Obviously a great many combinations of date, time, time zone, and delta
- time are possible, as well as many formatting options. The purpose of
- all this flexibility is to comply with as many standards as possible --
- Internet RFCs, ISO standards, and proven corporate standards -- as well
- as with notations commonly used by real people, in order that dates and
- times from the widest variety of sources can be assigned to a variable
- and used in any date-time field in any Kermit command.
- You can test any date-and/or-time format with the DATE command, which
- converts it to standard yyyymmdd hh:mm:ss format if it is understood,
- or else gives an explicit error message (rather than just "BAD DATE" as
- in previous C-Kermit releases) to indicate what is wrong with it.
- Examples (on Tuesday, 31 July 2001 in New York City, Eastern Daylight
- Time, UTC -0400):
- DATE command argument Result
- 12:30 20010731 12:30:00
- 12:30:01 20010731 12:30:01
- 12:30:01.5 20010731 12:30:02
- 1230 20010731 12:30:00
- 230 20010731 02:30:00
- 230+1d 20010801 02:30:00
- 230+1d3:00 20010801 05:30:00
- 20010718 19:21:15 20010718 19:21:15
- 20010718_192115 20010718 19:21:15
- 20010718T192115 20010718 19:21:15
- 18 Jul 2001 +0400 20010717 23:59:59
- 18 Jul 2001 192115 20010718 19:21:15
- 18 Jul 2001 192115.8 20010718 19:21:16
- 18-Jul-2001T1921 20010718 19:21:00
- 18-Jul-2001 1921Z 20010718 15:21:00
- 18-Jul-2001 1921 GMT 20010718 15:21:00
- 18-Jul-2001 1921 UTC 20010718 15:21:00
- 18-Jul-2001 1921 Z 20010718 15:21:00
- 18-Jul-2001 1921Z 20010718 15:21:00
- 18-Jul-2001 1921 -04:00:00 20010718 19:21:00
- 21-Jul-2001_08:20:00am 20010721 08:20:00
- 21-Jul-2001_8:20:00P.M. 20010721 20:20:00
- Fri Jul 20 11:26:25 2001 20010720 11:26:25
- Fri Jul 20 11:26:25 GMT 2001 20010720 07:26:25
- Sun, 9 Apr 2000 06:46:46 +0100 20000409 01:46:46
- Sunday, 9 Apr 2000 06:46:46 +0100 20000409 01:46:46
- now 20010731 19:41:12
- today 20010731 00:00:00
- today 09:00 20010731 09:00:00
- tomorrow 20010801 00:00:00
- tomorrow 09:00 20010801 09:00:00
- tomorrow 09:00 GMT 20010801 05:00:00
- yesterday 20010730 00:00:00
- yesterday 09:00 20010730 09:00:00
- + 3 days 20010803 00:00:00
- +3 days 20010803 00:00:00
- +3days 20010803 00:00:00
- + 3days 20010803 00:00:00
- + 3 days 09:00 20010803 09:00:00
- + 2 weeks 20010814 00:00:00
- + 1 month 20010831 00:00:00
- - 7 months 20001231 00:00:00
- + 10 years 20110731 00:00:00
- friday 20010803 00:00:00
- saturday 20010804 00:00:00
- sunday 20010805 00:00:00
- monday 20010806 00:00:00
- tuesday 20010731 00:00:00
- wednesday 20010801 00:00:00
- thursday 20010802 00:00:00
- friday 07:00 20010803 07:00:00
- thursday 1:00pm 20010802 13:00:00
- thursday 1:00pm GMT 20010802 09:00:00
- Thu, 10 Nov 94 10:50:47 EST 19941110 10:50:47
- Fri, 20 Oct 1995 18:35:15 -0400 (EDT) 19951020 18:35:15
- 31/12/2001 20011231 00:00:00
- 12/31/2001 20011231 00:00:00
- 2001-July-20 20010720 00:00:00
- 2001-September-30 20010930 00:00:00
- 30-September-2001 20010930 00:00:00
- Sep 30, 2001 12:34:56 20010930 12:34:56
- September 30, 2001 20010930 00:00:00
- September 30, 2001 630 20010930 06:30:00
- September 30 2001 630 20010930 06:30:00
- Sep-30-2001 12:34:59 20010930 12:34:59
- 20010807113542.014 20010807 11:35.42
- 20010807113542.014Z 20010807 07:35:42
- 8.13.6. New Date-Time Functions
- In the following descriptions, date-time function arguments are the
- same free-format date-time strings discussed above, with the same
- defaults for missing fields. They are automatically converted to
- standard format internally prior to processing.
- \fcvtdate(d1)
- Converts the date-time d1 to standard format and local time.
- This function is not new, but now it accepts a wider range of
- argument formats that can include timezones and/or delta times.
- If the first argument is omitted, the current date and time are
- assumed. The optional second argument is a format code for the
- result:
- n1 = 1: yyyy-mmm-dd hh:mm:ss (mmm = English 3-letter month
- abbreviation)
- n1 = 2: dd-mmm-yyyy hh:mm:ss (ditto)
- n1 = 3: yyyymmddhhmmss (all numeric)
- \futcdate(d1)
- Converts the date-time d1 to Universal Coordinated Time (UTC),
- also known as GMT or Zulu or Zero-Meridian time. The default d1
- is NOW. If d1 is a valid date-time, the UTC result is returned
- in standard format, yyyymmdd hh:ss:mm.
- \fcmpdates(d1,d2)
- Compares two free-format date-times, d1 and d2, and, if both
- arguments are valid, returns a number: -1 if d1 is earlier than
- (before) d2; 0 if d1 is the same as d2; 1 if d1 is later than
- (after) d2.
- \fdiffdates(d1,d2)
- Computes the difference between two free-format date-times, d1
- and d2. If both arguments are valid, returns a delta time which
- is negative if d1 is earlier than (before) d2 and positive
- otherwise. If d1 and d2 are equal, the result is "+0:00".
- Otherwise, the result consists of the number of days, hours,
- minutes, and seconds that separate the two date-times. If the
- number of days is zero, it is omitted. If the number of days is
- nonzero but the hours, minutes, and seconds are all zero, the
- time is omitted. if the seconds are zero, they are omitted.
- \fdelta2secs(dt)
- Converts a delta time to seconds. For example, "+1d00:00:01" to
- 86401. Valid delta times must start with a + or - sign. Days are
- accepted as time units, but not years, months, or weeks. If the
- result would overflow a computer long word (as would happen with
- 32-bit long words when the number of days is greater than
- 24854), the function fails.
- HINT: Although Kermit has a number of built-in date and time variables,
- it doesn't have a single one suitable for writing a timestamp. For this
- you would normally use something like "\v(ndate) \v(time)". But
- \fcvtdate() (with no arguments) is equivalent: it returns the current
- date and time in yyyymmdd hh:mm:ss format, suitable for time stamping.
- 8.13.7. Date-Time Programming Examples
- Here's a macro that converts any date-time to UTC, which you might use
- if C-Kermit didn't already have a \futcdate() function:
- define utcdate {
- .local := \fcvtdate(\%*) ; 1.
- .tmp := \fcvtdate(\m(local)UTC) ; 2.
- .offset := \fdiffdate(\m(local),\m(tmp)) ; 3.
- .utc := \fcvtdate(\m(local)\m(offset)) ; 4.
- sho mac utc ; 5.
- }
- Brief explanation: Line 1 converts the macro argument, a free-format
- date-time, to standard-format local time. Line 2 appends the "UTC"
- timezone to the local time and converts the result to local time. In
- other words, we take the same time as the local time, but pretend it's
- UTC time, and convert it to local time. For example, if New York time
- is 4 hours ahead of UTC, then 6:00pm New York time is 2:00pm UTC. Line
- 3 gets the difference of the two results (e.g. "+04:00"). Line 4
- appends the difference (delta time) to the local time, and converts it
- again, which adds (or subtracts) the UTC offset to the given time. Line
- 5 displays the result.
- Here's a script that opens a web page, gets its headers into an array,
- scans the array for the "Last-Modified:" header, and interprets it:
- http open www.columbia.edu
- if fail stop 1 HTTP OPEN failed
- http /array:a head index.html /dev/null
- if fail stop 1 HTTP GET failed
- show array a
- for \%i 1 \fdim(&a) 1 {
- .\%x := \findex(:,\&a[\%i])
- if not \%x continue
- .tag := \fleft(\&a[\%i],\%x-1)
- .val := \fltrim(\fsubstr(\&a[\%i],\%x+1))
- if ( eq "\m(tag)" "Last-Modified" ) {
- echo HTTP Date: \m(val)
- .rdate := \fcvtdate(\m(val))
- echo {Standard Date (local): \m(rdate)}
- echo {Standard Date (UTC): \futcdate(\m(rdate))}
- break
- }
- }
- http close
- The result:
- HTTP Date: Mon, 13 Aug 2001 20:05:42 GMT
- Standard Date (local): 20010813 16:05:42
- Standard Date (UTC): 20010813 20:05:42
- As you can see, Kermit had no trouble decoding the date-time-string
- from the website, converting to local time, and converting back to UTC
- with no conflicts or loss of information. If it had been in any other
- known format, the result would have been the same.
- Now suppose we want to download the web page only if it is newer than
- our local copy. The \fdate(filename) function (which returns the
- modification date-time of the given file) and the new \fcmpdates()
- function make it easy. Insert the following just before the BREAK
- statement:
- if ( < 0 \fcmpdates(\m(rdate),\fdate(index.html)) ) {
- echo GETTING index.html...
- http get index.html index.html
- if success echo HTTP GET OK
- } else {
- echo index.html: no update needed
- }
- http close
- exit
- This says, "if 0 is less than the comparison of the remote file date
- and the local file date, get the remote file, otherwise skip it." And
- it automatically reconciles the time-zone difference (if any).
- It would be nice to be able to extend this script into a
- general-purpose website updater, but unfortunately HTTP protocol
- doesn't provide any mechanism for the client to ask the server for a
- list of files, recursive or otherwise.
- [ [483]Top ] [ [484]Contents ] [ [485]C-Kermit Home ] [ [486]Kermit
- Home ]
- 8.14. Trapping Keyboard Interruption
- Normally when you type Ctrl-C and Kermit is in command mode (as opposed
- to CONNECT mode) with COMMAND INTERRUPTION ON (as it is unless you have
- set it OFF), Kermit interrupts any command that is currently in
- progress, and if a command file or macro is executing, rolls the
- command stack back to top level, closing all open command files,
- deactivating all macros, deallocating all local variables and arrays,
- and leaving you at the command prompt.
- Suppose, however, you want certain actions to occur when a script is
- interrupted; for example, closing open files, writing log entries, or
- displaying summary results. You can do this by defining a macro named
- ON_CTRLC. When Ctrl-C is detected, and a macro with this name is
- defined, Kermit executes it from the current command level, thus giving
- it full access to the environment in which the interruption occurred,
- including local variables and open files. Only when the ON_CTRLC macro
- completes execution is the command stack rolled back to top level.
- Once the ON_CTRLC macro is defined, it can be executed only once. This
- is to prevent recursion if the user types Ctrl-C while the ON_CTRLC
- macro is executing. If you type Ctrl-C while the Ctrl-C macro is
- active, this does not start a new copy of ON_CTRLC; rather, it returns
- to the top-level command prompt. After the ON_CTRLC macro returns, it
- has been removed from the macro table so if you want to use it again or
- install a different Ctrl-C trap, you must execute a new DEFINE ON_CTRLC
- command. In any case, as always when you interrupt a script with
- Ctrl-C, its completion status is FAILURE.
- Normally the ON_CTRLC macro would be defined in the command file or
- macro to which it applies, and should be declared LOCAL. This way, if
- the command file or macro completes successfully without being
- interrupted, the ON_CTRLC definition disappears automatically.
- Otherwise the definition would still be valid and the macro would be
- executed, probably out of context, the next time you typed Ctrl-C.
- Here's a simple example of a command file that sets a Ctrl-C trap for
- itself:
- local on_ctrlc ; Make Ctrl-C trap local to this command file.
- define on_ctrlc { ; Define the ON_CTRLC macro.
- echo Interrupted at \v(time).
- echo Iterations: \%n
- }
- xecho Type Ctrl-C to quit
- for \%n 1 999 1 { ; Prints a dot every second until interrupted.
- sleep 1
- xecho .
- }
- echo Finished normally at \v(time) ; Get here only if not interrupted.
- decrement \%n
- echo Iterations: \%n
- This prints a summary no matter whether it completes normally or is
- interrupted from the keyboard. In both cases the trap is automatically
- removed afterwards.
- For an example of how to use ON_CTRLC to debug scripts, see
- [487]Section 8.1.
- [ [488]Top ] [ [489]Contents ] [ [490]C-Kermit Home ] [ [491]Kermit
- Home ]
- 9. S-EXPRESSIONS
- This section is primarily for those who want to write
- calculation-intensive scripts, especially if they require
- floating-point arithmetic, and/or for those who are familiar with the
- LISP programming language.
- Ever since C-Kermit version 5 was released in 1988, scripting has been
- one of its major attractions, and arithmetic is a key part of it.
- Versions 5 and 6 included integer arithmetic only, using traditional
- algebraic notation, e.g.:
- echo \fevaluate(3*(2+7)/2)
- 13
- C-Kermit 7.0 added support for floating-point arithmetic, but only
- through function calls:
- echo \ffpdivide(\ffpmultiply(3.0,\ffpadd(2.0,7.0)),2.0)
- 13.5
- C-Kermit 8.0 introduces a third form of arithmetic that treats integers
- and floating-point numbers uniformly, is easier to read and write, and
- executes very quickly:
- (/ (* 3 (+ 2 7)) 2)
- 13.5
- But first some background.
- The Kermit command and scripting language differs from true programming
- languages (such as C or Fortran) in many ways; one of the most
- prominent differences is the way in which variables are distinguished
- from constants. In a command language, words are taken literally; for
- example, the Unix shell:
- cat foo.bar
- displays the file named foo.bar. Whereas in a programming language like
- C, words are assumed to be variables:
- s = foo.bar; /* Assigns the value of foo.bar to the variable s */
- To make a programming language take words literally, you have to quote
- or "escape" them:
- s = "foo.bar"; /* Assigns a pointer to the string "foo.bar" to the variable s
- */
- The opposite holds for command languages: to get them to treat a word
- as a variable rather than a constant, you have to escape them. For
- example, in the Unix shell:
- foo=123 ; Assign value 123 to variable foo.
- echo foo ; Prints "foo"
- echo $foo ; Prints "123"
- And in Kermit:
- define foo 123 ; Assign value 123 to variable foo.
- echo 123 ; This prints "123".
- echo foo ; This prints "foo".
- echo \m(foo) ; This prints "123".
- In other words, character strings (such as "foo" above) are interpreted
- as literal strings, rather than variable names, except in special
- commands like DEFINE that deal specifically with variable names (or in
- numeric contexts as explained in [492]Section 8.2). The special
- "escape" character (dollar sign ($) for the shell, backslash (\) for
- Kermit) indicates that a variable is to be replaced by its value.
- The requirement to escape variable names in command languages normally
- does not impose any special hardship, but can add a considerable
- notational burden to arithmetic expressions, which are typically full
- of variables. Especially in Kermit when floating point numbers are
- involved, where you must use special \ffpxxx() functions, e.g.
- "\ffpadd(\m(a),\m(b))" rather than the simple "+" operator to add two
- floating-point numbers together, because the original arithmetic
- handler doesn't support floating point (this might change in the
- future). To illustrate, the general formula for the area of a triangle
- is:
- sqrt(s * (s - a) * (s - b) * (s - c))
- where a, b, and c are the lengths of the triangle's three sides and:
- s = (a + b + c) / 2
- Except in special cases (e.g. a = 3, b = 4, c = 5), the result has a
- fractional part so the computation must be done using floating-point
- arithmetic. We can create a Kermit 7.0 function for this as follows:
- def area {
- local s t1 t2 t3
- assign s \ffpdiv(\ffpadd(\ffpadd(\%1,\%2),\%3),2.0)
- assign t1 \ffpsub(\m(s),\%1)
- assign t2 \ffpsub(\m(s),\%2)
- assign t3 \ffpsub(\m(s),\%3)
- return \ffpsqrt(\ffpmul(\m(s),\ffpmul(\m(t1),\ffpmul(\m(t2),\m(t3)))))
- }
- But as you can see, this is rather cumbersome. Note, in particular,
- that arithmetic functions like \ffpadd(), \ffpmul(), etc, take exactly
- two operands (like their symbolic counterparts + and *), so obtaining
- the product of three or more numbers (as we do in this case) is
- awkward.
- Using the alternative S-Expression notation, we can reduce this to a
- form that is both easier to read and executes faster (the details are
- explained later):
- def newarea {
- (let s (/ (+ \%1 \%2 \%3) 2.0))
- (sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
- }
- In both examples, the \%1..3 variables are the normal Kermit macro
- arguments, referenced by the normal escaping mechanism. For increased
- readability, we can also assign the macro arguments \%1, \%2, and \%3
- to the letters a, b, and c corresponding to our formula:
- def newarea {
- (let a \%1 b \%2 c \%3)
- (let s (/ (+ a b c) 2.0))
- (sqrt (* s (- s a) (- s b) (- s c)))
- }
- And now the Kermit function reads almost like the original formula.
- Here Kermit behaves more like a regular programming language. In an
- S-Expression, macro names need not be escaped when they are used as the
- names of numeric variables.
- [ [493]Top ] [ [494]Contents ] [ [495]C-Kermit Home ] [ [496]Kermit
- Home ]
- 9.1. What is an S-Expression?
- The S-Expression concept is borrowed from the Lisp programming
- language. "S-Expression" is short for Symbolic Expression (itself
- sometimes shortened to SEXP). S-Expressions provide a kind of
- Alternative Mini-Universe within the Kermit command language when the
- regular rules don't apply, a universe enclosed in parentheses.
- C-Kermit does not pretend to be a full Lisp interpreter; only the
- arithmetic parts of Lisp have been incorporated: S-Expressions that
- operate on numbers and return numeric values (plus extensibility
- features described in [497]Section 9.8, which allow some degree of
- string processing).
- An S-Expression is a list of zero or more items, separated by spaces,
- within parentheses. Examples:
- ()
- (1)
- (a)
- (+ a 1)
- (* 2 a b)
- If the S-Expression is empty, it has the NIL (empty) value. If it is
- not empty and the first item is an operator (such as + or *), there can
- be zero or more subsequent items, called the operands:
- (+ 1 2)
- Here the operator is "+" and the operands are "1" and "2", and the
- value of the S-Expression is the value of the operation (in this case
- 3). The operator always comes first, which is different from the
- familiar algebraic notation; this because S-Expression operators can
- have different numbers of operands:
- (+ 1)
- (+ 1 2)
- (+ 1 2 3 4 5 6 7 8 9)
- If the first item in the S-Expression is not an operator, then it must
- be a variable or a number (or a macro; see [498]Section 9.8), and the
- S-Expression can only contain one item; in this case, the
- S-Expression's value is the value of the variable or number:
- (a)
- (3)
- Operands can be numbers, variables that have numeric values, functions
- that return numbers, or other S-Expressions. To illustrate an
- S-Expression within an S-Expression, observe that:
- (+ 1 2)
- is equivalent to any of the following (plus an infinite number of
- others):
- (+ 1 (+ 1 1))
- (+ (- 3 2) (/ 14 (+ 3 4)))
- S-Expressions can be nested to any reasonable level; for example, the
- value of the following S-Expression is 64:
- (- (* (+ 2 (* 3 4)) (- 9 (* 2 2))) 6)
- Operators have no precedence, implied or otherwise, since they can't be
- mixed. The only exceptions are unary + and -, which simply indicate the
- sign of a number:
- (* 3 -1)
- Order of evaluation is specified entirely by parentheses, which are
- required around each operator and its operands: (+ a (* b c)) instead
- of (a + b * c).
- S-Expressions provide a simple and isolated environment in which
- Kermit's macro names can be used without the \m(...) escaping that is
- normally required. Given:
- define a 1
- define b 2
- define c 3
- Then:
- (+ \m(a) \m(b) \m(c))
- is equivalent to:
- (+ a b c)
- Within an S-Expression, as in other strictly numeric contexts
- ([499]Section 8.2), any operand that starts with a letter is treated as
- a Kermit macro name. In this context, abbreviations are not accepted;
- variable names must be spelled out in full. Alphabetic case is not
- significant; "a" and "A" are the same variable, but both are different
- from "area".
- Of course, regular Kermit variables and functions can be used in
- S-Expressions in the normal ways:
- (* \v(math_pi) (^ \%r 2)) ; Area of a circle with radius \%r
- (+ \fjoin(&a)) ; Sum of all elements of array \&a[]
- [ [500]Top ] [ [501]Contents ] [ [502]C-Kermit Home ] [ [503]Kermit
- Home ]
- 9.2. Integer and Floating-Point-Arithmetic
- Normally, if all numbers in an S-Expression are integers, the result is
- an integer:
- (+ 1 1) ; Result is 2
- (/ 9 3) ; Result is 3
- If any of the operands is floating point, however, the result is also
- floating point:
- (+ 1 1.0) ; Result is 2.0
- (/ 9.0 3) ; Result is 3.0
- If all the operands are integers but the result has a fractional part,
- the result is floating point:
- (/ 10 3) ; Result is 3.333333333333333
- To force an integer result in such cases, use the TRUNCATE operator:
- (truncate (/ 10 3)) ; Result is 3
- Similarly, to force a computation to occur in floating point, you can
- coerce one of its operands to FLOAT:
- (+ 1 (float 1)) ; Result is 2.0
- The result is also floating point if the magnitude of any integer
- operand, intermediate result, or the result itself, is larger than the
- maximum for the underlying machine architecture:
- (^ 100 100)
- If the result is too large even for floating-point representation,
- "Infinity" is printed; if it is too small to be distinguished from 0,
- 0.0 is returned.
- Large numbers can be used and large results generated, but they are
- accurate only to the precision of the underlying machine. For example,
- the result of:
- (+ 111111111111111111111 222222222222222222222)
- should be 333333333333333333333, but 333333333333333300000.0 is
- produced instead if the machine is accurate to only about 16 decimal
- digits, even with coercion to floating-point. The order of magnitude is
- correct but the least significant digits are wrong. The imprecise
- nature of the result is indicated by the ".0" at the end. Contrast
- with:
- (+ 111111111 222222222)
- which produces an exact integer result.
- [ [504]Top ] [ [505]Contents ] [ [506]C-Kermit Home ] [ [507]Kermit
- Home ]
- 9.3. How to Use S-Expressions
- S-Expressions may be given as commands to C-Kermit. Any command whose
- first character is "(" (left parenthesis) is interpreted as an
- S-Expression.
- If you enter an S-Expression at the C-Kermit> prompt, its result is
- printed:
- C-Kermit>(/ 10.0 3)
- 3.333333333333333
- C-Kermit>
- If an S-Expression is executed within a macro or command file, its
- value is not printed. However, you can control the printing action
- with:
- SET SEXPRESSION ECHO { AUTO, ON, OFF }
- AUTO is the default, meaning print the value at top level only;
- ON means always print the value; OFF means never print it.
- In any case, the value of the most recent S-Expression (and the
- S-Expression itself) may be accessed programmatically through the
- following variables:
- \v(sexpression)
- The S-Expression most recently executed.
- \v(svalue)
- The value of the S-Expression most recently executed.
- Besides issuing S-Expressions as commands in themselves, you can also
- execute them anywhere within a Kermit command, but in this case they
- must be enclosed in a function call (otherwise they are taken
- literally):
- \fsexpression(s)
- The argument "s" is an S-Expression; the outer parentheses may
- be omitted. The value of the S-Expression is returned. Note that
- since S-Expressions usually contain spaces, some form of
- grouping or quoting might be needed in some contexts:
- echo \fsexpression((+ 1 1)) ; Outer parentheses may be included
- echo \fsexpr(+ 1 1) ; Outer parentheses may be omitted
- echo Value = "\fsexp(+ 1 a)" ; Can be embedded in strings
- echo Value = \&a[\fsexp(/ b 2)] ; Can be used in array subscripts
- if = {\fsexp(+ 1 1)} 2 { ; Braces needed here for grouping
- echo One plus one still equals two
- }
- The IF statement illustrates how to use S-Expressions as (or in) IF or
- WHILE conditions:
- * Although S-Expressions and IF conditions are similar in appearance,
- they are not interchangeable. Therefore you must use \fsexpr() to
- let Kermit know it's an S-Expression rather than a regular IF
- condition, or a boolean or algebraic expression within an IF
- condition.
- * In contexts where a single "word" is expected, you must enclose the
- \fsexp() invocation in braces if the S-Expression contains spaces
- (and most of them do).
- If an S-Expression is the last command executed in a macro, its value
- becomes the return value of the macro; no RETURN command is needed.
- Example:
- def newarea {
- (let s (/ (+ \%1 \%2 \%3) 2.0))
- (sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
- }
- This is equivalent to (but more efficient than):
- def newarea {
- (let s (/ (+ \%1 \%2 \%3) 2.0))
- return \fsexp(sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
- }
- When an S-Expression is entered as a command -- that is, the first
- nonblank character of the command is a left parenthesis -- then it is
- allowed to span multiple lines, as many as you like, until the first
- left parenthesis is matched:
- (let s (/
- (+
- \%1
- \%2
- \%3
- )
- 2.0
- )
- )
- (sqrt (*
- s
- (- s \%1)
- (- s \%2)
- (- s \%3)
- )
- )
- The S-Expression concept lends itself easily to embedding and
- recursion, but the depth to which recursion can occur is limited by the
- resources of the computer (memory size, address space, swap space on
- disk) and other factors. There is no way that C-Kermit can know what
- this limit is, since it varies not only from computer to computer, but
- also from moment to moment. If resources are exhausted by recursion,
- C-Kermit simply crashes; there's no way to trap this error. However,
- you can set a depth limit on S-Expressions:
- SET SEXPRESSION DEPTH-LIMIT number
- Limits the number of times the S-Expression reader can invoke
- itself without returning to the given number. The default limit
- is 1000. This limit applies to S-Expressions embedded within
- other S-Expressions as well as to S-Expressions that invoke
- recursive macros. If the limit is exceeded, Kermit prints
- "?S-Expression depth limit exceeded" and returns to its prompt.
- More about recursion in [508]Section 9.8.
- You can also test the depth programmatically:
- \v(sdepth)
- The current S-Expression invocation depth. The depth includes
- both nesting level and recursion. For example, in:
- (foo (foo (foo (foo (foo))))), the innermost (foo) is at depth
- 5.
- Help, completion, and syntax checking are not available within an
- S-Expression. If you type ? within an S-Expression, it says:
- C-Kermit>(? S-Expression ("help sexp" for details)
- As it says, typing "help sexp" will display a brief help text.
- The SHOW SEXPRESSION command displays current SET SEXPRESSION settings
- and related information.
- [ [509]Top ] [ [510]Contents ] [ [511]C-Kermit Home ] [ [512]Kermit
- Home ]
- 9.4. Summary of Built-in Constants and Operators
- Three constants are built in:
- * PI, whose value is the value of pi (the quotient of circumference
- of any circle and its diameter, 3.141592653...) to the underlying
- machine's precision;
- * T, which always has the value 1, which signifies truth in Kermit
- logical expressions or S-Expressions;
- * NIL, which always has the empty value, and can serve as a False
- truth value.
- These constants are specific to S-Expressions and are not visible
- outside them. They may not be used as the target of an assignment. So,
- for example:
- (setq t 0) Fails
- assign t 0 Succeeds but this is not the same T!
- E (the base of natural logarithms, 2.7182818184...) is not built in
- since it is not intrinsic in most Lisp dialects. If you want E to be
- the base of natural logarithms you can:
- (setq e (exp 1))
- Operators are either symbols (such as "+") or words. Words must be
- spelled out in full, not abbreviated. Differences of alphabetic case
- are ignored.
- The most basic operation in S-Expressions is evaluation:
- EVAL [ s-expression or variable or number [ another [ another ... ] ] ]
- Evaluates its operands and returns the value of the last one
- evaluated. Examples:
- (eval) 0
- (eval 1) 1
- (eval a) value of a
- (eval (+ 1 a)) value of a+1
- (eval (setq a 1) (setq b (+ a 0.5))) value of b (= a+0.5)
- You can use "." as a shorthand for EVAL:
- (.)
- (. 1)
- (. a)
- (. (+ 1 a))
- (. (setq a 1) (setq b (+ a 0.5)))
- Opposite of EVAL is the operator that suppresses evaluation of its
- operand:
- QUOTE item
- The value (quote item) is "item". If the item is itself an
- S-Expression, the result is the S-Expression with the outer
- parentheses stripped. Examples:
- (quote) (illegal)
- (quote a) a
- (quote hello) hello
- (quote (this is a string)) this is a string
- (quote this is a string) (illegal)
- A shorthand notation is also accepted for quoting:
- 'a is equivalent to (quote a). And therefore:
- '(a b c) is equivalent to (quote (a b c)).
- More about quoting in [513]Section 9.8.
- STRING item
- Is a combination of EVAL and QUOTE. It evaluates the item as an
- S-Expression, and then puts quotes around the result (more about
- this in [514]Section 9.8).
- The following operators assign values to variables:
- SETQ [ variable [ value [ variable [ value [ ... ] ] ] ] ]
- Applies to global variables. For each variable given: if a value
- is not given, the variable is undefined. If a value is given,
- assigns the value to the variable. The value may be a number, a
- variable, or anything that resolves to a number including an
- S-Expression. Returns the value of the last assignment.
- Examples:
- (setq) Does nothing, returns NIL.
- (setq a) Undefines a, returns NIL.
- (setq a 1) Assigns 1 to a, returns 1.
- (setq a 1 b 2) Assigns 1 to a, 2 to b, returns 2.
- (setq a 1 b 2 c) Assigns 1 to a, 2 to b, undefines c, returns NIL.
- To undefine a variable that is not the final one in the list, give it a
- value of "()" or NIL:
- (setq a () b 2) Undefines a, assigns 2 to b, returns 2.
- (setq a nil b 2) Ditto.
- Note that a variable can be used right away once it has a value:
- (setq a 1 b a) Assigns 1 to a, the value of a (1) to b, returns 1.
- The results of SETQ (when used with macro names) can be checked
- conveniently with SHOW MACRO, e.g:
- show mac a b c
- LET [ variable [ value [ variable [ value [ ... ] ] ] ] ]
- Like SETQ, but applies to local variables. Note that "local" is
- used in the Kermit sense, not the Lisp sense; it applies to the
- current Kermit command level, not to the current S-Expression.
- If you want to use SETQ or LET to assign a value to a backslash
- variable such as \%a or \&a[2], you must double the backslash:
- (setq \\%a 3)
- (setq \\%b (+ \%a 1))
- (setq \\&a[2] (setq (\\%c (+ \%a \%b))))
- In other words:
- * Double the backslash when you want to indicate the variable's NAME;
- * Don't double the backslash when you want its VALUE.
- See [515]Section 9.6 for a fuller explanation of variable syntax and
- scope.
- Here's a summary table of arithmetic operators; in the examples, a is 2
- and b is -1.3:
- Operator Description Example Result
- + Adds all operands (0 or more) (+ a b) 0.7
- - Subtracts all operands (0 or more) (- 9 5 2 1) 1
- * Multiplies all operands (0 or more) (* a (+ b 1) 3) -1.80
- / Divides all operands (2 or more) (/ b a 2) -0.325
- ^ Raise given number to given power (^ 3 2) 9
- ++ Increments variables (++ a 1.2) 3.2
- -- Decrements variables (-- a) 1
- ABS Absolute value of 1 operand (abs (* a b 3)) 7.8
- MAX Maximum of all operands (1 or more) (max 1 2 3 4) 4
- MIN Minimum of all operands (1 or more) (min 1 2 3 4) 1
- MOD (%) Modulus of all operands (1 or more) (mod 7 4 2) 1
- FLOAT Convert an integer to floating-point (float 1) 1.0
- TRUNCATE Integer part of floating-point operand (truncate 3.333) 3
- CEILING Ceiling of floating-point operand (ceiling 1.25) 2
- FLOOR Floor of floating-point operand (floor 1.25) 1
- ROUND Operand rounded to nearest integer (round 1.75) 2
- SQRT Square root of 1 operand (sqrt 2) 1.414..
- EXP e (2.71828..) to the given power (exp -1) 0.367..
- SIN Sine of angle-in-radians (sin (/ pi 2)) 1.0
- COS Cosine of angle-in-radians (cos pi) -1.0
- TAN Tangent of angle-in-radians (tan pi) 0.0
- LOG Natural log (base e) of given number (log 2.7183) 1.000..
- LOG10 Log base 10 of given number (log10 1000) 3.0
- The ++ and -- operators are also assignment operators and work just
- like SETQ and LET in their interpretations of operators and operands,
- but:
- * Each target variable must already be defined and have a numeric
- value;
- * The assignment value is the amount by which to increment or
- decrement the variable.
- * If an assignment value is not given, 1 is used.
- If you include more than one variable-value pair in a ++ or --
- expression, every variable (except, optionally, the last) must be
- followed by a value. Examples:
- (++ a) Equivalent to (setq a (+ a 1)) and to (++ a 1)
- (++ a 2) Equivalent to (setq a (+ a 2))
- (-- a (* 2 pi)) Equivalent to (setq a (- a (* 2 pi)))
- (++ a 1 b 1 c 1 d) Equivalent to four SETQs incrementing a,b,c,d by 1.
- Another group of operators forms the predicates. These return a "truth
- value", in which 0 (or NIL) is false, and 1 or any other nonzero number
- is true.
- Operator Description Example Result
- = (or ==) Operands are equal (= 1 1.0) 1
- != Operands are not equal (!= 1 1.0) 0
- < Operands in strictly ascending order (< 1 2 3) 1
- <= Operands in ascending order (<= 1 1 2 3) 1
- > Operands in strictly descending order (> 3 2 1) 1
- >= Operands in descending order (<= 3 3 2 1) 1
- AND (&&) Operands are all true (and 1 1 1 1 0) 0
- OR (||) At least one operand is true (or 1 1 1 1 0) 1
- XOR Logical Exclusive OR (xor 3 1) 0
- NOT (!) Reverses truth value of operand (not 3) 0
- The Exclusive OR of two values is true if one value is true and the
- other value is false.
- And another group operates on bits within an integer word:
- Operator Description Example Result
- & Bitwise AND (& 7 2) 2
- | Bitwise OR (| 1 2 3 4) 7
- # Bitwise Exclusive OR (# 3 1) 2
- ~ Reverses all bits (~ 3) -4
- These operators coerce their operands to integer by truncation if
- necessary. The result of bit reversal is hardware dependent.
- The final category of operator works on truth values:
- Operator Description Example Result
- IF Conditional evaluation (if (1) 2 3) 2
- IF (predicate) (s1) [ (s2) ]
- The IF operator is similar to Kermit's IF command. If the
- predicate is true (i.e. evaluates to a nonzero number), the
- first S-Expression (s1) is evaluated and its value is returned.
- Otherwise, if (s2) is given, it is evaluated and its value
- returned; if (s2) is not given, nothing happens and the NIL
- (empty) value is returned.
- You can group multiple expressions in the s1 and s2 expressions using
- EVAL (or "."):
- (if (< a 0) (eval (setq x 0) (setq y 0)) (eval (setq x a) (setq y b)))
- or equivalently:
- (if (< a 0) (. (setq x 0) (setq y 0)) (. (setq x a) (setq y b)))
- Each operator has its own requirement as to number and type of
- operands. In the following table, "number" means any kind of number --
- integer or floating-point -- or a variable, function, macro, or
- S-Expression that returns a number; "vname" means variable name,
- "fpnumber" means a floating-point number (or anything that resolves to
- one), and "integer" means integer (or anything that resolves to one).
- "truthvalue" means anything that resolves to a value of zero or an
- empty value (which indicates false) or a nonzero value (which indicates
- true). "any" means any kind of value, including none at all.
- Operator Number of operands Type of operands Returns
- EVAL (.) 0 or more S-Expression Last value (default NIL)
- STRING 1 S-Expression string
- QUOTE (') 1 word string
- SETQ 0 or more vname value pairs Last value (default NIL)
- LET 0 or more vname value pairs Last value (default NIL)
- + 0 or more number number (default 0)
- - 0 or more number number (default 0)
- * 0 or more number number (see note (1))
- / 2 or more number number
- ^ 2 or more number number
- ++ 1 or more vname value pairs Result of last increment
- -- 1 or more vname value pairs Result of last decrement
- ABS 1 number number
- MAX 1 or more number number
- MIN 1 or more number number
- MOD (%) 2 number number
- FLOAT 1 number fpnumber
- TRUNCATE 1 number integer
- CEILING 1 number integer
- FLOOR 1 number integer
- ROUND 1 number integer
- SQRT 1 number fpnumber
- EXP 1 number fpnumber
- SIN 1 number fpnumber
- COS 1 number fpnumber
- TAN 1 number fpnumber
- LOG 1 number fpnumber
- LOG10 1 number fpnumber
- = (==) 1 or more number truthvalue
- != 1 or more number truthvalue
- < 1 or more number truthvalue
- <= 1 or more number truthvalue
- > 1 or more number truthvalue
- >= 1 or more number truthvalue
- AND (&&) 1 or more truthvalue truthvalue
- OR (||) 1 or more truthvalue truthvalue
- XOR 2 truthvalue truthvalue
- NOT (!) 1 truthvalue truthvalue
- & 1 or more number (see note 2) integer
- | 1 or more number (see note 2) integer
- # 2 number (see note 2) integer
- ~ 1 number (see note 2) integer
- IF 2 or 3 truthvalue,any,any any
- Operators that don't require any arguments return the default values
- shown.
- 1. The value of "*", when used as an operand, is initially "1" and the
- value of the most recent S-Expression thereafter, as in Franz Lisp.
- This is handy when doing a series of calculations by hand:
- C-Kermit>(* 13272.42 0.40)
- 5308.968
- C-Kermit>(/ * 2)
- 2654.4840
- C-Kermit>
- 2. The bitwise operators coerce their operands to integer by
- truncation.
- [ [516]Top ] [ [517]Contents ] [ [518]C-Kermit Home ] [ [519]Kermit
- Home ]
- 9.5. Variables
- As noted elsewhere in this discussion, all backslash items (variables
- such as \%a, macro parameters such as \%1, array elements such as
- \&a[\%i], built-in variables such as \v(ndate), built-in functions such
- as \fjoin(), macro names enclosed in \m(), \s(), or \:(), etc) are
- evaluated at "top level" before the S-Expression is sent to the
- S-Expression reader. To use a backslash variable as the target of an
- assignment (e.g. by SETQ, LET, ++, or --), you must double the
- backslash, e.g. (setq \\%r 1234). This is discussed at greater length
- in the next section.
- Thus S-Expression reader generally deals only with macro names (not
- backslash items) as variables. It is important to understand how the
- reader handles macro names. There are fundamentally two kinds of
- S-Expressions: those that contain a single element, such as:
- (foo)
- and those that contain more than one element:
- (foo a b c)
- If an S-Expression contains only one element, and it is the name of a
- macro, the macro's definition is examined. If the definition is a
- number (integer or floating-point, positive or negative), then this
- becomes the value of the expression. If the definition starts with '
- (apostrophe), then the quoted word or string is the value of the
- expression (explained in [520]Section 9.8). Otherwise, the macro is
- assumed to be composed of Kermit commands (possibly including
- S-Expressions), which are executed. If the macro has a RETURN value, or
- it executes an S-Expression as its last command, the result becomes the
- value of the S-Expression; otherwise the result is empty.
- For S-Expressions that contain more than one element, and the first
- element is the name of a macro, then this macro is executed with the
- arguments that are given, after the arguments are evaluated by the
- S-Expression reader. Likewise, If the first element is a built-in
- operator, then it is applied to the operands after they are evaluated.
- In both cases, each operand is fed to the S-Expression reader
- recursively for evaluation. If an operand is a number or a quoted
- string, it is used as-is. But if it's a macro name, this degenerates
- into the first case, and the previous paragraph applies.
- Examples:
- define foo 123
- (foo) Result: 123
- define foo 'abc
- (foo) Result: abc
- define foo '(one two three)
- (foo) Result: one two three
- define foo return \frandom(1000)
- (foo) Result: 713 (or other number)
- define foo (+ a b)
- (foo) Result: The sum of a and b
- A more difficult example:
- define foo abc
- (foo) Result: ???
- The result in the last example depends on the definition of abc:
- * If it has no definition, an error occurs; otherwise:
- * If the definition is an S-Expression, the result is the
- S-Expression's value; otherwise:
- * If the definition consists of Kermit commands, they are executed.
- But in this case "(foo)" produces the empty result, because it
- doesn't RETURN anything.
- The use of macros as S-Expression operators is described in
- [521]Section 9.8.
- [ [522]Top ] [ [523]Contents ] [ [524]C-Kermit Home ] [ [525]Kermit
- Home ]
- 9.6. Assignments and Scope
- The assignment operators SETQ and LET apply to global and local
- variables, respectively. SETQ and LET are standard Lisp operators
- adapted to Kermit scoping rules. When the operands are numeric or
- arithmetic, SETQ is equivalent to Kermit's EVALUATE command:
- (setq a (+ 1 2))
- evaluate a 1 + 2
- When the operand is a string, SETQ is equivalent to DEFINE:
- (setq a '(this is a string))
- define a this is a string
- In the first case, both statements create a macro named "a" with a
- value of 3. But in neither case is the macro "a" necessarily global. If
- either of these commands executes in an environment (i.e. macro
- invocation level) where a "local a" command has been given, the "a"
- macro is global to that environment, but is not visible outside it.
- LET is equivalent to the Kermit LOCAL command, followed by the
- corresponding EVALUATE:
- (let a (+ 1 2))
- is equivalent to:
- local a
- evaluate a 1 + 2
- Again, "local" in this context applies to the Kermit macro invocation
- stack, not to the S-Expression nesting level. To illustrate, recall our
- "newarea" macro:
- def newarea {
- (let a \%1 b \%2 c \%3)
- (let s (/ (+ a b c) 2.0))
- (sqrt (* s (- s a) (- s b) (- s c)))
- }
- Because SETQ and LET expressions return a value, they can be placed
- within a larger S-Expression. In this case we can replace the first
- reference to the "s" variable by its defining expression:
- def newarea {
- (let a \%1 b \%2 c \%3)
- (sqrt (* (let s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c)))
- }
- This would not work if LET were local to the S-Expression, but it works
- nicely in the context of Kermit macros. The previous definition is
- equivalent to:
- def newarea {
- local a b c s
- (setq a \%1 b \%2 c \%3)
- (sqrt (* (setq s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c)))
- }
- In both cases, the variables a, b, c, and s are local to the "newarea"
- macro, and global within it.
- Multiple assignments can be handled in several ways. Here is the
- obvious way to initialize a series of variables to the same value:
- (setq a 0)
- (setq b 0)
- (setq c 0)
- (setq s 0)
- Here is a more compact and efficient way of doing the same thing:
- (setq a 0 b 0 c 0 s 0)
- However, in case the value was more complex, it's better to put only
- one copy of it in the S-Expression; in this case we rely on the fact
- that SETQ returns the value of its last assignment:
- (setq a (setq b (setq c (setq s (* x (^ y 2))))))
- Similarly, to set a series of variables to x, x+1, x+2, ...
- (setq c (+ (setq b (+ (setq a (+ (setq s x) 1)) 1)) 1))
- In the last example, you can see why "last" does not always correspond
- to "rightmost" (the leftmost variable "c" is assigned last).
- If you are working with backslash variables like \%a or array elements
- like \&a[1], remember two rules:
- 1. Don't put spaces inside array brackets.
- 2. You must double the backslash when using SETQ, LET, ++, or -- to
- assign a value to a backslash variable.
- Examples of assigning to a backslash variable:
- (setq x 1)
- (setq \\%a 0)
- (setq \\&a[x+1] 1)
- (++ \\%x)
- (-- \\&a[x+2])
- Examples of referring to a backslash variable's value:
- (setq a (+ \%a 1))
- (setq b (+ \%a \&a[1]))
- (++ a \%x)
- (-- b \&a[1])
- The special notation is required because all backslashed items (\%x
- variables, array elements, built-in \v(xxx) variables, and \fxxx()
- function invocations) are evaluated in a single pass BEFORE the
- S-Expression is executed; any other approach would result in
- unacceptable performance. So, for example, in:
- declare \&a[] = 1 2 3
- define \%x 4
- define \%y 0
- (setq \\%y (+ \%x \&a[1]))
- the S-Expression becomes:
- (setq \%y (+ 4 1))
- before it is sent to the S-Expression evaluator. If the backslash had
- not been doubled on the assignment target, the result would have been:
- (setq 0 (+ 4 1))
- which is illegal because you can't assign a value to a number.
- Conversely, if backslashes were doubled on right-hand-side values:
- (setq \\%y (+ \\%x \\&a[1])
- this too, would give an error (not numeric - "\%x").
- If you omit the double backslash in the assignment target, the result
- depends on whether the variable already has a value:
- (setq \%a (* 3 3))
- If \%a has a non-numeric single-word value, then this becomes the name
- of the variable that is assigned by SETQ. To illustrate:
- define \%a foo
- echo \%a
- foo
- (setq \%a (* 3 3))
- echo \%a
- foo
- show macro foo
- foo = 9
- If \%a has no value, a numeric value, or a multiword value, an "invalid
- assignment" error occurs.
- [ [526]Top ] [ [527]Contents ] [ [528]C-Kermit Home ] [ [529]Kermit
- Home ]
- 9.7. Conditional Expressions
- The IF operator provides a compact form of decision-making within
- S-Expressions. An IF expression can stand wherever a number might
- stand, as long is it returns a number. Here's a quick way to obtain the
- average value of all the elements in an array that contains only
- numbers:
- (/ (+ \fjoin(&a)) (float \fdim(&a)))
- This results in a "Divide by zero" error if the array is empty. If you
- want to define the average value of an empty array to be 0 instead of
- getting an error, you can use IF to check the array size:
- (if \fdim(&a) (/ (+ \fjoin(&a)) (float \fdim(&a))) 0)
- or equivalently:
- (if (not \fdim(&a)) 0 (/ (+ \fjoin(&a)) (float \fdim(&a))))
- Of course, IF can fit anywhere else into an S-Expression:
- (setq a (+ b (if (< c 0) 0 c)))
- and the IF expression can be as complex as you like:
- (setq a (+ b (if (and (or (> x 0) (> y 0)) (< c 0) (> d 1) (!= e 0)) 1 0)))
- and the "then" and "else" parts can contain multiple S-Expressions
- enclosed within (EVAL ...):
- (if x (eval (...) (...) (...)) (eval (...) (...) (...)))
- AND and OR operators are guaranteed to "short circuit". If any operand
- of AND is false, none of the subsequent operands is evaluated;
- likewise, if an OR operand is true, no further operands are evaluated.
- Bear in mind that the S-Expression IF is not the same as Kermit IF; the
- condition is only allowed to be an S-Expression or a variable or
- number, not the whole list of possibilities you see when you type "if
- ?" at the C-Kermit> prompt. But keep reading...
- [ [530]Top ] [ [531]Contents ] [ [532]C-Kermit Home ] [ [533]Kermit
- Home ]
- 9.8. Extensibility
- To extend the capabilities of S-Expressions, you can use Kermit macro
- names as operators, with the following limitations:
- * The macro must not have the same name as a built-in operator.
- * You must use the full macro name, not an abbreviation.
- And with the following enhancement:
- * If the last statement executed by the macro is an S-Expression, its
- value is returned automatically. In other words:
- define bump (++ \%1)
- is equivalent to:
- define bump return \fsexpression(++ \%1)
- Here's an example in which we define a FIBONACCI operator that returns
- the nth element, n >= 0, of the Fibonacci series, 0 1 1 2 3 5 8 13 21
- 34 55, . . ., in which the first element is 0, the second is 1, and
- each subsequent element is the sum of the two before it. This series
- was devised by Leonardo Pisano, Filius Bonacci (Fibonacci for short) in
- 1202 to describe how fast rabbits can breed, and also forms the basis
- for the Golden Mean, the branching behavior of plants, the spiral of a
- nautilus shell, etc. (Thanks to [534]Dat Thuc Nguyen for December 2003
- corrections to this section!)
- We can write a FIBONACCI function as a macro easily with S-Expressions:
- define FIBONACCI {
- (if (== \%1 0) 0
- (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1)))))
- }
- You can read this as:
- If the argument (\%1) is 0, return a result of 0; if it is 1,
- return 1; otherwise:
- return the sum of fibonacci(argument - 2) and fibonacci(argument -
- 1)
- Note that a RETURN statement is not needed, since S-Expressions
- automatically set the return value of their containing macros.
- For comparison, here's how it would be coded without S-Expressions:
- define FIBONACCI {
- if == \%1 0 {
- return 0
- } else if == \%1 1 {
- return 1
- } else {
- return \feval(\fexec(fibonacci \feval(\%1-2)) -
- + \fexec(fibonacci \feval(\%1-1)))
- }
- }
- Now we can use the FIBONACCI function (whichever way you write it) just
- as if it were a built-in operator:
- (fibonacci 6)
- Or:
- (setq a 10)
- (fibonacci a)
- Within S-Expressions only (not outside them), S-Expressions themselves
- can be used as macro arguments:
- (setq a 2 b 4)
- (setq x (fibonacci (* a b )))
- The value of the S-Expression (in this case "8"), and not the
- S-Expression itself, is sent to the macro.
- Your macro is responsible for argument validation and error handling. A
- robust Fibonacci macro would be more like this:
- define FIBONACCI {
- if < \v(argc) 2 end 1 ?\%0: Missing argument
- if > \v(argc) 2 end 1 ?\%0: Too many arguments
- if not integer \%1 end 1 ?\%0: Integers only
- if < \%1 1 end 1 ?\%0: Argument out of range
- (if (== \%1 0) 0
- (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1)))))
- }
- Recall that "END nonzero-number [ message ]" causes a macro invocation
- to fail. When the macro is the operator in an S-Expression, this makes
- the S-Expression fail too. Also note that our Fibonacci macro is just
- an illustration, not a practical example. Since it is recursive (calls
- itself), it won't work for large arguments because the call stack can
- exceed available memory. See [535]Section 9.9.2 for a practical
- alternative.
- Kermit macros, when used as S-Expression operators, can do anything at
- all except initiate file transfers: they can print messages on the
- screen, read and write files, interact with the user, and so on. For
- example, here's a macro ASKME that asks you to enter a number, makes
- sure that you did, and then returns its value for use in the
- S-Expression:
- define ASKME {
- local \%n
- while true {
- ask \%n { Number: }
- if not def \%n continue
- if not numeric \%n {
- echo Not numeric - "\%n"
- continue
- }
- break
- }
- return \%n
- }
- (setq a (* 2 (askme))) ; Get number from user, double it, assign result to a.
- Here's a macro you can use to validate that a number is in a given
- range:
- define inrange {
- if != \v(argc) 4 end 1 ?\%0: Wrong number of arguments
- if ( < \%1 \%2 || > \%1 \%3 ) return 0
- return 1
- }
- The first argument is the number to be checked, the second is the
- minimum acceptable value, the third is the maximum. You can use this
- (for example) in IF conditions:
- define yes echo \%1 IS OK
- define no echo \%1 IS NOT OK
- (setq a -1 b 999)
- (if (inrange a 0 100) (yes a) (no a))
- (if (inrange b -1000 +1000) (yes b) (no b))
- This is just an illustration, of course; there's already a built-in
- operator to let you do range checking without help from macros:
- (if (<= 0 a 100) (yes a) (no a))
- (if (<= -1000 b +1000) (yes b) (no b))
- To send string parameters to a macro, some kind of quoting is required
- to tell the S-Expression parser to take a given "word" literally rather
- than replacing it by its value. For this we use the Lisp QUOTE
- operator:
- define length return \flength(\%1)
- (length (quote abcdefghijklmnopqrstuvwxyz))
- 26
- This causes the string "abcdefghijklmnopqrstuvwxyz" to be sent
- literally to the LENGTH macro. Kermit, like Lisp, also offers a
- shortcut for QUOTE, that lets us quote a word by prefixing it with a
- single quote (') character, also called apostrophe (ASCII 39):
- (length 'abcdefghijklmnopqrstuvwxyz)
- 26
- The two forms are equivalent.
- How the macro treats its arguments is up to the macro. In the example
- above, the argument is treated as a literal string. However, it can
- also be treated as a variable name:
- define string This is a string
- define length return \flength(\m(\%1))
- (length 'string)
- 16
- Note the construct \m(\%1). This means "the value of the macro whose
- name is the value of
- \%1". The value of \%1 in this case is the word "string", and the value
- of the macro whose name is "string" is "This is a string".
- What if the macro takes multiple arguments, or a variable number of
- them? Here's a simple macro that prints a phrase that includes its
- arguments:
- define complain echo It's too \%*!
- (Recall that \%* means "all arguments".)
- It can be called in the traditional way:
- complain hot Result: "It's too hot!"
- complain cold and wet Result: "It's too cold and wet!"
- Or from an S-Expression if you quote the arguments:
- (complain 'hot) Result: "It's too hot!"
- (complain 'cold 'and 'wet) Result: "It's too cold and wet!"
- To group multiple words into a single argument, use parentheses:
- (complain (quote (cold and wet))) Result: "It's too cold and wet!"
- (complain '(cold and wet)) Result: "It's too cold and wet!"
- Note the difference:
- (complain 'cold 'and 'wet) Three arguments
- (complain '(cold and wet)) One argument
- Since the COMPLAIN macro uses \%* to refer to all its arguments, no
- matter how many, it doesn't care which form you use. But it makes a
- difference in cases where the macro refers to its arguments
- individually.
- To illustrate, let's consider a macro that receives the name of a macro
- and its argument list and executes it with its arguments, without
- knowing how many arguments there are. The following LOOP macro is used
- to execute the given macro with the given argument list the requested
- number of times:
- def loop { local i, for i 1 \%1 1 do \%2 \%3 }
- Within the LOOP macro, the first argument (\%1) is the loop count, \%2
- is the macro name, and \%3 is the argument list. When the LOOP macro is
- invoked traditionally like this:
- loop 3 complain hot
- it prints "It's too hot!" three times. To invoke it from an
- S-Expression, you must quote both the macro name as well as the
- argument, since in this case the macro name itself is an argument:
- (loop 3 'complain 'hot)
- Now what if you need to send different or variable numbers of arguments
- to the LOOP macro? The LOOP macro can handle it already, provided you
- group the arguments into LOOP's third argument (\%3). In Kermit syntax,
- without grouping:
- loop 3 complain cold and wet
- prints "It's too cold!" three times ("and wet" is lost); but with
- grouping (either of the following two forms):
- loop 3 complain {cold and wet}
- loop 3 complain "cold and wet"
- the LOOP macro prints "It's too cold and wet!" three times as desired.
- To do the same thing in an S-Expression, just use the Lisp forms of
- quoting instead of the Kermit forms; the following two are equivalent:
- (loop 3 'complain (quote (cold and wet)))
- (loop 3 'complain '(cold and wet))
- Here's a similar example in which we write a macro that shows both the
- name and the value of one or more other macros, whose names are given
- as arguments (similar to "show macro"):
- define display {
- local \%i
- for \%i 1 \v(argc)-1 1 {
- echo \&_[\%i] = \m(\&_[\%i])
- }
- }
- (Recall that \&_[] is the macro's argument vector array, equivalent to
- \%1, \%2, ...) The DISPLAY macro can be used in S-Expressions like
- this:
- (setq a 1 b 2 c 3)
- (display 'a 'b 'c 'd)
- which prints:
- a = 1
- b = 2
- c = 3
- d =
- The names must be quoted to prevent their evaluation before they are
- sent to the macro. This ability to pass variables "by name" to macros,
- rather than by value, lets you write macros that change the values of
- argument variables. For example, here's a macro that doubles the value
- of its argument variable:
- define double (++ \%1 \%1)
- which you can call like this:
- (setq a 12)
- (double 'a)
- In the macro, \%1 is replace by the variable name "a"; "(++ a a)" adds
- "a" to itself, and sets the value of "a" to the result.
- There are no built-in operators other than QUOTE, ', and STRING for
- handling strings in S-Expressions, but using just these, plus macros
- that use Kermit's regular string-handling features, you can easily
- extend S-Expressions to do string manipulation:
- define len return \flen(\%1) Returns length of argument string
- define cap return \fupper(\%1) Uppercase argument string
- define rev return \freverse(\%1) Reverses argument string
- define sub return \fsubstr(\%1,\%2,\%3) Returns substring of arg string
- (len '(this is a string)) Result: 16
- (rev '(this is a string)) Result: gnirts a si siht
- (rev (cap '(this is a string))) Result: GNIRTS A SI SIHT
- (sub (rev (cap '(this is a string))) 5 9) Result: TS A SI S
- You can assign a string to a macro name as follows:
- (setq foo '(this is a string))
- (setq foo (quote (this is a string)))
- The two are exactly equivalent. In both cases, the macro "foo" has the
- value:
- '(this is a string)
- so when it is retrieved it can be identified as a string rather than a
- number or commands to be executed. Thus:
- (setq foo (quote (this is a string)))
- show macro foo
- foo = '(this is a string)
- (foo)
- this is a string
- Note the different results for "show macro foo" and "(foo)". The former
- shows the internal definition; the latter evaluates the variable, which
- removes the quoting. And perhaps more important, note that if the
- apostrophe and surrounding parentheses were not stored as part of the
- definition, (foo) would try to execute "this is a string" as a command.
- Given the assignment above, the following work as expected:
- (len foo) Result: 16
- (rev foo) Result: gnirts a si siht
- (rev (cap foo)) Result: GNIRTS A SI SIHT
- (sub (rev (cap foo)) 5 8) Result: TS A SI S
- Note that, unlike built-in S-Expression operators that return numbers
- or truth values, these operators return strings. If you want to assign
- their return values to other variables, you can do so:
- (setq bar (rev (cap foo))) Result: GNIRTS A SI SIHT
- But now the S-Expression processor doesn't know the value of "bar" is
- supposed to be a string, rather than a macro to execute. For this you
- need one final special operator, STRING. The STRING operator takes an
- S-Expression as an operand, evaluates it, and then returns its value
- enclosed in '(), so you can use the value as a string is subsequent
- S-Expressions. Use STRING for referencing macros that return strings:
- (setq bar (string (rev (cap foo)))) Result: '(GNIRTS A SI SIHT)
- STRING is like QUOTE, except that it evaluates its operand before
- applying the quoting, rather than taking the operand literally.
- To reference backslash variables or functions that return string
- values, you must use the regular quoting mechanisms:
- (setq time '(\v(time)))
- (setq date '(\v(date)))
- assign \%r this is a string
- (setq s1 '(\%r))
- That's because backslash items are evaluated BEFORE the S-Expression
- parser ever sees them, and the values of \v(time) and so on are not
- valid S-Expressions, so STRING won't like them.
- Finally a brief word on the touchy topic of quoting. Suppose you want
- to include (say) literal parentheses in a string that will later be
- processed by the S-Expression reader (or \fsplit() or \fword()).
- Normally, you can't do this because parentheses are meaningful in these
- contexts. To defeat the normal parsing rules, you can quote the
- parentheses with backslash. However, due to the many levels of string
- processing involved, a surprisingly large amount of backslashes might
- be required, for example:
- (setq s '(a b (c d) \\\\\\\\\\\\\\\\(e f (g h) x\\\\\\\\\\\\\\\\) j k))
- This is nearly impossible to explain(*). Instead, just remember two
- points:
- * In situations like this, it's better to use DEFINE to create the
- string, rather than SETQ. The example above requires only double
- backslashes when DEFINE is used:
- define s '(a b (c d) \\(e f (g h) x\\) j k)
- * The level of quoting depends on how many levels of evaluation the
- string must pass through, which is not always obvious. However, the
- number of backslashes required in any given situation is always a
- power of 2. So if 1 doesn't work, try 2; if 2 doesn't work, try 4;
- if 4 doesn't work, try 8, 16, 32, and so on.
- Considerations like this apply in any scripting language (shell, Tcl,
- Perl, Python, etc). The situation is known as "Quoting Hell".
- (*) If you really want an explanation, here it is:
- * Every SEXP has its backslash items evaluated in a single pass at
- top level before being passed to the SEXP reader, so \%1,
- \v(ftime), etc, can be evaluated up front, freeing the SEXP reader
- of having to know about such things, which in turn makes it much
- more efficient. Therefore one level of quoting is lost right away,
- and therefore you must double each backslash that is to be used as
- a quote.
- * When the SEXP reader sees '\', it treats it as a quote; discards it
- and keeps the next character. Thus '\\' becomes '\'. This would be
- the end of it, except that:
- * The SEXP reader must call itself recursively on its operands, so we
- must double any quotes in the operands: 2^2 = 4.
- * If the result is to be passed as an argument to a macro, the
- backslashes must again be doubled, because the macro processor
- evaluates the arguments before sending them to the macro: 2^3 = 8.
- * If the macro itself is to see the quotes, rather than just the
- result of the quoting, the quotes must be doubled again: 2^4 = 16.
- Moral: To create string constants in which grouping characters must be
- quoted, use DEFINE rather than SETQ.
- [ [536]Top ] [ [537]Contents ] [ [538]C-Kermit Home ] [ [539]Kermit
- Home ]
- 9.9. Examples
- 9.9.1. Statistics
- The following program computes statistics -- means, maxima, minima,
- variance, standard deviation, and correlation -- from data stored in
- parallel arrays, \&x[] and \&y[], which can contain any mixture of
- integer and floating-point numbers: positive, negative, or zero. Array
- setup and validation are not shown. Except for the traditional FOR loop
- and printing the results at the end, the entire computation is done
- with S-Expressions:
- ; Initialize sums, maxima, minima, and number of elements
- (setq xsum 0 ysum 0 xsum2 0 ysum2 0 xysum 0)
- (setq xmin (setq xmax \&x[1]) ymin (setq ymax \&y[1]))
- (setq n \fdim(&x))
- ; Loop through elements and accumulate sums, maxima, and minima
- for i 1 n 1 {
- (setq x \&x[i] y \&y[i]) ; Notational convenience
- (setq xmax (max xmax x) ymax (max ymax y)) ; X and Y maxima
- (setq xmin (min xmin x) ymin (min ymin y)) ; X and Y minima
- (++ xsum x ysum y) ; X and Y sums
- (++ xsum2 (^ x 2) ysum2 (^ y 2)) ; Sum of X and Y squares
- (++ xysum (* x y)) ; Sum of XY products
- }
- ; Calculate results
- (setq xmean (/ xsum n) ymean (/ ysum n)) ; Mean X and Y
- (setq xss (- xsum2 (/ (^ xsum 2) n))) ; Intermediate values
- (setq yss (- ysum2 (/ (^ ysum 2) n)))
- (setq xyss (- xysum (/ (* xsum ysum) n)))
- (setq xvar (/ xss n) yvar (/ yss n)) ; X and Y variance
- (setq sdx (sqrt xvar) sdy (sqrt yvar)) ; Std deviation in X and Y
- (setq tmp (* xss yss))
- (setq cc (if tmp (/ xyss (sqrt tmp)) 1.0)) ; Correlation coefficient
- show macro xmean ymean xvar yvar sdx sdy cc ; Print the results
- The final "if tmp" check accounts for the possibility that both arrays
- contain all 0's. Results can also be printed with "echo CC = \m(cc)",
- or any other desired way. Interestingly, if we had not needed the sum
- of the squares and products, we could have obtained the sums, maxima,
- and minima of the X's and Y's without a loop like this:
- (setq xsum (+ \fjoin(&x)) ysum (+ \fjoin(&y)))
- (setq xmax (max \fjoin(&x)) ymax (max \fjoin(&y)))
- (setq xmin (min \fjoin(&x)) ymin (min \fjoin(&y)))
- Any Kermit function that returns numbers or lists of numbers can be
- included in an S-Expression as an operand.
- 9.9.2. Practical Fibonacci Series
- The recursive Fibonacci example given previously is simple and elegant,
- but not very useful since it causes memory occupation to grow each time
- it calls itself, until eventually both physical memory and disk swap
- space are filled and the program crashes. Even for small arguments,
- like 17, execution time can be prohibitive:
- (setq t1 \v(ftime))
- (setq result (fibonacci 17))
- (setq t2 (- \v(ftime) t1))
- echo FIBONACCI(17) = \m(result): TIME = \ffpround(t2,3)
- prints (on a certain rather slow computer):
- FIBONACCI(17) = 1597: TIME = 5.861
- Any recursive function can be recoded iteratively. The result is not as
- pretty, but execution is far less expensive:
- define FIBITER {
- (if (== \%3 0) (\%2) (fibiter (+ \%1 \%2) \%1 (- \%3 1)))
- }
- define FIBONACCI {
- (fibiter 1 0 \%1)
- }
- Here's the result on the same computer for the same argument of 17:
- FIBONACCI(17) = 1597: TIME = 0.015
- (47 times faster.) Execution time increases proportionally to the size
- of the argument in the iterative case, whereas in the recursive case it
- goes up geometrically, quickly reaching infinity.
- [ [540]Top ] [ [541]Contents ] [ [542]C-Kermit Home ] [ [543]Kermit
- Home ]
- 9.10. Differences from Algebraic Notation
- In C-Kermit:
- * Algebraic notation uses infix operators and normal rules of
- operator precedence, with parentheses used to force exceptions to
- the rules; many operations can be included in an expression.
- S-Expressions use prefix operators with no intrinsic precedence;
- each operation is enclosed in parentheses, and the arrangement of
- parentheses determines precedence.
- * Algebraic infix operators require two operands; S-Expression prefix
- operators can accept a variable number of operands.
- * You can use algebraic notation anywhere that C-Kermit accepts a
- number, e.g. "echo \&a[((1+1)*2-1]", but you can use S-Expressions
- only as top-level commands. You can, however, use either algebraic
- or S-Expressions anywhere at all by enclosing them in \fevaluate()
- or \fsexpression(), respectively.
- * You can use any mixture of integer and floating-point numbers in
- S-Expressions, but only integers are permitted in algebraic
- expressions. Outside of S-Expressions, floating point arithmetic is
- supported only by \ffp...() function calls.
- * Operators and operands in S-Expressions must be separated by
- spaces, e.g. "(+ a b)". Spaces are not required in algebraic
- expressions: "((a+b)*c)".
- * When assigning values to backslash variables (such as \%x or
- \&a[2]) using SETQ or LET, you must double the backslash.
- [ [544]Top ] [ [545]Contents ] [ [546]C-Kermit Home ] [ [547]Kermit
- Home ]
- 9.11. Differences from Lisp
- * Kermit has a lot of built-in operators not found in Lisp: ++, ^,
- etc.
- * Most dialects of real Lisp do not allow S-Expressions that don't
- start with an operator, for example:
- (a)
- This expression can cause an error in Lisp (even if "a" has a
- value), but is acceptable in Kermit, where it returns the value of
- the variable "a". Similarly, (1) returns the value "1".
- * In real Lisp, EVAL requires exactly one operand. In Kermit, it can
- have 0, 1, 2, or more operands. It returns the value of the last
- operand evaluated.
- * Real Lisp SETQ and LET usually require an even number of operands.
- Kermit allows an odd number, in which case the last (or only)
- variable is undefined (i.e. deleted, destroyed).
- * Kermit does not support ratios such as "7/8". Some Lisp dialects
- accept ratios as numbers, and generate ratios when told to divide
- two integers whose quotient is not a whole number; e.g. in Common
- Lisp:
- [13] USER(37): (/ (+ 1 2 3 4) 3)
- 10/3
- [13] USER(38):
- * The result of (/ 10 3) is 3.333.... Some Lisp dialects truncate the
- result to 3 since both operands are integers, some don't; some give
- the result as a ratio. C-Kermit always gives a floating point
- result when there is a fractional part. If you want an integer
- result, you can use TRUNCATE, FLOOR, or CEILING, e.g. (truncate (/
- 10 3)).
- * There is currently no "bignum" support. Large numbers can be used
- and large results generated, but (as noted in [548]Section 9.2)
- they are accurate only to the precision of the underlying machine.
- \v(math_precision) gives the machine precision as a number of
- decimal digits, e.g. 16.
- * Scientific notation for floating-point numbers is not supported. If
- the magnitude of a number is greater than the precision of the
- underlying hardware, the less-significant digits are shown but
- their values are meaningless. If it the number is too small to be
- represented internally, it is shown as "0.0".
- * Many Lisp features are omitted: List processing (CAR, CDR, etc),
- DEFUN, Lisp-specific control structures, and so on.
- [ [549]Top ] [ [550]Contents ] [ [551]C-Kermit Home ] [ [552]Kermit
- Home ]
- 10. FILE TRANSFER
- New commands and switches:
- SET TRANSFER REPORT { OFF, ON }
- Enables or disables the (new) one-line message printed by Kermit
- after a remote-mode file transfer to indicate the source and
- destination file, complete with path, to let you know where the
- file went.
- SEND /TYPE:{TEXT,BINARY}
- Sends only files of the given type (see [553]Section 4).
- SEND /NOFOLLOWLINKS:
- (UNIX only) Skip over symbolic links rather than following them
- (default). This applies to wildcard and/or recursive SENDs; if a
- single filename is given, and it happens to be a symbolic link,
- the file it points to is sent.
- SEND /FOLLOWLINKS:
- (UNIX only) Follow (resolve) symbolic links. Watch out for
- circular links, endless loops, etc.
- SET SEND I-PACKETS { OFF, ON }
- When sending commands to a Kermit server, this tells whether
- command packets should be preceded by an I (information) packet,
- which is used to synchronize parameters prior to executing the
- command. Normally ON. The only reason to set this OFF is for
- communicating with buggy Kermit servers that misbehave when an I
- packet is sent to them. There is also a SET RECEIVE I-PACKETS
- command, but presently it has no effect.
- SET TRANSFER MESSAGE [ text ]
- Sets an initial message to be shown in the Last Message field of
- the fullscreen file-transfer display.
- SET TRANSFER TRANSLATION { ON, OFF }
- Inhibits or re-enables text-file transfer character-set
- translation globally.
- { SEND, MSEND, GET, RECEIVE } /TRANSPARENT
- Inhibits character-set translation for this transfer only.
- { GET, RECEIVE } /PIPES:{ON,OFF}
- Overrides global TRANSFER PIPES setting for this transfer only;
- ON allows incoming files with names like "!tar xf -" to be
- opened as pipelines rather than regular files.
- The following new "hot keys" are available when Kermit's file-transfer
- display is visible:
- D: Turn on debugging, open "debug.log" if not already open.
- d: Turn off debugging but leave log open (if it was open).
- T: Turn on debug-log timestamps.
- t: Turn off debug-log timestamps.
- Other improvements:
- * SET FILE DOWNLOAD-DIRECTORY now works for external protocols (e.g.
- sz/rz) too.
- * Improved automatic per-file text/binary switching, described in
- [554]Section 4.
- * When sending a file group (e.g. "send *.*"), failure to open a file
- is no longer fatal; now C-Kermit simply goes ahead to the next
- file.
- * Transaction log entries are now made for external protocols too.
- [ [555]Top ] [ [556]Contents ] [ [557]C-Kermit Home ] [ [558]Kermit
- Home ]
- 11. MODEMS AND DIALING
- In C-Kermit 8.0, the default modem type for dialing has changed from
- NONE (= DIRECT, meaning no modem) to GENERIC. This change should have
- no impact on direct connections. For dialing, it means that, unless you
- SET MODEM TYPE to a specific type, such as USROBOTICS or CONEXANT,
- Kermit assumes:
- 1. The modem uses the Hayes AT command set.
- 2. The modem supports error correction, data compression, and hardware
- flow control and is already configured to use them.
- In fact, Kermit assumes the modem is completely configured, and
- therefore does not send it an initialization string or any
- configuration commands. Instead, it sends only the simplest and most
- portable commands:
- ATQ0V1 Give dial result codes.
- ATDTnumber Dial the number.
- (or ATD or ATDP, as appropriate).
- The new defaults work for direct connections and for most modern modems
- on most platforms, and they work much faster than "full-treatment"
- dialing. If the new defaults don't work for you, or if you need to
- perform explicit modem configurations or interactions, then set a
- specific modem type and use the SET MODEM and SET DIAL commands as
- documented in Using C-Kermit.
- WARNING: Don't use the generic modem on hosts that do not support
- RTS/CTS flow control. If Xon/Xoff is in use on the serial port,
- you'll need to select a particular modem type so Kermit knows what
- command to give it to enable Xon/Xoff flow control between itself
- and your serial port.
- The following new modem types were added in C-Kermit 8.0:
- lucent: Lucent Venus chipset
- pctel: PCTel V.90 chipset
- conexant: Conexant (ex-Rockwell) modem family
- zoom-v32bis: New name for "Zoom"
- zoom-v34 Zoom V.34
- zoom-v90 Zoom V.90 56K
- zoom-v92: Zoom V.92 with V.44 data compression
- zoltrix-v34: New name for "zoltrix"
- zoltrix-hsp-v90: Synonym for PCTel
- zoltrix-hcf-v90: Synonym for ITU-T-V250
- smartlink-v90: Synonym for usrobotics (same chipset)
- acer-v90: Synonym for Rockwell-v90
- New DIAL-related variables:
- \v(dm_hf): Dial modifier: Wait for Hook-Flash.
- \v(dm_wb): Dial modifier: Wait for Bong.
- Finally, if dialing fails, Kermit now prints a context-sensitive hint
- suggesting possible reasons and remedies.
- Added in C-Kermit 8.0.201: Rudimentary support for Caller ID, for use
- with the ANSWER command. If the modem reports Caller ID information,
- Kermit stores it in variables that you can access after the call is
- answered:
- \v(callid_date) The date of the call
- \v(callid_time) The time of the call
- \v(callid_name) The name of the caller
- \v(callid_nmbr) The telephone number of the caller
- \v(callid_mesg) A message
- The format of these items depends on the originating and answering
- phone companies and the modems and their configuration.
- Not very many modems support Caller ID, and those that do (a) tend to
- have it disabled by default, and (b) use different commands to enable
- it. A quick survey shows of some current models shows:
- - USR V.90: No
- - ITU-T V.250: No
- - Lucent Venus: No
- - Diamond Supra: #CID=1
- - Rockwell 56K: #CID=1
- - PCTEL: #CID=1
- - Zoltrix: +VCID=1
- - Conexant: +VCID=1
- To use Kermit's Caller ID feature, you have to set the modem to wait
- for at least two rings before answering, and you have to give the
- command to enable Caller ID; for example (after choosing a modem with
- SET MODEM TYPE):
- set modem command autoanswer on ATS0=2#CID=1\{13}
- set modem command autoanswer on ATS0=2+VCID=1\{13}
- These commands can be undone with:
- set modem command autoanswer on ATS0=1#CID=0\{13}
- set modem command autoanswer on ATS0=1+VCID=0\{13}
- Kermit presently has no built-in knowledge of the Caller ID
- capabilities or commands of the modems in its database.
- Since the variables can be accessed only after the call is answered,
- the only way to refuse a call is to answer it, inspect the variables,
- and then hang it up if desired.
- [ [559]Top ] [ [560]Contents ] [ [561]C-Kermit Home ] [ [562]Kermit
- Home ]
- 12. TERMINAL CONNECTION
- Now that 7-bit connections are no longer the norm, the default terminal
- bytesize (also called "data size" or "word size") in C-Kermit 8.0 is 8
- bits, rather than 7 bits as it was in C-Kermit 7.0 and earlier:
- SET ESCAPE character
- This command, which specifies your CONNECT-mode escape
- character, allows you to specify any ASCII control character in
- a variety of formats. C-Kermit 8.0.201 now also lets you specify
- any 8-bit value, 128-255, as the escape character. In the SET
- ESCAPE command, you can type the 8-bit character literally or
- you can enter its numeric code. Here are examples that you can
- enter from a terminal or console that uses the ISO Latin-1
- character set:
- C-Kermit> set escape Ã
- C-Kermit> set escape 195
- C-Kermit> show escape
- Escape character: Code 195 (Ã): enabled
- C-Kermit>
- Both of these commands set the escape character value to 195
- (decimal), which happens to be uppercase letter A with Tilde in
- Latin-1. SHOW ESCAPE and SHOW TERMINAL show the value, as does
- the CONNECT message.
- SET TERMINAL AUTODOWNLOAD ERROR { STOP, CONTINUE }
- When Kermit has a terminal connection to another computer, and a
- file transfer is initiated automatically because a Kermit packet
- was received in CONNECT mode (i.e. in the terminal screen), this
- command tells what Kermit should do if the transfer fails. The
- default is to STOP, which leaves Kermit in command mode with its
- file-transfer display showing, so you can see that the transfer
- failed and why. If you SET TERMINAL AUTODOWNLOAD ERROR CONTINUE,
- this causes Kermit to return automatically to its terminal
- screen (i.e. resume its CONNECT session) as if the transfer had
- succeeded; this can be desirable if the entire session is under
- control of a host-based script.
- SET TERMINAL BYTESIZE { 7, 8 }
- The byte size to use during CONNECT and INPUT command execution,
- which can be more restrictive than the bytesize implied by the
- current PARITY setting, but not less restrictive. In C-Kermit
- 7.0 and earlier, the terminal bytesize was 7 by default to
- protect against the likelihood that parity was in use on the
- connection without the user's knowledge. When the terminal
- bytesize is 8 (as it is in C-Kermit 8.0 and later), the user
- will see garbage in this (increasingly unlikely) situation. Note
- that 8 data bits are required for most character sets other than
- ASCII: Latin-1, UTF-8, and so on.
- A new command has been added to produce timestamped session logs:
- SET TERMINAL SESSION-LOG TIMESTAMPED-TEXT
- Records the terminal session in text mode (like SET TERMINAL
- SESSION-LOG TEXT) but adds a timestamp at the beginning of each
- line. The timestamp format is hh:mm:ss.nnn, and indicates the
- time at which the first character of the line appeared.
- In most UNIX versions (those built with the select()-capable CONNECT
- module -- pretty much all the ones that have or could have TELNET
- included), an idle timeout feature has been added:
- SET TERMINAL IDLE-TIMEOUT number
- If the number is not 0, then Kermit is to take an action when
- the given amount of time passes with no activity during CONNECT
- mode. If the number is positive it is the maximum number of idle
- seconds; if number is negative it represents milliseconds
- (thousandths of seconds). If 0 is given as the number, there are
- no idle timeouts. Synonym: SET TERMINAL IDLE-LIMIT.
- SET TERMINAL IDLE-ACTION { RETURN, HANGUP, EXIT, OUTPUT [ string ] }
- The action to be taken upon an idle timeout in CONNECT mode.
- RETURN to the prompt, HANGUP the connection, EXIT from Kermit,
- or OUTPUT the given string (if no string is given, a NUL (ASCII
- 0) character is sent).
- SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT }
- Actions that can be selected on Telnet connections only, that
- might be useful if idle limits are enforced by the Telnet server
- or in the TCP/IP protocol: TELNET-NOP sends a "NO Operation"
- (do-nothing) command, which causes no response from the server;
- TELNET-AYT sends an "Are You There" message to the server, which
- should make the server send back a message. Neither of these
- actions interferes with your remote session.
- SET TERMINAL IDLE-ACTION is useful for connections to hosts or services
- that automatically log you out after a certain amount of idle time,
- e.g.:
- set term idle-timeout 300
- set term idle-action output \32
- sends a space (as if you had pressed the space bar) every 300 seconds
- (five minutes) while there is no activity (32 is the ASCII code for
- space).
- When C-Kermit returns from CONNECT to command mode, the reason for the
- transition is given in a new variable, \v(cx_status):
- 0 No CONNECT command given yet.
- 1 User escaped back manually.
- 2 A trigger string was encountered.
- 3 IKSD entered server mode.
- 4 Application Program Command received from host.
- 5 Idle timeout.
- 6 Telnet protocol error.
- 7 Keystroke macro.
- 8 Time limit exceeded.
- 100 Internal error.
- 101 Carrier required by not detected.
- 102 I/O error on connection.
- 103 Disconnected by host.
- 104 Disconnected by user.
- 105 Session limit exceeded.
- 106 Rejected due to Telnet policy.
- 107 Received kill signal.
- Values 100 and above indicate there is no connection.
- [ [563]Top ] [ [564]Contents ] [ [565]C-Kermit Home ] [ [566]Kermit
- Home ]
- 13. CHARACTER SETS
- See the section on [567]file scanning above, and the section on
- character-set conversion in [568]FTP. Also:
- * True support for CP1252 (rather than treating it as Latin-1).
- * Proper handling of C1 values when converting ISO 8-bit text to
- UTF-8.
- * TYPE /CHARACTER-SET: /TRANSLATE-TO: allows specific translations.
- * The TRANSLATE command now works on multiple files.
- * K_CHARSET environment variable to set the file character-set.
- * SET TRANSFER TRANSLATION OFF.
- * FTP client character-set translation ([569]Section 3.7).
- [ [570]Top ] [ [571]Contents ] [ [572]C-Kermit Home ] [ [573]Kermit
- Home ]
- 14. DIALOUT FROM TELNET TERMINAL SERVERS
- For years, C-Kermit has supported dialing out from Telnet modem servers
- (also called reverse terminal servers or access servers), but until now
- there was no way for Kermit to control the communication parameters
- (speed, parity, etc) on the serial port of the terminal server; it had
- to use whatever was there.
- But now, if you make a connection to a server that supports the Telnet
- Com Port Control Option, [574]RFC 2217, you have the same degree of
- control as you would have over a serial port on the computer where
- Kermit is running: SET SPEED, SET FLOW, SET PARITY, SET STOP-BITS, SHOW
- COMM, WAIT, SET CARRIER-WATCH, the modem-signal variables, sending
- Break, and so on, apply to the connection between the terminal server
- and the modem.
- For example, using a Cisco Access Server 2509, where specifying a TCP
- port in the 6000's selects a serial port that can be used for dialing
- out:
- set host xxx 6001 ; xxx is the IP hostname or address of the server
- (log in if necessary) ; With a script or by hand
- set modem type usr ; Tell Kermit what kind of modem it has
- set speed 57600 ; This affects the server's port
- set flow rts/cts ; Ditto
- dial 7654321
- The modem server might or might not require a login sequence. It might
- also allow for automatic authentication, e.g. via Kerberos tickets.
- NOTE: If the modem server requires a login sequence, then REDIAL might
- not work as expected.
- When you have a Telnet Com Port connection, your SET SPEED and SET FLOW
- options change automatically to reflect the capabilities of the server,
- rather than those of your local computer.
- See the configuration manual for your server for additional
- information. For example, how to set up the server to drop the Telnet
- connection automatically when the telephone call is hung up (e.g.
- "autohangup" on Cisco models).
- For a Linux-based Telnet Com-Port server, click the Sredird link:
- [ [575]Top ] [ [576]Contents ] [ [577]Sredird ] [ [578]C-Kermit Home ]
- [ [579]Kermit Home ]
- 15. COPING WITH BROKEN KERMIT PARTNERS
- There are lots of faulty Kermit protocol implementations out there,
- found mainly in 3rd-party products ranging from communications software
- packages to file-transfer functions embedded within devices. This topic
- is covered [580]HERE for C-Kermit 7.0, but C-Kermit 8.0 adds some
- additional tricks.
- SET ATTRIBUTE RECORD-FORMAT { ON, OFF }
- Allows control of the Kermit's Record-Format attribute. Set this
- to OFF in case incoming file are refused due to unknown or
- invalid record formats if you want to accept the file anyway.
- SET ATTRIBUTES OFF
- This is not a new trick, but it was recently discovered that the
- Kermit implementation embedded within a certain kind of
- punching/bending machine (Salvagnini if you must know) hangs
- upon reception of standard format Kermit attributes when
- receiving files. When sending files, it sends attributes of its
- own, one per A-packet, which is slightly unusual but legal. When
- receiving files from C-Kermit, K95, MS-DOS Kermit, Kermit-370,
- etc, it simply exits upon reception of the first A-packet;
- apparently it was not coded according to the protocol
- specification, which allows multiple attributes per A-packet.
- Solution: tell the file sender to SET ATTRIBUTES OFF.
- SET SEND I-PACKETS { ON, OFF }
- A Kermit server is supposed to accept I-packets; this is how the
- client lets the server know its capabilities and preferences
- before sending a command. Apparently there is at least one
- Kermit server implementation that does not accept I-packets, and
- does not properly respond with an Error packet if it gets one.
- To get around such situations in C-Kermit 8.0, you can use SET
- SEND I-PACKETS OFF to inhibit the sending of I packets. In this
- case, the client must be able to adjust to the server's
- configuration, rather than the other way around as we are used
- to.
- SET PROTOCOL KERMIT {} {} {}
- C-Kermit 6.0 and later automatically send "autoupload" and
- "autodownload" commands when in local mode and you give a file
- transfer command. For example, if you tell kermit to "send
- oofa.txt", Kermit sends "kermit -r" and a carriage return, in
- case you had forgotten to start Kermit on the far end and told
- it to receive a file. If a Kermit program had already been
- started on the far end, it should harmlessly absorb this string.
- However, some Kermit programs violate the Kermit protocol
- definition and treat such strings as Kermit packets even though
- they are not. In such cases, give this command to set the Kermit
- protocol autoupload and download strings to nothing, which tells
- Kermit not to send them. (This is not a new feature, but it was
- not previously included in the "Coping" section of the
- documentation.)
- [ [581]Top ] [ [582]Contents ] [ [583]C-Kermit Home ] [ [584]Kermit
- Home ]
- 16. NEW COMMAND-LINE OPTIONS
- kermit -h Now prints a complete listing of its command-line options,
- rather than an abbreviated list squeezed into a 24x80 space.
- -dd Debug, like -d but adds timestamps
- --version Shows C-Kermit version number.
- --noperms Equivalent to SET ATTRIBUTE PROTECTION OFF.
- Kermit now accepts a selection of URLs (Universal Resource Locators) as
- its first command-line argument. These are:
- telnet:hostname
- Makes a Telnet connection to the given host (IP hostname or
- address).
- ftp://[user[:password]@]hostname[/path...]
- Makes an FTP connection to the given host (IP hostname or
- address). If a username is given, Kermit tries to log you in; if
- a password is given, it is used; if not, you are prompted for
- one. If no username is given, an anonymous login is performed.
- If a pathname is included, Kermit tries to GET the given file.
- See [585]Section 3.1.3 for details.
- ftps://[user[:password]@]hostname[/path...]
- Makes a secure FTP connection over SSL.
- telnets://[user[:password]@]hostname
- Makes a secure Telnet connection over SSL.
- kermit://[user[:password]@]hostname[/path...]
- Makes a connection to an [586]Internet Kermit Server.
- http://[user[:password]@]hostname[/path...]
- Makes a connection to Web server.
- https://[user[:password]@]hostname[/path...]
- Makes a connection to secure Web server.
- [ [587]Top ] [ [588]Contents ] [ [589]C-Kermit Home ] [ [590]Kermit
- Home ]
- 17. LOGS
- In C-Kermit 8.0, we make an effort to keep passwords out of the debug
- log. This can never be 100% effective, but it's better than before,
- when there were no precautions at all. Whenever Kermit knows it's
- prompting for, parsing, or transmitting a password, it temporarily
- turns off logging and then turns it back on afterwards. This keeps the
- debug log password-free in most common cases, but there can be no
- guarantees.
- As noted elsewhere, the new "-dd" command-line option selects a
- timestamped debug log (equivalent to "set debug timestamps on", "log
- debug debug.log").
- C-Kermit 8.0 also supports a new timestamped session log via "set
- session-log timestamped-text", "log session".
- There have been requests for other kinds of logs, for example a command
- log. These might be added at some point. One person wanted to be able
- to log commands with timestamps, but only commands issued at the
- prompt, not commands from files or macros, and also wanted a header
- line at the beginning showing the date, user, and host. This can be
- done as follows:
- .filename := \v(home)commands.log ; (for example)
- fopen /write \%c \m(filename)
- if success {
- fwrite /line \%c \v(date): User=\v(user) Host=\v(host)
- fclose \%c
- set debug timestamps on
- log debug {| grep "CMD(P)" >> \m(filename)} append
- }
- [ [591]Top ] [ [592]Contents ] [ [593]C-Kermit Home ] [ [594]Kermit
- Home ]
- __________________________________________________________________
- C-Kermit 8.0 Update Notes / [595]The Kermit Project / Columbia
- University / 15 Dec 2003 - 13 Sep 2010
- References
- 1. http://www.columbia.edu/
- 2. mailto:kermit@columbia.edu
- 3. http://www.columbia.edu/kermit/index.html
- 4. http://www.columbia.edu/kermit/k95.html
- 5. http://www.columbia.edu/kermit/ckermit.html
- 6. http://www.columbia.edu/kermit/ckscripts.html
- 7. http://www.columbia.edu/kermit/current.html
- 8. http://www.columbia.edu/kermit/whatsnew.html
- 9. http://www.columbia.edu/kermit/faq.html
- 10. http://www.columbia.edu/kermit/support.html
- 11. http://www.columbia.edu/kermit/ckermit80.html#contents
- 12. http://www.columbia.edu/kermit/ckermit.html
- 13. http://www.columbia.edu/kermit/index.html
- 14. http://www.amazon.com/gp/product/1555581641?ie=UTF8&tag=aleidmoreldom-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1555581641
- 15. http://www.columbia.edu/kermit/ckermit80.html
- 16. mailto:kermit-support@columbia.edu
- 17. http://www.columbia.edu/kermit/
- 18. http://www.kermit-project.org/
- 19. http://www.columbia.nyc.ny.us/kermit/
- 20. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
- 21. ftp://kermit.columbia.edu/kermit/f/ckcmai.c
- 22. http://www.columbia.edu/kermit/ckermit80.html#xv
- 23. http://www.columbia.edu/kermit/ck60manual.html
- 24. http://www.columbia.edu/kermit/ckermi70.html
- 25. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt
- 26. http://www.columbia.edu/kermit/ckututor.html
- 27. ftp://kermit.columbia.edu/kermit/f/ckuker.nr
- 28. http://www.columbia.edu/kermit/security.htm
- 29. http://www.columbia.edu/kermit/telnet.htm
- 30. http://www.columbia.edu/kermit/ftpscripts.html
- 31. http://www.columbia.edu/kermit/ckcbwr.html
- 32. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt
- 33. http://www.columbia.edu/kermit/ckubwr.html
- 34. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
- 35. http://www.columbia.edu/kermit/ckvbwr.html
- 36. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt
- 37. http://www.columbia.edu/kermit/ckuins.html
- 38. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
- 39. http://www.columbia.edu/kermit/ckvins.html
- 40. ftp://kermit.columbia.edu/kermit/f/ckvins.txt
- 41. http://www.columbia.edu/kermit/ckccfg.html
- 42. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
- 43. http://www.columbia.edu/kermit/ckcplm.html
- 44. ftp://kermit.columbia.edu/kermit/f/ckcplm.txt
- 45. http://www.columbia.edu/kermit/iksd.html
- 46. http://www.columbia.edu/kermit/skermit.html
- 47. http://www.columbia.edu/kermit/ckermit80.html#top
- 48. http://www.columbia.edu/kermit/ckermit.html
- 49. http://www.columbia.edu/kermit/index.html
- 50. http://www.columbia.edu/kermit/ckermit80.html#x0
- 51. http://www.columbia.edu/kermit/ckermit80.html#x1
- 52. http://www.columbia.edu/kermit/ckermit80.html#x2
- 53. http://www.columbia.edu/kermit/ckermit80.html#x2.1
- 54. http://www.columbia.edu/kermit/ckermit80.html#x2.2
- 55. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1
- 56. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2
- 57. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3
- 58. http://www.columbia.edu/kermit/ckermit80.html#x2.2.4
- 59. http://www.columbia.edu/kermit/ckermit80.html#x2.2.5
- 60. http://www.columbia.edu/kermit/ckermit80.html#x2.2.6
- 61. http://www.columbia.edu/kermit/ckermit80.html#x3
- 62. http://www.columbia.edu/kermit/ckermit80.html#x3.1
- 63. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1
- 64. http://www.columbia.edu/kermit/ckermit80.html#x3.1.2
- 65. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
- 66. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
- 67. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 68. http://www.columbia.edu/kermit/ckermit80.html#x3.3
- 69. http://www.columbia.edu/kermit/ckermit80.html#x3.4
- 70. http://www.columbia.edu/kermit/ckermit80.html#x3.5
- 71. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1
- 72. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
- 73. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3
- 74. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 75. http://www.columbia.edu/kermit/ckermit80.html#x3.6.1
- 76. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
- 77. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3
- 78. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 79. http://www.columbia.edu/kermit/ckermit80.html#x3.7.1
- 80. http://www.columbia.edu/kermit/ckermit80.html#x3.7.2
- 81. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 82. http://www.columbia.edu/kermit/ckermit80.html#x3.9
- 83. http://www.columbia.edu/kermit/ckermit80.html#x3.10
- 84. http://www.columbia.edu/kermit/ckermit80.html#x3.10.1
- 85. http://www.columbia.edu/kermit/ckermit80.html#x3.10.2
- 86. http://www.columbia.edu/kermit/ckermit80.html#x3.10.3
- 87. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 88. http://www.columbia.edu/kermit/ckermit80.html#x4
- 89. http://www.columbia.edu/kermit/ckermit80.html#x5
- 90. http://www.columbia.edu/kermit/ckermit80.html#x6
- 91. http://www.columbia.edu/kermit/ckermit80.html#x6.1
- 92. http://www.columbia.edu/kermit/ckermit80.html#x6.2
- 93. http://www.columbia.edu/kermit/ckermit80.html#x6.3
- 94. http://www.columbia.edu/kermit/ckermit80.html#x6.4
- 95. http://www.columbia.edu/kermit/ckermit80.html#x6.5
- 96. http://www.columbia.edu/kermit/ckermit80.html#x6.6
- 97. http://www.columbia.edu/kermit/ckermit80.html#x7
- 98. http://www.columbia.edu/kermit/ckermit80.html#x8
- 99. http://www.columbia.edu/kermit/ckermit80.html#x8.1
- 100. http://www.columbia.edu/kermit/ckermit80.html#x8.2
- 101. http://www.columbia.edu/kermit/ckermit80.html#x8.3
- 102. http://www.columbia.edu/kermit/ckermit80.html#x8.4
- 103. http://www.columbia.edu/kermit/ckermit80.html#x8.5
- 104. http://www.columbia.edu/kermit/ckermit80.html#x8.6
- 105. http://www.columbia.edu/kermit/ckermit80.html#x8.7
- 106. http://www.columbia.edu/kermit/ckermit80.html#x8.8
- 107. http://www.columbia.edu/kermit/ckermit80.html#x8.9
- 108. http://www.columbia.edu/kermit/ckermit80.html#x8.10
- 109. http://www.columbia.edu/kermit/ckermit80.html#x8.11
- 110. http://www.columbia.edu/kermit/ckermit80.html#x8.12
- 111. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 112. http://www.columbia.edu/kermit/ckermit80.html#x8.14
- 113. http://www.columbia.edu/kermit/ckermit80.html#x9
- 114. http://www.columbia.edu/kermit/ckermit80.html#x9.1
- 115. http://www.columbia.edu/kermit/ckermit80.html#x9.2
- 116. http://www.columbia.edu/kermit/ckermit80.html#x9.3
- 117. http://www.columbia.edu/kermit/ckermit80.html#x9.4
- 118. http://www.columbia.edu/kermit/ckermit80.html#x9.5
- 119. http://www.columbia.edu/kermit/ckermit80.html#x9.6
- 120. http://www.columbia.edu/kermit/ckermit80.html#x9.7
- 121. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 122. http://www.columbia.edu/kermit/ckermit80.html#x9.9
- 123. http://www.columbia.edu/kermit/ckermit80.html#x9.10
- 124. http://www.columbia.edu/kermit/ckermit80.html#x9.11
- 125. http://www.columbia.edu/kermit/ckermit80.html#x10
- 126. http://www.columbia.edu/kermit/ckermit80.html#x11
- 127. http://www.columbia.edu/kermit/ckermit80.html#x12
- 128. http://www.columbia.edu/kermit/ckermit80.html#x13
- 129. http://www.columbia.edu/kermit/ckermit80.html#x14
- 130. http://www.columbia.edu/kermit/ckermit80.html#x15
- 131. http://www.columbia.edu/kermit/ckermit80.html#x16
- 132. http://www.columbia.edu/kermit/ckermit80.html#x17
- 133. http://www.columbia.edu/kermit/ckermit80.html#top
- 134. http://www.columbia.edu/kermit/ckermit.html
- 135. http://www.columbia.edu/kermit/index.html
- 136. http://www.columbia.edu/kermit/ckuins.html#x5
- 137. http://www.columbia.edu/kermit/ckuins.html
- 138. http://www.columbia.edu/kermit/ckermit80.html#x5
- 139. http://www.columbia.edu/kermit/ckermit80.html#x2.2
- 140. http://www.columbia.edu/kermit/ckermit80.html#contents
- 141. http://www.columbia.edu/kermit/ckermit80.html#x15
- 142. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 143. http://www.columbia.edu/kermit/ckermit80.html#ftpdates
- 144. http://www.columbia.edu/kermit/ckermit80.html#ftpcheck
- 145. http://www.columbia.edu/kermit/ckermit80.html#ftpnamelist
- 146. http://www.columbia.edu/kermit/ckermit80.html#srvrename
- 147. http://www.columbia.edu/kermit/ckermit80.html#ftpvdir
- 148. http://www.columbia.edu/kermit/ckermit80.html#setftptype
- 149. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 150. http://www.columbia.edu/kermit/ckermit80.html#x15
- 151. http://www.columbia.edu/kermit/ckermit80.html#x8.7
- 152. http://www.columbia.edu/kermit/ckermit80.html#x2.1
- 153. http://www.columbia.edu/kermit/ckermit80.html#x2.2
- 154. http://www.columbia.edu/kermit/ckermit80.html#x8.14
- 155. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 156. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 157. http://www.columbia.edu/kermit/ckututor.html
- 158. http://www.columbia.edu/kermit/ckuins.html
- 159. http://www.columbia.edu/kermit/skermit.html
- 160. http://www.columbia.edu/kermit/ckermit80.html#setlocus
- 161. http://www.columbia.edu/kermit/ckermit80.html#lcommands
- 162. http://www.columbia.edu/kermit/ckermit80.html#ftpuser
- 163. http://www.columbia.edu/kermit/ckermit80.html#showvar
- 164. http://www.columbia.edu/kermit/ckermit80.html#callerid
- 165. http://www.columbia.edu/kermit/ckermit80.html#x6.6
- 166. http://www.columbia.edu/kermit/ckermit80.html#x0
- 167. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 168. http://www.columbia.edu/kermit/ckermit80.html#top
- 169. http://www.columbia.edu/kermit/ckermit80.html#contents
- 170. http://www.columbia.edu/kermit/ckermit.html
- 171. http://www.columbia.edu/kermit/index.html
- 172. http://www.columbia.edu/kermit/ckermit80.html#x0
- 173. http://www.columbia.edu/kermit/ckermit80.html#top
- 174. http://www.columbia.edu/kermit/ckermit80.html#contents
- 175. http://www.columbia.edu/kermit/ckermit.html
- 176. http://www.columbia.edu/kermit/index.html
- 177. http://www.columbia.edu/kermit/k95.html
- 178. http://www.columbia.edu/kermit/sshclient.html
- 179. http://www.columbia.edu/kermit/skermit.html
- 180. http://www.columbia.edu/kermit/skermit.html
- 181. http://www.columbia.edu/kermit/sshclien.htm
- 182. http://www.columbia.edu/kermit/ckermit80.html#x3
- 183. ftp://ftp.isi.edu/in-notes/rfc1738.txt
- 184. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2
- 185. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1
- 186. ftp://ftp.isi.edu/in-notes/rfc2396.txt
- 187. ftp://ftp.isi.edu/in-notes/rfc2616.txt
- 188. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3
- 189. ftp://ftp.isi.edu/in-notes/rfc2616.txt
- 190. http://www.columbia.edu/kermit/ckermit80.html#x8.13.7
- 191. http://www.columbia.edu/kermit/security.htm#x5.4
- 192. http://www.columbia.edu/kermit/security.htm#x15
- 193. http://www.columbia.edu/kermit/security.htm#x6.2
- 194. http://www.columbia.edu/kermit/security.html
- 195. http://www.columbia.edu/kermit/ckermit80.html#x16
- 196. http://www.columbia.edu/kermit/ckermit80.html#top
- 197. http://www.columbia.edu/kermit/ckermit80.html#contents
- 198. http://www.columbia.edu/kermit/ckermit.html
- 199. http://www.columbia.edu/kermit/index.html
- 200. http://www.columbia.edu/kermit/ckermit80.html#x3.1
- 201. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 202. http://www.columbia.edu/kermit/ckermit80.html#x3.3
- 203. http://www.columbia.edu/kermit/ckermit80.html#x3.4
- 204. http://www.columbia.edu/kermit/ckermit80.html#x3.5
- 205. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 206. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 207. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 208. http://www.columbia.edu/kermit/ckermit80.html#x3.9
- 209. http://www.columbia.edu/kermit/ckermit80.html#x3.10
- 210. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 211. http://www.columbia.edu/kermit/security.htm
- 212. http://www.columbia.edu/kermit/security.htm#servers
- 213. http://www.columbia.edu/kermit/ckcsets.html
- 214. http://www.columbia.edu/kermit/unicode.html
- 215. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
- 216. http://www.columbia.edu/kermit/case10.html
- 217. http://www.columbia.edu/kermit/ckermit80.html#x4
- 218. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 219. http://www.columbia.edu/kermit/ftpscripts.html
- 220. http://www.columbia.edu/kermit/ckermit80.html#top
- 221. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 222. http://www.columbia.edu/kermit/ftpclient.html
- 223. http://www.columbia.edu/kermit/ftpscripts.html
- 224. http://www.columbia.edu/kermit/ckermit.html
- 225. http://www.columbia.edu/kermit/index.html
- 226. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1
- 227. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
- 228. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
- 229. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
- 230. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
- 231. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 232. http://www.columbia.edu/kermit/ckermit80.html#x3.5
- 233. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 234. http://www.columbia.edu/kermit/ftpscripts.html
- 235. http://www.columbia.edu/kermit/ckb2.htm
- 236. http://www.columbia.edu/kermit/ckermit80.html#ftpautolog
- 237. http://www.columbia.edu/kermit/ckermit80.html#ftpuser
- 238. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 239. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 240. http://www.columbia.edu/kermit/ckermit80.html#top
- 241. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 242. http://www.columbia.edu/kermit/ckermit.html
- 243. http://www.columbia.edu/kermit/index.html
- 244. http://www.columbia.edu/kermit/ibm_ie.html
- 245. http://www.columbia.edu/kermit/ckermit80.html#x3.10
- 246. http://www.columbia.edu/kermit/ckermit80.html#top
- 247. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 248. http://www.columbia.edu/kermit/ckermit.html
- 249. http://www.columbia.edu/kermit/index.html
- 250. http://www.columbia.edu/kermit/ck60manual.html
- 251. http://www.columbia.edu/kermit/ckermit70.html#x4.17
- 252. http://www.columbia.edu/kermit/ckermit70.html
- 253. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 254. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 255. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
- 256. http://www.columbia.edu/kermit/security.html
- 257. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 258. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 259. http://www.columbia.edu/kermit/ckermit80.html#x8.13.4
- 260. http://www.columbia.edu/kermit/ckermit80.html#permswitch
- 261. http://www.columbia.edu/kermit/ckermit80.html#ftpchmod
- 262. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
- 263. http://www.columbia.edu/kermit/ckermit80.html#x4
- 264. http://www.columbia.edu/kermit/ckermit80.html#top
- 265. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 266. http://www.columbia.edu/kermit/ckermit.html
- 267. http://www.columbia.edu/kermit/index.html
- 268. http://www.columbia.edu/kermit/ckermit80.html#x7
- 269. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 270. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 271. http://www.columbia.edu/kermit/ckb2.htm
- 272. http://www.columbia.edu/kermit/ckermit80.html#x3.10
- 273. http://www.columbia.edu/kermit/ckermit80.html#x3.10
- 274. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 275. http://www.columbia.edu/kermit/ckermit80.html#setftptype
- 276. http://www.columbia.edu/kermit/ckermit80.html#top
- 277. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 278. http://www.columbia.edu/kermit/ckermit.html
- 279. http://www.columbia.edu/kermit/index.html
- 280. http://www.columbia.edu/kermit/ckermit70.html#x4.9
- 281. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1
- 282. http://www.columbia.edu/kermit/ckermit80.html#erroraction
- 283. http://www.columbia.edu/kermit/ckermit70.html#x1.5
- 284. http://www.columbia.edu/kermit/ckermit70.html#x4.7
- 285. http://www.columbia.edu/kermit/ckermit70.html#x1.6
- 286. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 287. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
- 288. http://www.columbia.edu/kermit/ckermi70.htm
- 289. http://www.columbia.edu/kermit/ckermit80.html#x4
- 290. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 291. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
- 292. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 293. http://www.columbia.edu/kermit/ckermit80.html#erroraction
- 294. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
- 295. http://www.columbia.edu/kermit/ckermit80.html#erroraction
- 296. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
- 297. http://www.columbia.edu/kermit/ckermit80.html#ftpperms
- 298. http://www.columbia.edu/kermit/ckermit80.html#ftpunique
- 299. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
- 300. http://www.columbia.edu/kermit/ckermit80.html#note_utc
- 301. http://www.columbia.edu/kermit/ckermit80.html#note_date
- 302. http://www.columbia.edu/kermit/ckermit80.html#x3.6
- 303. http://www.boulder.nist.gov/timefreq/faq/faq.htm#10:
- 304. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 305. http://www.columbia.edu/kermit/ckermit80.html#top
- 306. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 307. http://www.columbia.edu/kermit/ckermit.html
- 308. http://www.columbia.edu/kermit/index.html
- 309. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 310. http://www.columbia.edu/kermit/ckermi70.htm#x4.3
- 311. http://www.columbia.edu/kermit/ckermit70.html
- 312. http://www.columbia.edu/kermit/ckermit80.html#x5
- 313. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3
- 314. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
- 315. http://www.columbia.edu/kermit/ckermi70.htm#x4.1
- 316. http://www.columbia.edu/kermit/ckermi70.htm#x4.2.2
- 317. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
- 318. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
- 319. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 320. http://www.columbia.edu/kermit/ckermit80.html#x3.11
- 321. http://www.columbia.edu/kermit/ckermit80.html#srvrename
- 322. http://www.columbia.edu/kermit/ckermi70.htm#x4.1
- 323. http://www.columbia.edu/kermit/ckermi70.htm
- 324. http://www.columbia.edu/kermit/ckb2.htm
- 325. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
- 326. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3
- 327. http://www.proftpd.net/
- 328. http://www.columbia.edu/kermit/ckermit80.html#top
- 329. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 330. http://www.columbia.edu/kermit/ckermit.html
- 331. http://www.columbia.edu/kermit/index.html
- 332. http://www.columbia.edu/kermit/ckb2.htm
- 333. http://www.columbia.edu/kermit/ckcsets.html
- 334. http://www.columbia.edu/kermit/unicode.html
- 335. http://www.columbia.edu/kermit/ckcsets.html
- 336. http://www.columbia.edu/kermit/ckcsets.html
- 337. http://www.columbia.edu/kermit/ckermit80.html#x4
- 338. http://www.columbia.edu/kermit/utf8.html
- 339. http://www.columbia.edu/kermit/ckcsets.html
- 340. http://www.columbia.edu/kermit/ckermit80.html#x4
- 341. ftp://ftp.isi.edu/in-notes/rfc2640.txt
- 342. http://www.columbia.edu/kermit/ckermit80.html#top
- 343. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 344. http://www.columbia.edu/kermit/ckermit.html
- 345. http://www.columbia.edu/kermit/index.html
- 346. http://www.columbia.edu/kermit/ckermit80.html#top
- 347. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 348. http://www.columbia.edu/kermit/ckermit.html
- 349. http://www.columbia.edu/kermit/index.html
- 350. http://www.columbia.edu/kermit/ckermit80.html#top
- 351. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 352. http://www.columbia.edu/kermit/ckermit.html
- 353. http://www.columbia.edu/kermit/index.html
- 354. http://www.columbia.edu/kermit/ftpscripts.html
- 355. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 356. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 357. ftp://ftp.isi.edu/in-notes/rfc959.txt
- 358. http://www.columbia.edu/kermit/ckscripts.html
- 359. http://www.columbia.edu/kermit/ckermit80.html#top
- 360. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 361. http://www.columbia.edu/kermit/ftpscript.html
- 362. http://www.columbia.edu/kermit/ckermit.html
- 363. http://www.columbia.edu/kermit/index.html
- 364. http://www.columbia.edu/kermit/ckermit80.html#x3.11.1
- 365. http://www.columbia.edu/kermit/ckermit80.html#x3.11.2
- 366. http://www.columbia.edu/kermit/ckermit80.html#x3.11.3
- 367. http://www.columbia.edu/kermit/ckermit80.html#x3.11.4
- 368. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5
- 369. http://www.columbia.edu/kermit/ckermit.html
- 370. http://www.columbia.edu/kermit/k95.html
- 371. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5
- 372. ftp://ftp.isi.edu/in-notes/rfc959.txt
- 373. ftp://ftp.isi.edu/in-notes/rfc2389.txt
- 374. http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16.txt
- 375. http://www.columbia.edu/kermit/ftpclient.html
- 376. http://www.columbia.edu/kermit/ckermit80.html#top
- 377. http://www.columbia.edu/kermit/ckermit80.html#ftp
- 378. http://www.columbia.edu/kermit/ckermit.html
- 379. http://www.columbia.edu/kermit/index.html
- 380. http://www.columbia.edu/kermit/ckermit80.html#x3
- 381. http://www.columbia.edu/kermit/ckermit80.html#ucs2
- 382. http://www.columbia.edu/kermit/ckermit80.html#top
- 383. http://www.columbia.edu/kermit/ckermit80.html#contents
- 384. http://www.columbia.edu/kermit/ckermit.html
- 385. http://www.columbia.edu/kermit/index.html
- 386. http://www.columbia.edu/kermit/ckermit80.html#top
- 387. http://www.columbia.edu/kermit/ckermit80.html#contents
- 388. http://www.columbia.edu/kermit/ckermit.html
- 389. http://www.columbia.edu/kermit/index.html
- 390. http://www.columbia.edu/kermit/ckb2.htm
- 391. http://www.columbia.edu/kermit/ckermit80.html#top
- 392. http://www.columbia.edu/kermit/ckermit80.html#contents
- 393. http://www.columbia.edu/kermit/ckermit.html
- 394. http://www.columbia.edu/kermit/index.html
- 395. http://www.columbia.edu/kermit/ckermit80.html#x4
- 396. http://www.columbia.edu/kermit/ckermit80.html#x4
- 397. http://www.columbia.edu/kermit/ckermit80.html#x8.12
- 398. http://www.columbia.edu/kermit/ckermit80.html#x8.1
- 399. http://www.columbia.edu/kermit/ckermit80.html#x12
- 400. http://www.columbia.edu/kermit/ckermit80.html#x8.12
- 401. http://www.columbia.edu/kermit/ckermit80.html#top
- 402. http://www.columbia.edu/kermit/ckermit80.html#contents
- 403. http://www.columbia.edu/kermit/ckermit.html
- 404. http://www.columbia.edu/kermit/index.html
- 405. http://www.columbia.edu/kermit/ckermit80.html#x8.14
- 406. http://www.columbia.edu/kermit/ckermit80.html#top
- 407. http://www.columbia.edu/kermit/ckermit80.html#contents
- 408. http://www.columbia.edu/kermit/ckermit.html
- 409. http://www.columbia.edu/kermit/index.html
- 410. http://www.columbia.edu/kermit/ckermit80.html#x9
- 411. http://www.columbia.edu/kermit/ckermit80.html#top
- 412. http://www.columbia.edu/kermit/ckermit80.html#contents
- 413. http://www.columbia.edu/kermit/ckermit.html
- 414. http://www.columbia.edu/kermit/index.html
- 415. http://www.columbia.edu/kermit/ckermit80.html#x8.6
- 416. http://www.columbia.edu/kermit/ckermit80.html#top
- 417. http://www.columbia.edu/kermit/ckermit80.html#contents
- 418. http://www.columbia.edu/kermit/ckermit.html
- 419. http://www.columbia.edu/kermit/index.html
- 420. http://www.columbia.edu/kermit/ckermit80.html#top
- 421. http://www.columbia.edu/kermit/ckermit80.html#contents
- 422. http://www.columbia.edu/kermit/ckermit.html
- 423. http://www.columbia.edu/kermit/index.html
- 424. http://www.columbia.edu/kermit/ckermit80.html#top
- 425. http://www.columbia.edu/kermit/ckermit80.html#contents
- 426. http://www.columbia.edu/kermit/ckermit.html
- 427. http://www.columbia.edu/kermit/index.html
- 428. http://www.columbia.edu/kermit/ckermit80.html#fjoin
- 429. http://www.columbia.edu/kermit/ckermit80.html#fsplit
- 430. http://www.columbia.edu/kermit/ckermit80.html#x8.10
- 431. http://www.columbia.edu/kermit/ckermit80.html#top
- 432. http://www.columbia.edu/kermit/ckermit80.html#contents
- 433. http://www.columbia.edu/kermit/ckermit.html
- 434. http://www.columbia.edu/kermit/index.html
- 435. http://www.columbia.edu/kermit/ckermit80.html#x9
- 436. http://www.columbia.edu/kermit/ckermit80.html#x9
- 437. http://www.columbia.edu/kermit/ckermit80.html#x9
- 438. http://www.columbia.edu/kermit/ckermit80.html#x3
- 439. http://www.columbia.edu/kermit/ckermit80.html#x3
- 440. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 441. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 442. http://www.columbia.edu/kermit/ckermit80.html#x3.8
- 443. http://www.columbia.edu/kermit/ckermit80.html#x3
- 444. http://www.columbia.edu/kermit/ckermit80.html#x3
- 445. http://www.columbia.edu/kermit/ckermit80.html#x3
- 446. http://www.columbia.edu/kermit/ckermit80.html#x3.2
- 447. http://www.columbia.edu/kermit/ckermit80.html#x3
- 448. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 449. http://www.columbia.edu/kermit/ckermit80.html#x8.13
- 450. http://www.columbia.edu/kermit/ckermit80.html#x9
- 451. http://www.columbia.edu/kermit/ckermit80.html#x8.10
- 452. http://www.columbia.edu/kermit/ckermit80.html#x8.7.4
- 453. http://www.columbia.edu/kermit/ckermit80.html#top
- 454. http://www.columbia.edu/kermit/ckermit80.html#contents
- 455. http://www.columbia.edu/kermit/ckermit.html
- 456. http://www.columbia.edu/kermit/index.html
- 457. http://www.columbia.edu/kermit/ckermit80.html#top
- 458. http://www.columbia.edu/kermit/ckermit80.html#contents
- 459. http://www.columbia.edu/kermit/ckermit.html
- 460. http://www.columbia.edu/kermit/index.html
- 461. http://www.columbia.edu/kermit/ckermit80.html#top
- 462. http://www.columbia.edu/kermit/ckermit80.html#contents
- 463. http://www.columbia.edu/kermit/ckermit.html
- 464. http://www.columbia.edu/kermit/index.html
- 465. http://www.columbia.edu/kermit/ckermit80.html#x8.7
- 466. http://www.columbia.edu/kermit/ckermit80.html#top
- 467. http://www.columbia.edu/kermit/ckermit80.html#contents
- 468. http://www.columbia.edu/kermit/ckermit.html
- 469. http://www.columbia.edu/kermit/index.html
- 470. http://www.columbia.edu/kermit/ckermit80.html#scriptedit
- 471. http://www.columbia.edu/kermit/ckermit80.html#top
- 472. http://www.columbia.edu/kermit/ckermit80.html#contents
- 473. http://www.columbia.edu/kermit/ckermit.html
- 474. http://www.columbia.edu/kermit/index.html
- 475. http://www.columbia.edu/kermit/ckermit80.html#top
- 476. http://www.columbia.edu/kermit/ckermit80.html#contents
- 477. http://www.columbia.edu/kermit/ckermit.html
- 478. http://www.columbia.edu/kermit/index.html
- 479. ftp://ftp.isi.edu/in-notes/rfc2822.txt
- 480. ftp://ftp.isi.edu/in-notes/rfc2822.txt
- 481. ftp://ftp.isi.edu/in-notes/rfc2822.txt
- 482. ftp://ftp.isi.edu/in-notes/rfc2822.txt
- 483. http://www.columbia.edu/kermit/ckermit80.html#top
- 484. http://www.columbia.edu/kermit/ckermit80.html#contents
- 485. http://www.columbia.edu/kermit/ckermit.html
- 486. http://www.columbia.edu/kermit/index.html
- 487. http://www.columbia.edu/kermit/ckermit80.html#x8.1
- 488. http://www.columbia.edu/kermit/ckermit80.html#top
- 489. http://www.columbia.edu/kermit/ckermit80.html#contents
- 490. http://www.columbia.edu/kermit/ckermit.html
- 491. http://www.columbia.edu/kermit/index.html
- 492. http://www.columbia.edu/kermit/ckermit80.html#x8.2
- 493. http://www.columbia.edu/kermit/ckermit80.html#top
- 494. http://www.columbia.edu/kermit/ckermit80.html#contents
- 495. http://www.columbia.edu/kermit/ckermit.html
- 496. http://www.columbia.edu/kermit/index.html
- 497. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 498. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 499. http://www.columbia.edu/kermit/ckermit80.html#x8.2
- 500. http://www.columbia.edu/kermit/ckermit80.html#top
- 501. http://www.columbia.edu/kermit/ckermit80.html#contents
- 502. http://www.columbia.edu/kermit/ckermit.html
- 503. http://www.columbia.edu/kermit/index.html
- 504. http://www.columbia.edu/kermit/ckermit80.html#top
- 505. http://www.columbia.edu/kermit/ckermit80.html#contents
- 506. http://www.columbia.edu/kermit/ckermit.html
- 507. http://www.columbia.edu/kermit/index.html
- 508. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 509. http://www.columbia.edu/kermit/ckermit80.html#top
- 510. http://www.columbia.edu/kermit/ckermit80.html#contents
- 511. http://www.columbia.edu/kermit/ckermit.html
- 512. http://www.columbia.edu/kermit/index.html
- 513. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 514. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 515. http://www.columbia.edu/kermit/ckermit80.html#x9.6
- 516. http://www.columbia.edu/kermit/ckermit80.html#top
- 517. http://www.columbia.edu/kermit/ckermit80.html#contents
- 518. http://www.columbia.edu/kermit/ckermit.html
- 519. http://www.columbia.edu/kermit/index.html
- 520. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 521. http://www.columbia.edu/kermit/ckermit80.html#x9.8
- 522. http://www.columbia.edu/kermit/ckermit80.html#top
- 523. http://www.columbia.edu/kermit/ckermit80.html#contents
- 524. http://www.columbia.edu/kermit/ckermit.html
- 525. http://www.columbia.edu/kermit/index.html
- 526. http://www.columbia.edu/kermit/ckermit80.html#top
- 527. http://www.columbia.edu/kermit/ckermit80.html#contents
- 528. http://www.columbia.edu/kermit/ckermit.html
- 529. http://www.columbia.edu/kermit/index.html
- 530. http://www.columbia.edu/kermit/ckermit80.html#top
- 531. http://www.columbia.edu/kermit/ckermit80.html#contents
- 532. http://www.columbia.edu/kermit/ckermit.html
- 533. http://www.columbia.edu/kermit/index.html
- 534. mailto:thucdat@hotmail.com
- 535. http://www.columbia.edu/kermit/ckermit80.html#x9.9.2
- 536. http://www.columbia.edu/kermit/ckermit80.html#top
- 537. http://www.columbia.edu/kermit/ckermit80.html#contents
- 538. http://www.columbia.edu/kermit/ckermit.html
- 539. http://www.columbia.edu/kermit/index.html
- 540. http://www.columbia.edu/kermit/ckermit80.html#top
- 541. http://www.columbia.edu/kermit/ckermit80.html#contents
- 542. http://www.columbia.edu/kermit/ckermit.html
- 543. http://www.columbia.edu/kermit/index.html
- 544. http://www.columbia.edu/kermit/ckermit80.html#top
- 545. http://www.columbia.edu/kermit/ckermit80.html#contents
- 546. http://www.columbia.edu/kermit/ckermit.html
- 547. http://www.columbia.edu/kermit/index.html
- 548. http://www.columbia.edu/kermit/ckermit80.html#x9.2
- 549. http://www.columbia.edu/kermit/ckermit80.html#top
- 550. http://www.columbia.edu/kermit/ckermit80.html#contents
- 551. http://www.columbia.edu/kermit/ckermit.html
- 552. http://www.columbia.edu/kermit/index.html
- 553. http://www.columbia.edu/kermit/ckermit80.html#x4
- 554. http://www.columbia.edu/kermit/ckermit80.html#x4
- 555. http://www.columbia.edu/kermit/ckermit80.html#top
- 556. http://www.columbia.edu/kermit/ckermit80.html#contents
- 557. http://www.columbia.edu/kermit/ckermit.html
- 558. http://www.columbia.edu/kermit/index.html
- 559. http://www.columbia.edu/kermit/ckermit80.html#top
- 560. http://www.columbia.edu/kermit/ckermit80.html#contents
- 561. http://www.columbia.edu/kermit/ckermit.html
- 562. http://www.columbia.edu/kermit/index.html
- 563. http://www.columbia.edu/kermit/ckermit80.html#top
- 564. http://www.columbia.edu/kermit/ckermit80.html#contents
- 565. http://www.columbia.edu/kermit/ckermit.html
- 566. http://www.columbia.edu/kermit/index.html
- 567. http://www.columbia.edu/kermit/ckermit80.html#x4
- 568. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 569. http://www.columbia.edu/kermit/ckermit80.html#x3.7
- 570. http://www.columbia.edu/kermit/ckermit80.html#top
- 571. http://www.columbia.edu/kermit/ckermit80.html#contents
- 572. http://www.columbia.edu/kermit/ckermit.html
- 573. http://www.columbia.edu/kermit/index.html
- 574. ftp://ftp.isi.edu/in-notes/rfc2217.txt
- 575. http://www.columbia.edu/kermit/ckermit80.html#top
- 576. http://www.columbia.edu/kermit/ckermit80.html#contents
- 577. ftp://kermit.columbia.edu/kermit/sredird/
- 578. http://www.columbia.edu/kermit/ckermit.html
- 579. http://www.columbia.edu/kermit/index.html
- 580. http://www.columbia.edu/kermit/ckermi70.htm#x4.22
- 581. http://www.columbia.edu/kermit/ckermit80.html#top
- 582. http://www.columbia.edu/kermit/ckermit80.html#contents
- 583. http://www.columbia.edu/kermit/ckermit.html
- 584. http://www.columbia.edu/kermit/index.html
- 585. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
- 586. http://www.columbia.edu/kermit/cuiksd.html
- 587. http://www.columbia.edu/kermit/ckermit80.html#top
- 588. http://www.columbia.edu/kermit/ckermit80.html#contents
- 589. http://www.columbia.edu/kermit/ckermit.html
- 590. http://www.columbia.edu/kermit/index.html
- 591. http://www.columbia.edu/kermit/ckermit80.html#top
- 592. http://www.columbia.edu/kermit/ckermit80.html#contents
- 593. http://www.columbia.edu/kermit/ckermit.html
- 594. http://www.columbia.edu/kermit/index.html
- 595. http://www.columbia.edu/kermit/index.html
|