এটি হল rxgen কমান্ড যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।
কার্যক্রম:
NAME এর
rxgen - Rx দূরবর্তী পদ্ধতি কল প্যাকেজের জন্য স্টাব জেনারেটর
সাইনোপিসিস
rxgen [-h | -c | -C | -S | -r] [-dkpR]
[-I Dir] [-P উপসর্গ] [-o আউটফাইল] [ইনফাইল]
rxgen -s পরিবহন [-o আউটফাইল] [ইনফাইল]
rxgen -l [-o আউটফাইল] [ইনফাইল]
rxgen -m [-o আউটফাইল] [ইনফাইল]
বর্ণনাঃ
rxgen Rx RPC প্রোটোকল বাস্তবায়নের জন্য C কোড তৈরি করে এমন একটি টুল; এটি ইনপুট হিসাবে লাগে
C এর মতো একটি অ্যাপ্লিকেশন ইন্টারফেসের একটি বিবরণ এবং অনেকগুলি সার্ভার তৈরি করে
এবং/অথবা ক্লায়েন্ট স্টাব রুটিনগুলিকে RPC-ভিত্তিক প্রোগ্রামের সাথে সংযুক্ত করতে হবে। এই stubs অনুমতি দেয়
স্থানীয় পদ্ধতি কলের মাধ্যমে দূরবর্তী পদ্ধতিগুলি আহ্বান করার জন্য প্রোগ্রামগুলি। rxgen একটি এক্সটেনশন হয়
সূর্যের rpcgen (সংস্করণ 3.9) এবং পূর্ণ ধরে রাখে rpcgen কার্যকারিতা (অন্তত সেই হিসাবে
সংস্করণ)। অনুগ্রহ করে পড়ুন rpcgen(1) সূর্যের RPC নির্দিষ্ট পতাকা সম্পর্কে আরো বিস্তারিত জানার জন্য, এবং
দরকারী উদাহরণ সহ RPC ভাষা সম্পর্কিত RPC প্রোগ্রামিং গাইডে।
বিকল্প
rxgen বিভিন্ন মোডে কাজ করে। উত্পন্ন আউটপুট ফাইল উত্পাদিত হতে পারে
স্বতন্ত্রভাবে (একটি ব্যবহার করে -h, -c, -C, বা -S) বা সম্মিলিতভাবে। সব আউটপুট ফাইল হয়
তৈরি করা হয় যখন ডিফল্ট ব্যবহার করা হয় (অর্থাৎ, কোন বিকল্প নেই), অথবা আউটপুট সীমাবদ্ধ থাকে
সার্ভার স্টাব (-C এবং -S) যখন -r পতাকা ব্যবহার করা হয়। নিম্নলিখিত ধরনের বর্ণনা
উত্পন্ন আউটপুট ফাইল (সরলতার জন্য, ফাইলের নাম প্রধান আউটপুট ফাইলের নাম উল্লেখ করে):
-h স্ট্যান্ডার্ড RPCL সংজ্ঞা (ডিফল্ট) থেকে C ডেটা সংজ্ঞা (একটি হেডার ফাইল) তৈরি করুন
এক্সটেনশন: ফাইলের নাম.জ)।
-c RPCL দ্বারা বর্ণিত প্রোটোকলকে সিরিয়ালাইজ করার জন্য প্রয়োজনীয় XDR রুটিনগুলি সংকলন করুন৷
সমস্ত ঘোষণার জন্য XDR রুটিন তৈরি করুন (ডিফল্ট এক্সটেনশন: ফাইলের নাম.xdr.c)।
-C সমস্ত ক্লায়েন্ট-সাইড স্টাব রুটিন তৈরি করুন (ডিফল্ট এক্সটেনশন: ফাইলের নাম.cs.c)।
এই ফাইলে একটি রুটিন কল করা আর্গুমেন্টগুলি প্যাক আপ এবং এর মাধ্যমে পাঠানোর কারণ হবে৷
Rx (বা R)।
-S সমস্ত সার্ভার-সাইড স্টাব রুটিন তৈরি করুন (ডিফল্ট এক্সটেনশন: ফাইলের নাম.ss.c)।
আর্গুমেন্ট আনপ্যাক করা হয়, এবং সংশ্লিষ্ট সার্ভারের রুটিন বলা হয়।
-r দ্বারা উত্পাদিত দুটি ডিফল্ট এক্সটেনশন ফাইল তৈরি করুন -C এবং -S অপশন।
নিম্নলিখিত বিকল্পগুলি যে কোনও সংমিশ্রণে ব্যবহার করা যেতে পারে rxgen কল:
-R পুরানো \R প্রোটোকলের জন্য কোড তৈরি করুন, Rx এর বিপরীতে, যা ডিফল্ট।
-k উত্পন্ন কোড যখন কার্নেল দ্বারা ব্যবহার করার উদ্দেশ্যে করা হয় তখন নির্দিষ্ট করা আবশ্যক;
বিশেষ "অন্তর্ভুক্ত" এবং অন্যান্য নির্দিষ্টকরণ উত্পাদিত হয় যখন লক্ষ্য আউটপুট জন্য হয়
কার্নেল
-p প্যাকেজ সমন্বয় পতাকা: যখন একাধিক প্যাকেজ একটি একক মধ্যে অন্তর্ভুক্ত করা হয়
স্পেসিফিকেশন ফাইল, একটি একক এক্সিকিউট রিকোয়েস্ট রুটিন তাদের সকলের জন্য একটি হিসাবে ব্যবহার করা হবে
এই পতাকার ফলাফল। ডিফল্ট হল পৃথক এক্সিকিউট রিকোয়েস্ট স্টাব তৈরি করা
প্রতিটি প্যাকেজ।
-I Dir
অনুরূপ -I সি কম্পাইলারে পতাকা (cc) এই পতাকা প্রি-
প্রসেসর (CPP) তাই যে ডিরেক্টরি Dir স্ট্যান্ডার্ড লুকআপ তালিকার আগে অনুসন্ধান করা হয়
# ফাইলগুলি অন্তর্ভুক্ত করুন। প্রত্যাশিত হিসাবে, একাধিক -I পতাকা একযোগে ব্যবহার করা যেতে পারে।
-P উপসর্গ
সার্জারির উপসর্গ এই সুইচটি অনুসরণ করা স্ট্রিংটি সমস্ত উত্পন্ন আউটপুট ফাইলগুলিতে প্রিপেন্ড করা হয়;
দরকারী যখন একাধিক রান একই ইন্টারফেসের বিভিন্ন সংস্করণ তৈরি করতে চায়
(বলুন, কার্নেল এবং নন-কারনেল সংস্করণ)।
-d ডিবাগ মোড; শুধুমাত্র যখন প্রয়োজন rxgen ডিবাগ করা হয় (বলুন, মাধ্যমে ডিবিএক্স).
-o আউটফাইল
আউটপুট ফাইলের নাম উল্লেখ করুন। যদি কোনটি নির্দিষ্ট করা না থাকে, তাহলে আদর্শ আউটপুট
ব্যবহৃত (-c, -h, -C, এবং -S শুধুমাত্র মোড)। উল্লেখ্য যে একটি আউটপুট ফাইল নির্দিষ্ট করা হলে a
মাল্টি-আউটপুট ফাইল বিকল্প (যেমন ডিফল্ট, বা বিকল্প সহ -r), এরপর আউটফাইল
ডিফল্টরূপে উত্পন্ন নাম প্রতিস্থাপন করে (যা কনফিগারেশনের প্রধানের উপর ভিত্তি করে
ফাইলের নাম)।
সার্জারির -s, -l, এবং -m বিকল্প শুধুমাত্র জন্য উপস্থিত হয় rpcgen সমর্থন দেখা rpcgen(1) এর জন্য
তাদের ব্যবহারের তথ্য।
rxgen বাক্য গঠন সংক্ষিপ্তসার
স্পেসিফিকেশন ফাইল:
|
|
|
|
|
:
"প্যাকেজ"
:
"উপসর্গ"
:
"স্টার্টিংপকোড"
:
"বিভক্ত উপসর্গ" ";"
:
"IN =" "|"
"বাইরে =" "|"
:
["proc"] [ ] [ ]
["বিভক্ত" | "মাল্টি"]
["=" ] ";"
:
"(" ")"
:
["<" ">"| "[" "]"] | শূন্য
:
"," | শূন্য
:
"IN" | "আউট" | "INOUT" | শূন্য
:
| শূন্য
:
:
:
:
:
:
:
:
:
:
:
সূর্যের RPCL ভাষার সিনট্যাক্স (দেখুন rpcgen(1))
rxgen কম্যান্ডস
মন্তব্য এবং প্রাক প্রসেসিং
ইনপুট ইন্টারফেসে প্রিপ্রসেসর নির্দেশিকা থাকতে পারে যা C এর মাধ্যমে পাস করা হয়
প্রিপ্রসেসর (যেমন "cpp")। যেহেতু প্রিপ্রসেসর সব ইনপুট ফাইলের আগে রান করে
আসলে দ্বারা ব্যাখ্যা rxgen, সব CPP নির্দেশাবলী (#অন্তর্ভুক্ত, #ifdefs, #defines, ইত্যাদি) হল
আইনি এবং একটি মধ্যে স্বাগত rxgen ইনপুট ফাইল. অবশ্যই, এই প্রিপ্রসেসর কেউ
নির্দেশাবলী উত্পন্ন ফাইলগুলির মধ্যে অন্তর্ভুক্ত করা হবে। পার্থক্য সহজতর করতে
বিভিন্ন ধরনের আউটপুট ফাইলের মধ্যে, rxgen নির্দিষ্ট বিশেষ সংজ্ঞায়িত করে CPP জন্য প্রতীক
দ্বারা ব্যবহার করুন rxgen প্রোগ্রামার এগুলি হল RPC_HDR (হেডারে কম্পাইল করার সময় সংজ্ঞায়িত করা হয়,
ফাইলের নাম.h, ফাইল), RPC_XDR (xdr-এ কম্পাইল করার সময় সংজ্ঞায়িত করা হয়, ফাইলের নাম.xdr.c, ফাইল),
RPC_CLIENT (ক্লায়েন্ট স্টাবগুলিতে কম্পাইল করার সময় সংজ্ঞায়িত করা হয়, ফাইলের নাম.cs.c, ফাইল), এবং
RPC_SERVER (সার্ভার স্টাবগুলিতে কম্পাইল করার সময় সংজ্ঞায়িত করা হয়, ফাইলের নাম.ss.c, ফাইল)।
উপরন্তু, rxgen নিজের একটি সামান্য প্রিপ্রসেসিং করে। "%" দিয়ে শুরু হওয়া যেকোনো লাইন
সরাসরি আউটপুট ফাইলে পাস করা হয়েছে, ব্যাখ্যা ছাড়াই rxgen. একটি আরো ভারী en masse জন্য
অব্যক্ত কোড ডাম্পিং, এটি একটি মধ্যে এই ধরনের সমস্ত কোড অন্তর্ভুক্ত করার পরামর্শ দেওয়া হবে
"#include" ফাইলটি "%" এর আগে পাস করুন। ইনপুট ইন্টারফেসে যেকোনও থাকতে পারে
সি-স্টাইলের মন্তব্য যা অবশ্যই উপেক্ষা করা হয়। ব্যাখ্যা টোকেন-ভিত্তিক, এইভাবে
পৃথক বিবৃতিগুলির বিশেষ লাইন-অরিয়েন্টেশন প্রয়োজন হয় না। rxgen এছাড়াও একটি প্রদান করে
ত্রুটি রিপোর্টের যথেষ্ট সমৃদ্ধ এবং সহায়ক সেট, সঠিক লাইন অবস্থান দ্বারা চিহ্নিত করা এবং
ত্রুটির ধরন। এছাড়াও, rxgen মান অন্তর্ভুক্ত করার জন্য স্বয়ংক্রিয়ভাবে #include লাইন তৈরি করবে
ফাইল, যেমন rx/xdr.h এবং rx/rx.h, এর থেকে জেনারেট করা হেডার ফাইল সহ
ইন্টারফেস.
উপসর্গ অসম্পূর্ণ পদ্ধতি
সার্জারির প্যাকেজ বিবৃতি বলে rxgen ইন্টারফেস প্যাকেজের নাম। এর জন্য ব্যবহার করা হয়
সমস্ত জেনারেট করা স্টাব রুটিনের নামকরণ এবং এক্সিকিউট রিকোয়েস্ট পদ্ধতির প্রিফিক্সিং।
উদাহরণ স্বরূপ:
প্যাকেজ AFS_
এক্সিকিউট রিকোয়েস্ট পদ্ধতিকে AFS_ExecuteRequest নামে নামকরণ করে (সতর্কতা: পুরাতনে
ExecuteRequest নামের সাথে প্যাকেজের নামের পরে একটি অতিরিক্ত "_" সংস্করণ যুক্ত করা হয়েছে;
এইভাবে নিশ্চিত করুন যে আপনার কাছে ExecuteRequest ইন্টারফেস রুটিন নেই) এবং একটি প্রদত্ত স্টাব
রুটিন, ফিচ বলুন, আসলে AFS_Fetch নামকরণ করা হবে। একাধিক প্যাকেজ বিবৃতি (বর্তমান
সর্বোচ্চ আকার হল 10) প্রতি কনফিগারেশন অনুমোদিত এবং এর একাধিক সেট হলে দরকারী
ইন্টারফেস প্রয়োগ করা হয় (শেষে উদাহরণ দেখুন)। উল্লেখ্য যে এই ধরনের ক্ষেত্রে, ব্যবহার
দ্য -p পতাকা শুধুমাত্র একটি ExecuteRequest পদ্ধতির প্রজন্মের ফলাফল যা
একাধিক ইন্টারফেস সনাক্ত করে এবং যার নাম প্রথম প্যাকেজ দ্বারা উপসর্গযুক্ত
বিবৃতি ডিফল্ট ক্ষেত্রে, স্বাধীন ExecuteRequest পদ্ধতি তৈরি করা হবে
দূরবর্তী পদ্ধতি কল প্রতিটি প্যাকেজ গ্রুপ.
সার্জারির উপসর্গ বিবৃতি রিমোট পদ্ধতির নামগুলিতে সমস্ত কলের জন্য প্রিপেন্ড করার জন্য একটি নাম সরবরাহ করে
ExecuteRequest স্টাব রুটিন. যখন সার্ভার অন্যকে RPC কল করে তখন এটি কার্যকর
সার্ভার (বলুন, ডিবাগিং উদ্দেশ্যে)। উদাহরণ স্বরূপ:
উপসর্গ এস
সার্ভার থেকে কল করা সমস্ত রুটিনের নামের সাথে "S" নামটি আগে যুক্ত করে
স্টাব সার্ভার তারপর আসল নাম কল করতে পারে এবং ক্লায়েন্ট স্টাব পেতে পারে।
rxgen কার্যপ্রণালী ঘোষণা
সার্জারির proc বিবৃতি সবচেয়ে সাধারণ (এবং অর্থবহ) মধ্যে rxgen ইন্টারফেস. এর সিনট্যাক্স
বর্ণনা হল:
[proc] ] [ ] ( , ..., )
[বিভক্ত | বহু] [= ];
কোথায়:
· "proc" পদ্ধতি বিবৃতির একটি ঐচ্ছিক উপসর্গ। এই শুধু একটি শৈলীগত আইটেম
এবং একটি প্রয়োজনীয় পদ্ধতি বিভেদক নয়।
· পদ্ধতির নাম। উল্লেখ্য, এমনকি পদ্ধতির নামও রয়েছে
ঐচ্ছিক এটি শুধুমাত্র তখনই বোঝা যায় যখন প্রদত্ত পদ্ধতির নাম অভিন্ন হয়
শেষের নাম প্যাকেজ বিবৃতি (অর্থাৎ, "প্যাকেজ RCallBack" এবং এর ঘোষণা
"RCallBack" পদ্ধতি)।
· , যদি উপস্থিত থাকে, তাহলে ExecuteRequest পদ্ধতির পরিবর্তে সেই স্টাবটিকে কল করতে পারে
স্বয়ংক্রিয়ভাবে উৎপন্ন স্টাবের যখন সেই অপকোড সহ একটি কল ডিকোড করা হয়।
· একটি ধ্রুবক বা প্রতীক যা সেই পদ্ধতির জন্য অপকোড। এক ব্যবহার হতে পারে
প্রিপ্রসেসর বৈশিষ্ট্য (যেমন, # সংজ্ঞায়িত করুন), const RPC-ভাষা বৈশিষ্ট্য, বা পুরানো
অপকোড হিসাবে ভাল ধ্রুবক। অপকোডের আরও কিছু মূল্যায়ন/প্রসেসিং করা হয়।
বিশেষ করে, ডুপ্লিকেট এবং অ-অস্তিত্বশীল অপকোডের জন্য চেক করা হয়, সাথে
অপকোড সিকোয়েন্সে "হোল" (অর্থাৎ, পরপর অপকোডের ফাঁক) পরীক্ষা করে। জন্য
উদাহরণস্বরূপ, আমরা এই সত্যটি ব্যবহার করি যে যখন অপকোডগুলিতে "গর্ত" বিদ্যমান, তখন ExecuteRequest
পদ্ধতি ব্যবহার করে কেস বিবৃতি বরং দ্রুততর (এবং ছোট, কোডওয়াইজ) সূচীকৃত
অ্যারে পদ্ধতি।
এছাড়াও, rxgen প্রতিটির জন্য তিনটি মূল্যবান ম্যাক্রো সংজ্ঞায়িত করে (অর্থাৎ, হেডার ফাইলে যুক্ত করে)
প্যাকেজ গ্রুপ: LOWEST_OPCODE, HIGHEST_OPCODE, এবং
NUMBER_OPCODES এই জন্য দরকারী হতে পারে rxgen প্রোগ্রামার এছাড়াও,
লক্ষ্য করুন যে opcode বিবৃতি একটি ঐচ্ছিক বৈশিষ্ট্য, এবং বাদ দেওয়া যেতে পারে। যেমন
ক্ষেত্রে, স্বয়ংক্রিয় অপকোড নম্বরগুলি ক্রমানুসারে তৈরি হয়, 0 থেকে শুরু হয়।
কেউ ব্যবহার করে প্রাথমিক opcode নম্বর পরিবর্তন করতে পারেন startingopcode (a অভাবের জন্য
ভালো নাম) rxgen আদেশ এর সিনট্যাক্স হল:
startingopcode
কোথায় যুক্তিসঙ্গত হতে হবে! নোট করুন যে এক পদ্ধতি মিশ্রিত করা যাবে না, কিছু সঙ্গে
opcodes এবং কিছু ছাড়া, অথবা opcodes এর স্পেসিফিকেশনের পরে অনুমতি দেয় না
startingopcode বিবৃতি। rxgen এই ধরনের সব ক্ষেত্রে অভিযোগ করা হবে.
· দ্য যুক্তি এন্ট্রি পদ্ধতির একটি প্রদত্ত পরামিতি প্রতিনিধিত্ব করে। এর সিনট্যাক্স হল:
[IN | ইনউট | আউট | ]
[ |<>|[সর্বোচ্চ]|[]]
যদি টাইপটি একটি পরোক্ষ প্রকার হয় (অর্থাৎ, * দ্বারা অনুসরণ করা হয়), তাহলে ধরে নেওয়া হয় যে পয়েন্টার
একটি স্তর অনুসরণ করা উচিত এবং নির্দেশিত ডেটা প্রেরণ করা উচিত। এটা উচিৎ
সাধারণত সব স্ট্রাকচার/অ্যারে এবং আউট প্যারামিটারের জন্য ব্যবহার করা হয়। একটি লক্ষণীয় ব্যতিক্রম
যখন স্পষ্ট অ্যারে/স্ট্রাকচার সর্বাধিক আকার দেওয়া হয়; যেহেতু কোন অ্যারে-অফ-পয়েন্টার
ঘোষণা অনুরূপ প্রভাব অর্জন করতে টাইপডেফ ব্যবহার করা উচিত। দ্য
প্যারামিটার হতে পারে ইনপুট প্যারামিটার (IN এর পূর্বে), আউটপুট প্যারামিটার (এর আগে
আউট), অথবা ইনপুট/আউটপুট পরামিতি (INOUT এর আগে)। যদি নির্দিষ্ট করা না থাকে, তাহলে
পদ্ধতিতে পূর্ববর্তী প্যারামিটারের দিক ব্যবহার করা হয়। (দ্রষ্টব্য: প্রথম
পরামিতি নির্দেশমূলক আদিম দ্বারা পূর্বে হতে হবে!)
· "বিভক্ত" হল স্টাব রুটিনগুলি পরিচালনা করার জন্য একটি হ্যাক যা ফাইল স্থানান্তর বা যেকোনো কিছু করে
অন্যান্য অপারেশন যা আগে তথ্য বিনিময় করতে হবে (যেমন, একটি ফাইলের দৈর্ঘ্য)
কল তার আউটপুট পরামিতি প্রদান করে। কারণ বিশেষ হ্যান্ডশেক হয়
রিমোট ফাইল ট্রান্সফার করার সময় জড়িত, আমরা বর্তমানে এই ধরনের সমস্ত কলকে দুই ভাগে ভাগ করি
ক্লায়েন্ট-সাইড স্টাব রুটিন। প্রথমটি ("Begin" এর ডিফল্ট উপসর্গ সহ) ব্যবহার করা হয়
সার্ভার সাইডে সমস্ত IN এবং INOUT প্যারামিটার পাস করুন। দ্বিতীয়টি (ডিফল্ট সহ
"End" এর উপসর্গ) সার্ভার থেকে INOUT এবং OUT পরামিতি ফিরে পেতে ব্যবহৃত হয়।
দুটি কলের মধ্যে, ব্যবহারকারীকে ফাইলটির জন্য উপযুক্ত কল করার কথা
স্থানান্তর উদাহরণস্বরূপ, প্যাকেজ AFS_-এ নিম্নলিখিত পদ্ধতির ঘোষণা
আনুন (IN a, b, INOUT c, OUT d) বিভক্ত = FETCHOPCODE;
মোটামুটিভাবে দুটি স্বাধীন ক্লায়েন্ট স্টাব রুটিন তৈরি করবে:
BeginAFS_Fetch (IN a, b, c)
এবং
EndAFS_Fetch(OUT c, d)
সার্জারির splitprefix বিবৃতি দুটি দ্বারা ব্যবহৃত ডিফল্ট উপসর্গ নাম পরিবর্তন করতে ব্যবহৃত হয়
ফাইল স্থানান্তর-সম্পর্কিত পদ্ধতির সাথে ডিল করার সময় ক্লায়েন্ট-সাইড স্টাব তৈরি রুটিন
কল উদাহরণ স্বরূপ:
স্প্লিটপ্রিফিক্স IN=আগে_আউট=পরে_
একটি ফাইল স্থানান্তর-সম্পর্কিত রুটিনের জন্য দুটি ক্লায়েন্ট স্টাবের নামকরণের কারণ হবে, বলুন
আনুন(), হতে আগে_AFS_Fetch() এবং পরে_AFS_Fetch(), যথাক্রমে।
· "মাল্টি" বিকল্পটি উপরে বর্ণিত "বিভক্ত" বৈশিষ্ট্যের প্রায় অভিন্ন। একমাত্র
উল্লেখযোগ্য দৃশ্যমান পার্থক্য হল যে দুটি ক্লায়েন্ট স্টাবের সাথে, স্ট্যান্ডার্ড
ক্লায়েন্ট স্টাবও তৈরি হয়। যেহেতু উদ্দেশ্য হল মাল্টি-আরএক্স কলগুলি পরিচালনা করা, আমরা
যে ক্ষেত্রে কোনো মাল্টি-আরএক্স কল নেই সেই ক্ষেত্রে পুরো স্ট্যান্ডার্ড পদ্ধতির স্টাব প্রয়োজন
পদ্ধতি সঞ্চালিত হয়। "মাল্টি" বিকল্পের একটি পার্শ্ব প্রতিক্রিয়া হল একটি প্রজন্ম
বিশেষ ম্যাক্রো (যেমন, "মাল্টি_ " যা আর্গুমেন্ট হিসাবে ফিরে যায় "শুরু"
এবং হেডার আউটপুট ফাইলে "শেষ" স্টাব। এই ম্যাক্রোটি সরাসরি Rx কোড দ্বারা ব্যবহৃত হয়
যখন এই পদ্ধতির একটি মাল্টি-আরএক্স কল করা হয়।
অপ্রচলিত rxgen বৈশিষ্ট্য
যদিও নিম্নলিখিত rxgen কমান্ডগুলি এখনও কার্যকর, সেগুলি শীঘ্রই সরানো হবে
আরও ভাল বিকল্প আছে। তাদের ব্যবহার করবেন না!
সার্জারির প্রশিক্ষণ স্টেটমেন্ট হল একটি অস্থায়ী হ্যাক যা কিছু অদক্ষতা পরিচালনা করতে ব্যবহৃত হয়
কিছু ব্যবহারকারী-কাস্টমাইজড ঘোষণা পরিচালনা করার জন্য স্ট্যান্ডার্ড xdr রুটিন। বিশেষ করে, এই
একটি ঘোষণার অংশ হিসাবে নির্দিষ্ট একটি স্ট্রিং পয়েন্টারে প্রযোজ্য। উদাহরণ স্বরূপ,
বিশেষ কাঠামো বিবিএস সেকবডি;
বলে rxgen ব্যবহারকারী-সংজ্ঞায়িত BBS xdr রুটিনে "SeqBody" এন্ট্রি হল একটি স্ট্রিং (নোট
যে কাঠামো প্রতি একাধিক স্ট্রিং "বিশেষ" হতে পারে -- একাধিক স্ট্রিং দ্বারা পৃথক করা হয়
কমা); এটি এইভাবে সার্ভার-উত্পাদিত স্থানে সঠিকভাবে স্থান বরাদ্দ এবং ডি-অ্যালোকেট করবে
একটি IN বা INOUT পরামিতি হিসাবে এই গঠন ধারণ করা স্টাব।
একটি ভাল বিকল্প প্রশিক্ষণ হয় কাস্টমাইজড বিবৃতি, যা সহজভাবে
"কাস্টমাইজড" টোকেন অনুসরণ করে RPCL-এর উপর ভিত্তি করে একটি কাঠামোর নিয়মিত ঘোষণা
নিয়ম এই ক্ষেত্রে, ঘোষণাটি জেনারেট করা হেডার ফাইলে অন্তর্ভুক্ত করা হবে (-h
বিকল্প) কিন্তু এই কাঠামোর জন্য কোন xdr রুটিন তৈরি করা হবে না -- ব্যবহারকারী সরবরাহ করবে
এই. এই কাঠামোর সমস্ত পয়েন্টার এন্ট্রি মনে রাখা হবে তাই যখন গঠন হয়
সার্ভার স্টাবে একটি IN বা INOUT হিসাবে ব্যবহৃত হয়, কোন কোর লিক ঘটবে না। উদাহরণ স্বরূপ,
বিবেচনা
কাস্টমাইজড গঠন সিবিএস {
দীর্ঘ সেকলেন;
char *SeqBody;
}
"xdr_CBS" রুটিনটি ব্যবহারকারী দ্বারা সরবরাহ করা হবে যেখানে DECODE xdr opcode এর সময়,
"SeqBody" স্ট্রিংয়ের জন্য উপযুক্ত স্থান বরাদ্দ করা হয়েছে। একইভাবে, সেই স্থানটি খালি করা হয়
বিনামূল্যে xdr opcode সময়.
দ্রষ্টব্য: পুরানো শৈলী "অ্যারে প্যারামিটার স্পেসিফিকেশন" আর সমর্থিত নয়।
উদাহরণ
বর্তমান RPC ভাষা দ্বারা উপলব্ধ কিছু প্রয়োজনীয়তা না থাকলে, কেউ করতে পারে
এই ডেটা প্রকারগুলিকে অনির্ধারিত রেখে কিছু XDR রুটিন কাস্টমাইজ করুন। প্রতিটি ডেটা টাইপের জন্য
এটি অনির্ধারিত, এটি অনুমান করা হবে যে "xdr_" নামের সাথে একটি রুটিন বিদ্যমান রয়েছে
এটা একটি নির্বাচিত সেট rxgen বৈশিষ্ট্য নীচে উপস্থাপন করা হয়, কিন্তু একটি আরো ব্যাপক জন্য
একটি (ইউনিয়ন, জটিল উদাহরণ, ইত্যাদি) অনুগ্রহ করে পড়ুন rpcgen প্রোগ্রামিং গাইড এবং
বহিরাগত উপাত্ত প্রতিনিধিত্ব: রবি কারিগরী নোট.
টাইপডেফস
RPC typedef স্টেটমেন্টটি C typedef (যেমন "typedef ")।
ডিফল্টরূপে, বেশিরভাগ ব্যবহারকারীর ঘোষণা (যেমন স্ট্রাকস, ইউনিয়ন, ইত্যাদি) স্বয়ংক্রিয়ভাবে হয়
দ্বারা typedef'ed rxgen. যেহেতু এটি পার্সিংকে সহজ করে তোলে, তাই এর ব্যবহার সুপারিশ করা হয় rxgen
স্ক্রিপ্ট।
স্ট্রিং
C "char *" স্ট্রিং কনভেনশনটি অস্পষ্ট ধরনের, যেহেতু এটি সাধারণত উদ্দেশ্যে করা হয়
মানে অক্ষরের একটি নাল-সমাপ্ত স্ট্রিং, কিন্তু এটি একটি নির্দেশককেও উপস্থাপন করতে পারে
একক অক্ষর, অক্ষরের একটি অ্যারের জন্য একটি নির্দেশক, ইত্যাদি। RPC ভাষায়, একটি নাল-
সমাপ্ত স্ট্রিংকে দ্ব্যর্থহীনভাবে "স্ট্রিং" বলা হয়। উদাহরণ,
স্ট্রিং bigname<>;
স্ট্রিং নাম ;
typedef স্ট্রিং ভলনাম ;
লক্ষ্য করুন যে স্ট্রিংয়ের সর্বাধিক আকার নির্বিচারে হতে পারে (উপরের "বিগনেম" এর মতো) বা,
বাঞ্ছনীয়ভাবে, বা কোণ বন্ধনীতে নির্দিষ্ট করা হয়েছে (যেমন "নাম" এবং "ভলনাম" উপরে)। ভিতরে
অনুশীলন, একটি সবসময় ইন্টারফেসে শুধুমাত্র আবদ্ধ স্ট্রিং ব্যবহার করা উচিত. একটি নমুনা কলিং proc
উপরের ঘোষণাগুলি ব্যবহার করা হবে:
GetEntryByName (ভলনামের নামে,
OUT struct vldbentry *entry) = VL_GETENTRYBYNAME;
বা, অবশ্যই,
GetEntryByName (IN স্ট্রিং ভলনাম ,
OUT struct vldbentry *entry) = VL_GETENTRYBYNAME;
স্ট্রিং পরামিতি কখন হওয়া উচিত তা ব্যবহারকারীর পক্ষে বোঝা খুবই গুরুত্বপূর্ণ
তার/তার ক্লায়েন্ট এবং/অথবা সার্ভার প্রোগ্রাম দ্বারা বরাদ্দ এবং/অথবা মুক্ত। একটি সংক্ষিপ্ত বিশ্লেষণ
স্ট্রিং প্যারামিটার হ্যান্ডলিং অনুসরণ করে (উল্লেখ্য যে একটি অনুরূপ পদ্ধতি হ্যান্ডলিং এর জন্য ব্যবহৃত হয়
পরিবর্তনশীল দৈর্ঘ্য অ্যারে যেমন এটি পরে দেখানো হবে):
· ক্লায়েন্ট সাইডে: IN এবং INOUT স্ট্রিং প্যারামিটার প্রোগ্রামারের দায়িত্ব
এবং rpc কল করার আগে বরাদ্দ করা উচিত (স্ট্যাটিক বা ম্যালোকের মাধ্যমে) এবং মুক্ত করা উচিত (যদি
malloc ব্যবহার করা হয়েছিল) ব্যবহারকারীর ক্লায়েন্ট প্রোগ্রামে rpc এর রিটার্নের পরে; অবশ্যই, জন্য
INOUT পরামিতি, প্রত্যাবর্তিত স্ট্রিংটি ম্যালোসড ইনপুট স্ট্রিং থেকে বড় হতে পারে না।
আউট স্ট্রিং পরামিতিগুলি স্বয়ংক্রিয়ভাবে ম্যালোসড হয় (ফিরানো দৈর্ঘ্যের উপর ভিত্তি করে
স্ট্রিং এবং maxsize নয়) দ্বারা rxgen ক্লায়েন্ট স্টাবস (in ফাইলের নাম.cs.c) এবং হতে হবে
ক্লায়েন্ট প্রোগ্রাম দ্বারা মুক্ত; স্বীকার্য, এটি ব্যবহারকারীর থেকে কিছুটা বিভ্রান্তিকর হতে পারে
এমন কিছু খালি করতে হবে যা সে বরাদ্দ করেনি।}
· সার্ভার সাইডে: IN এবং INOUT স্ট্রিং প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে ম্যালোসড হয় (এর উপর ভিত্তি করে
rxgen সার্ভার স্টাব দ্বারা ইনকামিং স্ট্রিংগুলির আকার (in ফাইলের নাম.ss.c) তাদের আগে
ব্যবহারকারীর সার্ভার পদ্ধতিতে পাস করা হয়; যে স্থান ঠিক আগে স্বয়ংক্রিয়ভাবে মুক্ত হয়
rxgen সার্ভার স্টাব রিটার্ন করে; তাই ব্যবহারকারীকে IN এর জন্য বিশেষ কিছু করতে হবে না
এবং INOUT স্ট্রিং প্যারামিটার।
আউট স্ট্রিং পরামিতি অবশ্যই ব্যবহারকারীর সার্ভার পদ্ধতি দ্বারা ম্যালোস করা উচিত (যেমন নাল পয়েন্টার
এটি rxgen সার্ভার স্টাব দ্বারা পাস করা হয়) এবং এটি স্বয়ংক্রিয়ভাবে শেষে মুক্ত হয়
দ্য rxgen সার্ভার স্টাব ক্লায়েন্ট সাইডের মতো, আউট প্যারামিটারগুলি কিছুটা
অপ্রচলিত (অর্থাৎ সার্ভারের রুটিনকে অবশ্যই একটি স্ট্রিংকে মুক্ত না করেই malloc করতে হবে;
এই দ্বারা করা হয় rxgen সার্ভার স্টাব)।
উল্লেখ্য যে INOUT এবং আউট স্ট্রিং প্যারামিটারের জন্য, ক্লায়েন্ট এবং সার্ভার উভয় দিকেই তাদের
আর্গুমেন্ট অবশ্যই পয়েন্টার এর চার হতে হবে (যেমন চর **)।
Pointers
RPC-তে পয়েন্টার ঘোষণাগুলিও ঠিক যেমন সেগুলি C-তে রয়েছে (অর্থাৎ "struct
single_vldbentry *vldblist;")। অবশ্যই, কেউ নেটওয়ার্কে পয়েন্টার পাঠাতে পারে না, কিন্তু
তালিকা এবং গাছের মতো পুনরাবৃত্ত ডেটা টাইপ পাঠানোর জন্য কেউ XDR পয়েন্টার ব্যবহার করতে পারে (এক
একটি লিঙ্ক তালিকার উদাহরণ শীঘ্রই প্রদর্শিত হবে)।
অ্যারেগুলির
স্থির অ্যারেগুলি স্ট্যান্ডার্ড সি অ্যারে ঘোষণার মতো (যেমন "struct UpdateEntry
এন্ট্রি[20]") কোনো পার্শ্বপ্রতিক্রিয়া সমস্যা ছাড়াই rxgen. যেহেতু পরিবর্তনশীল-দৈর্ঘ্যের অ্যারে আছে
C-তে কোনো সুস্পষ্ট সিনট্যাক্স নেই, এর জন্য অ্যাঙ্গেল-বন্ধনী ব্যবহার করা হয় এবং অ্যারে ঘোষণাগুলি হল
আসলে "struct" এ কম্পাইল করা হয়েছে। উদাহরণস্বরূপ, ঘোষণা যেমন:
const MAXBULKSIZE = 10000;
const MAXENTRIES = 100;
অস্বচ্ছ বাল্ক ; /* সর্বাধিক 10000টি আইটেম */
int হোস্ট <>; /* যেকোনো সংখ্যক আইটেম */
typedef vldbentry blkentries<100>; /* পছন্দের অ্যারে decl */
নিম্নলিখিত স্ট্রাকটে কম্পাইল করা হয়:
গঠন {
u_int bulk_len; /* আইটেমের সংখ্যা */
char *বাল্ক_ভাল; /* পয়েন্টার টু অ্যারে */
} স্তূপ;
"বাল্ক" অ্যারের জন্য, এবং একইভাবে "blkentries<100>" অ্যারের জন্য,
গঠন {
u_int blkentries_len; /* অ্যারের আইটেমের সংখ্যা */
vldbentry *blkentries_val; /* পয়েন্টার টু অ্যারে */
} blkentries;
তাই ব্যবহারকারীকে "জাদুকরী" উত্পন্ন কাঠামো এন্ট্রি যেমন সচেতন হওয়া উচিত
অ্যারেতে আইটেমের সংখ্যা ( _len) এবং অ্যারের পয়েন্টার
( _val) যেহেতু কিছু এন্ট্রি থেকে পূরণ করতে হবে
ক্লায়েন্ট/সার্ভার প্রোগ্রাম। একটি নমুনা প্রক্রিয়া হবে:
typedef vldbentry blkentries ;
proc GetBlk (OUT blkentries *vlentries) = VL_GETBLK;
অথবা, আরো সরাসরি,
GetBlk(OUT vldbentry vlentries ) = VL_GETBLK;
উল্লেখ্য যে যদিও সর্বশেষ পদ্ধতিটি পছন্দনীয় কারণ একজনকে প্রথমে ব্যবহার করতে হবে না
টাইপডেফ স্টেটমেন্ট (এবং স্বীকার্যভাবে, প্রোগ্রামাররা টাইপডেফ এড়িয়ে চলতে পছন্দ করে), এক উচিত
বুঝতে পারি যে rxgen কাঠামোর প্রসারণ এবং xdr তৈরি করে নিহিতভাবে; তাই
ব্যবহারকারীকে আগের মতো "vldbentries_val" এবং "vldbentries_len" ক্ষেত্র সম্পর্কে সচেতন হতে হবে
(নিম্নলিখিত উদাহরণ দেখুন)।
বিন্যাস উদাহরণ I (অন্তত কাম্য)
ইন্টারফেস কনফিগারেশনে পদ্ধতির ঘোষণা:
proc ListAttributes (IN vldblistbyattributes * বৈশিষ্ট্য,
INOUT blkentries *vldbentries) = VL_LISTATTRIBUTES;
নমুনা ক্লায়েন্ট কোড:
blkentries এন্ট্রি, *pnt;
entries.blkentries_len = 10; /* সর্বাধিক # ফেরত এন্ট্রি */
entries.blkentries_val = (vldbentry *)malloc(LEN);
/* এটা অবশ্যই সেট করতে হবে */
কোড = VL_ListAttributes(&attributes, &entries);
যদি (!কোড) {
pnt = entries.blkentries_val;
জন্য (i=0; i < entries.blkentries_len; i++, pnt++)
display_vldbentry(pnt);
/* নিশ্চিত করুন যে আপনি বরাদ্দকৃত স্থান খালি করেছেন */
বিনামূল্যে((char*)entries.blkentries_val);
}
নমুনা সার্ভার কোড:
VL_ListAttributes(বৈশিষ্ট্য, এন্ট্রি)
{
vldbentry *singleentry = entries->blkentries_val;
এন্ট্রি->blkentries_len = 0;
যখন (copy_to_vldbentry(&vlentry, singleentry))
singleentry++, vldbentries->entries_len++;
}
যদিও পরিবর্তনশীল-আকারের অ্যারেগুলির জন্য এই পদ্ধতিটি সূক্ষ্ম কাজ করে, কিছু প্রধান ত্রুটি রয়েছে।
অ্যারে প্যারামিটার (অর্থাৎ উপরের vldbentries) অবশ্যই INOUT হিসাবে ঘোষণা করতে হবে যেহেতু আমাদের প্রয়োজন
প্রত্যাশিত রিটার্ন অ্যারের সর্বোচ্চ দৈর্ঘ্য পাস করুন; আরও গুরুত্বপূর্ণভাবে, একটি বড় (এর উপর নির্ভর করে
"_len" এর মান) জাঙ্ক কোডের অংশটি সার্ভারে স্থানান্তরিত হতে চলেছে ফলাফল হিসাবে
অ্যারের IN(বাইরে) পার্শ্ব-প্রতিক্রিয়া। এটি একটি সহজ এবং সুবিধাজনক পদ্ধতি যদি
প্রত্যাবর্তিত অ্যারের আকার শুরু থেকে ভবিষ্যদ্বাণী করা যেতে পারে এবং যখন আকারটি বেশ বেশি হয়। এই
এর ভুল ব্যবহার (এবং অপব্যবহারের) উদাহরণ হিসাবে পদ্ধতি অন্তর্ভুক্ত করা হয়েছে rxgen এবং হওয়া উচিত নয়
ব্যবহার করা হয়েছে।
বিন্যাস উদাহরণ II (আকাঙ্খিত পদ্ধতি)
ইন্টারফেস কনফিগারেশনে পদ্ধতির ঘোষণা (উপরের উদাহরণ I ব্যবহার করে):
proc ListAttributes (IN vldblistbyattributes * বৈশিষ্ট্য,
OUT blkentries *vldbentries) = VL_LISTATTRIBUTES;
নমুনা ক্লায়েন্ট কোড:
blkentries এন্ট্রি, *pnt;
কোড = VL_ListAttributes(&attributes, &entries);
যদি (!কোড) {
pnt = entries.blkentries_val;
জন্য (i=0; i < entries.blkentries_len; i++, pnt++)
display_vldbentry(pnt);
/* নিশ্চিত করুন যে আপনি বরাদ্দকৃত স্থান খালি করেছেন (rxgen দ্বারা) */
বিনামূল্যে((char*)entries.blkentries_val);
}
নমুনা সার্ভার কোড:
VL_ListAttributes(বৈশিষ্ট্য, এন্ট্রি)
{
vldbentry * একাকী;
এন্ট্রি->blkentries_len = 0;
singleentry = entries->blkentries_val
= (vldbentry *)malloc(MAXENTRIES * sizeof(vldbentry));
যখন (copy_to_vldbentry(&vlentry, singleentry))
singleentry++, vldbentries->entries_len++;
}
এটি একটি আউটপুট প্যারামিটার হিসাবে ভেরিয়েবল-আকার অ্যারে ব্যবহার করার সর্বোত্তম (এবং সহজ) উপায়।
এটা সার্ভার-সাইড স্টাব দায়িত্ব malloc () পর্যাপ্ত স্থান যা
স্বয়ংক্রিয়ভাবে দ্বারা মুক্ত rxgen অসম্পূর্ণ; ক্লায়েন্ট পক্ষের দ্বারা বরাদ্দ করা স্থান খালি করা উচিত
দ্য rxgen- কলিং স্টাব
বিন্যাস উদাহরণ তৃতীয় (সংযুক্ত তালিকা)
নিম্নলিখিত 3টি ঘোষণা বিবেচনা করে (কিছু অপ্টিমাইজেশান প্রয়োগ করা যেতে পারে)
কনফিগারেশন ফাইল:
typedef struct single_vldbentry *vldblist;
struct single_vldbentry {
vldbentry vlentry;
vldblist next_vldb;
};
struct vldb_list {
vldblist নোড;
};
এবং rxgen পদ্ধতির ঘোষণা:
লিঙ্কডলিস্ট (IN vldblistbyattributes * বৈশিষ্ট্যগুলি,
আউট vldb_list *linkedentries) = VL_LINKEDLIST;
নমুনা ক্লায়েন্ট কোড:
vldb_list linkedvldbs;
vldblist vllist, vllist1;
bzero(&linkedvldbs, sizeof(vldb_list));
কোড = VL_LinkedList(&attributes, &nentries, &linkedvldbs);
যদি (!কোড) {
printf("আমরা %d vldb এন্ট্রি পেয়েছি\n", nentries);
জন্য (vllist = linkedvldbs.node; vllist; vllist = vllist1) {
vllist1 = vllist->next_vldb;
display_entry(&vllist->vlentry);
বিনামূল্যে((char*)vllist);
}
}
নমুনা সার্ভার কোড:
VL_LinkedList(rxcall, attributes, nentries, linkedvldbs);
{
vldblist vllist, *vllistptr = &linkedvldbs->নোড;
যখন (...) {
vllist = *vllistptr
= (single_vldbentry *)malloc (sizeof (single_vldbentry));
copy_to_vldbentry(&tentry, &vllist->vlentry);
nentries++;
vllistptr = &vllist->next_vldb;
};
*vllistptr = NULL;
}
একটি লিঙ্কযুক্ত তালিকা ব্যবহার করা অনেক সুবিধা দেয়: সার্ভারে কিছুই পাস করা হয় না (প্যারামিটার
আউট হয়), কোন অতিরিক্ত ওভারহেড জড়িত নেই, এবং কলকারীকে স্পষ্টভাবে করতে হবে না
একটি নির্বিচারে রিটার্ন আকার জন্য প্রস্তুত. একটি অপূর্ণতা হল যে কলার আছে
দায়িত্ব malloc () (সার্ভারে) এবং বিনামূল্যে (ক্লায়েন্টে) প্রতিটি এন্ট্রির (কে
অবাঞ্ছিত কোর-লিক এড়িয়ে চলুন)। আরেকটি অপূর্ণতা হল যেহেতু এটি একটি পুনরাবৃত্ত কল, সি
স্ট্যাক তালিকায় নোডের সংখ্যার সাপেক্ষে রৈখিকভাবে বৃদ্ধি পাবে (তাই এটি করা বুদ্ধিমানের কাজ
Rx LWP স্ট্যাক বাড়ান যদি বিপুল পরিমাণ ডেটা ফেরত প্রত্যাশিত হয় -- ডিফল্ট স্ট্যাকের আকার
হল 4K)। সুবিধাগুলি এখানে অসুবিধার চেয়ে বেশি হওয়া উচিত।
উপরের তিনটি অ্যারের উদাহরণের মন্তব্যগুলিতে মনোযোগ দেওয়া গুরুত্বপূর্ণ
বিশেষ করে যখন তারা রেফারেন্স করছে যখন ব্যবহারকারীর জন্য বরাদ্দ/মুক্ত স্থান বরাদ্দ করা উচিত
পরিবর্তনশীল দৈর্ঘ্য অ্যারে। মেকানিজম এইভাবে আপনি স্ট্রিং পরিচালনার অনুরূপ
উপরের স্ট্রিং বিভাগ পর্যালোচনা করতে হতে পারে; উল্লেখ্য যে লিঙ্কযুক্ত তালিকাগুলি পরিচালনা করা হয়
কিছুটা ভিন্নভাবে...
বিবিধ উদাহরণ
নীচে একটি র্যান্ডম ইন্টারফেস ফাইলের একটি সংক্ষিপ্ত সংস্করণ যা কিছু সাধারণ দেখায়
মামলা।
/* R.xg স্ক্রিপ্ট ইন্টারফেস দ্বারা ব্যবহৃত সমস্ত কাঠামোর ঘোষণা */
গঠন AFSFid {
স্বাক্ষরবিহীন দীর্ঘ ভলিউম;
স্বাক্ষরবিহীন লম্বা ভনোড;
স্বাক্ষরবিহীন দীর্ঘ অনন্য;
};
typedef long ViceDataType;
/* মনে রাখবেন যে TEST শুধুমাত্র "HEADER" এর সমতুল্য হবে
হেডারের প্রক্রিয়াকরণ, *.h, ফাইল */
#ifdef RPC_HDR
# টেস্ট "হেডার" সংজ্ঞায়িত করুন
# আরও
# পরীক্ষা "বিশ্রাম" সংজ্ঞায়িত করুন
#endif
/* এটি স্ট্যান্ডার্ড *.xg স্পেসিফিকেশন ফাইল */
প্যাকেজ AFS_
splitprefix IN=BEFORE_OUT=AFTER_;
উপসর্গ পরীক্ষা
proc অপসারণ(struct AFSFid *Did, IN স্ট্রিং volname<64>,
OUT struct AFSSstatus *স্থিতি) = AFS_REMOVE;
ডিসকানেক্টএফএস AUX_disconnectFS() = AFS_DISCONNECTFS;
proc GetVolumeInfo(IN স্ট্রিং ভিড,
OUT struct VolumeInfo *Info) = AFS_GETVOLUMEINFO;
/* আপনার কনফিগারেশন প্রতি একটি ইন্টারফেসের বেশি থাকতে পারে */
প্যাকেজ VOTE_
/* "মাল্টি" বৈশিষ্ট্য ব্যবহার করে; এইভাবে VOTE_Beacon কে একটি হিসাবে বলা যেতে পারে
মাল্টি-আরএক্স কল বা নিয়মিত কল হিসাবে */
বীকন (দীর্ঘ অবস্থায়, দীর্ঘ ভোট শুরু,
net_version *সংস্করণ, net_tid *tid)
মাল্টি = VOTE_BEACON;
প্যাকেজ DISK_
/* "বিভক্ত" বৈশিষ্ট্য ব্যবহার করে */
SendFile (দীর্ঘ ফাইলে, দীর্ঘ অফসেট,
দীর্ঘ দৈর্ঘ্য, নেট_সংস্করণ *সংস্করণ)
বিভক্ত = DISK_SENDFILE;
আউটপুট of an আসল ইন্টারফেস কনফিগারেশন
আমরা দ্বারা উত্পন্ন প্রকৃত আউটপুট কিছু প্রদর্শন করব rxgen একটি সংক্ষিপ্ত অনুসরণ করে
প্রকৃত ইন্টারফেস কনফিগারেশন।
কনফিগারেশন ফাইল
ইন্টারফেস কনফিগারেশন ফাইলের বিষয়বস্তু (vldbint.xg):
প্যাকেজ VL_
#include "vl_opcodes.h" /* অপকোডগুলি এখানে অন্তর্ভুক্ত করা হয়েছে */
%#include "vl_opcodes.h" /* সরাসরি অন্যান্য জায়গায় */
/* পরামিতিগুলির বর্তমান সীমাবদ্ধতা যা অন্যান্য প্যাকেজগুলিকে প্রভাবিত করে
(অর্থাৎ আয়তন) */
const MAXNAMELEN = 65;
const MAXNSERVERS = 8;
const MAXTYPES = 3;
/* একটি পৃথক vldb এন্ট্রির বাহ্যিক (দৃশ্যমান) উপস্থাপনা */
struct vldbentry {
অক্ষরের নাম [MAXNAMELEN];
দীর্ঘ ভলিউম টাইপ;
দীর্ঘ n সার্ভার;
দীর্ঘ সার্ভার নম্বর [MAXNSERVERS];
দীর্ঘ সার্ভার পার্টিশন [MAXNSERVERS];
দীর্ঘ সার্ভার পতাকা[MAXNSERVERS];
u_long volumeId[MAXTYPES];
দীর্ঘ পতাকা;
};
typedef struct single_vldbentry *vldblist;
struct single_vldbentry {
vldbentry VldbEntry;
vldblist next_vldb;
};
struct vldb_list {
vldblist নোড;
};
/* vldb ইন্টারফেস কল */
CreateEntry (দীর্ঘ মেয়াদী,
vldbentry *newentry) = VLCREATEENTRY;
GetEntryByName (IN স্ট্রিং ভলিউমনেম ,
OUT vldbentry *entry) = VLGETENTRYBYNAME;
GetNewVolumeId (দীর্ঘ বাম্পকাউন্টে,
আউট লং *নতুন ভলিউমিড) = VLGETNEWVOLUMEID;
রিপ্লেস এন্ট্রি (দীর্ঘ মেয়াদী,
দীর্ঘ ভোল্টাইপ,
vldbentry *নিউভেন্ট্রি,
long ReleaseType) multi = VLREPLACEENTRY;
ListAttributes (IN VldbListByAttributes * বৈশিষ্ট্যগুলি,
আউট দীর্ঘ *নেন্ট্রি,
আউট vldbentry বাল্কেন্ট্রি )
= VLLISTATTRIBUTES;
লিঙ্কডলিস্ট (IN VldbListByAttributes * বৈশিষ্ট্যগুলি,
আউট দীর্ঘ *নেন্ট্রি,
আউট vldb_list *linkedentries) = VLLINKEDLIST;
আমরা শুধুমাত্র Rx জেনারেটেড কোডে মনোনিবেশ করব যেহেতু R তৈরি করা কোড-R বিকল্প)
শীঘ্রই অপ্রচলিত হবে। ভিতরে Rx-সম্পর্কিত কলগুলির একটি বিশদ বিবরণের জন্য
উত্পন্ন স্টাব (যেমন, rx_NewCall(), rx_EndCall()), যা ঘটে তার বিশদ সহ
নির্দিষ্ট কলের ভিতরে (যেমন xdrrx_create()) অনুগ্রহ করে Rx ডকুমেন্টেশন পড়ুন। টাইপিং
"rxgen vldbint.xg" এর ফলে চারটি ফাইল তৈরি হবে: vldbint.h, vldbint.xdr.c,
vldbint.cs.c এবং vldbint.ss.c. এই ফাইলগুলির একটি ঘনিষ্ঠ চেহারা অনুসরণ করে.
শিরোলেখ ফাইল (vldbint.h)
/* মেশিন জেনারেটেড ফাইল -- এডিট করবেন না */
#অন্তর্ভুক্ত করুন "vl_opcodes.h" /* সরাসরি অন্যান্য জায়গায় */
# MAXNAMELEN 65 সংজ্ঞায়িত করুন
# MAXNSERVERS 8 সংজ্ঞায়িত করুন
# MAXTYPES 3 সংজ্ঞায়িত করুন
struct vldbentry {
অক্ষরের নাম [MAXNAMELEN];
দীর্ঘ ভলিউম টাইপ;
দীর্ঘ n সার্ভার;
দীর্ঘ সার্ভার নম্বর [MAXNSERVERS];
দীর্ঘ সার্ভার পার্টিশন [MAXNSERVERS];
দীর্ঘ সার্ভার পতাকা[MAXNSERVERS];
u_long volumeId[MAXTYPES];
দীর্ঘ পতাকা;
};
typedef struct vldbentry vldbentry;
bool_t xdr_vldbentry();
typedef struct single_vldbentry *vldblist;
bool_t xdr_vldblist();
struct single_vldbentry {
vldbentry VldbEntry;
vldblist next_vldb;
};
typedef struct single_vldbentry single_vldbentry;
bool_t xdr_single_vldbentry();
struct vldb_list {
vldblist নোড;
};
typedef struct vldb_list vldb_list;
bool_t xdr_vldb_list();
#অন্তর্ভুক্ত
# মাল্টি_ভিএল_রিপ্লেস এন্ট্রি (ভলিড, ভোল্টাইপ, নিউএন্ট্রি, রিলিজ টাইপ) সংজ্ঞায়িত করুন \
মাল্টি_বডি(স্টার্টভিএল_রিপ্লেস এন্ট্রি(মাল্টি_কল, ভলিড, ভোল্টাইপ,
নতুন প্রবেশ, রিলিজ টাইপ), EndVL_ReplaceEntry(মাল্টি_কল))
typedef struct বাল্কেন্ট্রি {
u_int bulkentry_len;
vldbentry *bulkentry_val;
} বাল্কেন্ট্রি;
bool_t xdr_bulkentry();
/* প্যাকেজের জন্য Opcode-সম্পর্কিত দরকারী পরিসংখ্যান: VL_ */
# VL_LOWEST_OPCODE 501 সংজ্ঞায়িত করুন
# VL_HIGHEST_OPCODE 506 সংজ্ঞায়িত করুন
# VL_NUMBER_OPCODES 6 সংজ্ঞায়িত করুন
লক্ষ্য করুন যে সমস্ত কাঠামো স্বয়ংক্রিয়ভাবে টাইপ করা হয়েছে এবং সমস্ত "const" গুলি রূপান্তরিত হয়েছে
"#সংজ্ঞায়িত" কিছু ডেটা স্ট্রাকচার, যেমন বাল্কেন্ট্রি, পদ্ধতি প্যারাম থেকে নেওয়া হয়
(ListAttributes proc থেকে)। সুতরাং, স্টাব তৈরি করার সময় এটি মনে রাখা উচিত
সঙ্গে টুকরো টুকরো rxgen (অর্থাৎ, ব্যবহার করে -c, -h, -C, বা -S পতাকা)। এছাড়াও, পক্ষের এক
"মাল্টি" বিকল্পের প্রভাব ("রিপ্লেস এন্ট্রি" প্রোক-এ) এর প্রজন্ম
উপরে "multi_VL_ReplaceEntry"।
XDR রুটিন উন্নত কাঠামো (vldbint.xdr.c)
/* মেশিন জেনারেটেড ফাইল -- এডিট করবেন না */
#অন্তর্ভুক্ত
# "vldbint.h" অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত করুন "vl_opcodes.h" /* সরাসরি অন্যান্য জায়গায় */
bool_t
xdr_vldbentry(xdrs, objp)
XDR *xdrs;
vldbentry *objp;
{
যদি (!xdr_vector(xdrs, (char *)objp->নাম, MAXNAMELEN,
sizeof(char), xdr_char))
ফেরত (মিথ্যা);
যদি (!xdr_long(xdrs, &objp->ভলিউম টাইপ))
ফেরত (মিথ্যা);
যদি (!xdr_long(xdrs, &objp->nServers))
ফেরত (মিথ্যা);
যদি (!xdr_vector(xdrs, (char *)objp->সার্ভার নম্বর, MAXNSERVERS,
sizeof(দীর্ঘ), xdr_long))
ফেরত (মিথ্যা);
যদি (!xdr_vector(xdrs, (char *)objp->সার্ভার পার্টিশন,
MAXNSERVERS, sizeof(দীর্ঘ), xdr_long))
ফেরত (মিথ্যা);
যদি (!xdr_vector(xdrs, (char *)objp->সার্ভার ফ্ল্যাগ, MAXNSERVERS,
sizeof(দীর্ঘ), xdr_long))
ফেরত (মিথ্যা);
যদি (!xdr_vector(xdrs, (char *)objp->volumeId, MAXTYPES,
sizeof(u_long), xdr_u_long))
ফেরত (মিথ্যা);
যদি (!xdr_long(xdrs, &objp->পতাকা))
ফেরত (মিথ্যা);
ফেরত (সত্য);
}
bool_t
xdr_vldblist(xdrs, objp)
XDR *xdrs;
vldblist *objp;
{
যদি (!xdr_pointer(xdrs, (char **)objp,
sizeof(struct single_vldbentry),
xdr_single_vldbentry))
ফেরত (মিথ্যা);
ফেরত (সত্য);
}
bool_t
xdr_single_vldbentry(xdrs, objp)
XDR *xdrs;
single_vldbentry *objp;
{
যদি (!xdr_vldbentry(xdrs, &objp->VldbEntry))
ফেরত (মিথ্যা);
যদি (!xdr_vldblist(xdrs, &objp->next_vldb))
ফেরত (মিথ্যা);
ফেরত (সত্য);
}
bool_t
xdr_vldb_list(xdrs, objp)
XDR *xdrs;
vldb_list *objp;
{
যদি (!xdr_vldblist(xdrs, &objp->নোড))
ফেরত (মিথ্যা);
ফেরত (সত্য);
}
bool_t
xdr_bulkentry(xdrs, objp)
XDR *xdrs;
বাল্কেন্ট্রি *objp;
{
যদি (!xdr_array(xdrs, (char **)&objp->bulkentries_val,
(u_int *)&objp->bulkentries_len, MAXVLDBLEN,
sizeof(vldbentry), xdr_vldbentry))
ফেরত (মিথ্যা);
ফেরত (সত্য);
}
উল্লেখ্য যে xdr_bulkentry() একটি পদ্ধতির পার্শ্ব প্রতিক্রিয়া হিসাবে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়
পরামিতি ঘোষণা। এইভাবে, যদি অভিন্ন একাধিক ধরনের প্যারামিটার ঘোষণা ব্যবহার করা হয়,
তারপর গুন-সংজ্ঞায়িত xdr_* স্টাব তৈরি করা হবে! আমরা অনুভব করেছি এটি একটি ভাল বিকল্প
থাকার জন্য rxgen প্রোগ্রামার বাল্কেন্ট্রি_১, বাল্কেন্ট্রি_২... এর মতো প্রকারের সাথে ডিল করে।
মক্কেলের পক্ষে অসম্পূর্ণ রুটিন (vldbint.cs.c)
/* মেশিন জেনারেটেড ফাইল -- এডিট করবেন না */
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
# "vldbint.h" অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত করুন "vl_opcodes.h" /* সরাসরি অন্যান্য জায়গায় */
int VL_CreateEntry(z_conn, ভলিড, নতুন এন্ট্রি)
নিবন্ধন struct rx_connection *z_conn;
দীর্ঘ ভলিড;
vldbentry * newentry;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 501;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_long(&z_xdrs, &Volid))
|| (!xdr_vldbentry(&z_xdrs, newentry))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
int VL_GetEntryByName(z_conn, ভলিউম নাম, এন্ট্রি)
নিবন্ধন struct rx_connection *z_conn;
char * ভলিউমের নাম;
vldbentry * এন্ট্রি;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 504;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_string(&z_xdrs, &volumename, 65))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
/* উত্তর আর্গুমেন্ট আন-মার্শাল */
z_xdrs.x_op = XDR_DECODE;
যদি ((!xdr_vldbentry(&z_xdrs, এন্ট্রি))) {
z_result = RXGEN_CC_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
int VL_GetNewVolumeId(z_conn, bumpcount, newvolumid)
নিবন্ধন struct rx_connection *z_conn;
দীর্ঘ বাম্পকাউন্ট;
দীর্ঘ * নতুন ভলিউমিড;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 505;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_long(&z_xdrs, &bumpcount))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
/* উত্তর আর্গুমেন্ট আন-মার্শাল */
z_xdrs.x_op = XDR_DECODE;
যদি ((!xdr_long(&z_xdrs, newvolumid))) {
z_result = RXGEN_CC_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
int VL_ReplaceEntry(z_conn, Volid, voltype, newentry, ReleaseType)
নিবন্ধন struct rx_connection *z_conn;
দীর্ঘ ভলিড, ভোল্টাইপ, রিলিজ টাইপ;
vldbentry * newentry;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 506;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_long(&z_xdrs, &Volid))
|| (!xdr_long(&z_xdrs, &voltype))
|| (!xdr_vldbentry(&z_xdrs, newentry))
|| (!xdr_long(&z_xdrs, &ReleaseType))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
int StartVL_ReplaceEntry(z_call, Volid, voltype, newentry, ReleaseType)
নিবন্ধন struct rx_call *z_call;
দীর্ঘ ভলিড, ভোল্টাইপ, রিলিজ টাইপ;
vldbentry * newentry;
{
স্ট্যাটিক int z_op = 506;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_long(&z_xdrs, &Volid))
|| (!xdr_long(&z_xdrs, &voltype))
|| (!xdr_vldbentry(&z_xdrs, newentry))
|| (!xdr_long(&z_xdrs, &ReleaseType))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
ফেরত z_result;
}
int EndVL_ReplaceEntry(z_call)
নিবন্ধন struct rx_call *z_call;
{
int z_result;
XDR z_xdrs;
z_result = RXGEN_SUCCESS;
ব্যর্থ:
ফেরত z_result;
}
int VL_ListAttributes(z_conn, গুণাবলী, নেন্ট্রি, বাল্কেন্ট্রি_1)
নিবন্ধন struct rx_connection *z_conn;
VldbListByAttributes * বৈশিষ্ট্য;
দীর্ঘ * nentries;
বাল্কেন্ট্রি * বাল্কেন্ট্রি_১;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 511;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_VldbListByAttributes(&z_xdrs, গুণাবলী))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
/* উত্তর আর্গুমেন্ট আন-মার্শাল */
z_xdrs.x_op = XDR_DECODE;
যদি ((!xdr_long(&z_xdrs, nentries))
|| (!xdr_bulkentries(&z_xdrs, bulkentries_1))) {
z_result = RXGEN_CC_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
int VL_LinkedList(z_conn, গুণাবলী, নেন্ট্রি, লিঙ্ক এন্ট্রি)
নিবন্ধন struct rx_connection *z_conn;
VldbListByAttributes * বৈশিষ্ট্য;
দীর্ঘ * nentries;
vldb_list * linkedentries;
{
struct rx_call *z_call = rx_NewCall(z_conn);
স্ট্যাটিক int z_op = 512;
int z_result;
XDR z_xdrs;
xdrrx_create(&z_xdrs, z_call, XDR_ENCODE);
/* আর্গুমেন্ট মার্শাল */
যদি ((!xdr_int(&z_xdrs, &z_op))
|| (!xdr_VldbListByAttributes(&z_xdrs, গুণাবলী))) {
z_result = RXGEN_CC_MARSHAL;
ব্যর্থ হয়েছে;
}
/* উত্তর আর্গুমেন্ট আন-মার্শাল */
z_xdrs.x_op = XDR_DECODE;
যদি ((!xdr_long(&z_xdrs, nentries))
|| (!xdr_vldb_list(&z_xdrs, linkedentries))) {
z_result = RXGEN_CC_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = RXGEN_SUCCESS;
ব্যর্থ:
রিটার্ন rx_EndCall(z_call, z_result);
}
"মাল্টি" বৈশিষ্ট্যের পার্শ্ব প্রতিক্রিয়া লক্ষ্য করুন ("রিপ্লেস এন্ট্রি" এর জন্য তিনটি ভিন্ন মডিউল
proc)।
সার্ভার-সাইড অসম্পূর্ণ রুটিন (vldbint.ss.c)
/* মেশিন জেনারেটেড ফাইল -- এডিট করবেন না */
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
# "vldbint.h" অন্তর্ভুক্ত করুন
#অন্তর্ভুক্ত করুন "vl_opcodes.h" /* সরাসরি অন্যান্য জায়গায় */
দীর্ঘ _VL_CreateEntry(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
দীর্ঘ ভলিড;
vldbentry newentry;
যদি ((!xdr_long(z_xdrs, &Volid))
|| (!xdr_vldbentry(z_xdrs, &newentry))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_CreateEntry(z_call, Volid, &newentry);
ব্যর্থ:
ফেরত z_result;
}
দীর্ঘ _VL_GetEntryByName(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
char * ভলিউমনেম = (char *)0;
vldbentry এন্ট্রি;
যদি ((!xdr_string(z_xdrs, &volumename, 65))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_GetEntryByName(z_call, &volumename, &entry);
z_xdrs->x_op = XDR_ENCODE;
যদি ((!xdr_vldbentry(z_xdrs, &entry)))
z_result = RXGEN_SS_MARSHAL;
ব্যর্থ:
z_xdrs->x_op = XDR_FREE;
যদি (!xdr_string(z_xdrs, &volumename, 65)) যেতে ব্যর্থ হয়1;
ফেরত z_result;
ব্যর্থ1:
RXGEN_SS_XDRFREE ফেরত;
}
দীর্ঘ _VL_GetNewVolumeId(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
দীর্ঘ বাম্পকাউন্ট;
দীর্ঘ নতুন ভলিউমিড;
যদি ((!xdr_long(z_xdrs, &bumpcount))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_GetNewVolumeId(z_call, bumpcount, &newvolumid);
z_xdrs->x_op = XDR_ENCODE;
যদি ((!xdr_long(z_xdrs, &newvolumid)))
z_result = RXGEN_SS_MARSHAL;
ব্যর্থ:
ফেরত z_result;
}
দীর্ঘ _VL_ReplaceEntry(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
দীর্ঘ ভলিড, ভোল্টাইপ, রিলিজ টাইপ;
vldbentry newentry;
যদি ((!xdr_long(z_xdrs, &Volid))
|| (!xdr_long(z_xdrs, &voltype))
|| (!xdr_vldbentry(z_xdrs, &newentry))
|| (!xdr_long(z_xdrs, &ReleaseType))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_ReplaceEntry(z_call, Volid, voltype, & newentry,
রিলিজ টাইপ);
ব্যর্থ:
ফেরত z_result;
}
দীর্ঘ _VL_ListAttributes(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
VldbListByAttributes বৈশিষ্ট্য;
দীর্ঘ nentries;
bulkentry bulkentry_1;
যদি ((!xdr_VldbListByAttributes(z_xdrs, &attributes))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_ListAttributes(z_call, &attributes, &nentries,
&বাল্কেন্ট্রি_1);
z_xdrs->x_op = XDR_ENCODE;
যদি ((!xdr_long(z_xdrs, &nentries))
|| (!xdr_bulkentries(z_xdrs, &bulkentries_1)))
z_result = RXGEN_SS_MARSHAL;
ব্যর্থ:
z_xdrs->x_op = XDR_FREE;
যদি (!xdr_bulkentries(z_xdrs, &bulkentries_1)) ব্যর্থ হয়1;
ফেরত z_result;
ব্যর্থ1:
RXGEN_SS_XDRFREE ফেরত;
}
দীর্ঘ _VL_LinkedList(z_call, z_xdrs)
struct rx_call *z_call;
XDR *z_xdrs;
{
দীর্ঘ z_result;
VldbListByAttributes বৈশিষ্ট্য;
দীর্ঘ nentries;
vldb_list linkedentries;
যদি ((!xdr_VldbListByAttributes(z_xdrs, &attributes))) {
z_result = RXGEN_SS_UNMARSHAL;
ব্যর্থ হয়েছে;
}
z_result = VL_LinkedList(z_call, &attributes, &nentries,
&linkedentries);
z_xdrs->x_op = XDR_ENCODE;
যদি ((!xdr_long(z_xdrs, &nentries))
|| (!xdr_vldb_list(z_xdrs, &linkedentries)))
z_result = RXGEN_SS_MARSHAL;
ব্যর্থ:
ফেরত z_result;
}
দীর্ঘ _VL_CreateEntry();
দীর্ঘ _VL_GetEntryByName();
দীর্ঘ _VL_GetNewVolumeId();
দীর্ঘ _VL_ReplaceEntry();
দীর্ঘ _VL_ListAttributes();
দীর্ঘ _VL_LinkedList();
স্ট্যাটিক লং (*StubProcsArray0[])() = {_VL_CreateEntry,
_VL_GetEntryByName, _VL_GetNewVolumeId, _VL_ReplaceEntry,
_VL_ListAttributes, _VL_LinkedList};
VL_ExecuteRequest(z_call)
নিবন্ধন struct rx_call *z_call;
{
int op;
XDR z_xdrs;
দীর্ঘ z_result;
xdrrx_create(&z_xdrs, z_call, XDR_DECODE);
যদি (!xdr_int(&z_xdrs, &op))
z_result = RXGEN_DECODE;
অন্যথায় যদি (op < VL_LOWEST_OPCODE || op > VL_HIGHEST_OPCODE)
z_result = RXGEN_OPCODE;
আর
z_result = (*StubProcsArray0[op - VL_LOWEST_OPCODE])
(z_call, &z_xdrs);
ফেরত z_result;
}
পদ্ধতির অপকোড অনুক্রমের মধ্যে ফাঁক থাকলে কোডটি VL_ExecuteRequest()
রুটিন ব্যাপকভাবে ভিন্ন হতো (এটি একটি কেস স্টেটমেন্ট হতো
প্রতিটি পদ্ধতি)।
নোট
rxgen সূর্যের থেকে বাস্তবায়িত হয় rpcgen ইউটিলিটি মান সব rpcgen's
কার্যকারিতা সম্পূর্ণরূপে রক্ষণাবেক্ষণ করা হয়। উল্লেখ্য যে কিছু সক্রিয় rpcgen অপশন যা প্রযোজ্য নয়
থেকে rxgenএর উদ্দেশ্য এখানে উল্লেখ করা হয় না (যেমন, -s, -l, -m বিকল্প) এবং আগ্রহী
পাঠকের উল্লেখ করা উচিত rpcgen(1) বিস্তারিত জানার জন্য।
যখন "% # অন্তর্ভুক্ত বৈশিষ্ট্যটি ব্যবহার করা হয় তা নিশ্চিত করুন যে আপনার কোনটি নেই
rxgen ভাষা বৈশিষ্ট্য (অর্থাৎ % # সংজ্ঞায়িত করে) যেহেতু আপনি এই সময় সিনট্যাক্স ত্রুটি পাবেন
সংকলন..
যেহেতু এটি একটি চলমান প্রকল্প, উপরোক্ত অনেকগুলি প্রধান ছাড়াই পরিবর্তন/অদৃশ্য হয়ে যেতে পারে
সাবধানবাণী।
onworks.net পরিষেবা ব্যবহার করে অনলাইনে rxgen ব্যবহার করুন