setreuid(2)

الاسم
setreuid, setregid - تعيين معرف المستخدم أو المجموعة الحقيقي و/أو الفعّال

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

موجز
#include <unistd.h>

int setreuid(uid_t ruid, uid_t euid);
int setregid(gid_t rgid, gid_t egid);

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

setreuid(), setregid():
    _XOPEN_SOURCE >= 500
        || /* منذ glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _BSD_SOURCE

الوصف
تضبط setreuid() معرفي المستخدم الحقيقي والفعّال للعملية المستدعية.

تزويد القيمة -1 لأي من معرف المستخدم الحقيقي أو الفعّال يُجبر النظام على ترك ذلك المعرف دون تغيير.

لا يُسمح للعمليات غير المميزة إلا بتعيين معرف المستخدم الفعّال إلى معرف المستخدم الحقيقي، أو معرف المستخدم الفعّال، أو معرف المستخدم المُعيَّن المحفوظ.

لا يُسمح للمستخدمين غير المميزين إلا بتعيين معرف المستخدم الحقيقي إلى معرف المستخدم الحقيقي أو معرف المستخدم الفعّال.

إذا تم تعيين معرف المستخدم الحقيقي (أي أن ruid ليس -1) أو تم تعيين معرف المستخدم الفعّال إلى قيمة لا تساوي معرف المستخدم الحقيقي السابق، فسيتم تعيين معرف المستخدم المُعيَّن المحفوظ إلى معرف المستخدم الفعّال الجديد.

وبالمثل تمامًا، تضبط setregid() معرفي المجموعة الحقيقي والفعّال للعملية المستدعية، وينطبق كل ما سبق مع استبدال "مستخدم" بـ "مجموعة".

قيمة الإرجاع
عند النجاح، يُعاد الصفر. وعند حدوث خطأ، يُعاد الرقم -1، ويُضبط errno للإشارة إلى الخطأ.

ملاحظة: هناك حالات قد يفشل فيها setreuid() حتى عندما يكون UID المستدعي 0؛ إن إهمال التحقق من إرجاع الفشل من setreuid() هو خطأ أمني جسيم.

الأخطاء

EAGAIN
    كان الاستدعاء سيغير معرف المستخدم الحقيقي (UID) للمستدعي (أي أن ruid لا يطابق معرف المستخدم الحقيقي للمستدعي)، ولكن حدث فشل مؤقت في تخصيص هياكل بيانات النواة اللازمة.

EAGAIN
    لا يتطابق ruid مع معرف المستخدم الحقيقي لـ المستدعِي وهذا الاستدعاء سيجعل عدد العمليات التابعة لمعرف المستخدم الحقيقي ruid يتجاوز حد مورد RLIMIT_NPROC الخاص بـ المستدعِي. منذ لينكس 3.1، لم تعد حالة الخطأ هذه تحدث (لكن يجب على التطبيقات القوية التحقق من هذا الخطأ)؛ انظر وصف EAGAIN في execve(2).

EINVAL
    واحد أو أكثر من معرفات المستخدم أو المجموعة المستهدفة غير صالح في فضاء أسماء المستخدم هذا.

EPERM
    العملية المستدعية ليست مميزة (على لينكس، لا تملك الإمكانية اللازمة في مساحة المستخدم الخاصة بها: CAP_SETUID في حالة setreuid()، أو CAP_SETGID في حالة setregid()) وتم تحديد تغيير غير (i) تبديل معرف المستخدم (المجموعة) الفعّال مع معرف المستخدم (المجموعة) الحقيقي، أو (ii) تعيين أحدهما إلى قيمة الآخر أو (iii) تعيين معرف المستخدم (المجموعة) الفعّال إلى قيمة معرف المستخدم المُعيَّن المحفوظ (معرف المجموعة المُعيَّن المحفوظ).

الإصدارات
لا يحدد POSIX.1 جميع تغييرات UID التي يسمح بها لينكس لعملية غير مميزة. بالنسبة لـ setreuid()، يمكن جعل معرف المستخدم الفعّال مساويًا لمعرف المستخدم الحقيقي أو معرف المستخدم المُعيَّن المحفوظ، وغير محدد ما إذا كانت العمليات غير المميزة قد تضبط معرف المستخدم الحقيقي إلى معرف المستخدم الحقيقي، أو معرف المستخدم الفعّال، أو معرف المستخدم المُعيَّن المحفوظ. بالنسبة لـ setregid()، يمكن تغيير معرف المجموعة الحقيقي إلى قيمة معرف المجموعة المُعيَّن المحفوظ، ويمكن تغيير معرف المجموعة الفعّال إلى قيمة معرف المجموعة الحقيقي أو معرف المجموعة المُعيَّن المحفوظ. تختلف التفاصيل الدقيقة لتغييرات المعرف المسموح بها عبر التطبيقات.

لا يقدم POSIX.1 أي تحديد حول تأثير هذه الاستدعاءات على معرف المستخدم المُعيَّن المحفوظ ومعرف المجموعة المُعيَّن المحفوظ.

المعايير
POSIX.1-2024.

التاريخ
POSIX.1-2001, 4.3BSD (ظهر لأول مرة في 4.2BSD).

تعيين معرف المستخدم (المجموعة) الفعّال إلى معرف المستخدم المُعيَّن المحفوظ (معرف المجموعة المُعيَّن المحفوظ) ممكن منذ لينكس 1.1.37 (1.1.38).

استدعاءات النظام الأصلية setreuid() و setregid() في لينكس دعمت فقط معرفات المستخدم والمجموعة ذات 16 بت. لاحقًا، أضاف لينكس 2.4 setreuid32() و setregid32()، لدعم معرفات 32 بت. تتعامل دوال التغليف setreuid() و setregid() في glibc بشفافية مع الاختلافات عبر إصدارات النواة.

  الاختلافات بين مكتبة C والنواة
على مستوى النواة، معرفات المستخدم والمجموعة هي سمة لكل خيط. ومع ذلك، يتطلب POSIX أن تشترك جميع الخيوط في العملية في نفس بيانات الاعتماد. تعالج تطبيق الخيوط NPTL متطلبات POSIX من خلال توفير دوال تغليف لاستدعاءات النظام المختلفة التي تغير UIDs و GIDs للعملية. تستخدم دوال التغليف هذه (بما في ذلك تلك الخاصة بـ setreuid() و setregid()) تقنية قائمة على الإشارات لضمان أنه عندما يغير خيط واحد بيانات اعتماده، فإن جميع الخيوط الأخرى في العملية تغير أيضًا بيانات اعتمادها. للتفاصيل، انظر nptl(7).

انظر أيضًا
getgid(2), getuid(2), seteuid(2), setgid(2), setresuid(2), setuid(2), capabilities(7), credentials(7), user_namespaces(7)

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

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

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