1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508 |
- From 866b651bcb9f93f47582e5e2e4f1eb3155025298 Mon Sep 17 00:00:00 2001
- From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
- Date: Sat, 10 Nov 2012 16:21:01 +0100
- Subject: [PATCH] Add rpcgen program from nfs-utils sources
- Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
- [yann.morin.1998@free.fr: update for 0.3.1]
- Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
- ---
- Makefile.am | 2 +-
- configure.ac | 14 +-
- rpcgen/Makefile.am | 22 ++
- rpcgen/rpc_clntout.c | 217 ++++++++++
- rpcgen/rpc_cout.c | 706 +++++++++++++++++++++++++++++++++
- rpcgen/rpc_hout.c | 490 +++++++++++++++++++++++
- rpcgen/rpc_main.c | 1067 ++++++++++++++++++++++++++++++++++++++++++++++++++
- rpcgen/rpc_output.h | 16 +
- rpcgen/rpc_parse.c | 609 ++++++++++++++++++++++++++++
- rpcgen/rpc_parse.h | 166 ++++++++
- rpcgen/rpc_sample.c | 247 ++++++++++++
- rpcgen/rpc_scan.c | 474 ++++++++++++++++++++++
- rpcgen/rpc_scan.h | 103 +++++
- rpcgen/rpc_svcout.c | 882 +++++++++++++++++++++++++++++++++++++++++
- rpcgen/rpc_tblout.c | 165 ++++++++
- rpcgen/rpc_util.c | 479 ++++++++++++++++++++++
- rpcgen/rpc_util.h | 166 ++++++++
- rpcgen/rpcgen.1 | 521 ++++++++++++++++++++++++
- 18 files changed, 6344 insertions(+), 2 deletions(-)
- create mode 100644 rpcgen/Makefile.am
- create mode 100644 rpcgen/rpc_clntout.c
- create mode 100644 rpcgen/rpc_cout.c
- create mode 100644 rpcgen/rpc_hout.c
- create mode 100644 rpcgen/rpc_main.c
- create mode 100644 rpcgen/rpc_output.h
- create mode 100644 rpcgen/rpc_parse.c
- create mode 100644 rpcgen/rpc_parse.h
- create mode 100644 rpcgen/rpc_sample.c
- create mode 100644 rpcgen/rpc_scan.c
- create mode 100644 rpcgen/rpc_scan.h
- create mode 100644 rpcgen/rpc_svcout.c
- create mode 100644 rpcgen/rpc_tblout.c
- create mode 100644 rpcgen/rpc_util.c
- create mode 100644 rpcgen/rpc_util.h
- create mode 100644 rpcgen/rpcgen.1
- diff --git a/Makefile.am b/Makefile.am
- index 466b6dd..8558289 100644
- --- a/Makefile.am
- +++ b/Makefile.am
- @@ -1,4 +1,4 @@
- -SUBDIRS = src man doc
- +SUBDIRS = src man doc rpcgen
- ACLOCAL_AMFLAGS = -I m4
-
- noinst_HEADERS = tirpc/reentrant.h \
- diff --git a/configure.ac b/configure.ac
- index e3cb8af..0ea2e6e 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -58,6 +58,18 @@ AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netine
- AC_CHECK_LIB([pthread], [pthread_create])
- AC_CHECK_FUNCS([getrpcbyname getrpcbynumber setrpcent endrpcent getrpcent])
-
- -AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile])
- +AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes)
- +
- +AC_MSG_CHECKING([for a C compiler for build tools])
- +if test $cross_compiling = yes; then
- + AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc)
- +else
- + CC_FOR_BUILD=$CC
- +fi
- +AC_MSG_RESULT([$CC_FOR_BUILD])
- +AC_SUBST(CC_FOR_BUILD)
- +
- +AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile rpcgen/Makefile])
- +
- AC_OUTPUT(libtirpc.pc)
-
- diff --git a/rpcgen/Makefile.am b/rpcgen/Makefile.am
- new file mode 100644
- index 0000000..2277b6f
- --- /dev/null
- +++ b/rpcgen/Makefile.am
- @@ -0,0 +1,22 @@
- +COMPILE = $(CC_FOR_BUILD) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- + $(CPPFLAGS_FOR_BUILD) $(AM_CFLAGS) $(CFLAGS_FOR_BUILD)
- +LINK = $(CC_FOR_BUILD) $(AM_CFLAGS) $(CFLAGS_FOR_BUILD) $(AM_LDFLAGS) $(LDFLAGS_FOR_BUILD) -o $@
- +
- +noinst_PROGRAMS = rpcgen
- +
- +rpcgen_SOURCES = \
- + rpc_clntout.c \
- + rpc_cout.c \
- + rpc_hout.c \
- + rpc_main.c \
- + rpc_parse.c \
- + rpc_sample.c \
- + rpc_scan.c \
- + rpc_svcout.c \
- + rpc_tblout.c \
- + rpc_util.c \
- + rpc_parse.h \
- + rpc_scan.h \
- + rpc_util.h
- +
- +dist_man1_MANS = rpcgen.1
- diff --git a/rpcgen/rpc_clntout.c b/rpcgen/rpc_clntout.c
- new file mode 100644
- index 0000000..e2f4382
- --- /dev/null
- +++ b/rpcgen/rpc_clntout.c
- @@ -0,0 +1,217 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler
- + * Copyright (C) 1987, Sun Microsytsems, Inc.
- + */
- +#include <stdio.h>
- +#include <string.h>
- +#include <rpc/types.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +#include "rpc_output.h"
- +
- +/* extern pdeclaration(); */
- +/* void printarglist(); */
- +
- +#define DEFAULT_TIMEOUT 25 /* in seconds */
- +static char RESULT[] = "clnt_res";
- +
- +static void write_program(definition *def);
- +static void printbody(proc_list *proc);
- +
- +
- +void
- +write_stubs(void)
- +{
- + list *l;
- + definition *def;
- +
- + f_print(fout,
- + "\n/* Default timeout can be changed using clnt_control() */\n");
- + f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
- + DEFAULT_TIMEOUT);
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind == DEF_PROGRAM) {
- + write_program(def);
- + }
- + }
- +}
- +
- +static void
- +write_program(definition *def)
- +{
- + version_list *vp;
- + proc_list *proc;
- +
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\n");
- + ptype(proc->res_prefix, proc->res_type, 1);
- + f_print(fout, "*\n");
- + pvname(proc->proc_name, vp->vers_num);
- + printarglist(proc, "clnt", "CLIENT *");
- + f_print(fout, "{\n");
- + printbody(proc);
- + f_print(fout, "}\n");
- + }
- + }
- +}
- +
- +/*
- + * Writes out declarations of procedure's argument list.
- + * In either ANSI C style, in one of old rpcgen style (pass by reference),
- + * or new rpcgen style (multiple arguments, pass by value);
- + */
- +
- +/* sample addargname = "clnt"; sample addargtype = "CLIENT * " */
- +
- +void
- +printarglist(proc_list *proc, char *addargname, char *addargtype)
- +{
- +
- + decl_list *l;
- +
- + if (!newstyle) { /* old style: always pass arg by reference */
- + if (Cflag) { /* C++ style heading */
- + f_print(fout, "(");
- + ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
- + f_print(fout, "*argp, %s%s)\n", addargtype, addargname);
- + } else {
- + f_print(fout, "(argp, %s)\n", addargname);
- + f_print(fout, "\t");
- + ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
- + f_print(fout, "*argp;\n");
- + }
- + } else if (streq(proc->args.decls->decl.type, "void")) {
- + /* newstyle, 0 argument */
- + if (Cflag)
- + f_print(fout, "(%s%s)\n", addargtype, addargname);
- + else
- + f_print(fout, "(%s)\n", addargname);
- + } else {
- + /* new style, 1 or multiple arguments */
- + if (!Cflag) {
- + f_print(fout, "(");
- + for (l = proc->args.decls; l != NULL; l = l->next)
- + f_print(fout, "%s, ", l->decl.name);
- + f_print(fout, "%s)\n", addargname);
- + for (l = proc->args.decls; l != NULL; l = l->next) {
- + pdeclaration(proc->args.argname, &l->decl, 1, ";\n");
- + }
- + } else { /* C++ style header */
- + f_print(fout, "(");
- + for (l = proc->args.decls; l != NULL; l = l->next) {
- + pdeclaration(proc->args.argname, &l->decl, 0, ", ");
- + }
- + f_print(fout, " %s%s)\n", addargtype, addargname);
- + }
- + }
- +
- + if (!Cflag)
- + f_print(fout, "\t%s%s;\n", addargtype, addargname);
- +}
- +
- +
- +
- +static char *
- +ampr(char *type)
- +{
- + if (isvectordef(type, REL_ALIAS)) {
- + return ("");
- + } else {
- + return ("&");
- + }
- +}
- +
- +static void
- +printbody(proc_list *proc)
- +{
- + decl_list *l;
- + bool_t args2 = (proc->arg_num > 1);
- +
- + /* For new style with multiple arguments, need a structure in which
- + * to stuff the arguments. */
- + if (newstyle && args2) {
- + f_print(fout, "\t%s", proc->args.argname);
- + f_print(fout, " arg;\n");
- + }
- + f_print(fout, "\tstatic ");
- + if (streq(proc->res_type, "void")) {
- + f_print(fout, "char ");
- + } else {
- + ptype(proc->res_prefix, proc->res_type, 0);
- + }
- + f_print(fout, "%s;\n", RESULT);
- + f_print(fout, "\n");
- + f_print(fout, "\tmemset((char *)%s%s, 0, sizeof(%s));\n",
- + ampr(proc->res_type), RESULT, RESULT);
- + if (newstyle && !args2 && (streq(proc->args.decls->decl.type, "void"))) {
- + /* newstyle, 0 arguments */
- + f_print(fout,
- + "\tif (clnt_call(clnt, %s, (xdrproc_t) xdr_void, (caddr_t) NULL, "
- + "(xdrproc_t) xdr_%s, (caddr_t) %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
- + proc->proc_name,
- + stringfix(proc->res_type), ampr(proc->res_type), RESULT);
- +
- + } else if (newstyle && args2) {
- + /* newstyle, multiple arguments: stuff arguments into structure */
- + for (l = proc->args.decls; l != NULL; l = l->next) {
- + f_print(fout, "\targ.%s = %s;\n",
- + l->decl.name, l->decl.name);
- + }
- + f_print(fout,
- + "\tif (clnt_call(clnt, %s, (xdrproc_t) xdr_%s, (caddr_t) &arg, "
- + "(xdrproc_t) xdr_%s, (caddr_t) %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
- + proc->proc_name, proc->args.argname,
- + stringfix(proc->res_type), ampr(proc->res_type), RESULT);
- + } else { /* single argument, new or old style */
- + f_print(fout,
- + "\tif (clnt_call(clnt, %s, (xdrproc_t) xdr_%s, "
- + "(caddr_t) %s%s, (xdrproc_t) xdr_%s, (caddr_t) %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
- + proc->proc_name,
- + stringfix(proc->args.decls->decl.type),
- + (newstyle ? "&" : ""),
- + (newstyle ? proc->args.decls->decl.name : "argp"),
- + stringfix(proc->res_type), ampr(proc->res_type), RESULT);
- + }
- + f_print(fout, "\t\treturn (NULL);\n");
- + f_print(fout, "\t}\n");
- + if (streq(proc->res_type, "void")) {
- + f_print(fout, "\treturn ((void *)%s%s);\n",
- + ampr(proc->res_type), RESULT);
- + } else {
- + f_print(fout, "\treturn (%s%s);\n", ampr(proc->res_type), RESULT);
- + }
- +}
- diff --git a/rpcgen/rpc_cout.c b/rpcgen/rpc_cout.c
- new file mode 100644
- index 0000000..a61214f
- --- /dev/null
- +++ b/rpcgen/rpc_cout.c
- @@ -0,0 +1,706 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
- + */
- +#include <stdio.h>
- +#include <string.h>
- +#include <stdlib.h>
- +#include <malloc.h>
- +#include <ctype.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +
- +static int findtype(definition *def, char *type);
- +static int undefined(char *type);
- +static void print_generic_header(char *procname, int pointerp);
- +static void print_header(definition *def);
- +static void print_prog_header(proc_list *plist);
- +static void print_trailer(void);
- +static void print_ifopen(int indent, char *name);
- +static void print_ifarg(char *arg);
- +static void print_ifsizeof(char *prefix, char *type);
- +static void print_ifclose(int indent);
- +static void print_ifstat(int indent, char *prefix, char *type, relation rel,
- + char *amax, char *objname, char *name);
- +static void emit_enum(definition *def);
- +static void emit_program(definition *def);
- +static void emit_union(definition *def);
- +static void emit_struct(definition *def);
- +static void emit_typedef(definition *def);
- +static void print_stat(int indent, declaration *dec);
- +static void emit_inline(declaration *decl, int flag);
- +static void emit_single_in_line(declaration *decl, int flag, relation rel);
- +static char * upcase(char *str);
- +
- +/*
- + * Emit the C-routine for the given definition
- + */
- +void
- +emit(definition *def)
- +{
- + if (def->def_kind == DEF_CONST) {
- + return;
- + }
- + if (def->def_kind == DEF_PROGRAM) {
- + emit_program(def);
- + return;
- + }
- + if (def->def_kind == DEF_TYPEDEF) {
- + /* now we need to handle declarations like
- + * struct typedef foo foo;
- + * since we dont want this to be expanded into 2 calls
- + * to xdr_foo */
- +
- + if (strcmp(def->def.ty.old_type, def->def_name) == 0)
- + return;
- + };
- +
- + print_header(def);
- + switch (def->def_kind) {
- + case DEF_UNION:
- + emit_union(def);
- + break;
- + case DEF_ENUM:
- + emit_enum(def);
- + break;
- + case DEF_STRUCT:
- + emit_struct(def);
- + break;
- + case DEF_TYPEDEF:
- + emit_typedef(def);
- + break;
- + default:
- + break;
- + }
- + print_trailer();
- +}
- +
- +static int
- +findtype(definition *def, char *type)
- +{
- +
- + if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
- + return (0);
- + } else {
- + return (streq(def->def_name, type));
- + }
- +}
- +
- +static int
- +undefined(char *type)
- +{
- + definition *def;
- +
- + def = (definition *) FINDVAL(defined, type, findtype);
- +
- + return (def == NULL);
- +}
- +
- +
- +static void
- +print_generic_header(char *procname, int pointerp)
- +{
- + f_print(fout, "\n");
- + f_print(fout, "bool_t\n");
- + if (Cflag) {
- + f_print(fout, "xdr_%s(", procname);
- + f_print(fout, "XDR *xdrs, ");
- + f_print(fout, "%s ", procname);
- + if (pointerp)
- + f_print(fout, "*");
- + f_print(fout, "objp)\n{\n\n");
- + } else {
- + f_print(fout, "xdr_%s(xdrs, objp)\n", procname);
- + f_print(fout, "\tXDR *xdrs;\n");
- + f_print(fout, "\t%s ", procname);
- + if (pointerp)
- + f_print(fout, "*");
- + f_print(fout, "objp;\n{\n\n");
- + }
- +}
- +
- +static void
- +print_header(definition *def)
- +{
- + print_generic_header(def->def_name,
- + def->def_kind != DEF_TYPEDEF ||
- + !isvectordef(def->def.ty.old_type, def->def.ty.rel));
- +
- + /* Now add Inline support */
- +
- +
- + if (Inline == 0)
- + return;
- +}
- +
- +static void
- +print_prog_header(proc_list *plist)
- +{
- + print_generic_header(plist->args.argname, 1);
- +}
- +
- +static void
- +print_trailer(void)
- +{
- + f_print(fout, "\treturn (TRUE);\n");
- + f_print(fout, "}\n");
- +}
- +
- +
- +static void
- +print_ifopen(int indent, char *name)
- +{
- + tabify(fout, indent);
- + f_print(fout, " if (!xdr_%s(xdrs", name);
- +}
- +
- +static void
- +print_ifarg(char *arg)
- +{
- + f_print(fout, ", %s", arg);
- +}
- +
- +static void
- +print_ifsizeof(char *prefix, char *type)
- +{
- + if (streq(type, "bool")) {
- + f_print(fout, ", sizeof(bool_t), (xdrproc_t)xdr_bool");
- + } else {
- + f_print(fout, ", sizeof(");
- + if (undefined(type) && prefix) {
- + f_print(fout, "%s ", prefix);
- + }
- + f_print(fout, "%s), (xdrproc_t)xdr_%s", type, type);
- + }
- +}
- +
- +static void
- +print_ifclose(int indent)
- +{
- + f_print(fout, ")) {\n");
- + tabify(fout, indent);
- + f_print(fout, "\t return (FALSE);\n");
- + tabify(fout, indent);
- + f_print(fout, " }\n");
- +}
- +
- +static void
- +print_ifstat(int indent, char *prefix, char *type, relation rel,
- + char *amax, char *objname, char *name)
- +{
- + char *alt = NULL;
- +
- + switch (rel) {
- + case REL_POINTER:
- + print_ifopen(indent, "pointer");
- + print_ifarg("(char **)");
- + f_print(fout, "%s", objname);
- + print_ifsizeof(prefix, type);
- + break;
- + case REL_VECTOR:
- + if (streq(type, "string")) {
- + alt = "string";
- + } else if (streq(type, "opaque")) {
- + alt = "opaque";
- + }
- + if (alt) {
- + print_ifopen(indent, alt);
- + print_ifarg(objname);
- + } else {
- + print_ifopen(indent, "vector");
- + print_ifarg("(char *)");
- + f_print(fout, "%s", objname);
- + }
- + print_ifarg(amax);
- + if (!alt) {
- + print_ifsizeof(prefix, type);
- + }
- + break;
- + case REL_ARRAY:
- + if (streq(type, "string")) {
- + alt = "string";
- + } else if (streq(type, "opaque")) {
- + alt = "bytes";
- + }
- + if (streq(type, "string")) {
- + print_ifopen(indent, alt);
- + print_ifarg(objname);
- + } else {
- + if (alt) {
- + print_ifopen(indent, alt);
- + } else {
- + print_ifopen(indent, "array");
- + }
- + /* The (void*) avoids a gcc-4.1 warning */
- + print_ifarg("(char **)(void*)");
- + if (*objname == '&') {
- + f_print(fout, "%s.%s_val, (u_int *)%s.%s_len",
- + objname, name, objname, name);
- + } else {
- + f_print(fout, "&%s->%s_val, (u_int *)&%s->%s_len",
- + objname, name, objname, name);
- + }
- + }
- + print_ifarg(amax);
- + if (!alt) {
- + print_ifsizeof(prefix, type);
- + }
- + break;
- + case REL_ALIAS:
- + print_ifopen(indent, type);
- + print_ifarg(objname);
- + break;
- + }
- + print_ifclose(indent);
- +}
- +
- +static void
- +emit_enum(definition *def)
- +{
- + print_ifopen(1, "enum");
- + print_ifarg("(enum_t *)objp");
- + print_ifclose(1);
- +}
- +
- +static void
- +emit_program(definition *def)
- +{
- + decl_list *dl;
- + version_list *vlist;
- + proc_list *plist;
- +
- + for (vlist = def->def.pr.versions; vlist != NULL; vlist = vlist->next)
- + for (plist = vlist->procs; plist != NULL; plist = plist->next) {
- + if (!newstyle || plist->arg_num < 2)
- + continue;/* old style, or single argument */
- + print_prog_header(plist);
- + for (dl = plist->args.decls; dl != NULL; dl = dl->next)
- + print_stat(1, &dl->decl);
- + print_trailer();
- + }
- +}
- +
- +
- +static void
- +emit_union(definition *def)
- +{
- + declaration *dflt;
- + case_list *cl;
- + declaration *cs;
- + char *object;
- + char *vecformat = "objp->%s_u.%s";
- + char *format = "&objp->%s_u.%s";
- +
- + print_stat(1,&def->def.un.enum_decl);
- + f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name);
- + for (cl = def->def.un.cases; cl != NULL; cl = cl->next) {
- +
- + f_print(fout, "\tcase %s:\n", cl->case_name);
- + if(cl->contflag == 1) /* a continued case statement */
- + continue;
- + cs = &cl->case_decl;
- + if (!streq(cs->type, "void")) {
- + object = alloc(strlen(def->def_name) + strlen(format) +
- + strlen(cs->name) + 1);
- + if (isvectordef (cs->type, cs->rel)) {
- + s_print(object, vecformat, def->def_name,
- + cs->name);
- + } else {
- + s_print(object, format, def->def_name,
- + cs->name);
- + }
- + print_ifstat(2, cs->prefix, cs->type, cs->rel, cs->array_max,
- + object, cs->name);
- + free(object);
- + }
- + f_print(fout, "\t\tbreak;\n");
- + }
- + dflt = def->def.un.default_decl;
- + if (dflt != NULL) {
- + if (!streq(dflt->type, "void")) {
- + f_print(fout, "\tdefault:\n");
- + object = alloc(strlen(def->def_name) + strlen(format) +
- + strlen(dflt->name) + 1);
- + if (isvectordef (dflt->type, dflt->rel)) {
- + s_print(object, vecformat, def->def_name,
- + dflt->name);
- + } else {
- + s_print(object, format, def->def_name,
- + dflt->name);
- + }
- +
- + print_ifstat(2, dflt->prefix, dflt->type, dflt->rel,
- + dflt->array_max, object, dflt->name);
- + free(object);
- + f_print(fout, "\t\tbreak;\n");
- + } else {
- + /* Avoid gcc warnings about `value not handled in switch' */
- + f_print(fout, "\tdefault:\n");
- + f_print(fout, "\t\tbreak;\n");
- + }
- + } else {
- + f_print(fout, "\tdefault:\n");
- + f_print(fout, "\t\treturn (FALSE);\n");
- + }
- +
- + f_print(fout, "\t}\n");
- +}
- +
- +static void
- +emit_struct(definition *def)
- +{
- + decl_list *dl;
- + int i, j, size, flag;
- + decl_list *cur = NULL, *psav;
- + bas_type *ptr;
- + char *sizestr, *plus;
- + char ptemp[256];
- + int can_inline;
- + const char *buf_declaration;
- +
- +
- + if (Inline == 0) {
- + for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- + print_stat(1, &dl->decl);
- + } else {
- + size = 0;
- + can_inline = 0;
- + for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- + if ((dl->decl.prefix == NULL) && ((ptr = find_type(dl->decl.type)) != NULL) && ((dl->decl.rel == REL_ALIAS) || (dl->decl.rel == REL_VECTOR))) {
- +
- + if (dl->decl.rel == REL_ALIAS)
- + size += ptr->length;
- + else {
- + can_inline = 1;
- + break; /* can be inlined */
- + };
- + } else {
- + if (size >= Inline) {
- + can_inline = 1;
- + break; /* can be inlined */
- + }
- + size = 0;
- + }
- + if (size > Inline)
- + can_inline = 1;
- +
- + if (can_inline == 0) { /* can not inline, drop back to old mode */
- + for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- + print_stat(1, &dl->decl);
- + return;
- + };
- +
- +
- +
- +
- + flag = PUT;
- + for (j = 0; j < 2; j++) {
- +
- + if (flag == PUT)
- + f_print(fout, "\n\t if (xdrs->x_op == XDR_ENCODE) {\n");
- + else
- + f_print(fout, "\n \t return (TRUE);\n\t} else if (xdrs->x_op == XDR_DECODE) {\n");
- +
- +
- + i = 0;
- + size = 0;
- + sizestr = NULL;
- + buf_declaration = "int32_t *";
- + for (dl = def->def.st.decls; dl != NULL; dl = dl->next) { /* xxx */
- +
- + /* now walk down the list and check for basic types */
- + if ((dl->decl.prefix == NULL) && ((ptr = find_type(dl->decl.type)) != NULL) && ((dl->decl.rel == REL_ALIAS) || (dl->decl.rel == REL_VECTOR))) {
- + if (i == 0)
- + cur = dl;
- + i++;
- +
- + if (dl->decl.rel == REL_ALIAS)
- + size += ptr->length;
- + else {
- + /* this is required to handle arrays */
- +
- + if (sizestr == NULL)
- + plus = " ";
- + else
- + plus = "+";
- +
- + if (ptr->length != 1)
- + s_print(ptemp, " %s %s * %d", plus, dl->decl.array_max, ptr->length);
- + else
- + s_print(ptemp, " %s %s ", plus, dl->decl.array_max);
- +
- + /*now concatenate to sizestr !!!! */
- + if (sizestr == NULL)
- + sizestr = strdup(ptemp);
- + else {
- + sizestr = realloc(sizestr, strlen(sizestr) + strlen(ptemp) + 1);
- + if (sizestr == NULL) {
- +
- + f_print(stderr, "Fatal error : no memory \n");
- + crash();
- + };
- + sizestr = strcat(sizestr, ptemp); /*build up length of array */
- +
- + }
- + }
- +
- + } else {
- + if (i > 0)
- + {
- + if (sizestr == NULL && size < Inline) {
- + /* don't expand into inline code if size < inline */
- + while (cur != dl) {
- + print_stat(1, &cur->decl);
- + cur = cur->next;
- + }
- + } else {
- +
- +
- +
- + /* were already looking at a xdr_inlineable structure */
- + if (sizestr == NULL)
- + f_print(fout, "\t %sbuf = XDR_INLINE(xdrs,%d * BYTES_PER_XDR_UNIT);",
- + buf_declaration, size);
- + else if (size == 0)
- + f_print(fout,
- + "\t %sbuf = XDR_INLINE(xdrs,%s * BYTES_PER_XDR_UNIT);",
- + buf_declaration, sizestr);
- + else
- + f_print(fout,
- + "\t %sbuf = XDR_INLINE(xdrs,(%d + %s)* BYTES_PER_XDR_UNIT);",
- + buf_declaration, size, sizestr);
- + buf_declaration = "";
- +
- + f_print(fout, "\n\t if (buf == NULL) {\n");
- +
- + psav = cur;
- + while (cur != dl) {
- + print_stat(2, &cur->decl);
- + cur = cur->next;
- + }
- +
- + f_print(fout, "\n\t }\n\t else {\n");
- +
- + cur = psav;
- + while (cur != dl) {
- + emit_inline(&cur->decl, flag);
- + cur = cur->next;
- + }
- +
- + f_print(fout, "\t }\n");
- + }
- + }
- + size = 0;
- + i = 0;
- + sizestr = NULL;
- + print_stat(1, &dl->decl);
- + }
- +
- + }
- + if (i > 0)
- + {
- + if (sizestr == NULL && size < Inline) {
- + /* don't expand into inline code if size < inline */
- + while (cur != dl) {
- + print_stat(1, &cur->decl);
- + cur = cur->next;
- + }
- + } else {
- +
- + /* were already looking at a xdr_inlineable structure */
- + if (sizestr == NULL)
- + f_print(fout, "\t\t%sbuf = XDR_INLINE(xdrs,%d * BYTES_PER_XDR_UNIT);",
- + buf_declaration, size);
- + else if (size == 0)
- + f_print(fout,
- + "\t\t%sbuf = XDR_INLINE(xdrs,%s * BYTES_PER_XDR_UNIT);",
- + buf_declaration, sizestr);
- + else
- + f_print(fout,
- + "\t\t%sbuf = XDR_INLINE(xdrs,(%d + %s)* BYTES_PER_XDR_UNIT);",
- + buf_declaration, size, sizestr);
- + buf_declaration = "";
- +
- + f_print(fout, "\n\t\tif (buf == NULL) {\n");
- +
- + psav = cur;
- + while (cur != NULL) {
- + print_stat(2, &cur->decl);
- + cur = cur->next;
- + }
- + f_print(fout, "\n\t }\n\t else {\n");
- +
- + cur = psav;
- + while (cur != dl) {
- + emit_inline(&cur->decl, flag);
- + cur = cur->next;
- + }
- +
- + f_print(fout, "\t }\n");
- +
- + }
- + }
- + flag = GET;
- + }
- + f_print(fout, "\t return(TRUE);\n\t}\n\n");
- +
- + /* now take care of XDR_FREE case */
- +
- + for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
- + print_stat(1, &dl->decl);
- + }
- +}
- +
- +
- +
- +
- +static void
- +emit_typedef(definition *def)
- +{
- + char *prefix = def->def.ty.old_prefix;
- + char *type = def->def.ty.old_type;
- + char *amax = def->def.ty.array_max;
- + relation rel = def->def.ty.rel;
- +
- +
- + print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name);
- +}
- +
- +static void
- +print_stat(int indent, declaration *dec)
- +{
- + char *prefix = dec->prefix;
- + char *type = dec->type;
- + char *amax = dec->array_max;
- + relation rel = dec->rel;
- + char name[256];
- +
- + if (isvectordef(type, rel)) {
- + s_print(name, "objp->%s", dec->name);
- + } else {
- + s_print(name, "&objp->%s", dec->name);
- + }
- + print_ifstat(indent, prefix, type, rel, amax, name, dec->name);
- +}
- +
- +
- +static void
- +emit_inline(declaration *decl, int flag)
- +{
- +
- + /*check whether an array or not */
- +
- + switch (decl->rel) {
- + case REL_ALIAS:
- + emit_single_in_line(decl, flag, REL_ALIAS);
- + break;
- + case REL_VECTOR:
- + f_print(fout, "\t\t{ register %s *genp; \n", decl->type);
- + f_print(fout, "\t\t int i;\n");
- + f_print(fout, "\t\t for ( i = 0,genp=objp->%s;\n \t\t\ti < %s; i++){\n\t\t",
- + decl->name, decl->array_max);
- + emit_single_in_line(decl, flag, REL_VECTOR);
- + f_print(fout, "\t\t }\n\t\t };\n");
- + break;
- + default:
- + break;
- + }
- +}
- +
- +static void
- +emit_single_in_line(declaration *decl, int flag, relation rel)
- +{
- + char *upp_case;
- + int freed=0;
- +
- + if(flag == PUT)
- + f_print(fout,"\t\t (void) IXDR_PUT_");
- + else
- + if(rel== REL_ALIAS)
- + f_print(fout,"\t\t objp->%s = IXDR_GET_",decl->name);
- + else
- + f_print(fout,"\t\t *genp++ = IXDR_GET_");
- +
- + upp_case=upcase(decl->type);
- +
- + /* hack - XX */
- + if(strcmp(upp_case,"INT") == 0)
- + {
- + free(upp_case);
- + freed=1;
- + upp_case="INT32";
- + }
- +
- + if(strcmp(upp_case,"U_INT") == 0)
- + {
- + free(upp_case);
- + freed=1;
- + upp_case="U_INT32";
- + }
- +
- +
- + if(flag == PUT)
- + if(rel== REL_ALIAS)
- + f_print(fout,"%s(buf,objp->%s);\n",upp_case,decl->name);
- + else
- + f_print(fout,"%s(buf,*genp++);\n",upp_case);
- +
- + else
- + f_print(fout,"%s(buf);\n",upp_case);
- + if(!freed)
- + free(upp_case);
- +
- +}
- +
- +
- +static char *
- +upcase(char *str)
- +{
- + char *ptr, *hptr;
- +
- +
- + ptr = (char *) malloc(strlen(str)+1);
- + if (ptr == (char *) NULL) {
- + f_print(stderr, "malloc failed \n");
- + exit(1);
- + };
- +
- + hptr = ptr;
- + while (*str != '\0')
- + *ptr++ = toupper(*str++);
- +
- + *ptr = '\0';
- + return (hptr);
- +
- +}
- diff --git a/rpcgen/rpc_hout.c b/rpcgen/rpc_hout.c
- new file mode 100644
- index 0000000..ea1cb24
- --- /dev/null
- +++ b/rpcgen/rpc_hout.c
- @@ -0,0 +1,490 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_hout.c, Header file outputter for the RPC protocol compiler
- + */
- +#include <stdio.h>
- +#include <ctype.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +#include "rpc_output.h"
- +
- +
- +static int undefined2(char *type, char *stop);
- +static void pxdrfuncdecl(char *name, int pointerp);
- +static void pconstdef(definition *def);
- +static void pargdef(definition *def);
- +static void pstructdef(definition *def);
- +static void puniondef(definition *def);
- +static void pdefine(char *name, char *num);
- +static void puldefine(char *name, char *num);
- +static int define_printed(proc_list *stop, version_list *start);
- +static void pprogramdef(definition *def);
- +static void pprocdef(proc_list *proc, version_list *vp,
- + char *addargtype, int server_p, int mode);
- +static void parglist(proc_list *proc, char *addargtype);
- +static void penumdef(definition *def);
- +static void ptypedef(definition *def);
- +
- +/*
- + * Print the C-version of an xdr definition
- + */
- +void
- +print_datadef(definition *def)
- +{
- +
- + if (def->def_kind == DEF_PROGRAM ) /* handle data only */
- + return;
- +
- + if (def->def_kind != DEF_CONST) {
- + f_print(fout, "\n");
- + }
- + switch (def->def_kind) {
- + case DEF_STRUCT:
- + pstructdef(def);
- + break;
- + case DEF_UNION:
- + puniondef(def);
- + break;
- + case DEF_ENUM:
- + penumdef(def);
- + break;
- + case DEF_TYPEDEF:
- + ptypedef(def);
- + break;
- + case DEF_PROGRAM:
- + pprogramdef(def);
- + break;
- + case DEF_CONST:
- + pconstdef(def);
- + break;
- + }
- + if (def->def_kind != DEF_PROGRAM && def->def_kind != DEF_CONST) {
- + pxdrfuncdecl( def->def_name,
- + def->def_kind != DEF_TYPEDEF ||
- + !isvectordef(def->def.ty.old_type, def->def.ty.rel));
- +
- + }
- +}
- +
- +
- +void
- +print_funcdef(definition *def)
- +{
- + switch (def->def_kind) {
- + case DEF_PROGRAM:
- + f_print(fout, "\n");
- + pprogramdef(def);
- + break;
- + default:
- + break;
- + }
- +}
- +
- +static void
- +pxdrfuncdecl(char *name, int pointerp)
- +{
- + f_print(fout,
- + "#ifdef __cplusplus \n"
- + "extern \"C\" bool_t xdr_%s(XDR *, %s%s);\n"
- + "#elif __STDC__ \n"
- + "extern bool_t xdr_%s(XDR *, %s%s);\n"
- + "#else /* Old Style C */ \n"
- + "bool_t xdr_%s();\n"
- + "#endif /* Old Style C */ \n\n",
- + name, name, pointerp ? "*" : "",
- + name, name, pointerp ? "*" : "",
- + name);
- +}
- +
- +
- +static void
- +pconstdef(definition *def)
- +{
- + pdefine(def->def_name, def->def.co);
- +}
- +
- +/* print out the definitions for the arguments of functions in the
- + header file
- +*/
- +static void
- +pargdef(definition *def)
- +{
- + decl_list *l;
- + version_list *vers;
- + char *name;
- + proc_list *plist;
- +
- +
- + for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
- + for(plist = vers->procs; plist != NULL;
- + plist = plist->next) {
- +
- + if (!newstyle || plist->arg_num < 2) {
- + continue; /* old style or single args */
- + }
- + name = plist->args.argname;
- + f_print(fout, "struct %s {\n", name);
- + for (l = plist->args.decls;
- + l != NULL; l = l->next) {
- + pdeclaration(name, &l->decl, 1, ";\n" );
- + }
- + f_print(fout, "};\n");
- + f_print(fout, "typedef struct %s %s;\n", name, name);
- + pxdrfuncdecl(name, 0);
- + f_print( fout, "\n" );
- + }
- + }
- +
- +}
- +
- +
- +static void
- +pstructdef(definition *def)
- +{
- + decl_list *l;
- + char *name = def->def_name;
- +
- + f_print(fout, "struct %s {\n", name);
- + for (l = def->def.st.decls; l != NULL; l = l->next) {
- + pdeclaration(name, &l->decl, 1, ";\n");
- + }
- + f_print(fout, "};\n");
- + f_print(fout, "typedef struct %s %s;\n", name, name);
- +}
- +
- +static void
- +puniondef(definition *def)
- +{
- + case_list *l;
- + char *name = def->def_name;
- + declaration *decl;
- +
- + f_print(fout, "struct %s {\n", name);
- + decl = &def->def.un.enum_decl;
- + if (streq(decl->type, "bool")) {
- + f_print(fout, "\tbool_t %s;\n", decl->name);
- + } else {
- + f_print(fout, "\t%s %s;\n", decl->type, decl->name);
- + }
- + f_print(fout, "\tunion {\n");
- + for (l = def->def.un.cases; l != NULL; l = l->next) {
- + if (l->contflag == 0)
- + pdeclaration(name, &l->case_decl, 2, ";\n");
- + }
- + decl = def->def.un.default_decl;
- + if (decl && !streq(decl->type, "void")) {
- + pdeclaration(name, decl, 2, ";\n");
- + }
- + f_print(fout, "\t} %s_u;\n", name);
- + f_print(fout, "};\n");
- + f_print(fout, "typedef struct %s %s;\n", name, name);
- +}
- +
- +static void
- +pdefine(char *name, char *num)
- +{
- + f_print(fout, "#define %s %s\n", name, num);
- +}
- +
- +static void
- +puldefine(char *name, char *num)
- +{
- + f_print(fout, "#define %s ((u_int32_t)%s)\n", name, num);
- +}
- +
- +static int
- +define_printed(proc_list *stop, version_list *start)
- +{
- + version_list *vers;
- + proc_list *proc;
- +
- + for (vers = start; vers != NULL; vers = vers->next) {
- + for (proc = vers->procs; proc != NULL; proc = proc->next) {
- + if (proc == stop) {
- + return (0);
- + } else if (streq(proc->proc_name, stop->proc_name)) {
- + return (1);
- + }
- + }
- + }
- + abort();
- + /* NOTREACHED */
- +}
- +
- +static void
- +pprogramdef(definition *def)
- +{
- + version_list *vers;
- + proc_list *proc;
- + int i;
- + char *ext;
- +
- + pargdef(def);
- +
- + puldefine(def->def_name, def->def.pr.prog_num);
- + for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) {
- + if (tblflag) {
- + f_print(fout, "extern struct rpcgen_table %s_%s_table[];\n",
- + locase(def->def_name), vers->vers_num);
- + f_print(fout, "extern %s_%s_nproc;\n",
- + locase(def->def_name), vers->vers_num);
- + }
- + puldefine(vers->vers_name, vers->vers_num);
- +
- + /*
- + * Print out 3 definitions, one for ANSI-C, another for C++,
- + * a third for old style C
- + */
- +
- + for (i = 0; i < 3; i++) {
- + if (i == 0) {
- + f_print(fout, "\n#ifdef __cplusplus\n");
- + ext = "extern \"C\" ";
- + } else if (i == 1) {
- + f_print(fout, "\n#elif __STDC__\n");
- + ext = "extern ";
- + } else {
- + f_print(fout, "\n#else /* Old Style C */ \n");
- + ext = "extern ";
- + }
- +
- +
- + for (proc = vers->procs; proc != NULL; proc = proc->next) {
- + if (!define_printed(proc, def->def.pr.versions)) {
- + puldefine(proc->proc_name, proc->proc_num);
- + }
- + f_print(fout, "%s", ext);
- + pprocdef(proc, vers, "CLIENT *", 0, i);
- + f_print(fout, "%s", ext);
- + pprocdef(proc, vers, "struct svc_req *", 1, i);
- +
- + }
- +
- + }
- + f_print(fout, "#endif /* Old Style C */ \n");
- + }
- +}
- +
- +static void
- +pprocdef(proc_list *proc, version_list *vp, char *addargtype,
- + int server_p, int mode)
- +{
- + ptype(proc->res_prefix, proc->res_type, 1);
- + f_print(fout, "* ");
- + if (server_p)
- + pvname_svc(proc->proc_name, vp->vers_num);
- + else
- + pvname(proc->proc_name, vp->vers_num);
- +
- + /*
- + * mode 0 == cplusplus, mode 1 = ANSI-C, mode 2 = old style C
- + */
- + if (mode == 0 || mode == 1)
- + parglist(proc, addargtype);
- + else
- + f_print(fout, "();\n");
- +}
- +
- +
- +
- +/* print out argument list of procedure */
- +static void
- +parglist(proc_list *proc, char *addargtype)
- +{
- + decl_list *dl;
- +
- + f_print(fout, "(");
- +
- + if (proc->arg_num < 2 && newstyle &&
- + streq(proc->args.decls->decl.type, "void")) {
- + /* 0 argument in new style: do nothing */
- + } else {
- + for (dl = proc->args.decls; dl != NULL; dl = dl->next) {
- + ptype(dl->decl.prefix, dl->decl.type, 1);
- + if (!newstyle)
- + f_print(fout, "*"); /* old style passes by reference */
- +
- + f_print(fout, ", ");
- + }
- + }
- +
- + f_print(fout, "%s);\n", addargtype);
- +}
- +
- +static void
- +penumdef(definition *def)
- +{
- + char *name = def->def_name;
- + enumval_list *l;
- + char *last = NULL;
- + int count = 0;
- +
- + f_print(fout, "enum %s {\n", name);
- + for (l = def->def.en.vals; l != NULL; l = l->next) {
- + f_print(fout, "\t%s", l->name);
- + if (l->assignment) {
- + f_print(fout, " = %s", l->assignment);
- + last = l->assignment;
- + count = 1;
- + } else {
- + if (last == NULL) {
- + f_print(fout, " = %d", count++);
- + } else {
- + f_print(fout, " = %s + %d", last, count++);
- + }
- + }
- + f_print(fout, ",\n");
- + }
- + f_print(fout, "};\n");
- + f_print(fout, "typedef enum %s %s;\n", name, name);
- +}
- +
- +static void
- +ptypedef(definition *def)
- +{
- + char *name = def->def_name;
- + char *old = def->def.ty.old_type;
- + char prefix[8]; /* enough to contain "struct ", including NUL */
- + relation rel = def->def.ty.rel;
- +
- +
- + if (!streq(name, old)) {
- + if (streq(old, "string")) {
- + old = "char";
- + rel = REL_POINTER;
- + } else if (streq(old, "opaque")) {
- + old = "char";
- + } else if (streq(old, "bool")) {
- + old = "bool_t";
- + }
- + if (undefined2(old, name) && def->def.ty.old_prefix) {
- + s_print(prefix, "%s ", def->def.ty.old_prefix);
- + } else {
- + prefix[0] = 0;
- + }
- + f_print(fout, "typedef ");
- + switch (rel) {
- + case REL_ARRAY:
- + f_print(fout, "struct {\n");
- + f_print(fout, "\tu_int %s_len;\n", name);
- + f_print(fout, "\t%s%s *%s_val;\n", prefix, old, name);
- + f_print(fout, "} %s", name);
- + break;
- + case REL_POINTER:
- + f_print(fout, "%s%s *%s", prefix, old, name);
- + break;
- + case REL_VECTOR:
- + f_print(fout, "%s%s %s[%s]", prefix, old, name,
- + def->def.ty.array_max);
- + break;
- + case REL_ALIAS:
- + f_print(fout, "%s%s %s", prefix, old, name);
- + break;
- + }
- + f_print(fout, ";\n");
- + }
- +}
- +
- +void
- +pdeclaration(char *name, declaration *dec, int tab, char *separator)
- +{
- + char buf[8]; /* enough to hold "struct ", include NUL */
- + char *prefix;
- + char *type;
- +
- + if (streq(dec->type, "void")) {
- + return;
- + }
- + tabify(fout, tab);
- + if (streq(dec->type, name) && !dec->prefix) {
- + f_print(fout, "struct ");
- + }
- + if (streq(dec->type, "string")) {
- + f_print(fout, "char *%s", dec->name);
- + } else {
- + prefix = "";
- + if (streq(dec->type, "bool")) {
- + type = "bool_t";
- + } else if (streq(dec->type, "opaque")) {
- + type = "char";
- + } else {
- + if (dec->prefix) {
- + s_print(buf, "%s ", dec->prefix);
- + prefix = buf;
- + }
- + type = dec->type;
- + }
- + switch (dec->rel) {
- + case REL_ALIAS:
- + f_print(fout, "%s%s %s", prefix, type, dec->name);
- + break;
- + case REL_VECTOR:
- + f_print(fout, "%s%s %s[%s]", prefix, type, dec->name,
- + dec->array_max);
- + break;
- + case REL_POINTER:
- + f_print(fout, "%s%s *%s", prefix, type, dec->name);
- + break;
- + case REL_ARRAY:
- + f_print(fout, "struct {\n");
- + tabify(fout, tab);
- + f_print(fout, "\tu_int %s_len;\n", dec->name);
- + tabify(fout, tab);
- + f_print(fout, "\t%s%s *%s_val;\n", prefix, type, dec->name);
- + tabify(fout, tab);
- + f_print(fout, "} %s", dec->name);
- + break;
- + }
- + }
- + f_print(fout, separator );
- +}
- +
- +static int
- +undefined2(char *type, char *stop)
- +{
- + list *l;
- + definition *def;
- +
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + if (streq(def->def_name, stop)) {
- + return (1);
- + } else if (streq(def->def_name, type)) {
- + return (0);
- + }
- + }
- + }
- + return (1);
- +}
- diff --git a/rpcgen/rpc_main.c b/rpcgen/rpc_main.c
- new file mode 100644
- index 0000000..28aa60c
- --- /dev/null
- +++ b/rpcgen/rpc_main.c
- @@ -0,0 +1,1067 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_main.c, Top level of the RPC protocol compiler.
- + */
- +
- +#include <sys/types.h>
- +#include <sys/param.h>
- +#include <sys/file.h>
- +#include <sys/stat.h>
- +#include <stdio.h>
- +#include <string.h>
- +#include <stdlib.h>
- +#include <unistd.h>
- +#include <ctype.h>
- +#include <errno.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +#include "rpc_scan.h"
- +
- +struct commandline {
- + int cflag; /* xdr C routines */
- + int hflag; /* header file */
- + int lflag; /* client side stubs */
- + int mflag; /* server side stubs */
- + int nflag; /* netid flag */
- + int sflag; /* server stubs for the given transport */
- + int tflag; /* dispatch Table file */
- + int Ssflag; /* produce server sample code */
- + int Scflag; /* produce client sample code */
- + char *infile; /* input module name */
- + char *outfile; /* output module name */
- +};
- +
- +static char * extendfile(char *file, char *ext);
- +static void open_output(char *infile, char *outfile);
- +static void add_warning(void);
- +static void clear_args(void);
- +static void open_input(char *infile, char *define);
- +static int check_nettype(char *name, char **list_to_check);
- +static void c_output(char *infile, char *define, int extend, char *outfile);
- +static void c_initialize(void);
- +static char * generate_guard(char *pathname);
- +static void h_output(char *infile, char *define, int extend, char *outfile);
- +static void s_output(int argc, char **argv, char *infile,
- + char *define, int extend, char *outfile,
- + int nomain, int netflag);
- +static void l_output(char *infile, char *define, int extend, char *outfile);
- +static void t_output(char *infile, char *define, int extend, char *outfile);
- +static void svc_output(char *, char *, int, char *);
- +static void clnt_output(char *, char *, int, char *);
- +static int do_registers(int argc, char **argv);
- +static void addarg(char *cp);
- +static void putarg(int where, char *cp);
- +static void checkfiles(char *infile, char *outfile);
- +static int parseargs(int argc, char **argv, struct commandline *cmd);
- +static void usage(void);
- +static void options_usage(void);
- +
- +/*
- +extern void write_sample_svc();
- +int write_sample_clnt();
- +void write_sample_clnt_main();
- +
- +static svc_output();
- + */
- +
- +#define EXTEND 1 /* alias for TRUE */
- +#define DONT_EXTEND 0 /* alias for FALSE */
- +
- +#define SVR4_CPP "/usr/ccs/lib/cpp"
- +#define SUNOS_CPP "/lib/cpp"
- +static int cppDefined = 0; /* explicit path for C preprocessor */
- +
- +
- +static char *cmdname;
- +
- +static char *svcclosetime = "120";
- +static char *CPP = SVR4_CPP;
- +static char CPPFLAGS[] = "-C";
- +static char pathbuf[MAXPATHLEN + 1];
- +static char *allv[] = {
- + "rpcgen", "-s", "udp", "-s", "tcp",
- +};
- +static int allc = sizeof(allv)/sizeof(allv[0]);
- +static char *allnv[] = {
- + "rpcgen", "-s", "netpath",
- +};
- +static int allnc = sizeof(allnv)/sizeof(allnv[0]);
- +
- +/*
- + * machinations for handling expanding argument list
- + */
- +#if 0
- +static void addarg(); /* add another argument to the list */
- +static void putarg(); /* put argument at specified location */
- +static void clear_args(); /* clear argument list */
- +static void checkfiles(); /* check if out file already exists */
- +#endif
- +
- +
- +
- +#define ARGLISTLEN 20
- +#define FIXEDARGS 2
- +
- +static char *arglist[ARGLISTLEN];
- +static int argcount = FIXEDARGS;
- +
- +
- +int nonfatalerrors; /* errors */
- +int inetdflag/* = 1*/; /* Support for inetd */ /* is now the default */
- +int pmflag; /* Support for port monitors */
- +int logflag; /* Use syslog instead of fprintf for errors */
- +int tblflag; /* Support for dispatch table file */
- +
- +/* length at which to start doing an inline */
- +#define INLINE 3
- +
- +int Inline = INLINE; /* length at which to start doing an inline. 3 = default
- + * if 0, no xdr_inline code */
- +
- +int indefinitewait; /* If started by port monitors, hang till it wants */
- +int exitnow; /* If started by port monitors, exit after the call */
- +int timerflag; /* TRUE if !indefinite && !exitnow */
- +int newstyle; /* newstyle of passing arguments (by value) */
- +int Cflag = 0 ; /* ANSI C syntax */
- +static int allfiles; /* generate all files */
- +#ifdef linux
- +int tirpcflag = 0; /* no tirpc by default */
- +#else
- +int tirpcflag = 1; /* generating code for tirpc, by default */
- +#endif
- +
- +int
- +main(int argc, char **argv)
- +{
- + struct commandline cmd;
- +
- + (void) memset((char *) &cmd, 0, sizeof(struct commandline));
- + clear_args();
- + if (!parseargs(argc, argv, &cmd))
- + usage();
- +
- + if (cmd.cflag || cmd.hflag || cmd.lflag || cmd.tflag || cmd.sflag ||
- + cmd.mflag || cmd.nflag || cmd.Ssflag || cmd.Scflag) {
- + checkfiles(cmd.infile, cmd.outfile);
- + } else
- + checkfiles(cmd.infile, NULL);
- +
- + if (cmd.cflag) {
- + c_output(cmd.infile, "-DRPC_XDR", DONT_EXTEND, cmd.outfile);
- + } else if (cmd.hflag) {
- + h_output(cmd.infile, "-DRPC_HDR", DONT_EXTEND, cmd.outfile);
- + } else if (cmd.lflag) {
- + l_output(cmd.infile, "-DRPC_CLNT", DONT_EXTEND, cmd.outfile);
- + } else if (cmd.sflag || cmd.mflag || (cmd.nflag)) {
- + s_output(argc, argv, cmd.infile, "-DRPC_SVC", DONT_EXTEND,
- + cmd.outfile, cmd.mflag, cmd.nflag);
- + } else if (cmd.tflag) {
- + t_output(cmd.infile, "-DRPC_TBL", DONT_EXTEND, cmd.outfile);
- + } else if (cmd.Ssflag) {
- + svc_output(cmd.infile, "-DRPC_SERVER", DONT_EXTEND, cmd.outfile);
- + } else if (cmd.Scflag) {
- + clnt_output(cmd.infile, "-DRPC_CLIENT", DONT_EXTEND, cmd.outfile);
- + } else {
- + /* the rescans are required, since cpp may effect input */
- + c_output(cmd.infile, "-DRPC_XDR", EXTEND, "_xdr.c");
- + reinitialize();
- + h_output(cmd.infile, "-DRPC_HDR", EXTEND, ".h");
- + reinitialize();
- + l_output(cmd.infile, "-DRPC_CLNT", EXTEND, "_clnt.c");
- + reinitialize();
- + if (inetdflag || !tirpcflag)
- + s_output(allc, allv, cmd.infile, "-DRPC_SVC", EXTEND,
- + "_svc.c", cmd.mflag, cmd.nflag);
- + else
- + s_output(allnc, allnv, cmd.infile, "-DRPC_SVC",
- + EXTEND, "_svc.c", cmd.mflag, cmd.nflag);
- + if (tblflag) {
- + reinitialize();
- + t_output(cmd.infile, "-DRPC_TBL", EXTEND, "_tbl.i");
- + }
- + if (allfiles) {
- + reinitialize();
- + svc_output(cmd.infile, "-DRPC_SERVER", EXTEND, "_server.c");
- + }
- + if (allfiles) {
- + reinitialize();
- + clnt_output(cmd.infile, "-DRPC_CLIENT", EXTEND, "_client.c");
- + }
- + }
- + exit(nonfatalerrors);
- + /* NOTREACHED */
- +}
- +
- +/*
- + * add extension to filename
- + */
- +static char *
- +extendfile(char *file, char *ext)
- +{
- + char *res;
- + char *p;
- +
- + res = alloc(strlen(file) + strlen(ext) + 1);
- + if (res == NULL) {
- + abort();
- + }
- + p = strrchr(file, '.');
- + if (p == NULL) {
- + p = file + strlen(file);
- + }
- + (void) strcpy(res, file);
- + (void) strcpy(res + (p - file), ext);
- + return (res);
- +}
- +
- +/*
- + * Open output file with given extension
- + */
- +static void
- +open_output(char *infile, char *outfile)
- +{
- +
- + if (outfile == NULL) {
- + fout = stdout;
- + return;
- + }
- +
- + if (infile != NULL && streq(outfile, infile)) {
- + f_print(stderr, "%s: output would overwrite %s\n", cmdname,
- + infile);
- + crash();
- + }
- + fout = fopen(outfile, "w");
- + if (fout == NULL) {
- + f_print(stderr, "%s: unable to open ", cmdname);
- + perror(outfile);
- + crash();
- + }
- + record_open(outfile);
- +
- +}
- +
- +static void
- +add_warning(void)
- +{
- + f_print(fout, "/*\n");
- + f_print(fout, " * Please do not edit this file.\n");
- + f_print(fout, " * It was generated using rpcgen.\n");
- + f_print(fout, " */\n\n");
- +}
- +
- +/* clear list of arguments */
- +static void
- +clear_args(void)
- +{
- + int i;
- + for( i=FIXEDARGS; i<ARGLISTLEN; i++ )
- + arglist[i] = NULL;
- + argcount = FIXEDARGS;
- +}
- +
- +/*
- + * Open input file with given define for C-preprocessor
- + */
- +static void
- +open_input(char *infile, char *define)
- +{
- + int pd[2];
- +
- + infilename = (infile == NULL) ? "<stdin>" : infile;
- + (void) pipe(pd);
- + switch (fork()) {
- + case 0:
- + putarg(0, "cpp");
- + putarg(1, CPPFLAGS);
- + addarg(define);
- + addarg(infile);
- + addarg((char *)NULL);
- + (void) close(1);
- + (void) dup2(pd[1], 1);
- + (void) close(pd[0]);
- + if (cppDefined)
- + execv(CPP, arglist);
- + else {
- + execvp("cpp", arglist);
- + if (errno == ENOENT)
- + execvp(SVR4_CPP, arglist);
- + if (errno == ENOENT)
- + execvp(SUNOS_CPP, arglist);
- + }
- + perror("execv");
- + exit(1);
- + case -1:
- + perror("fork");
- + exit(1);
- + }
- + (void) close(pd[1]);
- + fin = fdopen(pd[0], "r");
- + if (fin == NULL) {
- + f_print(stderr, "%s: ", cmdname);
- + perror(infilename);
- + crash();
- + }
- +}
- +
- +/* valid tirpc nettypes */
- +static char* valid_ti_nettypes[] =
- +{
- + "netpath",
- + "visible",
- + "circuit_v",
- + "datagram_v",
- + "circuit_n",
- + "datagram_n",
- + "udp",
- + "tcp",
- + "raw",
- + NULL
- +};
- +
- +/* valid inetd nettypes */
- +static char* valid_i_nettypes[] =
- +{
- + "udp",
- + "tcp",
- + NULL
- +};
- +
- +static int
- +check_nettype(char *name, char **list_to_check)
- +{
- + int i;
- + for( i = 0; list_to_check[i] != NULL; i++ ) {
- + if( strcmp( name, list_to_check[i] ) == 0 ) {
- + return 1;
- + }
- + }
- + f_print( stderr, "illegal nettype :\'%s\'\n", name );
- + return 0;
- +}
- +
- +/*
- + * Compile into an XDR routine output file
- + */
- +
- +static void
- +c_output(char *infile, char *define, int extend, char *outfile)
- +{
- + definition *def;
- + char *include;
- + char *outfilename;
- + long tell;
- +
- + c_initialize();
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + open_output(infile, outfilename);
- + add_warning();
- + if (infile && (include = extendfile(infile, ".h"))) {
- + f_print(fout, "#include \"%s\"\n", include);
- + free(include);
- + /* .h file already contains rpc/rpc.h */
- + } else
- + f_print(fout, "#include <rpc/rpc.h>\n");
- + tell = ftell(fout);
- + while ((def = get_definition()) != NULL) {
- + emit(def);
- + }
- + if (extend && tell == ftell(fout)) {
- + (void) unlink(outfilename);
- + }
- +}
- +
- +
- +static void
- +c_initialize(void)
- +{
- +
- + /* add all the starting basic types */
- +
- + add_type(1,"int");
- + add_type(1,"int32_t");
- + add_type(1,"short");
- + add_type(1,"bool");
- +
- + add_type(1,"u_int");
- + add_type(1,"u_int32_t");
- + add_type(1,"u_short");
- +
- +}
- +
- +char rpcgen_table_dcl[] = "struct rpcgen_table {\n\
- + char *(*proc)();\n\
- + xdrproc_t xdr_arg;\n\
- + unsigned len_arg;\n\
- + xdrproc_t xdr_res;\n\
- + unsigned len_res;\n\
- +};\n";
- +
- +
- +static char *
- +generate_guard(char *pathname)
- +{
- + char* filename, *guard, *tmp;
- +
- + filename = strrchr(pathname, '/' ); /* find last component */
- + filename = ((filename == 0) ? pathname : filename+1);
- + guard = strdup(filename);
- + /* convert to upper case */
- + tmp = guard;
- + while (*tmp) {
- + if (islower(*tmp))
- + *tmp = toupper(*tmp);
- + tmp++;
- + }
- +
- + guard = extendfile(guard, "_H_RPCGEN");
- + return( guard );
- +}
- +
- +/*
- + * Compile into an XDR header file
- + */
- +static void
- +h_output(char *infile, char *define, int extend, char *outfile)
- +{
- + definition *def;
- + char *outfilename;
- + long tell;
- + char *guard;
- + list *l;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + open_output(infile, outfilename);
- + add_warning();
- + guard = generate_guard( outfilename ? outfilename: infile );
- +
- + f_print(fout,"#ifndef _%s\n#define _%s\n\n", guard,
- + guard);
- +
- + f_print(fout, "#include <rpc/rpc.h>\n\n");
- +
- + f_print(fout, "#ifndef IXDR_GET_INT32\n");
- + f_print(fout, "#define IXDR_GET_INT32(buf) IXDR_GET_LONG((buf))\n");
- + f_print(fout, "#endif\n");
- + f_print(fout, "#ifndef IXDR_PUT_INT32\n");
- + f_print(fout, "#define IXDR_PUT_INT32(buf, v) IXDR_PUT_LONG((buf), (v))\n");
- + f_print(fout, "#endif\n");
- + f_print(fout, "#ifndef IXDR_GET_U_INT32\n");
- + f_print(fout, "#define IXDR_GET_U_INT32(buf) IXDR_GET_U_LONG((buf))\n");
- + f_print(fout, "#endif\n");
- + f_print(fout, "#ifndef IXDR_PUT_U_INT32\n");
- + f_print(fout, "#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_U_LONG((buf), (v))\n");
- + f_print(fout, "#endif\n");
- +
- + tell = ftell(fout);
- + /* print data definitions */
- + while ((def = get_definition()) != NULL) {
- + print_datadef(def);
- + }
- +
- + /* print function declarations.
- + Do this after data definitions because they might be used as
- + arguments for functions */
- + for (l = defined; l != NULL; l = l->next) {
- + print_funcdef(l->val);
- + }
- + if (extend && tell == ftell(fout)) {
- + (void) unlink(outfilename);
- + } else if (tblflag) {
- + f_print(fout, rpcgen_table_dcl);
- + }
- + f_print(fout, "\n#endif /* !_%s */\n", guard);
- +}
- +
- +/*
- + * Compile into an RPC service
- + */
- +static void
- +s_output(int argc, char **argv, char *infile, char *define, int extend,
- + char *outfile, int nomain, int netflag)
- +{
- + char *include;
- + definition *def;
- + int foundprogram = 0;
- + char *outfilename;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + open_output(infile, outfilename);
- + add_warning();
- + if (infile && (include = extendfile(infile, ".h"))) {
- + f_print(fout, "#include \"%s\"\n", include);
- + free(include);
- + } else
- + f_print(fout, "#include <rpc/rpc.h>\n");
- +
- + f_print(fout, "#include <stdio.h>\n");
- + f_print(fout, "#include <stdlib.h>/* getenv, exit */\n");
- + if (Cflag) {
- + f_print (fout, "#include <rpc/pmap_clnt.h> /* for pmap_unset */\n");
- + f_print (fout, "#include <string.h> /* strcmp */ \n");
- + }
- + if (strcmp(svcclosetime, "-1") == 0)
- + indefinitewait = 1;
- + else if (strcmp(svcclosetime, "0") == 0)
- + exitnow = 1;
- + else if (inetdflag || pmflag) {
- + f_print(fout, "#include <signal.h>\n");
- + timerflag = 1;
- + }
- +
- +#ifndef linux
- + if( !tirpcflag && inetdflag )
- + f_print(fout, "#include <sys/ttycom.h>/* TIOCNOTTY */\n");
- +#else
- + if( !tirpcflag )
- + f_print(fout, "#include <sys/ioctl.h>/* TIOCNOTTY */\n");
- +#endif
- + if( Cflag && (inetdflag || pmflag ) ) {
- + f_print(fout, "#ifdef __cplusplus\n");
- + f_print(fout, "#include <sysent.h> /* getdtablesize, open */\n");
- + f_print(fout, "#endif /* __cplusplus */\n");
- +
- + if( tirpcflag )
- + f_print(fout, "#include <unistd.h> /* setsid */\n");
- + }
- + if( tirpcflag )
- + f_print(fout, "#include <sys/types.h>\n");
- +
- + f_print(fout, "#include <memory.h>\n");
- +#ifndef linux
- + f_print(fout, "#include <stropts.h>\n");
- +#endif
- + if (inetdflag || !tirpcflag ) {
- + f_print(fout, "#include <sys/socket.h>\n");
- + f_print(fout, "#include <netinet/in.h>\n");
- + }
- +
- + if ( (netflag || pmflag) && tirpcflag ) {
- + f_print(fout, "#include <netconfig.h>\n");
- + }
- + if (/*timerflag &&*/ tirpcflag)
- + f_print(fout, "#include <sys/resource.h> /* rlimit */\n");
- + if (logflag || inetdflag || pmflag) {
- +#ifdef linux
- + f_print(fout, "#include <syslog.h>\n");
- +#else
- + f_print(fout, "#ifdef SYSLOG\n");
- + f_print(fout, "#include <syslog.h>\n");
- + f_print(fout, "#else\n");
- + f_print(fout, "#define LOG_ERR 1\n");
- + f_print(fout, "#define openlog(a, b, c)\n");
- + f_print(fout, "#endif\n");
- +#endif
- + }
- +
- + /* for ANSI-C */
- + f_print(fout, "\n#ifdef __STDC__\n#define SIG_PF void(*)(int)\n#endif\n");
- +
- + f_print(fout, "\n#ifdef DEBUG\n#define RPC_SVC_FG\n#endif\n");
- + if (timerflag)
- + f_print(fout, "\n#define _RPCSVC_CLOSEDOWN %s\n", svcclosetime);
- + while ((def = get_definition()) != NULL) {
- + foundprogram |= (def->def_kind == DEF_PROGRAM);
- + }
- + if (extend && !foundprogram) {
- + (void) unlink(outfilename);
- + return;
- + }
- + write_most(infile, netflag, nomain);
- + if (!nomain) {
- + if( !do_registers(argc, argv) ) {
- + if (outfilename)
- + (void) unlink(outfilename);
- + usage();
- + }
- + write_rest();
- + }
- +}
- +
- +/*
- + * generate client side stubs
- + */
- +static void
- +l_output(char *infile, char *define, int extend, char *outfile)
- +{
- + char *include;
- + definition *def;
- + int foundprogram = 0;
- + char *outfilename;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + open_output(infile, outfilename);
- + add_warning();
- + if (Cflag)
- + f_print (fout, "#include <memory.h> /* for memset */\n");
- + if (infile && (include = extendfile(infile, ".h"))) {
- + f_print(fout, "#include \"%s\"\n", include);
- + free(include);
- + } else
- + f_print(fout, "#include <rpc/rpc.h>\n");
- + while ((def = get_definition()) != NULL) {
- + foundprogram |= (def->def_kind == DEF_PROGRAM);
- + }
- + if (extend && !foundprogram) {
- + (void) unlink(outfilename);
- + return;
- + }
- + write_stubs();
- +}
- +
- +/*
- + * generate the dispatch table
- + */
- +static void
- +t_output(char *infile, char *define, int extend, char *outfile)
- +{
- + definition *def;
- + int foundprogram = 0;
- + char *outfilename;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + open_output(infile, outfilename);
- + add_warning();
- + while ((def = get_definition()) != NULL) {
- + foundprogram |= (def->def_kind == DEF_PROGRAM);
- + }
- + if (extend && !foundprogram) {
- + (void) unlink(outfilename);
- + return;
- + }
- + write_tables();
- +}
- +
- +/* sample routine for the server template */
- +static void
- +svc_output(char *infile, char *define, int extend, char *outfile)
- +{
- + definition *def;
- + char *include;
- + char *outfilename;
- + long tell;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + checkfiles(infile,outfilename); /*check if outfile already exists.
- + if so, print an error message and exit*/
- + open_output(infile, outfilename);
- + add_sample_msg();
- +
- + if (infile && (include = extendfile(infile, ".h"))) {
- + f_print(fout, "#include \"%s\"\n", include);
- + free(include);
- + } else
- + f_print(fout, "#include <rpc/rpc.h>\n");
- +
- + tell = ftell(fout);
- + while ((def = get_definition()) != NULL) {
- + write_sample_svc(def);
- + }
- + if (extend && tell == ftell(fout)) {
- + (void) unlink(outfilename);
- + }
- +}
- +
- +
- +/* sample main routine for client */
- +static void
- +clnt_output(char *infile, char *define, int extend, char *outfile)
- +{
- + definition *def;
- + char *include;
- + char *outfilename;
- + long tell;
- + int has_program = 0;
- +
- + open_input(infile, define);
- + outfilename = extend ? extendfile(infile, outfile) : outfile;
- + checkfiles(infile, outfilename); /*check if outfile already exists.
- + if so, print an error message and exit*/
- +
- + open_output(infile, outfilename);
- + add_sample_msg();
- + if (infile && (include = extendfile(infile, ".h"))) {
- + f_print(fout, "#include \"%s\"\n", include);
- + free(include);
- + } else
- + f_print(fout, "#include <rpc/rpc.h>\n");
- + tell = ftell(fout);
- + while ((def = get_definition()) != NULL) {
- + has_program += write_sample_clnt(def);
- + }
- +
- + if (has_program)
- + write_sample_clnt_main();
- +
- + if (extend && tell == ftell(fout)) {
- + (void) unlink(outfilename);
- + }
- +}
- +
- +/*
- + * Perform registrations for service output
- + * Return 0 if failed; 1 otherwise.
- + */
- +static int
- +do_registers(int argc, char **argv)
- +{
- + int i;
- +
- + if (inetdflag || !tirpcflag) {
- + for (i = 1; i < argc; i++) {
- + if (streq(argv[i], "-s")) {
- + if (!check_nettype(argv[i + 1], valid_i_nettypes))
- + return 0;
- + write_inetd_register(argv[i + 1]);
- + i++;
- + }
- + }
- + } else {
- + for (i = 1; i < argc; i++)
- + if (streq(argv[i], "-s")) {
- + if (!check_nettype(argv[i + 1], valid_ti_nettypes))
- + return 0;
- + write_nettype_register(argv[i + 1]);
- + i++;
- + } else if (streq(argv[i], "-n")) {
- + write_netid_register(argv[i + 1]);
- + i++;
- + }
- + }
- + return 1;
- +}
- +
- +/*
- + * Add another argument to the arg list
- + */
- +static void
- +addarg(char *cp)
- +{
- + if (argcount >= ARGLISTLEN) {
- + f_print(stderr, "rpcgen: too many defines\n");
- + crash();
- + /*NOTREACHED*/
- + }
- + arglist[argcount++] = cp;
- +
- +}
- +
- +static void
- +putarg(int where, char *cp)
- +{
- + if (where >= ARGLISTLEN) {
- + f_print(stderr, "rpcgen: arglist coding error\n");
- + crash();
- + /*NOTREACHED*/
- + }
- + arglist[where] = cp;
- +
- +}
- +
- +/*
- + * if input file is stdin and an output file is specified then complain
- + * if the file already exists. Otherwise the file may get overwritten
- + * If input file does not exist, exit with an error
- + */
- +
- +static void
- +checkfiles(char *infile, char *outfile)
- +{
- +
- + struct stat buf;
- +
- + if(infile) /* infile ! = NULL */
- + if(stat(infile,&buf) < 0)
- + {
- + perror(infile);
- + crash();
- + };
- + if (outfile) {
- + if (stat(outfile, &buf) < 0)
- + return; /* file does not exist */
- + else {
- + f_print(stderr,
- + "file '%s' already exists and may be overwritten\n", outfile);
- + crash();
- + }
- + }
- +}
- +
- +/*
- + * Parse command line arguments
- + */
- +static int
- +parseargs(int argc, char **argv, struct commandline *cmd)
- +{
- + int i;
- + int j;
- + char c;
- + char flag[(1 << 8 * sizeof(char))];
- + int nflags;
- +
- + cmdname = argv[0];
- + cmd->infile = cmd->outfile = NULL;
- + if (argc < 2) {
- + return (0);
- + }
- + allfiles = 0;
- + flag['c'] = 0;
- + flag['h'] = 0;
- + flag['l'] = 0;
- + flag['m'] = 0;
- + flag['o'] = 0;
- + flag['s'] = 0;
- + flag['n'] = 0;
- + flag['t'] = 0;
- + flag['S'] = 0;
- + flag['C'] = 0;
- + for (i = 1; i < argc; i++) {
- + if (argv[i][0] != '-') {
- + if (cmd->infile) {
- + f_print( stderr, "Cannot specify more than one input file!\n");
- +
- + return (0);
- + }
- + cmd->infile = argv[i];
- + } else {
- + for (j = 1; argv[i][j] != 0; j++) {
- + c = argv[i][j];
- + switch (c) {
- + case 'a':
- + allfiles = 1;
- + break;
- + case 'c':
- + case 'h':
- + case 'l':
- + case 'm':
- + case 't':
- + if (flag[(int) c]) {
- + return (0);
- + }
- + flag[(int) c] = 1;
- + break;
- + case 'S':
- + /* sample flag: Ss or Sc.
- + Ss means set flag['S'];
- + Sc means set flag['C']; */
- + c = argv[i][++j]; /* get next char */
- + if( c == 's' )
- + c = 'S';
- + else if( c == 'c' )
- + c = 'C';
- + else
- + return( 0 );
- +
- + if (flag[(int) c]) {
- + return (0);
- + }
- + flag[(int) c] = 1;
- + break;
- + case 'C': /* ANSI C syntax */
- + Cflag = 1;
- + break;
- +
- + case 'b': /* turn TIRPC flag off for
- + generating backward compatible
- + */
- + tirpcflag = 0;
- + break;
- +
- + case 'I':
- + inetdflag = 1;
- + break;
- + case 'N':
- + newstyle = 1;
- + break;
- + case 'L':
- + logflag = 1;
- + break;
- + case 'K':
- + if (++i == argc) {
- + return (0);
- + }
- + svcclosetime = argv[i];
- + goto nextarg;
- + case 'T':
- + tblflag = 1;
- + break;
- + case 'i' :
- + if (++i == argc) {
- + return (0);
- + }
- + Inline = atoi(argv[i]);
- + goto nextarg;
- + case 'n':
- + case 'o':
- + case 's':
- + if (argv[i][j - 1] != '-' ||
- + argv[i][j + 1] != 0) {
- + return (0);
- + }
- + flag[(int) c] = 1;
- + if (++i == argc) {
- + return (0);
- + }
- + if (c == 's') {
- + if (!streq(argv[i], "udp") &&
- + !streq(argv[i], "tcp")) {
- + return (0);
- + }
- + } else if (c == 'o') {
- + if (cmd->outfile) {
- + return (0);
- + }
- + cmd->outfile = argv[i];
- + }
- + goto nextarg;
- + case 'D':
- + if (argv[i][j - 1] != '-') {
- + return (0);
- + }
- + (void) addarg(argv[i]);
- + goto nextarg;
- + case 'Y':
- + if (++i == argc) {
- + return (0);
- + }
- + (void) strcpy(pathbuf, argv[i]);
- + (void) strcat(pathbuf, "/cpp");
- + CPP = pathbuf;
- + cppDefined = 1;
- + goto nextarg;
- +
- +
- +
- + default:
- + return (0);
- + }
- + }
- + nextarg:
- + ;
- + }
- + }
- +
- + cmd->cflag = flag['c'];
- + cmd->hflag = flag['h'];
- + cmd->lflag = flag['l'];
- + cmd->mflag = flag['m'];
- + cmd->nflag = flag['n'];
- + cmd->sflag = flag['s'];
- + cmd->tflag = flag['t'];
- + cmd->Ssflag = flag['S'];
- + cmd->Scflag = flag['C'];
- +
- + if( tirpcflag ) {
- + pmflag = inetdflag ? 0 : 1; /* pmflag or inetdflag is always TRUE */
- + if( (inetdflag && cmd->nflag)) { /* netid not allowed with inetdflag */
- + f_print(stderr, "Cannot use netid flag with inetd flag!\n");
- + return (0);
- + }
- + } else { /* 4.1 mode */
- + pmflag = 0; /* set pmflag only in tirpcmode */
- + inetdflag = 1; /* inetdflag is TRUE by default */
- + if( cmd->nflag ) { /* netid needs TIRPC */
- + f_print( stderr, "Cannot use netid flag without TIRPC!\n");
- + return( 0 );
- + }
- + }
- +
- + if( newstyle && ( tblflag || cmd->tflag) ) {
- + f_print( stderr, "Cannot use table flags with newstyle!\n");
- + return( 0 );
- + }
- +
- + /* check no conflicts with file generation flags */
- + nflags = cmd->cflag + cmd->hflag + cmd->lflag + cmd->mflag +
- + cmd->sflag + cmd->nflag + cmd->tflag + cmd->Ssflag + cmd->Scflag;
- +
- + if (nflags == 0) {
- + if (cmd->outfile != NULL || cmd->infile == NULL) {
- + return (0);
- + }
- + } else if (nflags > 1) {
- + f_print( stderr, "Cannot have more than one file generation flag!\n");
- + return (0);
- + }
- + return (1);
- +}
- +
- +static void
- +usage(void)
- +{
- + f_print(stderr, "usage: %s infile\n", cmdname);
- + f_print(stderr, "\t%s [-a][-b][-C][-Dname[=value]] -i size [-I [-K seconds]] [-L][-N][-T] infile\n",
- + cmdname);
- + f_print(stderr, "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss] [-o outfile] [infile]\n",
- + cmdname);
- + f_print(stderr, "\t%s [-s nettype]* [-o outfile] [infile]\n", cmdname);
- + f_print(stderr, "\t%s [-n netid]* [-o outfile] [infile]\n", cmdname);
- + options_usage();
- + exit(1);
- +}
- +
- +static void
- +options_usage(void)
- +{
- + f_print(stderr, "options:\n");
- + f_print(stderr, "-a\t\tgenerate all files, including samples\n");
- + f_print(stderr, "-b\t\tbackward compatibility mode (generates code for SunOS 4.1)\n");
- + f_print(stderr, "-c\t\tgenerate XDR routines\n");
- + f_print(stderr, "-C\t\tANSI C mode\n");
- + f_print(stderr, "-Dname[=value]\tdefine a symbol (same as #define)\n");
- + f_print(stderr, "-h\t\tgenerate header file\n");
- + f_print(stderr, "-i size\t\tsize at which to start generating inline code\n");
- + f_print(stderr, "-I\t\tgenerate code for inetd support in server (for SunOS 4.1)\n");
- + f_print(stderr, "-K seconds\tserver exits after K seconds of inactivity\n");
- + f_print(stderr, "-l\t\tgenerate client side stubs\n");
- + f_print(stderr, "-L\t\tserver errors will be printed to syslog\n");
- + f_print(stderr, "-m\t\tgenerate server side stubs\n");
- + f_print(stderr, "-n netid\tgenerate server code that supports named netid\n");
- + f_print(stderr, "-N\t\tsupports multiple arguments and call-by-value\n");
- + f_print(stderr, "-o outfile\tname of the output file\n");
- + f_print(stderr, "-s nettype\tgenerate server code that supports named nettype\n");
- + f_print(stderr, "-Sc\t\tgenerate sample client code that uses remote procedures\n");
- + f_print(stderr, "-Ss\t\tgenerate sample server code that defines remote procedures\n");
- + f_print(stderr, "-t\t\tgenerate RPC dispatch table\n");
- + f_print(stderr, "-T\t\tgenerate code to support RPC dispatch tables\n");
- + f_print(stderr, "-Y path\t\tdirectory name to find C preprocessor (cpp)\n");
- +
- + exit(1);
- +}
- diff --git a/rpcgen/rpc_output.h b/rpcgen/rpc_output.h
- new file mode 100644
- index 0000000..eb25a60
- --- /dev/null
- +++ b/rpcgen/rpc_output.h
- @@ -0,0 +1,16 @@
- +/*
- + * rpc_output.h
- + *
- + * Declarations for output functions
- + *
- + */
- +
- +#ifndef RPCGEN_NEW_OUTPUT_H
- +#define RPCGEN_NEW_OUTPUT_H
- +
- +void write_msg_out(void);
- +int nullproc(proc_list *);
- +void printarglist(proc_list *, char *, char *);
- +void pdeclaration(char *, declaration *, int, char *);
- +
- +#endif /* RPCGEN_NEW_OUTPUT_H */
- diff --git a/rpcgen/rpc_parse.c b/rpcgen/rpc_parse.c
- new file mode 100644
- index 0000000..b53a553
- --- /dev/null
- +++ b/rpcgen/rpc_parse.c
- @@ -0,0 +1,609 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_parse.c, Parser for the RPC protocol compiler
- + * Copyright (C) 1987 Sun Microsystems, Inc.
- + */
- +#include <stdio.h>
- +#include <string.h>
- +#include "rpc/types.h"
- +#include "rpc_scan.h"
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +
- +#define ARGNAME "arg"
- +
- +/*
- +extern char *make_argname();
- +extern char *strdup();
- + */
- +
- +static void isdefined(definition *defp);
- +static void def_struct(definition *defp);
- +static void def_program(definition *defp);
- +static void def_enum(definition *defp);
- +static void def_const(definition *defp);
- +static void def_union(definition *defp);
- +static void check_type_name(char *name, int new_type);
- +static void def_typedef(definition *defp);
- +static void get_declaration(declaration *dec, defkind dkind);
- +static void get_prog_declaration(declaration *dec, defkind dkind, int num);
- +static void get_type(char **prefixp, char **typep, defkind dkind);
- +static void unsigned_dec(char **typep);
- +
- +/*
- + * return the next definition you see
- + */
- +definition *
- +get_definition(void)
- +{
- + definition *defp;
- + token tok;
- +
- + defp = ALLOC(definition);
- + get_token(&tok);
- + switch (tok.kind) {
- + case TOK_STRUCT:
- + def_struct(defp);
- + break;
- + case TOK_UNION:
- + def_union(defp);
- + break;
- + case TOK_TYPEDEF:
- + def_typedef(defp);
- + break;
- + case TOK_ENUM:
- + def_enum(defp);
- + break;
- + case TOK_PROGRAM:
- + def_program(defp);
- + break;
- + case TOK_CONST:
- + def_const(defp);
- + break;
- + case TOK_EOF:
- + free(defp);
- + return (NULL);
- + default:
- + error("definition keyword expected");
- + }
- + scan(TOK_SEMICOLON, &tok);
- + isdefined(defp);
- + return (defp);
- +}
- +
- +static void
- +isdefined(definition *defp)
- +{
- + STOREVAL(&defined, defp);
- +}
- +
- +static void
- +def_struct(definition *defp)
- +{
- + token tok;
- + declaration dec;
- + decl_list *decls;
- + decl_list **tailp;
- +
- + defp->def_kind = DEF_STRUCT;
- +
- + scan(TOK_IDENT, &tok);
- + defp->def_name = tok.str;
- + scan(TOK_LBRACE, &tok);
- + tailp = &defp->def.st.decls;
- + do {
- + get_declaration(&dec, DEF_STRUCT);
- + decls = ALLOC(decl_list);
- + decls->decl = dec;
- + *tailp = decls;
- + tailp = &decls->next;
- + scan(TOK_SEMICOLON, &tok);
- + peek(&tok);
- + } while (tok.kind != TOK_RBRACE);
- + get_token(&tok);
- + *tailp = NULL;
- +}
- +
- +static void
- +def_program(definition *defp)
- +{
- + token tok;
- + declaration dec;
- + decl_list *decls;
- + decl_list **tailp;
- + version_list *vlist;
- + version_list **vtailp;
- + proc_list *plist;
- + proc_list **ptailp;
- + int num_args;
- + bool_t isvoid = FALSE; /* whether first argument is void */
- + defp->def_kind = DEF_PROGRAM;
- + scan(TOK_IDENT, &tok);
- + defp->def_name = tok.str;
- + scan(TOK_LBRACE, &tok);
- + vtailp = &defp->def.pr.versions;
- + tailp = &defp->def.st.decls;
- + scan(TOK_VERSION, &tok);
- + do {
- + scan(TOK_IDENT, &tok);
- + vlist = ALLOC(version_list);
- + vlist->vers_name = tok.str;
- + scan(TOK_LBRACE, &tok);
- + ptailp = &vlist->procs;
- + do {
- + /* get result type */
- + plist = ALLOC(proc_list);
- + get_type(&plist->res_prefix, &plist->res_type,
- + DEF_PROGRAM);
- + if (streq(plist->res_type, "opaque")) {
- + error("illegal result type");
- + }
- + scan(TOK_IDENT, &tok);
- + plist->proc_name = tok.str;
- + scan(TOK_LPAREN, &tok);
- + /* get args - first one*/
- + num_args = 1;
- + isvoid = FALSE;
- + /* type of DEF_PROGRAM in the first
- + * get_prog_declaration and DEF_STURCT in the next
- + * allows void as argument if it is the only argument
- + */
- + get_prog_declaration(&dec, DEF_PROGRAM, num_args);
- + if (streq(dec.type, "void"))
- + isvoid = TRUE;
- + decls = ALLOC(decl_list);
- + plist->args.decls = decls;
- + decls->decl = dec;
- + tailp = &decls->next;
- + /* get args */
- + while(peekscan(TOK_COMMA, &tok)) {
- + num_args++;
- + get_prog_declaration(&dec, DEF_STRUCT,
- + num_args);
- + decls = ALLOC(decl_list);
- + decls->decl = dec;
- + *tailp = decls;
- + if (streq(dec.type, "void"))
- + isvoid = TRUE;
- + tailp = &decls->next;
- + }
- + /* multiple arguments are only allowed in newstyle */
- + if( !newstyle && num_args > 1 ) {
- + error("only one argument is allowed" );
- + }
- + if (isvoid && num_args > 1) {
- + error("illegal use of void in program definition");
- + }
- + *tailp = NULL;
- + scan(TOK_RPAREN, &tok);
- + scan(TOK_EQUAL, &tok);
- + scan_num(&tok);
- + scan(TOK_SEMICOLON, &tok);
- + plist->proc_num = tok.str;
- + plist->arg_num = num_args;
- + *ptailp = plist;
- + ptailp = &plist->next;
- + peek(&tok);
- + } while (tok.kind != TOK_RBRACE);
- + *ptailp = NULL;
- + *vtailp = vlist;
- + vtailp = &vlist->next;
- + scan(TOK_RBRACE, &tok);
- + scan(TOK_EQUAL, &tok);
- + scan_num(&tok);
- + vlist->vers_num = tok.str;
- + /* make the argument structure name for each arg*/
- + for(plist = vlist->procs; plist != NULL;
- + plist = plist->next) {
- + plist->args.argname = make_argname(plist->proc_name,
- + vlist->vers_num);
- + /* free the memory ??*/
- + }
- + scan(TOK_SEMICOLON, &tok);
- + scan2(TOK_VERSION, TOK_RBRACE, &tok);
- + } while (tok.kind == TOK_VERSION);
- + scan(TOK_EQUAL, &tok);
- + scan_num(&tok);
- + defp->def.pr.prog_num = tok.str;
- + *vtailp = NULL;
- +}
- +
- +
- +static void
- +def_enum(definition *defp)
- +{
- + token tok;
- + enumval_list *elist;
- + enumval_list **tailp;
- +
- + defp->def_kind = DEF_ENUM;
- + scan(TOK_IDENT, &tok);
- + defp->def_name = tok.str;
- + scan(TOK_LBRACE, &tok);
- + tailp = &defp->def.en.vals;
- + do {
- + scan(TOK_IDENT, &tok);
- + elist = ALLOC(enumval_list);
- + elist->name = tok.str;
- + elist->assignment = NULL;
- + scan3(TOK_COMMA, TOK_RBRACE, TOK_EQUAL, &tok);
- + if (tok.kind == TOK_EQUAL) {
- + scan_num(&tok);
- + elist->assignment = tok.str;
- + scan2(TOK_COMMA, TOK_RBRACE, &tok);
- + }
- + *tailp = elist;
- + tailp = &elist->next;
- + } while (tok.kind != TOK_RBRACE);
- + *tailp = NULL;
- +}
- +
- +static void
- +def_const(definition *defp)
- +{
- + token tok;
- +
- + defp->def_kind = DEF_CONST;
- + scan(TOK_IDENT, &tok);
- + defp->def_name = tok.str;
- + scan(TOK_EQUAL, &tok);
- + scan2(TOK_IDENT, TOK_STRCONST, &tok);
- + defp->def.co = tok.str;
- +}
- +
- +static void
- +def_union(definition *defp)
- +{
- + token tok;
- + declaration dec;
- + case_list *cases;
- + case_list **tailp;
- +
- + defp->def_kind = DEF_UNION;
- + scan(TOK_IDENT, &tok);
- + defp->def_name = tok.str;
- + scan(TOK_SWITCH, &tok);
- + scan(TOK_LPAREN, &tok);
- + get_declaration(&dec, DEF_UNION);
- + defp->def.un.enum_decl = dec;
- + tailp = &defp->def.un.cases;
- + scan(TOK_RPAREN, &tok);
- + scan(TOK_LBRACE, &tok);
- + scan(TOK_CASE, &tok);
- + while (tok.kind == TOK_CASE) {
- + scan2(TOK_IDENT, TOK_CHARCONST, &tok);
- + cases = ALLOC(case_list);
- + cases->case_name = tok.str;
- + scan(TOK_COLON, &tok);
- + /* now peek at next token */
- + if(peekscan(TOK_CASE,&tok))
- + {
- +
- + do
- + {
- + scan2(TOK_IDENT, TOK_CHARCONST, &tok);
- + cases->contflag=1; /* continued case statement */
- + *tailp = cases;
- + tailp = &cases->next;
- + cases = ALLOC(case_list);
- + cases->case_name = tok.str;
- + scan(TOK_COLON, &tok);
- +
- + }while(peekscan(TOK_CASE,&tok));
- + }
- +
- + get_declaration(&dec, DEF_UNION);
- + cases->case_decl = dec;
- + cases->contflag=0; /* no continued case statement */
- + *tailp = cases;
- + tailp = &cases->next;
- + scan(TOK_SEMICOLON, &tok);
- +
- + scan3(TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
- + }
- + *tailp = NULL;
- + if (tok.kind == TOK_DEFAULT) {
- + scan(TOK_COLON, &tok);
- + get_declaration(&dec, DEF_UNION);
- + defp->def.un.default_decl = ALLOC(declaration);
- + *defp->def.un.default_decl = dec;
- + scan(TOK_SEMICOLON, &tok);
- + scan(TOK_RBRACE, &tok);
- + } else {
- + defp->def.un.default_decl = NULL;
- + }
- +}
- +
- +static char* reserved_words[] =
- +{
- + "array",
- + "bytes",
- + "destroy",
- + "free",
- + "getpos",
- + "inline",
- + "pointer",
- + "reference",
- + "setpos",
- + "sizeof",
- + "union",
- + "vector",
- + NULL
- + };
- +
- +static char* reserved_types[] =
- +{
- + "opaque",
- + "string",
- + NULL
- + };
- +
- +/* check that the given name is not one that would eventually result in
- + xdr routines that would conflict with internal XDR routines. */
- +static void
- +check_type_name(char *name, int new_type)
- +{
- + int i;
- + char tmp[100];
- +
- + for( i = 0; reserved_words[i] != NULL; i++ ) {
- + if( strcmp( name, reserved_words[i] ) == 0 ) {
- + sprintf(tmp,
- + "illegal (reserved) name :\'%s\' in type definition", name );
- + error(tmp);
- + }
- + }
- + if( new_type ) {
- + for( i = 0; reserved_types[i] != NULL; i++ ) {
- + if( strcmp( name, reserved_types[i] ) == 0 ) {
- + sprintf(tmp,
- + "illegal (reserved) name :\'%s\' in type definition", name );
- + error(tmp);
- + }
- + }
- + }
- +}
- +
- +static void
- +def_typedef(definition *defp)
- +{
- + declaration dec;
- +
- + defp->def_kind = DEF_TYPEDEF;
- + get_declaration(&dec, DEF_TYPEDEF);
- + defp->def_name = dec.name;
- + check_type_name( dec.name, 1 );
- + defp->def.ty.old_prefix = dec.prefix;
- + defp->def.ty.old_type = dec.type;
- + defp->def.ty.rel = dec.rel;
- + defp->def.ty.array_max = dec.array_max;
- +}
- +
- +static void
- +get_declaration(declaration *dec, defkind dkind)
- +{
- + token tok;
- +
- + get_type(&dec->prefix, &dec->type, dkind);
- + dec->rel = REL_ALIAS;
- + if (streq(dec->type, "void")) {
- + return;
- + }
- +
- + check_type_name( dec->type, 0 );
- +
- + scan2(TOK_STAR, TOK_IDENT, &tok);
- + if (tok.kind == TOK_STAR) {
- + dec->rel = REL_POINTER;
- + scan(TOK_IDENT, &tok);
- + }
- + dec->name = tok.str;
- + if (peekscan(TOK_LBRACKET, &tok)) {
- + if (dec->rel == REL_POINTER) {
- + error("no array-of-pointer declarations -- use typedef");
- + }
- + dec->rel = REL_VECTOR;
- + scan_num(&tok);
- + dec->array_max = tok.str;
- + scan(TOK_RBRACKET, &tok);
- + } else if (peekscan(TOK_LANGLE, &tok)) {
- + if (dec->rel == REL_POINTER) {
- + error("no array-of-pointer declarations -- use typedef");
- + }
- + dec->rel = REL_ARRAY;
- + if (peekscan(TOK_RANGLE, &tok)) {
- + dec->array_max = "~0"; /* unspecified size, use max */
- + } else {
- + scan_num(&tok);
- + dec->array_max = tok.str;
- + scan(TOK_RANGLE, &tok);
- + }
- + }
- + if (streq(dec->type, "opaque")) {
- + if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR) {
- + error("array declaration expected");
- + }
- + } else if (streq(dec->type, "string")) {
- + if (dec->rel != REL_ARRAY) {
- + error("variable-length array declaration expected");
- + }
- + }
- +}
- +
- +
- +static void
- +get_prog_declaration(declaration *dec, defkind dkind, int num)
- +{
- + token tok;
- + char name[10]; /* argument name */
- +
- + if (dkind == DEF_PROGRAM) {
- + peek(&tok);
- + if (tok.kind == TOK_RPAREN) { /* no arguments */
- + dec->rel = REL_ALIAS;
- + dec->type = "void";
- + dec->prefix = NULL;
- + dec->name = NULL;
- + return;
- + }
- + }
- + get_type(&dec->prefix, &dec->type, dkind);
- + dec->rel = REL_ALIAS;
- + if (peekscan(TOK_IDENT, &tok)) /* optional name of argument */
- + strcpy(name, tok.str);
- + else
- + sprintf(name, "%s%d", ARGNAME, num); /* default name of argument */
- +
- + dec->name = (char *) strdup(name);
- +
- + if (streq(dec->type, "void")) {
- + return;
- + }
- +
- + if (streq(dec->type, "opaque")) {
- + error("opaque -- illegal argument type");
- + }
- + if (peekscan(TOK_STAR, &tok)) {
- + if (streq(dec->type, "string")) {
- + error("pointer to string not allowed in program arguments\n");
- + }
- + dec->rel = REL_POINTER;
- + if (peekscan(TOK_IDENT, &tok)) /* optional name of argument */
- + dec->name = strdup(tok.str);
- + }
- + if (peekscan(TOK_LANGLE, &tok)) {
- + if (!streq(dec->type, "string")) {
- + error("arrays cannot be declared as arguments to procedures -- use typedef");
- + }
- + dec->rel = REL_ARRAY;
- + if (peekscan(TOK_RANGLE, &tok)) {
- + dec->array_max = "~0";/* unspecified size, use max */
- + } else {
- + scan_num(&tok);
- + dec->array_max = tok.str;
- + scan(TOK_RANGLE, &tok);
- + }
- + }
- + if (streq(dec->type, "string")) {
- + if (dec->rel != REL_ARRAY) { /* .x specifies just string as
- + * type of argument
- + * - make it string<>
- + */
- + dec->rel = REL_ARRAY;
- + dec->array_max = "~0";/* unspecified size, use max */
- + }
- + }
- +}
- +
- +
- +
- +static void
- +get_type(char **prefixp, char **typep, defkind dkind)
- +{
- + token tok;
- +
- + *prefixp = NULL;
- + get_token(&tok);
- + switch (tok.kind) {
- + case TOK_IDENT:
- + *typep = tok.str;
- + break;
- + case TOK_STRUCT:
- + case TOK_ENUM:
- + case TOK_UNION:
- + *prefixp = tok.str;
- + scan(TOK_IDENT, &tok);
- + *typep = tok.str;
- + break;
- + case TOK_UNSIGNED:
- + unsigned_dec(typep);
- + break;
- + case TOK_SHORT:
- + *typep = "short";
- + (void) peekscan(TOK_INT, &tok);
- + break;
- + case TOK_INT32:
- + *typep = "int32_t";
- + (void) peekscan(TOK_INT, &tok);
- + break;
- + case TOK_VOID:
- + if (dkind != DEF_UNION && dkind != DEF_PROGRAM) {
- + error("voids allowed only inside union and program definitions with one argument");
- + }
- + *typep = tok.str;
- + break;
- + case TOK_STRING:
- + case TOK_OPAQUE:
- + case TOK_CHAR:
- + case TOK_INT:
- + case TOK_FLOAT:
- + case TOK_DOUBLE:
- + case TOK_BOOL:
- + *typep = tok.str;
- + break;
- + default:
- + error("expected type specifier");
- + }
- +}
- +
- +static void
- +unsigned_dec(char **typep)
- +{
- + token tok;
- +
- + peek(&tok);
- + switch (tok.kind) {
- + case TOK_CHAR:
- + get_token(&tok);
- + *typep = "u_char";
- + break;
- + case TOK_SHORT:
- + get_token(&tok);
- + *typep = "u_short";
- + (void) peekscan(TOK_INT, &tok);
- + break;
- + case TOK_INT32:
- + get_token(&tok);
- + *typep = "u_int32_";
- + (void) peekscan(TOK_INT, &tok);
- + break;
- + case TOK_INT:
- + get_token(&tok);
- + *typep = "u_int";
- + break;
- + default:
- + *typep = "u_int";
- + break;
- + }
- +}
- diff --git a/rpcgen/rpc_parse.h b/rpcgen/rpc_parse.h
- new file mode 100644
- index 0000000..2afae10
- --- /dev/null
- +++ b/rpcgen/rpc_parse.h
- @@ -0,0 +1,166 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
- +
- +/*
- + * rpc_parse.h, Definitions for the RPCL parser
- + */
- +
- +enum defkind {
- + DEF_CONST,
- + DEF_STRUCT,
- + DEF_UNION,
- + DEF_ENUM,
- + DEF_TYPEDEF,
- + DEF_PROGRAM
- +};
- +typedef enum defkind defkind;
- +
- +typedef char *const_def;
- +
- +enum relation {
- + REL_VECTOR, /* fixed length array */
- + REL_ARRAY, /* variable length array */
- + REL_POINTER, /* pointer */
- + REL_ALIAS, /* simple */
- +};
- +typedef enum relation relation;
- +
- +struct typedef_def {
- + char *old_prefix;
- + char *old_type;
- + relation rel;
- + char *array_max;
- +};
- +typedef struct typedef_def typedef_def;
- +
- +struct enumval_list {
- + char *name;
- + char *assignment;
- + struct enumval_list *next;
- +};
- +typedef struct enumval_list enumval_list;
- +
- +struct enum_def {
- + enumval_list *vals;
- +};
- +typedef struct enum_def enum_def;
- +
- +struct declaration {
- + char *prefix;
- + char *type;
- + char *name;
- + relation rel;
- + char *array_max;
- +};
- +typedef struct declaration declaration;
- +
- +struct decl_list {
- + declaration decl;
- + struct decl_list *next;
- +};
- +typedef struct decl_list decl_list;
- +
- +struct struct_def {
- + decl_list *decls;
- +};
- +typedef struct struct_def struct_def;
- +
- +struct case_list {
- + char *case_name;
- + int contflag;
- + declaration case_decl;
- + struct case_list *next;
- +};
- +typedef struct case_list case_list;
- +
- +struct union_def {
- + declaration enum_decl;
- + case_list *cases;
- + declaration *default_decl;
- +};
- +typedef struct union_def union_def;
- +
- +struct arg_list {
- + char *argname; /* name of struct for arg*/
- + decl_list *decls;
- +};
- +
- +typedef struct arg_list arg_list;
- +
- +struct proc_list {
- + char *proc_name;
- + char *proc_num;
- + arg_list args;
- + int arg_num;
- + char *res_type;
- + char *res_prefix;
- + struct proc_list *next;
- +};
- +typedef struct proc_list proc_list;
- +
- +struct version_list {
- + char *vers_name;
- + char *vers_num;
- + proc_list *procs;
- + struct version_list *next;
- +};
- +typedef struct version_list version_list;
- +
- +struct program_def {
- + char *prog_num;
- + version_list *versions;
- +};
- +typedef struct program_def program_def;
- +
- +struct definition {
- + char *def_name;
- + defkind def_kind;
- + union {
- + const_def co;
- + struct_def st;
- + union_def un;
- + enum_def en;
- + typedef_def ty;
- + program_def pr;
- + } def;
- +};
- +typedef struct definition definition;
- +
- +definition *get_definition();
- +
- +
- +struct bas_type
- +{
- + char *name;
- + int length;
- + struct bas_type *next;
- +};
- +
- +typedef struct bas_type bas_type;
- diff --git a/rpcgen/rpc_sample.c b/rpcgen/rpc_sample.c
- new file mode 100644
- index 0000000..2b5c81b
- --- /dev/null
- +++ b/rpcgen/rpc_sample.c
- @@ -0,0 +1,247 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_sample.c 1.1 90/08/30 (C) 1987 SMI";
- +
- +#endif
- +
- +/*
- + * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
- + */
- +
- +#include <stdio.h>
- +#include <string.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +
- +
- +static char RQSTP[] = "rqstp";
- +
- +static void write_sample_client(char *program_name, version_list *vp);
- +static void write_sample_server(definition * def);
- +static void return_type(proc_list *plist);
- +
- +void
- +write_sample_svc(definition *def)
- +{
- + if (def->def_kind != DEF_PROGRAM)
- + return;
- + write_sample_server(def);
- +}
- +
- +
- +int
- +write_sample_clnt(definition *def)
- +{
- + version_list *vp;
- + int count = 0;
- +
- + if (def->def_kind != DEF_PROGRAM)
- + return (0);
- + /* generate sample code for each version */
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + write_sample_client(def->def_name, vp);
- + ++count;
- + }
- + return (count);
- +}
- +
- +
- +static void
- +write_sample_client(char *program_name, version_list *vp)
- +{
- + proc_list *proc;
- + int i;
- + decl_list *l;
- +
- + f_print(fout, "\n\nvoid\n");
- + pvname(program_name, vp->vers_num);
- + if (Cflag)
- + f_print(fout, "( char* host )\n{\n");
- + else
- + f_print(fout, "(host)\nchar *host;\n{\n");
- + f_print(fout, "\tCLIENT *clnt;\n");
- +
- + i = 0;
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\t");
- + ptype(proc->res_prefix, proc->res_type, 1);
- + f_print(fout, " *result_%d;\n", ++i);
- + /* print out declarations for arguments */
- + if (proc->arg_num < 2 && !newstyle) {
- + f_print(fout, "\t");
- + if (!streq(proc->args.decls->decl.type, "void"))
- + ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
- + else
- + f_print(fout, "char* "); /* cannot have "void" type */
- + f_print(fout, " ");
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_arg;\n");
- + } else if (!streq(proc->args.decls->decl.type, "void")) {
- + for (l = proc->args.decls; l != NULL; l = l->next) {
- + f_print(fout, "\t");
- + ptype(l->decl.prefix, l->decl.type, 1);
- + f_print(fout, " ");
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_%s;\n", l->decl.name);
- + /* pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );*/
- + }
- + }
- + }
- +
- + /* generate creation of client handle */
- + f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
- + program_name, vp->vers_name, tirpcflag ? "netpath" : "udp");
- + f_print(fout, "\tif (clnt == NULL) {\n");
- + f_print(fout, "\t\tclnt_pcreateerror(host);\n");
- + f_print(fout, "\t\texit(1);\n\t}\n");
- +
- + /* generate calls to procedures */
- + i = 0;
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\tresult_%d = ", ++i);
- + pvname(proc->proc_name, vp->vers_num);
- + if (proc->arg_num < 2 && !newstyle) {
- + f_print(fout, "(");
- + if (streq(proc->args.decls->decl.type, "void")) /* cast to void* */
- + f_print(fout, "(void*)");
- + f_print(fout, "&");
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_arg, clnt);\n");
- + } else if (streq(proc->args.decls->decl.type, "void")) {
- + f_print(fout, "(clnt);\n");
- + } else {
- + f_print(fout, "(");
- + for (l = proc->args.decls; l != NULL; l = l->next) {
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_%s, ", l->decl.name);
- + }
- + f_print(fout, "clnt);\n");
- + }
- + f_print(fout, "\tif (result_%d == NULL) {\n", i);
- + f_print(fout, "\t\tclnt_perror(clnt, \"call failed:\");\n");
- + f_print(fout, "\t}\n");
- + }
- +
- + f_print(fout, "\tclnt_destroy( clnt );\n");
- + f_print(fout, "}\n");
- +}
- +
- +static void
- +write_sample_server(definition * def)
- +{
- + version_list *vp;
- + proc_list *proc;
- +
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\n");
- + /* if( Cflag )
- + f_print( fout, "extern \"C\"{\n");
- +*/
- + return_type(proc);
- + f_print(fout, "* \n");
- + if (Cflag)
- + pvname_svc(proc->proc_name, vp->vers_num);
- + else
- + pvname(proc->proc_name, vp->vers_num);
- + printarglist(proc, RQSTP, "struct svc_req *");
- +
- + f_print(fout, "{\n");
- + f_print(fout, "\n\tstatic ");
- + if (!streq(proc->res_type, "void"))
- + return_type(proc);
- + else
- + f_print(fout, "char*"); /* cannot have void type */
- + /* f_print(fout, " result;\n", proc->res_type); */
- + f_print(fout, " result;\n");
- + f_print(fout,
- + "\n\t/*\n\t * insert server code here\n\t */\n\n");
- + if (!streq(proc->res_type, "void"))
- + f_print(fout, "\treturn(&result);\n}\n");
- + else /* cast back to void * */
- + f_print(fout, "\treturn((void*) &result);\n}\n");
- + /* if( Cflag)
- + f_print( fout, "};\n");
- +*/
- +
- + }
- + }
- +}
- +
- +
- +
- +static void
- +return_type(proc_list *plist)
- +{
- + ptype( plist->res_prefix, plist->res_type, 1 );
- +}
- +
- +void
- +add_sample_msg(void)
- +{
- + f_print(fout, "/*\n");
- + f_print(fout, " * This is sample code generated by rpcgen.\n");
- + f_print(fout, " * These are only templates and you can use them\n");
- + f_print(fout, " * as a guideline for developing your own functions.\n");
- + f_print(fout, " */\n\n");
- +}
- +
- +void
- +write_sample_clnt_main(void)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- +
- + f_print(fout, "\n\n" );
- + if( Cflag )
- + f_print(fout,"main( int argc, char* argv[] )\n{\n" );
- + else
- + f_print(fout, "main(argc, argv)\nint argc;\nchar *argv[];\n{\n" );
- +
- + f_print(fout, "\tchar *host;");
- + f_print(fout, "\n\n\tif(argc < 2) {");
- + f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n" );
- + f_print(fout, "\t\texit(1);\n\t}");
- + f_print(fout, "\n\thost = argv[1];\n");
- +
- + for (l = defined; l != NULL; l = l->next) {
- + def = l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + continue;
- + }
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print( fout, "\t" );
- + pvname(def->def_name, vp->vers_num);
- + f_print( fout, "( host );\n" );
- + }
- + }
- + f_print(fout, "}\n");
- +}
- diff --git a/rpcgen/rpc_scan.c b/rpcgen/rpc_scan.c
- new file mode 100644
- index 0000000..f58fa9f
- --- /dev/null
- +++ b/rpcgen/rpc_scan.c
- @@ -0,0 +1,474 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_scan.c, Scanner for the RPC protocol compiler
- + * Copyright (C) 1987, Sun Microsystems, Inc.
- + */
- +#include <stdio.h>
- +#include <ctype.h>
- +#include <string.h>
- +#include "rpc_scan.h"
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +
- +static void unget_token(token *tokp);
- +static void findstrconst(char **str, char **val);
- +static void findchrconst(char **str, char **val);
- +static void findconst(char **str, char **val);
- +static void findkind(char **mark, token *tokp);
- +static int cppline(char *line);
- +static int directive(char *line);
- +static void printdirective(char *line);
- +static void docppline(char *line, int *lineno, char **fname);
- +
- +#define startcomment(where) (where[0] == '/' && where[1] == '*')
- +#define endcomment(where) (where[-1] == '*' && where[0] == '/')
- +
- +static int pushed = 0; /* is a token pushed */
- +static token lasttok; /* last token, if pushed */
- +
- +/*
- + * scan expecting 1 given token
- + */
- +void
- +scan(tok_kind expect, token *tokp)
- +{
- + get_token(tokp);
- + if (tokp->kind != expect) {
- + expected1(expect);
- + }
- +}
- +
- +/*
- + * scan expecting any of the 2 given tokens
- + */
- +void
- +scan2(tok_kind expect1, tok_kind expect2, token *tokp)
- +{
- + get_token(tokp);
- + if (tokp->kind != expect1 && tokp->kind != expect2) {
- + expected2(expect1, expect2);
- + }
- +}
- +
- +/*
- + * scan expecting any of the 3 given token
- + */
- +void
- +scan3(tok_kind expect1, tok_kind expect2, tok_kind expect3, token *tokp)
- +{
- + get_token(tokp);
- + if (tokp->kind != expect1 && tokp->kind != expect2
- + && tokp->kind != expect3) {
- + expected3(expect1, expect2, expect3);
- + }
- +}
- +
- +/*
- + * scan expecting a constant, possibly symbolic
- + */
- +void
- +scan_num(token *tokp)
- +{
- + get_token(tokp);
- + switch (tokp->kind) {
- + case TOK_IDENT:
- + break;
- + default:
- + error("constant or identifier expected");
- + }
- +}
- +
- +/*
- + * Peek at the next token
- + */
- +void
- +peek(token *tokp)
- +{
- + get_token(tokp);
- + unget_token(tokp);
- +}
- +
- +/*
- + * Peek at the next token and scan it if it matches what you expect
- + */
- +int
- +peekscan(tok_kind expect, token *tokp)
- +{
- + peek(tokp);
- + if (tokp->kind == expect) {
- + get_token(tokp);
- + return (1);
- + }
- + return (0);
- +}
- +
- +/*
- + * Get the next token, printing out any directive that are encountered.
- + */
- +void
- +get_token(token *tokp)
- +{
- + int commenting;
- +
- + if (pushed) {
- + pushed = 0;
- + *tokp = lasttok;
- + return;
- + }
- + commenting = 0;
- + for (;;) {
- + if (*where == 0) {
- + for (;;) {
- + if (!fgets(curline, MAXLINESIZE, fin)) {
- + tokp->kind = TOK_EOF;
- + *where = 0;
- + return;
- + }
- + linenum++;
- + if (commenting) {
- + break;
- + } else if (cppline(curline)) {
- + docppline(curline, &linenum,
- + &infilename);
- + } else if (directive(curline)) {
- + printdirective(curline);
- + } else {
- + break;
- + }
- + }
- + where = curline;
- + } else if (isspace(*where)) {
- + while (isspace(*where)) {
- + where++; /* eat */
- + }
- + } else if (commenting) {
- + for (where++; *where; where++) {
- + if (endcomment(where)) {
- + where++;
- + commenting--;
- + break;
- + }
- + }
- + } else if (startcomment(where)) {
- + where += 2;
- + commenting++;
- + } else {
- + break;
- + }
- + }
- +
- + /*
- + * 'where' is not whitespace, comment or directive Must be a token!
- + */
- + switch (*where) {
- + case ':':
- + tokp->kind = TOK_COLON;
- + where++;
- + break;
- + case ';':
- + tokp->kind = TOK_SEMICOLON;
- + where++;
- + break;
- + case ',':
- + tokp->kind = TOK_COMMA;
- + where++;
- + break;
- + case '=':
- + tokp->kind = TOK_EQUAL;
- + where++;
- + break;
- + case '*':
- + tokp->kind = TOK_STAR;
- + where++;
- + break;
- + case '[':
- + tokp->kind = TOK_LBRACKET;
- + where++;
- + break;
- + case ']':
- + tokp->kind = TOK_RBRACKET;
- + where++;
- + break;
- + case '{':
- + tokp->kind = TOK_LBRACE;
- + where++;
- + break;
- + case '}':
- + tokp->kind = TOK_RBRACE;
- + where++;
- + break;
- + case '(':
- + tokp->kind = TOK_LPAREN;
- + where++;
- + break;
- + case ')':
- + tokp->kind = TOK_RPAREN;
- + where++;
- + break;
- + case '<':
- + tokp->kind = TOK_LANGLE;
- + where++;
- + break;
- + case '>':
- + tokp->kind = TOK_RANGLE;
- + where++;
- + break;
- +
- + case '"':
- + tokp->kind = TOK_STRCONST;
- + findstrconst(&where, &tokp->str);
- + break;
- + case '\'':
- + tokp->kind = TOK_CHARCONST;
- + findchrconst(&where, &tokp->str);
- + break;
- +
- + case '-':
- + case '0':
- + case '1':
- + case '2':
- + case '3':
- + case '4':
- + case '5':
- + case '6':
- + case '7':
- + case '8':
- + case '9':
- + tokp->kind = TOK_IDENT;
- + findconst(&where, &tokp->str);
- + break;
- +
- + default:
- + if (!(isalpha(*where) || *where == '_')) {
- + char buf[100];
- + char *p;
- +
- + s_print(buf, "illegal character in file: ");
- + p = buf + strlen(buf);
- + if (isprint(*where)) {
- + s_print(p, "%c", *where);
- + } else {
- + s_print(p, "%d", *where);
- + }
- + error(buf);
- + }
- + findkind(&where, tokp);
- + break;
- + }
- +}
- +
- +static void
- +unget_token(token *tokp)
- +{
- + lasttok = *tokp;
- + pushed = 1;
- +}
- +
- +static void
- +findstrconst(char **str, char **val)
- +{
- + char *p;
- + int size;
- +
- + p = *str;
- + do {
- + *p++;
- + } while (*p && *p != '"');
- + if (*p == 0) {
- + error("unterminated string constant");
- + }
- + p++;
- + size = p - *str;
- + *val = alloc(size + 1);
- + (void) strncpy(*val, *str, size);
- + (*val)[size] = 0;
- + *str = p;
- +}
- +
- +static void
- +findchrconst(char **str, char **val)
- +{
- + char *p;
- + int size;
- +
- + p = *str;
- + do {
- + *p++;
- + } while (*p && *p != '\'');
- + if (*p == 0) {
- + error("unterminated string constant");
- + }
- + p++;
- + size = p - *str;
- + if (size != 3) {
- + error("empty char string");
- + }
- + *val = alloc(size + 1);
- + (void) strncpy(*val, *str, size);
- + (*val)[size] = 0;
- + *str = p;
- +}
- +
- +static void
- +findconst(char **str, char **val)
- +{
- + char *p;
- + int size;
- +
- + p = *str;
- + if (*p == '0' && *(p + 1) == 'x') {
- + p++;
- + do {
- + p++;
- + } while (isxdigit(*p));
- + } else {
- + do {
- + p++;
- + } while (isdigit(*p));
- + }
- + size = p - *str;
- + *val = alloc(size + 1);
- + (void) strncpy(*val, *str, size);
- + (*val)[size] = 0;
- + *str = p;
- +}
- +
- +static token symbols[] = {
- + {TOK_CONST, "const"},
- + {TOK_UNION, "union"},
- + {TOK_SWITCH, "switch"},
- + {TOK_CASE, "case"},
- + {TOK_DEFAULT, "default"},
- + {TOK_STRUCT, "struct"},
- + {TOK_TYPEDEF, "typedef"},
- + {TOK_ENUM, "enum"},
- + {TOK_OPAQUE, "opaque"},
- + {TOK_BOOL, "bool"},
- + {TOK_VOID, "void"},
- + {TOK_CHAR, "char"},
- + {TOK_INT, "int"},
- + {TOK_UNSIGNED, "unsigned"},
- + {TOK_SHORT, "short"},
- + {TOK_INT32, "int32"},
- + {TOK_FLOAT, "float"},
- + {TOK_DOUBLE, "double"},
- + {TOK_STRING, "string"},
- + {TOK_PROGRAM, "program"},
- + {TOK_VERSION, "version"},
- + {TOK_EOF, "??????"},
- +};
- +
- +static void
- +findkind(char **mark, token *tokp)
- +{
- + int len;
- + token *s;
- + char *str;
- +
- + str = *mark;
- + for (s = symbols; s->kind != TOK_EOF; s++) {
- + len = strlen(s->str);
- + if (strncmp(str, s->str, len) == 0) {
- + if (!isalnum(str[len]) && str[len] != '_') {
- + tokp->kind = s->kind;
- + tokp->str = s->str;
- + *mark = str + len;
- + return;
- + }
- + }
- + }
- + tokp->kind = TOK_IDENT;
- + for (len = 0; isalnum(str[len]) || str[len] == '_'; len++);
- + tokp->str = alloc(len + 1);
- + (void) strncpy(tokp->str, str, len);
- + tokp->str[len] = 0;
- + *mark = str + len;
- +}
- +
- +static int
- +cppline(char *line)
- +{
- + return (line == curline && *line == '#');
- +}
- +
- +static int
- +directive(char *line)
- +{
- + return (line == curline && *line == '%');
- +}
- +
- +static void
- +printdirective(char *line)
- +{
- + f_print(fout, "%s", line + 1);
- +}
- +
- +static void
- +docppline(char *line, int *lineno, char **fname)
- +{
- + char *file;
- + int num;
- + char *p;
- +
- + line++;
- + while (isspace(*line)) {
- + line++;
- + }
- + num = atoi(line);
- + while (isdigit(*line)) {
- + line++;
- + }
- + while (isspace(*line)) {
- + line++;
- + }
- + if (*line != '"') {
- + error("preprocessor error");
- + }
- + line++;
- + p = file = alloc(strlen(line) + 1);
- + while (*line && *line != '"') {
- + *p++ = *line++;
- + }
- + if (*line == 0) {
- + error("preprocessor error");
- + }
- + *p = 0;
- + if (*file == 0) {
- + *fname = NULL;
- + free(file);
- + } else {
- + *fname = file;
- + }
- + *lineno = num - 1;
- +}
- diff --git a/rpcgen/rpc_scan.h b/rpcgen/rpc_scan.h
- new file mode 100644
- index 0000000..16f688c
- --- /dev/null
- +++ b/rpcgen/rpc_scan.h
- @@ -0,0 +1,103 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +/* @(#)rpc_scan.h 1.3 90/08/29 (C) 1987 SMI */
- +
- +/*
- + * rpc_scan.h, Definitions for the RPCL scanner
- + */
- +
- +/*
- + * kinds of tokens
- + */
- +enum tok_kind {
- + TOK_IDENT,
- + TOK_CHARCONST,
- + TOK_STRCONST,
- + TOK_LPAREN,
- + TOK_RPAREN,
- + TOK_LBRACE,
- + TOK_RBRACE,
- + TOK_LBRACKET,
- + TOK_RBRACKET,
- + TOK_LANGLE,
- + TOK_RANGLE,
- + TOK_STAR,
- + TOK_COMMA,
- + TOK_EQUAL,
- + TOK_COLON,
- + TOK_SEMICOLON,
- + TOK_CONST,
- + TOK_STRUCT,
- + TOK_UNION,
- + TOK_SWITCH,
- + TOK_CASE,
- + TOK_DEFAULT,
- + TOK_ENUM,
- + TOK_TYPEDEF,
- + TOK_INT,
- + TOK_SHORT,
- + TOK_INT32,
- + TOK_UNSIGNED,
- + TOK_FLOAT,
- + TOK_DOUBLE,
- + TOK_OPAQUE,
- + TOK_CHAR,
- + TOK_STRING,
- + TOK_BOOL,
- + TOK_VOID,
- + TOK_PROGRAM,
- + TOK_VERSION,
- + TOK_EOF
- +};
- +typedef enum tok_kind tok_kind;
- +
- +/*
- + * a token
- + */
- +struct token {
- + tok_kind kind;
- + char *str;
- +};
- +typedef struct token token;
- +
- +
- +/*
- + * routine interface
- + */
- +void scan();
- +void scan2();
- +void scan3();
- +void scan_num();
- +void peek();
- +int peekscan();
- +void get_token();
- +void expected1(tok_kind);
- +void expected2(tok_kind, tok_kind);
- +void expected3(tok_kind, tok_kind, tok_kind);
- +
- diff --git a/rpcgen/rpc_svcout.c b/rpcgen/rpc_svcout.c
- new file mode 100644
- index 0000000..284a529
- --- /dev/null
- +++ b/rpcgen/rpc_svcout.c
- @@ -0,0 +1,882 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- + static char sccsid[] = "@(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
- + */
- +#include <stdio.h>
- +#include <string.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +#include "rpc_output.h"
- +
- +static void write_real_program(definition *def);
- +static void write_program(definition *def, char *storage);
- +static void printerr(char *err, char *transp);
- +static void printif(char *proc, char *transp, char *prefix, char *arg);
- +static void write_inetmost(char *infile);
- +static void print_return(char *space);
- +static void print_pmapunset(char *space);
- +static void print_err_message(char *space);
- +static void write_timeout_func(void);
- +static void write_pm_most(char *infile, int netflag);
- +static void write_rpc_svc_fg(char *infile, char *sp);
- +static void open_log_file(char *infile, char *sp);
- +
- +static char RQSTP[] = "rqstp";
- +static char TRANSP[] = "transp";
- +static char ARG[] = "argument";
- +static char RESULT[] = "result";
- +static char ROUTINE[] = "local";
- +
- +char _errbuf[256]; /* For all messages */
- +
- +static void
- +p_xdrfunc(char *rname, char *typename)
- +{
- + if (Cflag)
- + f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n", rname,
- + stringfix(typename));
- + else
- + f_print(fout, "\t\txdr_%s = xdr_%s;\n", rname, stringfix(typename));
- +}
- +
- +void
- +internal_proctype(proc_list *plist)
- +{
- + f_print(fout, "static ");
- + ptype( plist->res_prefix, plist->res_type, 1 );
- + f_print( fout, "*" );
- +}
- +
- +
- +/*
- + * write most of the service, that is, everything but the registrations.
- + */
- +void
- +write_most(char *infile, int netflag, int nomain)
- +{
- + if (inetdflag || pmflag) {
- + char* var_type;
- + var_type = (nomain? "extern" : "static");
- + f_print(fout, "%s int _rpcpmstart;", var_type );
- + f_print(fout, "\t\t/* Started by a port monitor ? */\n");
- + f_print(fout, "%s int _rpcfdtype;", var_type );
- + f_print(fout, "\t\t/* Whether Stream or Datagram ? */\n");
- + if (timerflag) {
- + f_print(fout, "%s int _rpcsvcdirty;", var_type );
- + f_print(fout, "\t/* Still serving ? */\n");
- + }
- + write_svc_aux( nomain );
- + }
- + /* write out dispatcher and stubs */
- + write_programs( nomain? (char *)NULL : "static" );
- +
- + if( nomain )
- + return;
- +
- + f_print(fout, "\nmain()\n");
- + f_print(fout, "{\n");
- + if (inetdflag) {
- + write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */
- + } else {
- + if( tirpcflag ) {
- + if (netflag) {
- + f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
- + f_print(fout, "\tstruct netconfig *nconf = NULL;\n");
- + }
- + f_print(fout, "\tpid_t pid;\n");
- + f_print(fout, "\tint i;\n");
- + f_print(fout, "\tchar mname[FMNAMESZ + 1];\n\n");
- + write_pm_most(infile, netflag);
- + f_print(fout, "\telse {\n");
- + write_rpc_svc_fg(infile, "\t\t");
- + f_print(fout, "\t}\n");
- + } else {
- + f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
- + f_print(fout, "\n");
- + print_pmapunset("\t");
- + }
- + }
- +
- + if (logflag && !inetdflag) {
- + open_log_file(infile, "\t");
- + }
- +}
- +
- +/*
- + * write a registration for the given transport
- + */
- +void
- +write_netid_register(char *transp)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- + char *sp;
- + char tmpbuf[32];
- +
- + sp = "";
- + f_print(fout, "\n");
- + f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp);
- + f_print(fout, "%s\tif (nconf == NULL) {\n", sp);
- + (void) sprintf(_errbuf, "cannot find %s netid.", transp);
- + sprintf(tmpbuf, "%s\t\t", sp);
- + print_err_message(tmpbuf);
- + f_print(fout, "%s\t\texit(1);\n", sp);
- + f_print(fout, "%s\t}\n", sp);
- + f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n",
- + sp, TRANSP);
- + f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
- + (void) sprintf(_errbuf, "cannot create %s service.", transp);
- + print_err_message(tmpbuf);
- + f_print(fout, "%s\t\texit(1);\n", sp);
- + f_print(fout, "%s\t}\n", sp);
- +
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + continue;
- + }
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print(fout,
- + "%s\t(void) rpcb_unset(%s, %s, nconf);\n",
- + sp, def->def_name, vp->vers_name);
- + f_print(fout,
- + "%s\tif (!svc_reg(%s, %s, %s, ",
- + sp, TRANSP, def->def_name, vp->vers_name);
- + pvname(def->def_name, vp->vers_num);
- + f_print(fout, ", nconf)) {\n");
- + (void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
- + def->def_name, vp->vers_name, transp);
- + print_err_message(tmpbuf);
- + f_print(fout, "%s\t\texit(1);\n", sp);
- + f_print(fout, "%s\t}\n", sp);
- + }
- + }
- + f_print(fout, "%s\tfreenetconfigent(nconf);\n", sp);
- +}
- +
- +/*
- + * write a registration for the given transport for TLI
- + */
- +void
- +write_nettype_register(char *transp)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- +
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + continue;
- + }
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print(fout, "\tif (!svc_create(");
- + pvname(def->def_name, vp->vers_num);
- + f_print(fout, ", %s, %s, \"%s\")) {\n ",
- + def->def_name, vp->vers_name, transp);
- + (void) sprintf(_errbuf,
- + "unable to create (%s, %s) for %s.",
- + def->def_name, vp->vers_name, transp);
- + print_err_message("\t\t");
- + f_print(fout, "\t\texit(1);\n");
- + f_print(fout, "\t}\n");
- + }
- + }
- +}
- +
- +/*
- + * write the rest of the service
- + */
- +void
- +write_rest(void)
- +{
- + f_print(fout, "\n");
- + if (inetdflag) {
- + f_print(fout, "\tif (%s == (SVCXPRT *)NULL) {\n", TRANSP);
- + (void) sprintf(_errbuf, "could not create a handle");
- + print_err_message("\t\t");
- + f_print(fout, "\t\texit(1);\n");
- + f_print(fout, "\t}\n");
- + if (timerflag) {
- + f_print(fout, "\tif (_rpcpmstart) {\n");
- + f_print(fout,
- + "\t\t(void) signal(SIGALRM, %s closedown);\n",
- + Cflag? "(SIG_PF)" : "(void(*)())" );
- + f_print(fout, "\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
- + f_print(fout, "\t}\n");
- + }
- + }
- + f_print(fout, "\tsvc_run();\n");
- + (void) sprintf(_errbuf, "svc_run returned");
- + print_err_message("\t");
- + f_print(fout, "\texit(1);\n");
- + f_print(fout, "\t/* NOTREACHED */\n");
- + f_print(fout, "}\n");
- +}
- +
- +void
- +write_programs(char *storage)
- +{
- + list *l;
- + definition *def;
- +
- + /* write out stubs for procedure definitions */
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind == DEF_PROGRAM) {
- + write_real_program(def);
- + }
- + }
- +
- + /* write out dispatcher for each program */
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind == DEF_PROGRAM) {
- + write_program(def, storage);
- + }
- + }
- +
- +
- +}
- +
- +/* write out definition of internal function (e.g. _printmsg_1(...))
- + which calls server's defintion of actual function (e.g. printmsg_1(...)).
- + Unpacks single user argument of printmsg_1 to call-by-value format
- + expected by printmsg_1. */
- +static void
- +write_real_program(definition *def)
- +{
- + version_list *vp;
- + proc_list *proc;
- + decl_list *l;
- +
- + if( !newstyle ) return; /* not needed for old style */
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\n");
- + internal_proctype(proc);
- + f_print(fout, "\n_");
- + pvname(proc->proc_name, vp->vers_num);
- + if( Cflag ) {
- + f_print(fout, "(" );
- + /* arg name */
- + if (proc->arg_num > 1)
- + f_print(fout, proc->args.argname);
- + else
- + ptype(proc->args.decls->decl.prefix,
- + proc->args.decls->decl.type, 0);
- + f_print(fout, " *argp, struct svc_req *%s)\n",
- + RQSTP);
- + } else {
- + f_print(fout, "(argp, %s)\n", RQSTP );
- + /* arg name */
- + if (proc->arg_num > 1)
- + f_print(fout, "\t%s *argp;\n", proc->args.argname);
- + else {
- + f_print(fout, "\t");
- + ptype(proc->args.decls->decl.prefix,
- + proc->args.decls->decl.type, 0);
- + f_print(fout, " *argp;\n");
- + }
- + f_print(fout, " struct svc_req *%s;\n", RQSTP);
- + }
- +
- + f_print(fout, "{\n");
- + f_print(fout, "\treturn(");
- + if( Cflag )
- + pvname_svc(proc->proc_name, vp->vers_num);
- + else
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "(");
- + if (proc->arg_num < 2) { /* single argument */
- + if (!streq( proc->args.decls->decl.type, "void"))
- + f_print(fout, "*argp, "); /* non-void */
- + } else {
- + for (l = proc->args.decls; l != NULL; l = l->next)
- + f_print(fout, "argp->%s, ", l->decl.name);
- + }
- + f_print(fout, "%s));\n}\n", RQSTP);
- + }
- + }
- +}
- +
- +static void
- +write_program(definition *def, char *storage)
- +{
- + version_list *vp;
- + proc_list *proc;
- + int filled;
- +
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print(fout, "\n");
- + if (storage != NULL) {
- + f_print(fout, "%s ", storage);
- + }
- + f_print(fout, "void\n");
- + pvname(def->def_name, vp->vers_num);
- +
- + if (Cflag) {
- + f_print(fout, "(struct svc_req *%s, ", RQSTP);
- + f_print(fout, "register SVCXPRT *%s)\n", TRANSP);
- + } else {
- + f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
- + f_print(fout, " struct svc_req *%s;\n", RQSTP);
- + f_print(fout, " register SVCXPRT *%s;\n", TRANSP);
- + }
- +
- + f_print(fout, "{\n");
- +
- + filled = 0;
- + f_print(fout, "\tunion {\n");
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + if (proc->arg_num < 2) { /* single argument */
- + if (streq(proc->args.decls->decl.type,
- + "void")) {
- + continue;
- + }
- + filled = 1;
- + f_print(fout, "\t\t");
- + ptype(proc->args.decls->decl.prefix,
- + proc->args.decls->decl.type, 0);
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_arg;\n");
- +
- + }
- + else {
- + filled = 1;
- + f_print(fout, "\t\t%s", proc->args.argname);
- + f_print(fout, " ");
- + pvname(proc->proc_name, vp->vers_num);
- + f_print(fout, "_arg;\n");
- + }
- + }
- + if (!filled) {
- + f_print(fout, "\t\tint fill;\n");
- + }
- + f_print(fout, "\t} %s;\n", ARG);
- + f_print(fout, "\tchar *%s;\n", RESULT);
- +
- + if (Cflag) {
- + f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT);
- + f_print(fout,
- + "\tchar *(*%s)(char *, struct svc_req *);\n",
- + ROUTINE);
- + } else {
- + f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
- + f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
- + }
- +
- + f_print(fout, "\n");
- +
- + if (timerflag)
- + f_print(fout, "\t_rpcsvcdirty = 1;\n");
- + f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
- + if (!nullproc(vp->procs)) {
- + f_print(fout, "\tcase NULLPROC:\n");
- + f_print(fout,
- + "\t\t(void) svc_sendreply(%s, (xdrproc_t) xdr_void, (char *)NULL);\n",
- + TRANSP);
- + print_return("\t\t");
- + f_print(fout, "\n");
- + }
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + f_print(fout, "\tcase %s:\n", proc->proc_name);
- + if (proc->arg_num < 2) { /* single argument */
- + p_xdrfunc( ARG, proc->args.decls->decl.type);
- + } else {
- + p_xdrfunc( ARG, proc->args.argname);
- + }
- + p_xdrfunc( RESULT, proc->res_type);
- + if( Cflag )
- + f_print(fout,
- + "\t\t%s = (char *(*)(char *, struct svc_req *)) ",
- + ROUTINE);
- + else
- + f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
- +
- + if (newstyle) { /* new style: calls internal routine */
- + f_print(fout,"_");
- + }
- + /* Not sure about the following...
- + * rpc_hout always generates foobar_1_svc for
- + * the service procedure, so why should we use
- + * foobar_1 here?! --okir */
- +#if 0
- + if( Cflag && !newstyle )
- + pvname_svc(proc->proc_name, vp->vers_num);
- + else
- + pvname(proc->proc_name, vp->vers_num);
- +#else
- + pvname_svc(proc->proc_name, vp->vers_num);
- +#endif
- + f_print(fout, ";\n");
- + f_print(fout, "\t\tbreak;\n\n");
- + }
- + f_print(fout, "\tdefault:\n");
- + printerr("noproc", TRANSP);
- + print_return("\t\t");
- + f_print(fout, "\t}\n");
- +
- + f_print(fout, "\t(void) memset((char *)&%s, 0, sizeof (%s));\n", ARG, ARG);
- + if (Cflag)
- + printif("getargs", TRANSP, "(caddr_t) &", ARG);
- + else
- + printif("getargs", TRANSP, "&", ARG);
- + printerr("decode", TRANSP);
- + print_return("\t\t");
- + f_print(fout, "\t}\n");
- +
- + if (Cflag)
- + f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n",
- + RESULT, ROUTINE, ARG, RQSTP);
- + else
- + f_print(fout, "\t%s = (*%s)(&%s, %s);\n",
- + RESULT, ROUTINE, ARG, RQSTP);
- + f_print(fout,
- + "\tif (%s != NULL && !svc_sendreply(%s, "
- + "(xdrproc_t) xdr_%s, %s)) {\n",
- + RESULT, TRANSP, RESULT, RESULT);
- + printerr("systemerr", TRANSP);
- + f_print(fout, "\t}\n");
- +
- + if (Cflag)
- + printif("freeargs", TRANSP, "(caddr_t) &", ARG);
- + else
- + printif("freeargs", TRANSP, "&", ARG);
- + (void) sprintf(_errbuf, "unable to free arguments");
- + print_err_message("\t\t");
- + f_print(fout, "\t\texit(1);\n");
- + f_print(fout, "\t}\n");
- + print_return("\t");
- + f_print(fout, "}\n");
- + }
- +}
- +
- +static void
- +printerr(char *err, char *transp)
- +{
- + f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
- +}
- +
- +static void
- +printif(char *proc, char *transp, char *prefix, char *arg)
- +{
- + f_print(fout, "\tif (!svc_%s(%s, (xdrproc_t) xdr_%s, (caddr_t) %s%s)) {\n",
- + proc, transp, arg, prefix, arg);
- +}
- +
- +int
- +nullproc(proc_list *proc)
- +{
- + for (; proc != NULL; proc = proc->next) {
- + if (streq(proc->proc_num, "0")) {
- + return (1);
- + }
- + }
- + return (0);
- +}
- +
- +static void
- +write_inetmost(char *infile)
- +{
- + f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
- + f_print(fout, "\tint sock;\n");
- + f_print(fout, "\tint proto;\n");
- + f_print(fout, "\tstruct sockaddr_in saddr;\n");
- + f_print(fout, "\tint asize = sizeof (saddr);\n");
- + f_print(fout, "\n");
- + f_print(fout,
- + "\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n");
- + f_print(fout, "\t\tint ssize = sizeof (int);\n\n");
- + f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n");
- + f_print(fout, "\t\t\texit(1);\n");
- + f_print(fout, "\t\tif (getsockopt(0, SOL_SOCKET, SO_TYPE,\n");
- + f_print(fout, "\t\t\t\t(char *)&_rpcfdtype, &ssize) == -1)\n");
- + f_print(fout, "\t\t\texit(1);\n");
- + f_print(fout, "\t\tsock = 0;\n");
- + f_print(fout, "\t\t_rpcpmstart = 1;\n");
- + f_print(fout, "\t\tproto = 0;\n");
- + open_log_file(infile, "\t\t");
- + f_print(fout, "\t} else {\n");
- + write_rpc_svc_fg(infile, "\t\t");
- + f_print(fout, "\t\tsock = RPC_ANYSOCK;\n");
- + print_pmapunset("\t\t");
- + f_print(fout, "\t}\n");
- +}
- +
- +static void
- +print_return(char *space)
- +{
- + if (exitnow)
- + f_print(fout, "%sexit(0);\n", space);
- + else {
- + if (timerflag)
- + f_print(fout, "%s_rpcsvcdirty = 0;\n", space);
- + f_print(fout, "%sreturn;\n", space);
- + }
- +}
- +
- +static void
- +print_pmapunset(char *space)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- +
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind == DEF_PROGRAM) {
- + for (vp = def->def.pr.versions; vp != NULL;
- + vp = vp->next) {
- + f_print(fout, "%s(void) pmap_unset(%s, %s);\n",
- + space, def->def_name, vp->vers_name);
- + }
- + }
- + }
- +}
- +
- +static void
- +print_err_message(char *space)
- +{
- + if (logflag)
- + f_print(fout, "%ssyslog(LOG_ERR, \"%s\");\n", space, _errbuf);
- + else if (inetdflag || pmflag)
- + f_print(fout, "%s_msgout(\"%s\");\n", space, _errbuf);
- + else
- + f_print(fout, "%sfprintf(stderr, \"%s\");\n", space, _errbuf);
- +}
- +
- +/*
- + * Write the server auxiliary function ( _msgout, timeout)
- + */
- +void
- +write_svc_aux(int nomain)
- +{
- + if (!logflag)
- + write_msg_out();
- + if( !nomain )
- + write_timeout_func();
- +}
- +
- +/*
- + * Write the _msgout function
- + */
- +void
- +write_msg_out(void)
- +{
- + f_print(fout, "\n");
- + f_print(fout, "static\n");
- + if( !Cflag ) {
- + f_print(fout, "void _msgout(msg)\n");
- + f_print(fout, "\tchar *msg;\n");
- + } else {
- + f_print(fout, "void _msgout(char* msg)\n");
- + }
- + f_print(fout, "{\n");
- + f_print(fout, "#ifdef RPC_SVC_FG\n");
- + if (inetdflag || pmflag)
- + f_print(fout, "\tif (_rpcpmstart)\n");
- + f_print(fout, "\t\tsyslog(LOG_ERR, \"%%s\", msg);\n");
- + f_print(fout, "\telse\n");
- + f_print(fout, "\t\t(void) fprintf(stderr, \"%%s\\n\", msg);\n");
- + f_print(fout, "#else\n");
- + f_print(fout, "\tsyslog(LOG_ERR, \"%%s\", msg);\n");
- + f_print(fout, "#endif\n");
- + f_print(fout, "}\n");
- +}
- +
- +/*
- + * Write the timeout function
- + */
- +static void
- +write_timeout_func(void)
- +{
- + if (!timerflag)
- + return;
- + f_print(fout, "\n");
- + f_print(fout, "static void\n");
- + f_print(fout, "closedown()\n");
- + f_print(fout, "{\n");
- + f_print(fout, "\tif (_rpcsvcdirty == 0) {\n");
- + f_print(fout, "\t\tstatic int size;\n");
- + f_print(fout, "\t\tint i, openfd;\n");
- + if (tirpcflag && pmflag) {
- + f_print(fout, "\t\tstruct t_info tinfo;\n\n");
- + f_print(fout, "\t\tif (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS))\n");
- + } else {
- + f_print(fout, "\n\t\tif (_rpcfdtype == SOCK_DGRAM)\n");
- + }
- + f_print(fout, "\t\t\texit(0);\n");
- + f_print(fout, "\t\tif (size == 0) {\n");
- + if( tirpcflag ) {
- + f_print(fout, "\t\t\tstruct rlimit rl;\n\n");
- + f_print(fout, "\t\t\trl.rlim_max = 0;\n");
- + f_print(fout, "\t\t\tgetrlimit(RLIMIT_NOFILE, &rl);\n");
- + f_print(fout, "\t\t\tif ((size = rl.rlim_max) == 0)\n");
- + f_print(fout, "\t\t\t\treturn;\n");
- + } else {
- + f_print(fout, "\t\t\tsize = getdtablesize();\n");
- + }
- + f_print(fout, "\t\t}\n");
- + f_print(fout, "\t\tfor (i = 0, openfd = 0; i < size && openfd < 2; i++)\n");
- + f_print(fout, "\t\t\tif (FD_ISSET(i, &svc_fdset))\n");
- + f_print(fout, "\t\t\t\topenfd++;\n");
- + f_print(fout, "\t\tif (openfd <= 1)\n");
- + f_print(fout, "\t\t\texit(0);\n");
- + f_print(fout, "\t}\n");
- + f_print(fout, "\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
- + f_print(fout, "}\n");
- +}
- +
- +/*
- + * Write the most of port monitor support
- + */
- +static void
- +write_pm_most(char *infile, int netflag)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- +
- + f_print(fout, "\tif (!ioctl(0, I_LOOK, mname) &&\n");
- + f_print(fout, "\t\t(!strcmp(mname, \"sockmod\") ||");
- + f_print(fout, " !strcmp(mname, \"timod\"))) {\n");
- + f_print(fout, "\t\tchar *netid;\n");
- + if (!netflag) { /* Not included by -n option */
- + f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n");
- + f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP);
- + }
- + if( timerflag )
- + f_print(fout, "\t\tint pmclose;\n");
- +/* not necessary, defined in /usr/include/stdlib */
- +/* f_print(fout, "\t\textern char *getenv();\n");*/
- + f_print(fout, "\n");
- + f_print(fout, "\t\t_rpcpmstart = 1;\n");
- + if (logflag)
- + open_log_file(infile, "\t\t");
- + f_print(fout, "\t\tif ((netid = getenv(\"NLSPROVIDER\")) == NULL) {\n");
- + sprintf(_errbuf, "cannot get transport name");
- + print_err_message("\t\t\t");
- + f_print(fout, "\t\t} else if ((nconf = getnetconfigent(netid)) == NULL) {\n");
- + sprintf(_errbuf, "cannot get transport info");
- + print_err_message("\t\t\t");
- + f_print(fout, "\t\t}\n");
- + /*
- + * A kludgy support for inetd services. Inetd only works with
- + * sockmod, and RPC works only with timod, hence all this jugglery
- + */
- + f_print(fout, "\t\tif (strcmp(mname, \"sockmod\") == 0) {\n");
- + f_print(fout, "\t\t\tif (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, \"timod\")) {\n");
- + sprintf(_errbuf, "could not get the right module");
- + print_err_message("\t\t\t\t");
- + f_print(fout, "\t\t\t\texit(1);\n");
- + f_print(fout, "\t\t\t}\n");
- + f_print(fout, "\t\t}\n");
- + if( timerflag )
- + f_print(fout, "\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n");
- + f_print(fout, "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {\n",
- + TRANSP);
- + sprintf(_errbuf, "cannot create server handle");
- + print_err_message("\t\t\t");
- + f_print(fout, "\t\t\texit(1);\n");
- + f_print(fout, "\t\t}\n");
- + f_print(fout, "\t\tif (nconf)\n");
- + f_print(fout, "\t\t\tfreenetconfigent(nconf);\n");
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + continue;
- + }
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print(fout,
- + "\t\tif (!svc_reg(%s, %s, %s, ",
- + TRANSP, def->def_name, vp->vers_name);
- + pvname(def->def_name, vp->vers_num);
- + f_print(fout, ", 0)) {\n");
- + (void) sprintf(_errbuf, "unable to register (%s, %s).",
- + def->def_name, vp->vers_name);
- + print_err_message("\t\t\t");
- + f_print(fout, "\t\t\texit(1);\n");
- + f_print(fout, "\t\t}\n");
- + }
- + }
- + if (timerflag) {
- + f_print(fout, "\t\tif (pmclose) {\n");
- + f_print(fout, "\t\t\t(void) signal(SIGALRM, %s closedown);\n",
- + Cflag? "(SIG_PF)" : "(void(*)())" );
- + f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
- + f_print(fout, "\t\t}\n");
- + }
- + f_print(fout, "\t\tsvc_run();\n");
- + f_print(fout, "\t\texit(1);\n");
- + f_print(fout, "\t\t/* NOTREACHED */\n");
- + f_print(fout, "\t}\n");
- +}
- +
- +/*
- + * Support for backgrounding the server if self started.
- + */
- +static void
- +write_rpc_svc_fg(char *infile, char *sp)
- +{
- + f_print(fout, "#ifndef RPC_SVC_FG\n");
- + f_print(fout, "%sint size;\n", sp);
- + if( tirpcflag )
- + f_print(fout, "%sstruct rlimit rl;\n", sp);
- + if (inetdflag)
- + f_print(fout, "%sint pid, i;\n\n", sp);
- + f_print(fout, "%spid = fork();\n", sp);
- + f_print(fout, "%sif (pid < 0) {\n", sp);
- + f_print(fout, "%s\tperror(\"cannot fork\");\n", sp);
- + f_print(fout, "%s\texit(1);\n", sp);
- + f_print(fout, "%s}\n", sp);
- + f_print(fout, "%sif (pid)\n", sp);
- + f_print(fout, "%s\texit(0);\n", sp);
- + /* get number of file descriptors */
- + if( tirpcflag ) {
- + f_print(fout, "%srl.rlim_max = 0;\n", sp);
- + f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp);
- + f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp);
- + f_print(fout, "%s\texit(1);\n", sp);
- + } else {
- + f_print(fout, "%ssize = getdtablesize();\n", sp);
- + }
- +
- + f_print(fout, "%sfor (i = 0; i < size; i++)\n", sp);
- + f_print(fout, "%s\t(void) close(i);\n", sp);
- + /* Redirect stderr and stdout to console */
- + f_print(fout, "%si = open(\"/dev/console\", 2);\n", sp);
- + f_print(fout, "%s(void) dup2(i, 1);\n", sp);
- + f_print(fout, "%s(void) dup2(i, 2);\n", sp);
- + /* This removes control of the controlling terminal */
- + if( tirpcflag )
- + f_print(fout, "%ssetsid();\n", sp);
- + else {
- + f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp);
- + f_print(fout, "%sif (i >= 0) {\n", sp);
- + f_print(fout, "%s\t(void) ioctl(i, TIOCNOTTY, (char *)NULL);\n", sp);;
- + f_print(fout, "%s\t(void) close(i);\n", sp);
- + f_print(fout, "%s}\n", sp);
- + }
- + if (!logflag)
- + open_log_file(infile, sp);
- + f_print(fout, "#endif\n");
- + if (logflag)
- + open_log_file(infile, sp);
- +}
- +
- +static void
- +open_log_file(char *infile, char *sp)
- +{
- + char *s;
- +
- + s = strrchr(infile, '.');
- + if (s)
- + *s = '\0';
- + f_print(fout,"%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile);
- + if (s)
- + *s = '.';
- +}
- +
- +
- +
- +
- +/*
- + * write a registration for the given transport for Inetd
- + */
- +void
- +write_inetd_register(char *transp)
- +{
- + list *l;
- + definition *def;
- + version_list *vp;
- + char *sp;
- + int isudp;
- + char tmpbuf[32];
- +
- + if (inetdflag)
- + sp = "\t";
- + else
- + sp = "";
- + if (streq(transp, "udp"))
- + isudp = 1;
- + else
- + isudp = 0;
- + f_print(fout, "\n");
- + if (inetdflag) {
- + f_print(fout, "\tif ((_rpcfdtype == 0) || (_rpcfdtype == %s)) {\n",
- + isudp ? "SOCK_DGRAM" : "SOCK_STREAM");
- + }
- + f_print(fout, "%s\t%s = svc%s_create(%s",
- + sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK");
- + if (!isudp)
- + f_print(fout, ", 0, 0");
- + f_print(fout, ");\n");
- + f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
- + (void) sprintf(_errbuf, "cannot create %s service.", transp);
- + (void) sprintf(tmpbuf, "%s\t\t", sp);
- + print_err_message(tmpbuf);
- + f_print(fout, "%s\t\texit(1);\n", sp);
- + f_print(fout, "%s\t}\n", sp);
- +
- + if (inetdflag) {
- + f_print(fout, "%s\tif (!_rpcpmstart)\n\t", sp);
- + f_print(fout, "%s\tproto = IPPROTO_%s;\n",
- + sp, isudp ? "UDP": "TCP");
- + }
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind != DEF_PROGRAM) {
- + continue;
- + }
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + f_print(fout, "%s\tif (!svc_register(%s, %s, %s, ",
- + sp, TRANSP, def->def_name, vp->vers_name);
- + pvname(def->def_name, vp->vers_num);
- + if (inetdflag)
- + f_print(fout, ", proto)) {\n");
- + else
- + f_print(fout, ", IPPROTO_%s)) {\n",
- + isudp ? "UDP": "TCP");
- + (void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
- + def->def_name, vp->vers_name, transp);
- + print_err_message(tmpbuf);
- + f_print(fout, "%s\t\texit(1);\n", sp);
- + f_print(fout, "%s\t}\n", sp);
- + }
- + }
- + if (inetdflag)
- + f_print(fout, "\t}\n");
- +}
- diff --git a/rpcgen/rpc_tblout.c b/rpcgen/rpc_tblout.c
- new file mode 100644
- index 0000000..ae002f7
- --- /dev/null
- +++ b/rpcgen/rpc_tblout.c
- @@ -0,0 +1,165 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI";
- +#endif
- +
- +/*
- + * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler
- + */
- +#include <stdio.h>
- +#include <string.h>
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +#include "rpc_output.h"
- +
- +static void write_table(definition *def);
- +static void printit(char *prefix, char *type);
- +
- +#define TABSIZE 8
- +#define TABCOUNT 5
- +#define TABSTOP (TABSIZE*TABCOUNT)
- +
- +static char tabstr[TABCOUNT+1] = "\t\t\t\t\t";
- +
- +static char tbl_hdr[] = "struct rpcgen_table %s_table[] = {\n";
- +static char tbl_end[] = "};\n";
- +
- +static char null_entry[] = "\n\t(char *(*)())0,\n\
- + \t(xdrproc_t) xdr_void,\t\t\t0,\n\
- + \t(xdrproc_t) xdr_void,\t\t\t0,\n";
- +
- +
- +static char tbl_nproc[] = "int %s_nproc =\n\tsizeof(%s_table)/sizeof(%s_table[0]);\n\n";
- +
- +void
- +write_tables(void)
- +{
- + list *l;
- + definition *def;
- +
- + f_print(fout, "\n");
- + for (l = defined; l != NULL; l = l->next) {
- + def = (definition *) l->val;
- + if (def->def_kind == DEF_PROGRAM) {
- + write_table(def);
- + }
- + }
- +}
- +
- +static void
- +write_table(definition *def)
- +{
- + version_list *vp;
- + proc_list *proc;
- + int current;
- + int expected;
- + char progvers[100];
- + int warning;
- +
- + for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
- + warning = 0;
- + s_print(progvers, "%s_%s",
- + locase(def->def_name), vp->vers_num);
- + /* print the table header */
- + f_print(fout, tbl_hdr, progvers);
- +
- + if (nullproc(vp->procs)) {
- + expected = 0;
- + } else {
- + expected = 1;
- + f_print(fout, null_entry);
- + }
- + for (proc = vp->procs; proc != NULL; proc = proc->next) {
- + current = atoi(proc->proc_num);
- + if (current != expected++) {
- + f_print(fout,
- + "\n/*\n * WARNING: table out of order\n */\n");
- + if (warning == 0) {
- + f_print(stderr,
- + "WARNING %s table is out of order\n",
- + progvers);
- + warning = 1;
- + nonfatalerrors = 1;
- + }
- + expected = current + 1;
- + }
- + f_print(fout, "\n\t(char *(*)())RPCGEN_ACTION(");
- +
- + /* routine to invoke */
- + if( Cflag && !newstyle )
- + pvname_svc(proc->proc_name, vp->vers_num);
- + else {
- + if( newstyle )
- + f_print( fout, "_"); /* calls internal func */
- + pvname(proc->proc_name, vp->vers_num);
- + }
- + f_print(fout, "),\n");
- +
- + /* argument info */
- + if( proc->arg_num > 1 )
- + printit((char*) NULL, proc->args.argname );
- + else
- + /* do we have to do something special for newstyle */
- + printit( proc->args.decls->decl.prefix,
- + proc->args.decls->decl.type );
- + /* result info */
- + printit(proc->res_prefix, proc->res_type);
- + }
- +
- + /* print the table trailer */
- + f_print(fout, tbl_end);
- + f_print(fout, tbl_nproc, progvers, progvers, progvers);
- + }
- +}
- +
- +static void
- +printit(char *prefix, char *type)
- +{
- + int len;
- + int tabs;
- +
- +
- + len = fprintf(fout, "\txdr_%s,", stringfix(type));
- + /* account for leading tab expansion */
- + len += TABSIZE - 1;
- + /* round up to tabs required */
- + tabs = (TABSTOP - len + TABSIZE - 1)/TABSIZE;
- + f_print(fout, "%s", &tabstr[TABCOUNT-tabs]);
- +
- + if (streq(type, "void")) {
- + f_print(fout, "0");
- + } else {
- + f_print(fout, "sizeof ( ");
- + /* XXX: should "follow" be 1 ??? */
- + ptype(prefix, type, 0);
- + f_print(fout, ")");
- + }
- + f_print(fout, ",\n");
- +}
- diff --git a/rpcgen/rpc_util.c b/rpcgen/rpc_util.c
- new file mode 100644
- index 0000000..b67be57
- --- /dev/null
- +++ b/rpcgen/rpc_util.c
- @@ -0,0 +1,479 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +#if 0
- +static char sccsid[] = "@(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI";
- +#endif
- +
- +/*
- + * rpc_util.c, Utility routines for the RPC protocol compiler
- + */
- +#include <stdio.h>
- +#include <memory.h>
- +#include <ctype.h>
- +#include <unistd.h>
- +#include "rpc_scan.h"
- +#include "rpc_parse.h"
- +#include "rpc_util.h"
- +
- +static void printwhere(void);
- +
- +
- +#define ARGEXT "argument"
- +
- +char curline[MAXLINESIZE]; /* current read line */
- +char *where = curline; /* current point in line */
- +int linenum = 0; /* current line number */
- +
- +char *infilename; /* input filename */
- +
- +#define NFILES 7
- +char *outfiles[NFILES]; /* output file names */
- +int nfiles;
- +
- +FILE *fout; /* file pointer of current output */
- +FILE *fin; /* file pointer of current input */
- +
- +list *defined; /* list of defined things */
- +
- +/*
- + * Reinitialize the world
- + */
- +void
- +reinitialize(void)
- +{
- + memset(curline, 0, MAXLINESIZE);
- + where = curline;
- + linenum = 0;
- + defined = NULL;
- +}
- +
- +/*
- + * string equality
- + */
- +int
- +streq(char *a, char *b)
- +{
- + return (strcmp(a, b) == 0);
- +}
- +
- +/*
- + * find a value in a list
- + */
- +definition *
- +findval(list *lst, char *val, int (*cmp)(definition *, char *))
- +{
- +
- + for (; lst != NULL; lst = lst->next) {
- + if ((*cmp) (lst->val, val)) {
- + return (lst->val);
- + }
- + }
- + return (NULL);
- +}
- +
- +/*
- + * store a value in a list
- + */
- +void
- +storeval(lstp, val)
- + list **lstp;
- + definition *val;
- +{
- + list **l;
- + list *lst;
- +
- +
- + for (l = lstp; *l != NULL; l = (list **) & (*l)->next);
- + lst = ALLOC(list);
- + lst->val = val;
- + lst->next = NULL;
- + *l = lst;
- +}
- +
- +static int
- +findit(definition *def, char *type)
- +{
- + return (streq(def->def_name, type));
- +}
- +
- +static char *
- +fixit(char *type, char *orig)
- +{
- + definition *def;
- +
- + def = (definition *) FINDVAL(defined, type, findit);
- + if (def == NULL || def->def_kind != DEF_TYPEDEF) {
- + return (orig);
- + }
- + switch (def->def.ty.rel) {
- + case REL_VECTOR:
- + return (def->def.ty.old_type);
- + case REL_ALIAS:
- + return (fixit(def->def.ty.old_type, orig));
- + default:
- + return (orig);
- + }
- +}
- +
- +char *
- +fixtype(char *type)
- +{
- + return (fixit(type, type));
- +}
- +
- +char *
- +stringfix(char *type)
- +{
- + if (streq(type, "string")) {
- + return ("wrapstring");
- + } else {
- + return (type);
- + }
- +}
- +
- +void
- +ptype(char *prefix, char *type, int follow)
- +{
- + if (prefix != NULL) {
- + if (streq(prefix, "enum")) {
- + f_print(fout, "enum ");
- + } else {
- + f_print(fout, "struct ");
- + }
- + }
- + if (streq(type, "bool")) {
- + f_print(fout, "bool_t ");
- + } else if (streq(type, "string")) {
- + f_print(fout, "char *");
- + } else {
- + f_print(fout, "%s ", follow ? fixtype(type) : type);
- + }
- +}
- +
- +static int
- +typedefed(definition *def, char *type)
- +{
- + if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) {
- + return (0);
- + } else {
- + return (streq(def->def_name, type));
- + }
- +}
- +
- +int
- +isvectordef(char *type, relation rel)
- +{
- + definition *def;
- +
- + for (;;) {
- + switch (rel) {
- + case REL_VECTOR:
- + return (!streq(type, "string"));
- + case REL_ARRAY:
- + return (0);
- + case REL_POINTER:
- + return (0);
- + case REL_ALIAS:
- + def = (definition *) FINDVAL(defined, type, typedefed);
- + if (def == NULL) {
- + return (0);
- + }
- + type = def->def.ty.old_type;
- + rel = def->def.ty.rel;
- + }
- + }
- +}
- +
- +char *
- +locase(char *str)
- +{
- + char c;
- + static char buf[100];
- + char *p = buf;
- +
- + while ((c = *str++) != '\0') {
- + *p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c;
- + }
- + *p = 0;
- + return (buf);
- +}
- +
- +void
- +pvname_svc(char *pname, char *vnum)
- +{
- + f_print(fout, "%s_%s_svc", locase(pname), vnum);
- +}
- +
- +void
- +pvname(char *pname, char *vnum)
- +{
- + f_print(fout, "%s_%s", locase(pname), vnum);
- +}
- +
- +/*
- + * print a useful (?) error message, and then die
- + */
- +void
- +error(char *msg)
- +{
- + printwhere();
- + f_print(stderr, "%s, line %d: ", infilename, linenum);
- + f_print(stderr, "%s\n", msg);
- + crash();
- +}
- +
- +/*
- + * Something went wrong, unlink any files that we may have created and then
- + * die.
- + */
- +void
- +crash(void)
- +{
- + int i;
- +
- + for (i = 0; i < nfiles; i++) {
- + (void) unlink(outfiles[i]);
- + }
- + exit(1);
- +}
- +
- +void
- +record_open(char *file)
- +{
- + if (nfiles < NFILES) {
- + outfiles[nfiles++] = file;
- + } else {
- + f_print(stderr, "too many files!\n");
- + crash();
- + }
- +}
- +
- +static char expectbuf[100];
- +static char *toktostr();
- +
- +/*
- + * error, token encountered was not the expected one
- + */
- +void
- +expected1(exp1)
- + tok_kind exp1;
- +{
- + s_print(expectbuf, "expected '%s'",
- + toktostr(exp1));
- + error(expectbuf);
- +}
- +
- +/*
- + * error, token encountered was not one of two expected ones
- + */
- +void
- +expected2(exp1, exp2)
- + tok_kind exp1, exp2;
- +{
- + s_print(expectbuf, "expected '%s' or '%s'",
- + toktostr(exp1),
- + toktostr(exp2));
- + error(expectbuf);
- +}
- +
- +/*
- + * error, token encountered was not one of 3 expected ones
- + */
- +void
- +expected3(exp1, exp2, exp3)
- + tok_kind exp1, exp2, exp3;
- +{
- + s_print(expectbuf, "expected '%s', '%s' or '%s'",
- + toktostr(exp1),
- + toktostr(exp2),
- + toktostr(exp3));
- + error(expectbuf);
- +}
- +
- +void
- +tabify(f, tab)
- + FILE *f;
- + int tab;
- +{
- + while (tab--) {
- + (void) fputc('\t', f);
- + }
- +}
- +
- +
- +static token tokstrings[] = {
- + {TOK_IDENT, "identifier"},
- + {TOK_CONST, "const"},
- + {TOK_RPAREN, ")"},
- + {TOK_LPAREN, "("},
- + {TOK_RBRACE, "}"},
- + {TOK_LBRACE, "{"},
- + {TOK_LBRACKET, "["},
- + {TOK_RBRACKET, "]"},
- + {TOK_STAR, "*"},
- + {TOK_COMMA, ","},
- + {TOK_EQUAL, "="},
- + {TOK_COLON, ":"},
- + {TOK_SEMICOLON, ";"},
- + {TOK_UNION, "union"},
- + {TOK_STRUCT, "struct"},
- + {TOK_SWITCH, "switch"},
- + {TOK_CASE, "case"},
- + {TOK_DEFAULT, "default"},
- + {TOK_ENUM, "enum"},
- + {TOK_TYPEDEF, "typedef"},
- + {TOK_INT, "int"},
- + {TOK_SHORT, "short"},
- + {TOK_INT32, "int32"},
- + {TOK_UNSIGNED, "unsigned"},
- + {TOK_DOUBLE, "double"},
- + {TOK_FLOAT, "float"},
- + {TOK_CHAR, "char"},
- + {TOK_STRING, "string"},
- + {TOK_OPAQUE, "opaque"},
- + {TOK_BOOL, "bool"},
- + {TOK_VOID, "void"},
- + {TOK_PROGRAM, "program"},
- + {TOK_VERSION, "version"},
- + {TOK_EOF, "??????"}
- +};
- +
- +static char *
- +toktostr(kind)
- + tok_kind kind;
- +{
- + token *sp;
- +
- + for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++);
- + return (sp->str);
- +}
- +
- +static void
- +printbuf(void)
- +{
- + char c;
- + int i;
- + int cnt;
- +
- +# define TABSIZE 4
- +
- + for (i = 0; (c = curline[i]) != '\0'; i++) {
- + if (c == '\t') {
- + cnt = 8 - (i % TABSIZE);
- + c = ' ';
- + } else {
- + cnt = 1;
- + }
- + while (cnt--) {
- + (void) fputc(c, stderr);
- + }
- + }
- +}
- +
- +static void
- +printwhere(void)
- +{
- + int i;
- + char c;
- + int cnt;
- +
- + printbuf();
- + for (i = 0; i < where - curline; i++) {
- + c = curline[i];
- + if (c == '\t') {
- + cnt = 8 - (i % TABSIZE);
- + } else {
- + cnt = 1;
- + }
- + while (cnt--) {
- + (void) fputc('^', stderr);
- + }
- + }
- + (void) fputc('\n', stderr);
- +}
- +
- +char *
- +make_argname(char *pname, char *vname)
- +{
- + char *name;
- +
- + name = malloc(strlen(pname) + strlen(vname) + strlen(ARGEXT) + 3);
- + if (!name) {
- + fprintf(stderr, "failed in malloc");
- + exit(1);
- + }
- + sprintf(name, "%s_%s_%s", locase(pname), vname, ARGEXT);
- + return(name);
- +}
- +
- +bas_type *typ_list_h;
- +bas_type *typ_list_t;
- +
- +void
- +add_type(int len, char *type)
- +{
- + bas_type *ptr;
- +
- +
- + if ((ptr = (bas_type *) malloc(sizeof(bas_type))) == (bas_type *) NULL) {
- + fprintf(stderr, "failed in malloc");
- + exit(1);
- + }
- + ptr->name = type;
- + ptr->length = len;
- + ptr->next = NULL;
- + if (typ_list_t == NULL) {
- +
- + typ_list_t = ptr;
- + typ_list_h = ptr;
- + } else {
- +
- + typ_list_t->next = ptr;
- + typ_list_t = ptr;
- + }
- +}
- +
- +
- +bas_type *
- +find_type(char *type)
- +{
- + bas_type *ptr;
- +
- + ptr = typ_list_h;
- +
- +
- + while (ptr != NULL) {
- + if (strcmp(ptr->name, type) == 0)
- + return (ptr);
- + else
- + ptr = ptr->next;
- + };
- + return (NULL);
- +}
- +
- diff --git a/rpcgen/rpc_util.h b/rpcgen/rpc_util.h
- new file mode 100644
- index 0000000..fa115be
- --- /dev/null
- +++ b/rpcgen/rpc_util.h
- @@ -0,0 +1,166 @@
- +/*
- + * Copyright (c) 2009, Sun Microsystems, Inc.
- + * All rights reserved.
- + *
- + * Redistribution and use in source and binary forms, with or without
- + * modification, are permitted provided that the following conditions are met:
- + * - Redistributions of source code must retain the above copyright notice,
- + * this list of conditions and the following disclaimer.
- + * - Redistributions in binary form must reproduce the above copyright notice,
- + * this list of conditions and the following disclaimer in the documentation
- + * and/or other materials provided with the distribution.
- + * - Neither the name of Sun Microsystems, Inc. nor the names of its
- + * contributors may be used to endorse or promote products derived
- + * from this software without specific prior written permission.
- + *
- + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- + * POSSIBILITY OF SUCH DAMAGE.
- + */
- +
- +/* @(#)rpc_util.h 1.5 90/08/29 (C) 1987 SMI */
- +
- +/*
- + * rpc_util.h, Useful definitions for the RPC protocol compiler
- + */
- +
- +#include <stdlib.h>
- +
- +#define alloc(size) malloc((unsigned)(size))
- +#define ALLOC(object) (object *) malloc(sizeof(object))
- +
- +#define s_print (void) sprintf
- +#define f_print (void) fprintf
- +
- +struct list {
- + definition *val;
- + struct list *next;
- +};
- +typedef struct list list;
- +
- +#define PUT 1
- +#define GET 2
- +
- +/*
- + * Global variables
- + */
- +#define MAXLINESIZE 1024
- +extern char curline[MAXLINESIZE];
- +extern char *where;
- +extern int linenum;
- +
- +extern char *infilename;
- +extern FILE *fout;
- +extern FILE *fin;
- +
- +extern list *defined;
- +
- +
- +extern bas_type *typ_list_h;
- +extern bas_type *typ_list_t;
- +
- +/*
- + * All the option flags
- + */
- +extern int inetdflag;
- +extern int pmflag;
- +extern int tblflag;
- +extern int logflag;
- +extern int newstyle;
- +extern int Cflag; /* C++ flag */
- +extern int tirpcflag; /* flag for generating tirpc code */
- +extern int Inline; /* if this is 0, then do not generate inline code */
- +
- +/*
- + * Other flags related with inetd jumpstart.
- + */
- +extern int indefinitewait;
- +extern int exitnow;
- +extern int timerflag;
- +
- +extern int nonfatalerrors;
- +
- +/*
- + * rpc_util routines
- + */
- +void storeval();
- +
- +#define STOREVAL(list,item) \
- + storeval(list,item)
- +
- +definition *findval();
- +
- +#define FINDVAL(list,item,finder) \
- + findval(list, item, finder)
- +
- +
- +/*
- + * rpc_cout routines
- + */
- +void cprint(void);
- +void emit(definition *);
- +
- +/*
- + * rpc_hout routines
- + */
- +void print_datadef(definition *);
- +void print_funcdef(definition *);
- +
- +/*
- + * rpc_svcout routines
- + */
- +void write_most(char *, int, int);
- +void write_register(void);
- +void write_netid_register(char *);
- +void write_nettype_register(char *);
- +void write_inetd_register(char *);
- +void write_rest(void);
- +void write_programs(char *);
- +void write_svc_aux(int);
- +
- +/*
- + * rpc_clntout routines
- + */
- +void write_stubs(void);
- +void printarglist(proc_list *, char *, char *);
- +
- +/*
- + * rpc_tblout routines
- + */
- +void write_tables(void);
- +
- +/*
- + * rpc_util
- + */
- +void pvname_svc(char *, char *);
- +void pvname(char *, char *);
- +void ptype(char *, char *, int);
- +char * make_argname(char *, char *);
- +void add_type(int, char *);
- +void reinitialize(void);
- +void crash(void);
- +void error(char *);
- +char *fixtype(char *);
- +char *stringfix(char *);
- +char *locase(char *);
- +int isvectordef(char *, relation);
- +int streq(char *, char *);
- +void tabify(FILE *, int);
- +void record_open(char *);
- +bas_type *find_type(char *type);
- +
- +/*
- + * rpc_sample
- + */
- +void write_sample_svc(definition *);
- +int write_sample_clnt(definition *);
- +void write_sample_clnt_main(void);
- +void add_sample_msg(void);
- diff --git a/rpcgen/rpcgen.1 b/rpcgen/rpcgen.1
- new file mode 100644
- index 0000000..89df7ed
- --- /dev/null
- +++ b/rpcgen/rpcgen.1
- @@ -0,0 +1,521 @@
- +.\" @(#)rpcgen.1 1.35 93/06/02 SMI
- +.\" $FreeBSD: src/usr.bin/rpcgen/rpcgen.1,v 1.12.2.4 2002/06/21 15:28:50 charnier Exp $
- +.\" Copyright 1985-1993 Sun Microsystems, Inc.
- +.Dd March 28, 1993
- +.Dt RPCGEN 1
- +.Os
- +.Sh NAME
- +.Nm rpcgen
- +.Nd an RPC protocol compiler
- +.Sh SYNOPSIS
- +.Nm
- +.Ar infile
- +.Nm
- +.Op Fl a
- +.Op Fl b
- +.Op Fl C
- +.Oo
- +.Fl D Ns Ar name Ns Op Ar =value
- +.Oc
- +.Op Fl i Ar size
- +.Op Fl I Op Fl K Ar seconds
- +.Op Fl L
- +.Op Fl M
- +.Op Fl N
- +.Op Fl T
- +.Op Fl Y Ar pathname
- +.Ar infile
- +.Nm
- +.Oo
- +.Fl c |
- +.Fl h |
- +.Fl l |
- +.Fl m |
- +.Fl t |
- +.Fl \&Sc |
- +.Fl \&Ss |
- +.Fl \&Sm
- +.Oc
- +.Op Fl o Ar outfile
- +.Op Ar infile
- +.Nm
- +.Op Fl s Ar nettype
- +.Op Fl o Ar outfile
- +.Op Ar infile
- +.Nm
- +.Op Fl n Ar netid
- +.Op Fl o Ar outfile
- +.Op Ar infile
- +.\" .SH AVAILABILITY
- +.\" .LP
- +.\" SUNWcsu
- +.Sh DESCRIPTION
- +The
- +.Nm
- +utility is a tool that generates C code to implement an
- +.Tn RPC
- +protocol.
- +The input to
- +.Nm
- +is a language similar to C known as
- +.Tn RPC
- +Language (Remote Procedure Call Language).
- +.Pp
- +The
- +.Nm
- +utility is normally used as in the first synopsis where
- +it takes an input file and generates three output files.
- +If the
- +.Ar infile
- +is named
- +.Pa proto.x ,
- +then
- +.Nm
- +generates a header in
- +.Pa proto.h ,
- +XDR routines in
- +.Pa proto_xdr.c ,
- +server-side stubs in
- +.Pa proto_svc.c ,
- +and client-side stubs in
- +.Pa proto_clnt.c .
- +With the
- +.Fl T
- +option,
- +it also generates the
- +.Tn RPC
- +dispatch table in
- +.Pa proto_tbl.i .
- +.Pp
- +The
- +.Nm
- +utility can also generate sample client and server files
- +that can be customized to suit a particular application.
- +The
- +.Fl \&Sc ,
- +.Fl \&Ss
- +and
- +.Fl \&Sm
- +options generate sample client, server and makefile, respectively.
- +The
- +.Fl a
- +option generates all files, including sample files.
- +If the
- +.Ar infile
- +is
- +.Pa proto.x ,
- +then the client side sample file is written to
- +.Pa proto_client.c ,
- +the server side sample file to
- +.Pa proto_server.c
- +and the sample makefile to
- +.Pa makefile.proto .
- +.Pp
- +The server created can be started both by the port monitors
- +(for example,
- +.Xr inetd 8 )
- +or by itself.
- +When it is started by a port monitor,
- +it creates servers only for the transport for which
- +the file descriptor
- +.Em 0
- +was passed.
- +The name of the transport must be specified
- +by setting up the environment variable
- +.Ev PM_TRANSPORT .
- +When the server generated by
- +.Nm
- +is executed,
- +it creates server handles for all the transports
- +specified in
- +.Ev NETPATH
- +environment variable,
- +or if it is unset,
- +it creates server handles for all the visible transports from
- +.Pa /etc/netconfig
- +file.
- +Note:
- +the transports are chosen at run time and not at compile time.
- +When the server is self-started,
- +it backgrounds itself by default.
- +A special define symbol
- +.Em RPC_SVC_FG
- +can be used to run the server process in foreground.
- +.Pp
- +The second synopsis provides special features which allow
- +for the creation of more sophisticated
- +.Tn RPC
- +servers.
- +These features include support for user provided
- +.Em #defines
- +and
- +.Tn RPC
- +dispatch tables.
- +The entries in the
- +.Tn RPC
- +dispatch table contain:
- +.Bl -bullet -offset indent -compact
- +.It
- +pointers to the service routine corresponding to that procedure,
- +.It
- +a pointer to the input and output arguments,
- +.It
- +the size of these routines.
- +.El
- +A server can use the dispatch table to check authorization
- +and then to execute the service routine;
- +a client library may use it to deal with the details of storage
- +management and XDR data conversion.
- +.Pp
- +The other three synopses shown above are used when
- +one does not want to generate all the output files,
- +but only a particular one.
- +See the
- +.Sx EXAMPLES
- +section below for examples of
- +.Nm
- +usage.
- +When
- +.Nm
- +is executed with the
- +.Fl s
- +option,
- +it creates servers for that particular class of transports.
- +When
- +executed with the
- +.Fl n
- +option,
- +it creates a server for the transport specified by
- +.Ar netid .
- +If
- +.Ar infile
- +is not specified,
- +.Nm
- +accepts the standard input.
- +.Pp
- +The C preprocessor,
- +.Em cc -E
- +is run on the input file before it is actually interpreted by
- +.Nm .
- +For each type of output file,
- +.Nm
- +defines a special preprocessor symbol for use by the
- +.Nm
- +programmer:
- +.Bl -tag -width indent
- +.It RPC_HDR
- +defined when compiling into headers
- +.It RPC_XDR
- +defined when compiling into XDR routines
- +.It RPC_SVC
- +defined when compiling into server-side stubs
- +.It RPC_CLNT
- +defined when compiling into client-side stubs
- +.It RPC_TBL
- +defined when compiling into RPC dispatch tables
- +.El
- +.Pp
- +Any line beginning with
- +.Dq %
- +is passed directly into the output file,
- +uninterpreted by
- +.Nm .
- +To specify the path name of the C preprocessor use
- +.Fl Y
- +flag.
- +.Pp
- +For every data type referred to in
- +.Ar infile ,
- +.Nm
- +assumes that there exists a
- +routine with the string
- +.Em xdr_
- +prepended to the name of the data type.
- +If this routine does not exist in the
- +.Tn RPC/XDR
- +library, it must be provided.
- +Providing an undefined data type
- +allows customization of
- +.Xr xdr 3
- +routines.
- +.Sh OPTIONS
- +The following options are available:
- +.Bl -tag -width indent
- +.It Fl a
- +Generate all files, including sample files.
- +.It Fl b
- +Backward compatibility mode.
- +Generate transport specific
- +.Tn RPC
- +code for older versions
- +of the operating system.
- +.Pp
- +Note: in
- +.Fx ,
- +this compatibility flag is turned on by
- +default since
- +.Fx
- +supports only the older
- +.Tn ONC RPC
- +library.
- +.It Fl c
- +Compile into
- +.Tn XDR
- +routines.
- +.It Fl C
- +Generate header and stub files which can be used with
- +.Tn ANSI
- +C compilers. Headers generated with this flag can also be
- +used with C++ programs.
- +.It Fl D Ns Ar name
- +.It Fl D Ns Ar name=value
- +.\".It Fl D Ns Ar name Ns Op Ar =value
- +Define a symbol
- +.Ar name .
- +Equivalent to the
- +.Em #define
- +directive in the source.
- +If no
- +.Ar value
- +is given,
- +.Ar value
- +is defined as
- +.Em 1 .
- +This option may be specified more than once.
- +.It Fl h
- +Compile into C data-definitions (a header).
- +.Fl T
- +option can be used in conjunction to produce a
- +header which supports
- +.Tn RPC
- +dispatch tables.
- +.It Fl i Ar size
- +Size at which to start generating inline code.
- +This option is useful for optimization.
- +The default size is 5.
- +.Pp
- +Note: in order to provide backwards compatibility with the older
- +.Nm
- +on the
- +.Fx
- +platform, the default is actually 0 (which means
- +that inline code generation is disabled by default). You must specify
- +a non-zero value explicitly to override this default.
- +.It Fl I
- +Compile support for
- +.Xr inetd 8
- +in the server side stubs.
- +Such servers can be self-started or can be started by
- +.Nm inetd .
- +When the server is self-started, it backgrounds itself by default.
- +A special define symbol
- +.Em RPC_SVC_FG
- +can be used to run the
- +server process in foreground, or the user may simply compile without
- +the
- +.Fl I
- +option.
- +.Pp
- +If there are no pending client requests, the
- +.Nm inetd
- +servers exit after 120 seconds (default).
- +The default can be changed with the
- +.Fl K
- +option.
- +All the error messages for
- +.Nm inetd
- +servers
- +are always logged with
- +.Xr syslog 3 .
- +.\" .IP
- +.\" Note:
- +.\" this option is supported for backward compatibility only.
- +.\" By default,
- +.\" .B rpcgen
- +.\" generates servers that can be invoked through portmonitors.
- +.Pp
- +.It Fl K Ar seconds
- +By default, services created using
- +.Nm
- +and invoked through
- +port monitors wait 120 seconds
- +after servicing a request before exiting.
- +That interval can be changed using the
- +.Fl K
- +flag.
- +To create a server that exits immediately upon servicing a request,
- +use
- +.Fl K Ar 0 .
- +To create a server that never exits, the appropriate argument is
- +.Fl k Ar -1 .
- +.Pp
- +When monitoring for a server,
- +some portmonitors
- +.Em always
- +spawn a new process in response to a service request.
- +If it is known that a server will be used with such a monitor, the
- +server should exit immediately on completion.
- +For such servers,
- +.Nm
- +should be used with
- +.Fl K Ar 0 .
- +.It Fl l
- +Compile into client-side stubs.
- +.It Fl L
- +When the servers are started in foreground, use
- +.Xr syslog 3
- +to log the server errors instead of printing them on the standard
- +error.
- +.It Fl m
- +Compile into server-side stubs,
- +but do not generate a
- +.Qq main
- +routine.
- +This option is useful for doing callback-routines
- +and for users who need to write their own
- +.Qq main
- +routine to do initialization.
- +.It Fl M
- +Generate multithread-safe stubs for passing arguments and results between
- +rpcgen generated code and user written code.
- +This option is useful
- +for users who want to use threads in their code.
- +However, the
- +.Xr rpc_svc_calls 3
- +functions are not yet MT-safe, which means that rpcgen generated server-side
- +code will not be MT-safe.
- +.It Fl N
- +This option allows procedures to have multiple arguments.
- +It also uses the style of parameter passing that closely resembles C.
- +So, when passing an argument to a remote procedure, you do not have to
- +pass a pointer to the argument, but can pass the argument itself.
- +This behavior is different from the old style of
- +.Nm
- +generated code.
- +To maintain backward compatibility,
- +this option is not the default.
- +.It Fl n Ar netid
- +Compile into server-side stubs for the transport
- +specified by
- +.Ar netid .
- +There should be an entry for
- +.Ar netid
- +in the
- +netconfig database.
- +This option may be specified more than once,
- +so as to compile a server that serves multiple transports.
- +.It Fl o Ar outfile
- +Specify the name of the output file.
- +If none is specified,
- +standard output is used
- +(
- +.Fl c ,
- +.Fl h ,
- +.Fl l ,
- +.Fl m ,
- +.Fl n ,
- +.Fl s ,
- +.Fl \&Sc ,
- +.Fl \&Sm ,
- +.Fl \&Ss ,
- +and
- +.Fl t
- +modes only).
- +.It Fl s Ar nettype
- +Compile into server-side stubs for all the
- +transports belonging to the class
- +.Ar nettype .
- +The supported classes are
- +.Em netpath ,
- +.Em visible ,
- +.Em circuit_n ,
- +.Em circuit_v ,
- +.Em datagram_n ,
- +.Em datagram_v ,
- +.Em tcp ,
- +and
- +.Em udp
- +(see
- +.Xr rpc 3
- +for the meanings associated with these classes).
- +This option may be specified more than once.
- +Note:
- +the transports are chosen at run time and not at compile time.
- +.It Fl \&Sc
- +Generate sample client code that uses remote procedure calls.
- +.It Fl \&Sm
- +Generate a sample
- +.Pa Makefile
- +which can be used for compiling the application.
- +.It Fl \&Ss
- +Generate sample server code that uses remote procedure calls.
- +.It Fl t
- +Compile into
- +.Tn RPC
- +dispatch table.
- +.It Fl T
- +Generate the code to support
- +.Tn RPC
- +dispatch tables.
- +.Pp
- +The options
- +.Fl c ,
- +.Fl h ,
- +.Fl l ,
- +.Fl m ,
- +.Fl s ,
- +.Fl \&Sc ,
- +.Fl \&Sm ,
- +.Fl \&Ss ,
- +and
- +.Fl t
- +are used exclusively to generate a particular type of file,
- +while the options
- +.Fl D
- +and
- +.Fl T
- +are global and can be used with the other options.
- +.It Fl Y Ar pathname
- +Give the name of the directory where
- +.Nm
- +will start looking for the C-preprocessor.
- +.El
- +.Sh EXAMPLES
- +The following example:
- +.Dl example% rpcgen -T prot.x
- +.Pp
- +generates all the five files:
- +.Pa prot.h ,
- +.Pa prot_clnt.c ,
- +.Pa prot_svc.c ,
- +.Pa prot_xdr.c
- +and
- +.Pa prot_tbl.i .
- +.Pp
- +The following example sends the C data-definitions (header)
- +to the standard output.
- +.Dl example% rpcgen -h prot.x
- +.Pp
- +To send the test version of the
- +.Fl D Ns Ar TEST ,
- +server side stubs for
- +all the transport belonging to the class
- +.Ar datagram_n
- +to standard output, use:
- +.Dl example% rpcgen -s datagram_n -DTEST prot.x
- +.Pp
- +To create the server side stubs for the transport indicated
- +by
- +.Ar netid
- +tcp,
- +use:
- +.Dl example% rpcgen -n tcp -o prot_svc.c prot.x
- +.Sh SEE ALSO
- +.Xr cc 1 ,
- +.Xr rpc 3 ,
- +.Xr syslog 3 ,
- +.Xr inetd 8
- +.\" .BR rpc_svc_calls (3)
- +.Rs
- +.%T The rpcgen chapter in the NETP manual
- +.Re
- --
- 1.9.1
|