getgrouplist(3)

الاسم
getgrouplist - الحصول على قائمة المجموعات التي ينتمي إليها مستخدم

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

موجز
#include <grp.h>

int getgrouplist(const char *user, gid_t group,
                 gid_t *groups, int *ngroups);

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

getgrouplist():
    منذ glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 وما قبله:
        _BSD_SOURCE

الوصف
تفحص الدالة getgrouplist() قاعدة بيانات المجموعات (انظر group(5)) للحصول على قائمة المجموعات التي ينتمي إليها user. يُعاد حتى *ngroups من هذه المجموعات في المصفوفة groups.

إذا لم يكن ضمن المجموعات المعرفة لـ user في قاعدة بيانات المجموعات، فسيُدرج group في قائمة المجموعات التي تُرجعها getgrouplist()؛ يُحدد هذا المعامل عادةً كمعرف المجموعة من سجل كلمة السر لـ user.

المعامل ngroups هو معامل قيمة-نتيجة: عند الإرجاع يحتوي دائمًا على عدد المجموعات التي وُجدت لـ user، بما في ذلك group؛ قد تكون هذه القيمة أكبر من عدد المجموعات المخزنة في groups.

قيمة الإرجاع
إذا كان عدد المجموعات التي user عضو فيها أقل من أو يساوي *ngroups، فتُعاد القيمة *ngroups.

إذا كان المستخدم عضوًا في أكثر من *ngroups مجموعة، فتُرجع getgrouplist() -1. في هذه الحالة، يمكن استخدام القيمة المُعادة في *ngroups لتغيير حجم المخزن المُمرر إلى استدعاء لاحق لـ getgrouplist().

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

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

التاريخ
glibc 2.2.4.

العلل
قبل glibc 2.3.3، يحتوي تنفيذ هذه الدالة على خطأ تجاوز المخزن: تُعيد القائمة الكاملة للمجموعات لـ user في المصفوفة groups، حتى عندما يتجاوز عدد المجموعات *ngroups.

أمثلة
يعرض البرنامج أدناه قائمة المجموعات للمستخدم المُسمى في وسيط سطر الأوامر الأول. يحدد وسيط سطر الأوامر الثاني قيمة ngroups التي ستُزود لـ getgrouplist(). تُظهر جلسة الصدفة التالية أمثلة على استخدام هذا البرنامج:

    $ ./a.out cecilia 0
    getgrouplist() returned -1
    ngroups = 3
    $ ./a.out cecilia 3
    ngroups = 3
    16 (dialout)
    33 (video)
    100 (users)

  مصدر البرنامج
    #include <errno.h>
    #include <grp.h>
    #include <pwd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(int argc, char *argv[])
    {
        int            ngroups;
        gid_t          *groups;
        struct group   *gr;
        struct passwd  *pw;

        if (argc != 3) {
            fprintf(stderr, "Usage: %s <user> <ngroups>\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        ngroups = atoi(argv[2]);

        groups = malloc(sizeof(*groups) * ngroups);
        if (groups == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }

        /* Fetch passwd structure (contains first group ID for user).  */

        errno = 0;
        pw = getpwnam(argv[1]);
        if (pw == NULL) {
            if (errno)
                perror("getpwnam");
            else
                fprintf(stderr, "no such user\n");
            exit(EXIT_FAILURE);
        }

        /* Retrieve group list.  */

        if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) {
            fprintf(stderr, "getgrouplist() returned -1\n");
            fprintf(stderr, "ngroups = %d\n", ngroups);
            exit(EXIT_FAILURE);
        }

        /* Display list of retrieved groups, along with group names.  */

        fprintf(stderr, "ngroups = %d\n", ngroups);
        for (int j = 0; j < ngroups; j++) {
            printf("%d", groups[j]);
            gr = getgrgid(groups[j]);
            if (gr != NULL)
                printf(" (%s)", gr->gr_name);
            printf("\n");
        }

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
getgroups(2), setgroups(2), getgrent(3), group_member(3), group(5), passwd(5)

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

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

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