getgrent_r(3)

الاسم
getgrent_r, fgetgrent_r - الحصول على مدخل ملف المجموعة بشكل قابل لإعادة الدخول

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

موجز
#include <grp.h>

int getgrent_r(size_t size;
               struct group *restrict gbuf,
               char buf[restrict size], size_t size,
               struct group **restrict gbufp);
int fgetgrent_r(size_t size;
               FILE *restrict stream, struct group *restrict gbuf,
               char buf[restrict size], size_t size,
               struct group **restrict gbufp);

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

getgrent_r():
    _GNU_SOURCE

fgetgrent_r():
    منذ glibc 2.19:
        _DEFAULT_SOURCE
    في glibc 2.19 وما قبله:
        _SVID_SOURCE

الوصف
الدالتان getgrent_r() و fgetgrent_r() هما النسختان القابلتان لإعادة الدخول من getgrent(3) و fgetgrent(3). الأولى تقرأ مدخل المجموعة التالي من الدفق المُهيأ بواسطة setgrent(3). الثانية تقرأ مدخل المجموعة التالي من stream.

عُرف هيكل group في <grp.h> كالتالي:

    struct group {
        char   *gr_name;        /* اسم المجموعة */
        char   *gr_passwd;      /* كلمة سر المجموعة */
        gid_t   gr_gid;         /* معرف المجموعة */
        char  **gr_mem;         /* مصفوفة منتهية بـ NULL من المؤشرات
                                   إلى أسماء أعضاء المجموعة */
    };

لمزيد من المعلومات حول حقول هذا الهيكل، راجع group(5).

الدوال غير القابلة لإعادة الدخول تُرجع مؤشرًا إلى تخزين ثابت، حيث يحتوي هذا التخزين الثابت على مؤشرات إضافية لاسم المجموعة، كلمة السر، والأعضاء. الدوال القابلة لإعادة الدخول الموصوفة هنا تُرجع كل ذلك في مخازن مؤقتة يُوفرها المُستدعي. أولاً هناك المخزن المؤقت gbuf الذي يمكنه حمل struct group. ثم المخزن المؤقت buf بحجم size الذي يمكنه حمل سلاسل محارف إضافية. نتيجة هذه الدوال، struct group المقروء من الدفق، تُخزن في المخزن المؤقت المُوفر *gbuf، ويُعاد مؤشر إلى هذا struct group في *gbufp.

قيمة الإرجاع
عند النجاح، تُرجع هذه الدوال 0 ويكون *gbufp مؤشرًا إلى struct group. عند الخطأ، تُرجع هذه الدوال قيمة خطأ ويكون *gbufp NULL.

الأخطاء

ENOENT
    لا يوجد مزيد من المدخلات.

ERANGE
    مساحة المخزن المؤقت (buffer) المزودة غير كافية. حاول ثانية بمخزن أكبر.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
getgrent_r() | سلامة الخيوط | غير آمن للمسارات المتعددة (MT-Unsafe) سباق:grent locale
fgetgrent_r() | سلامة الخيوط | MT-Safe

في الجدول أعلاه، grent في race:grent يُشير إلى أنه إذا استُخدمت أي من الدوال setgrent(3)، getgrent(3)، endgrent(3)، أو getgrent_r() بالتوازي في خيوط مختلفة من برنامج، فقد تحدث سباقات بيانات.

الإصدارات
أنظمة أخرى تستخدم النموذج الأولي

    struct group *getgrent_r(struct group *grp, char buf[.size],
                             int size);

أو، بشكل أفضل،

    int getgrent_r(struct group *grp, char buf[.size], int size,
                   FILE **gr_fp);

المعايير
GNU.

التاريخ
أُنجزت هذه الدوال بأسلوب يشبه نسخة POSIX من دوال مثل getpwnam_r(3).

ملاحظات
الدالة getgrent_r() ليست قابلة لإعادة الدخول حقًا لأنها تشارك موضع القراءة في الدفق مع جميع الخيوط الأخرى.

أمثلة
    #define _GNU_SOURCE
    #include <grp.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define BUFLEN 4096

    int
    main(void)
    {
        struct group grp;
        struct group *grpp;
        char buf[BUFLEN];
        int i;

        setgrent();
        for (;;) {
            i = getgrent_r(&grp, buf, sizeof(buf), &grpp);
            if (i)
                break;
            printf("%s (%jd):", grpp->gr_name, (intmax_t) grpp->gr_gid);
            for (size_t j = 0; ; j++) {
                if (grpp->gr_mem[j] == NULL)
                    break;
                printf(" %s", grpp->gr_mem[j]);
            }
            printf("\n");
        }
        endgrent();
        exit(EXIT_SUCCESS);
    }

انظر أيضًا
fgetgrent(3), getgrent(3), getgrgid(3), getgrnam(3), putgrent(3), group(5)

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

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

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