resolver(3)

الاسم
res_ninit, res_nquery, res_nsearch, res_nquerydomain, res_nmkquery, res_nsend, res_nclose, res_init, res_query, res_search, res_querydomain, res_mkquery, res_send, dn_comp, dn_expand - إجراءات الحل

المكتبة
مكتبة الحلّال (libresolv، -lresolv)

موجز
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>

struct __res_state;
typedef struct __res_state *res_state;

int res_ninit(res_state statep);

void res_nclose(res_state statep);

int res_nquery(int anslen;
           res_state statep,
           const char *dname,
           int class, int type,
           unsigned char answer[anslen], int anslen);

int res_nsearch(int anslen;
           res_state statep,
           const char *dname,
           int class, int type,
           unsigned char answer[anslen], int anslen);

int res_nquerydomain(int anslen;
           res_state statep,
           const char *name, const char *domain,
           int class, int type,
           unsigned char answer[anslen], int anslen);

int res_nmkquery(int datalen, int buflen;
           res_state statep, int op,
           const char *dname,
           int class, int type,
           const unsigned char data[datalen], int datalen,
           const unsigned char *newrr,
           unsigned char buf[buflen], int buflen);

int res_nsend(int msglen, int anslen;
           res_state statep,
           const unsigned char msg[msglen], int msglen,
           unsigned char answer[anslen], int anslen);

int dn_comp(int length;
           const char *exp_dn,
           unsigned char comp_dn[length], int length,
           unsigned char **dnptrs,
           unsigned char **lastdnptr);

int dn_expand(int length;
           const unsigned char *msg,
           const unsigned char *eomorig,
           const unsigned char *comp_dn,
           char exp_dn[length], int length);

[[deprecated]] extern struct __res_state _res;

[[deprecated]] int res_init(void);

[[deprecated]]
int res_query(int anslen;
           const char *dname,
           int class, int type,
           unsigned char answer[anslen], int anslen);

[[deprecated]]
int res_search(int anslen;
           const char *dname,
           int class, int type,
           unsigned char answer[anslen], int anslen);

[[deprecated]]
int res_querydomain(int anslen;
           const char *name, const char *domain,
           int class, int type,
           unsigned char answer[anslen], int anslen);

[[deprecated]]
int res_mkquery(int datalen, int buflen;
           int op,
           const char *dname,
           int class, int type,
           const unsigned char data[datalen], int datalen,
           const unsigned char *newrr,
           unsigned char buf[buflen], int buflen);

[[deprecated]]
int res_send(int msglen, int anslen;
           const unsigned char msg[msglen], int msglen,
           unsigned char answer[anslen], int anslen);

الوصف
ملاحظة: هذه الصفحة غير مكتملة (دوال الحل المتنوعة المقدمة من glibc غير موصوفة) وربما قديمة.

الدوال الموصوفة أدناه تُجري استعلامات وتُفسر الردود من خوادم أسماء النطاقات على الإنترنت.

تتكون واجهة البرمجة من مجموعة دوال أكثر حداثة وقابلة لإعادة الدخول ومجموعة أقدم من الدوال غير القابلة لإعادة الدخول والتي تم استبدالها. تستخدم واجهات الحل التقليدية مثل res_init() و res_query() بعض الحالة الثابتة (العامة) المخزنة في بنية _res، مما يجعل هذه الدوال غير آمنة للخيوط. قدم BIND 8.2 مجموعة من الواجهات الجديدة res_ninit() و res_nquery() وهكذا، والتي تأخذ res_state كوسيطها الأول، لذا يمكنك استخدام حالة حل خاصة بكل خيط.

تقرأ الدالتان res_ninit() و res_init() ملفات الإعداد (انظر resolv.conf(5)) للحصول على اسم النطاق المبدئي وعنوان (عناوين) خادم الأسماء. إذا لم يُعطَ أي خادم، يُحاول المضيف المحلي. إذا لم يُعطَ أي نطاق، يُستخدم النطاق المرتبط بالمضيف المحلي. يمكن تجاوزه باستخدام متغير البيئة LOCALDOMAIN. تُنفذ res_ninit() أو res_init() عادةً بواسطة أول استدعاء لإحدى الدوال الأخرى. كل استدعاء لـ res_ninit() يتطلب استدعاءً مقابلًا لـ res_nclose() لتحرير الذاكرة المخصصة بواسطة res_ninit() والاستدعاءات اللاحقة لـ res_nquery().

تستعلم الدالتان res_nquery() و res_query() خادم الأسماء عن اسم النطاق المؤهل بالكامل name من type و class المحددين. يُترك الرد في المخزن المؤقت answer بطول anslen المقدم من المستدعي.

تُجري الدالتان res_nsearch() و res_search() استعلامًا وتنتظران الرد مثل res_nquery() و res_query()، ولكن بالإضافة إلى ذلك تنفذان القواعد المبدئية وقواعد البحث التي يتحكم بها RES_DEFNAMES و RES_DNSRCH (انظر وصف خيارات _res أدناه).

تُجري الدالتان res_nquerydomain() و res_querydomain() استعلامًا باستخدام res_nquery()/res_query() على تسلسل name و domain.

الدوال التالية هي إجراءات منخفضة المستوى تُستخدم بواسطة res_nquery()/res_query().

تبني الدالتان res_nmkquery() و res_mkquery() رسالة استعلام في buf بطول buflen لاسم النطاق dname. نوع الاستعلام op هو أحد التالي (عادةً QUERY):

QUERY
    استعلام قياسي.

IQUERY
    استعلام عكسي. أُزيل هذا الخيار في glibc 2.26، لأنه لم يكن مدعومًا من خوادم DNS لفترة طويلة جدًا.

NS_NOTIFY_OP
    إخطار الثانوي بتغيير SOA (بداية السلطة).

newrr غير مستخدم حاليًا.

ترسل الدالتان res_nsend() و res_send() استعلامًا منسقًا مسبقًا مُعطى في msg بطول msglen وتعيدان الرد في answer الذي طوله anslen. ستستدعيان res_ninit()/res_init() إذا لم تكن قد استُدعيت بالفعل.

تضغط الدالة dn_comp() اسم النطاق exp_dn وتخزنه في المخزن المؤقت comp_dn بطول length. يستخدم الضغط مصفوفة من المؤشرات dnptrs إلى الأسماء المضغوطة سابقًا في الرسالة الحالية. يشير المؤشر الأول إلى بداية الرسالة وتنتهي القائمة بـ NULL. يُحدد حد المصفوفة بواسطة lastdnptr. إذا كان dnptr هو NULL، لا تُضغط أسماء النطاقات. إذا كان lastdnptr هو NULL، لا تُحدث قائمة التسميات.

توسع الدالة dn_expand() اسم النطاق المضغوط comp_dn إلى اسم نطاق كامل، يُوضع في المخزن المؤقت exp_dn بحجم length. الاسم المضغوط موجود في رسالة استعلام أو رد، ويشير msg إلى بداية الرسالة.

تستخدم إجراءات الحل معلومات الإعداد والحالة الموجودة في بنية __res_state (إما مُمررة كوسيط statep، أو في المتغير العام _res، في حالة الدوال الأقدم غير القابلة لإعادة الدخول). الحقل الوحيد من هذه البنية الذي يُتعامل معه عادةً من قبل المستخدم هو حقل options. يمكن أن يحتوي هذا الحقل على "أو" أحادي البت للخيارات التالية:

RES_INIT
    صحيح إذا استُدعيت res_ninit() أو res_init().

RES_DEBUG
    اطبع رسائل التصحيح. هذا الخيار متاح فقط إذا بُني glibc مع تمكين التصحيح، وهو ليس المبدئي.

RES_AAONLY (غير مطبق؛ مهمَل في glibc 2.25)
    اقبل الإجابات الموثوقة فقط. تواصل res_send() حتى تجد إجابة موثوقة أو تُرجع خطأ. كان هذا الخيار موجودًا لكنه غير مطبق حتى glibc 2.24؛ منذ glibc 2.25، هو مهمَل، واستخدامه يُنتج تحذيرًا.

RES_USEVC
    استخدم اتصالات TCP للاستعلامات بدلاً من رزم بيانات UDP.

RES_PRIMARY (غير مطبق؛ مهمَل في glibc 2.25)
    استعلم من خادم اسم النطاق الرئيسي فقط. كان هذا الخيار موجودًا لكنه غير مطبق حتى glibc 2.24؛ منذ glibc 2.25، هو مهمَل، واستخدامه يُنتج تحذيرًا.

RES_IGNTC
    تجاهل أخطاء الاقتطاع. لا تُعد المحاولة باستخدام TCP.

RES_RECURSE
    اضبط بت الاستدعاء الذاتي المطلوب في الاستعلامات. يُنفذ الاستدعاء الذاتي بواسطة خادم اسم النطاق، وليس بواسطة res_send(). [مُفعّل مبدئيًا].

RES_DEFNAMES
    إذا ضُبط، ستُلحق res_search() اسم النطاق المبدئي بأسماء المكونات المفردة—أي تلك التي لا تحتوي على نقطة. [مُفعّل مبدئيًا].

RES_STAYOPEN
    يُستخدم مع RES_USEVC لإبقاء اتصال TCP مفتوحًا بين الاستعلامات.

RES_DNSRCH
    إذا ضُبط، ستبحث res_search() عن أسماء المضيفين في النطاق الحالي وفي النطاقات الأم. يُستخدم هذا الخيار بواسطة gethostbyname(3). [مُفعّل مبدئيًا].

RES_INSECURE1
    قبول استجابة من خادم خاطئ. يمكن استخدام هذا لكشف المخاطر الأمنية المحتملة، لكن تحتاج إلى ترجمة glibc مع تفعيل التصحيح واستخدام خيار RES_DEBUG (لأغراض التصحيح فقط).

RES_INSECURE2
    قبول استجابة تحتوي على استعلام خاطئ. يمكن استخدام هذا لكشف المخاطر الأمنية المحتملة، لكن تحتاج إلى ترجمة glibc مع تفعيل التصحيح واستخدام خيار RES_DEBUG (لأغراض التصحيح فقط).

RES_NOALIASES
    تعطيل استخدام متغير البيئة HOSTALIASES.

RES_USE_INET6
    محاولة استعلام AAAA قبل استعلام A داخل دالة gethostbyname(3)، ورسم استجابات IPv4 في "شكل نفق" IPv6 إذا لم تُعثر على سجلات AAAA لكن مجموعة سجلات A موجودة. منذ glibc 2.25، هذا الخيار مهمل، واستخدامه يولّد تحذيرًا؛ يجب على التطبيقات استخدام getaddrinfo(3) بدلاً من gethostbyname(3).

RES_ROTATE
    يسبب اختيارًا دائريًا لخوادم الأسماء من بين تلك المدرجة. هذا له تأثير توزيع حمل الاستعلام بين جميع الخوادم المدرجة، بدلاً من أن يحاول جميع العملاء الخادم الأول المدرج أولاً في كل مرة.

RES_NOCHECKNAME (غير مطبق؛ مهمل في glibc 2.25)
    تعطيل الفحص الحديث لـ BIND لأسماء المضيفات الواردة وأسماء البريد من الأحرف غير الصالحة مثل الشرطة السفلية (_)، أو غير ASCII، أو أحرف التحكم. هذا الخيار كان موجودًا حتى glibc 2.24؛ منذ glibc 2.25، هو مهمل، واستخدامه يولّد تحذيرًا.

RES_KEEPTSIG (غير مطبق؛ مهمل في glibc 2.25)
    لا تُزل سجلات TSIG. هذا الخيار كان موجودًا لكن غير مطبق حتى glibc 2.24؛ منذ glibc 2.25، هو مهمل، واستخدامه يولّد تحذيرًا.

RES_BLAST (غير مطبق؛ مهمل في glibc 2.25)
    إرسال كل استعلام بشكل متزامن ومتكرر إلى جميع الخوادم. هذا الخيار كان موجودًا لكن غير مطبق حتى glibc 2.24؛ منذ glibc 2.25، هو مهمل، واستخدامه يولّد تحذيرًا.

RES_USEBSTRING (glibc 2.3.4 إلى glibc 2.24)
    إجراء عمليات بحث عكسية لـ IPv6 باستخدام تنسيق التسمية الثنائية الموصوف في RFC 2673؛ إذا لم يُضبط هذا الخيار (وهو المبدئي)، يُستخدم تنسيق nibble. أُزيل هذا الخيار في glibc 2.25، لأنه اعتمد على امتداد DNS غير متوافق مع الإصدارات السابقة ولم يُنشر أبدًا على الإنترنت.

RES_NOIP6DOTINT (glibc 2.24 وما قبله)
    استخدام منطقة ip6.arpa في البحث العكسي لـ IPv6 بدلاً من ip6.int، الذي هو مهمل منذ glibc 2.3.4. هذا الخيار موجود حتى glibc 2.24 بما في ذلك، حيث هو مفعّل مبدئيًا. في glibc 2.25، أُزيل هذا الخيار.

RES_USE_EDNS0 (منذ glibc 2.6)
    يفعّل دعم امتدادات DNS (EDNS0) الموصوفة في RFC 2671.

RES_SNGLKUP (منذ glibc 2.10)
    مبدئيًا، يُجري glibc عمليات بحث IPv4 و IPv6 بالتوازي منذ glibc 2.9. بعض خوادم DNS للأجهزة لا تستطيع معالجة هذه الاستعلامات بشكل صحيح وتُسبب انتهاء مهلة الطلبات. هذا الخيار يُعطّل السلوك ويجعل glibc يُنفّذ طلبات IPv6 و IPv4 بالتسلسل (على حساب بعض التباطؤ في عملية الحل).

RES_SNGLKUPREOP
    عند تفعيل خيار RES_SNGLKUP، يُفتح مقبس جديد لكل طلب.

RES_USE_DNSSEC
    استخدم DNSSEC مع بت OK في سجل OPT. هذا الخيار يستلزم RES_USE_EDNS0.

RES_NOTLDQUERY
    لا تبحث عن اسم غير مؤهل كنطاق أعلى مستوى (TLD).

RES_DEFAULT
    خيار مبدئي يستلزم: RES_RECURSE و RES_DEFNAMES و RES_DNSRCH و RES_NOIP6DOTINT.

قيمة الإرجاع
الدالتان res_ninit() و res_init() تُرجعان 0 عند النجاح، أو -1 إذا حدث خطأ.

الدوال res_nquery() و res_query() و res_nsearch() و res_search() و res_nquerydomain() و res_querydomain() و res_nmkquery() و res_mkquery() و res_nsend() و res_send() تُرجع طول الاستجابة، أو -1 إذا حدث خطأ.

الدالتان dn_comp() و dn_expand() تُرجعان طول الاسم المضغوط، أو -1 إذا حدث خطأ.

في حالة إرجاع خطأ من res_nquery() أو res_query() أو res_nsearch() أو res_search() أو res_nquerydomain() أو res_querydomain()، يمكن الرجوع إلى المتغير العام h_errno (انظر gethostbyname(3)) لتحديد الخطأ.

الملفات

/etc/resolv.conf
    ملف تضبيط الحلّال (resolver)

/etc/host.conf
    ملف تضبيط الحلّال (resolver)

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
res_ninit(), res_nclose(), res_nquery(), res_nsearch(), res_nquerydomain(), res_nsend() | سلامة الخيوط | المنطقة (locale) آمنة لتعدد المسالك (MT-Safe)
res_nmkquery(), dn_comp(), dn_expand() | سلامة الخيوط | MT-Safe

المعايير
لا شيء.

التاريخ
4.3BSD.

انظر أيضًا
gethostbyname(3) و resolv.conf(5) و resolver(5) و hostname(7) و named(8)

ملف المصدر لمكتبة C لجنو هو resolv/README.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.