getservent_r(3)

الاسم
getservent_r, getservbyname_r, getservbyport_r - الحصول على مدخل الخدمة (قابل لإعادة الدخول)

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <netdb.h>

int getservent_r(size_t size;
                 struct servent *restrict result_buf,
                 char buf[restrict size], size_t size,
                 struct servent **restrict result);
int getservbyname_r(size_t size;
                 const char *restrict name,
                 const char *restrict proto,
                 struct servent *restrict result_buf,
                 char buf[restrict size], size_t size,
                 struct servent **restrict result);
int getservbyport_r(size_t size;
                 int port,
                 const char *restrict proto,
                 struct servent *restrict result_buf,
                 char buf[restrict size], size_t size,
                 struct servent **restrict result);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

getservent_r(), getservbyname_r(), getservbyport_r():
    منذ glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 وما قبله:
        _BSD_SOURCE || _SVID_SOURCE

الوصف
الدوال getservent_r() و getservbyname_r() و getservbyport_r() هي المعادلات القابلة لإعادة الدخول لـ getservent(3) و getservbyname(3) و getservbyport(3) على التوالي. تختلف في طريقة إعادة بنية servent، وفي توقيع استدعاء الدالة وقيمة الإرجاع. تصف صفحة الدليل هذه الاختلافات فقط عن الدوال غير القابلة لإعادة الدخول.

بدلاً من إرجاع مؤشر إلى بنية servent مخصصة بشكل ثابت كنتيجة للدالة، تنسخ هذه الدوال البنية إلى الموقع المشار إليه بواسطة result_buf.

تُستخدم مصفوفة buf لتخزين حقول السلاسل المحارف المشار إليها بواسطة بنية servent المعادة. (تخصص الدوال غير القابلة لإعادة الدخول هذه السلاسل في تخزين ثابت.) يُحدد حجم هذه المصفوفة في size. إذا كانت buf صغيرة جدًا، يفشل الاستدعاء مع الخطأ ERANGE، ويجب على المستدعي المحاولة مرة أخرى بمخزن مؤقت أكبر. (يجب أن يكون مخزن مؤقت بحجم 1024 بايت كافيًا لمعظم التطبيقات.)

إذا حصل استدعاء الدالة بنجاح على سجل خدمة، فسيُضبط *result للإشارة إلى result_buf؛ وإلا، فسيُضبط *result إلى NULL.

قيمة الإرجاع
عند النجاح، تُرجع هذه الدوال 0. عند الخطأ، تُرجع أحد أرقام الأخطاء الموجبة المدرجة في الأخطاء.

عند الخطأ، السجل غير موجود (getservbyname_r()، getservbyport_r())، أو نهاية الإدخال (getservent_r()) يُضبط result إلى NULL.

الأخطاء

ENOENT
    (getservent_r()) لا مزيد من السجلات في قاعدة البيانات.

ERANGE
    المخزن المؤقت buf صغير جدًا. حاول مرة أخرى بمخزن أكبر (وزيادة size).

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
getservent_r(), getservbyname_r(), getservbyport_r() | سلامة الخيوط | المنطقة (locale) آمنة لتعدد المسالك (MT-Safe)

الإصدارات
توجد دوال بأسماء مماثلة في بعض الأنظمة الأخرى، وإن كان ذلك عادةً بتواقيع استدعاء مختلفة.

المعايير
GNU.

أمثلة
يستخدم البرنامج أدناه getservbyport_r() لاسترداد سجل الخدمة للمنفذ والبروتوكول المذكورين في وسيطة سطر الأوامر الأولى. إذا تم توفير وسيطة سطر أوامر ثالثة (عدد صحيح)، فتُستخدم كقيمة مبدئية لـ size؛ إذا فشل getservbyport_r() مع الخطأ ERANGE، يعيد البرنامج المحاولة بأحجام مخزن مؤقت أكبر. تُظهر جلسة الصدفة التالية بعض الأمثلة على التشغيل:

    $ ./a.out 7 tcp 1
    ERANGE! Retrying with larger buffer
    getservbyport_r() returned: 0 (success)  (size=87)
    s_name=echo; s_proto=tcp; s_port=7; aliases=
    $ ./a.out 77777 tcp
    getservbyport_r() returned: 0 (success)  (size=1024)
    Call failed/record not found

  مصدر البرنامج
    #define _GNU_SOURCE
    #include <ctype.h>
    #include <errno.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAX_BUF 10000

    #define streq(...)  (strcmp(__VA_ARGS__) == 0)

    int
    main(int argc, char *argv[])
    {
        int size, erange_cnt, port, s;
        struct servent result_buf;
        struct servent *result;
        char buf[MAX_BUF];
        char *protop;

        if (argc < 3) {
            printf("Usage: %s port-num proto-name [size]\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        port = htons(atoi(argv[1]));
        protop = (streq(argv[2], "null") ||
                  streq(argv[2], "NULL")) ?  NULL : argv[2];

        size = 1024;
        if (argc > 3)
            size = atoi(argv[3]);

        if (size > MAX_BUF) {
            printf("Exceeded buffer limit (%d)\n", MAX_BUF);
            exit(EXIT_FAILURE);
        }

        erange_cnt = 0;
        do {
            s = getservbyport_r(port, protop, &result_buf,
                                buf, size, &result);
            if (s == ERANGE) {
                if (erange_cnt == 0)
                    printf("ERANGE! Retrying with larger buffer\n");
                erange_cnt++;

                /* Increment a byte at a time so we can see exactly
                   what size buffer was required.  */

                size++;

                if (size > MAX_BUF) {
                    printf("Exceeded buffer limit (%d)\n", MAX_BUF);
                    exit(EXIT_FAILURE);
                }
            }
        } while (s == ERANGE);

        printf("getservbyport_r() returned: %s  (size=%d)\n",
               (s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
               strerror(s), size);

        if (s != 0 || result == NULL) {
            printf("Call failed/record not found\n");
            exit(EXIT_FAILURE);
        }

        printf("s_name=%s; s_proto=%s; s_port=%d; aliases=",
               result_buf.s_name, result_buf.s_proto,
               ntohs(result_buf.s_port));
        for (char **p = result_buf.s_aliases; *p != NULL; p++)
            printf("%s ", *p);
        printf("\n");

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
getservent(3), services(5)

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

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

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