chmod(2)

الاسم
chmod, fchmod, fchmodat - تغيير أذونات ملف

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

موجز
#include <sys/stat.h>

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

#include <fcntl.h>           /* تعريف ثوابت AT_* */
#include <sys/stat.h>

int fchmodat(int dirfd, const char *path, mode_t mode, int flags);

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

fchmod():
    منذ glibc 2.24:
        _POSIX_C_SOURCE >= 199309L
    glibc 2.19 إلى glibc 2.23
        _POSIX_C_SOURCE
    glibc 2.16 إلى glibc 2.19:
        _BSD_SOURCE || _POSIX_C_SOURCE
    glibc 2.12 إلى glibc 2.16:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500
            || _POSIX_C_SOURCE >= 200809L
    glibc 2.11 وما قبله:
        _BSD_SOURCE || _XOPEN_SOURCE >= 500

fchmodat():
    منذ glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    قبل glibc 2.10:
        _ATFILE_SOURCE

الوصف
تغير استدعاءات النظام chmod() و fchmod() بتات وضع الملف. (يتكون وضع الملف من بتات أذونات الملف بالإضافة إلى بتات set-user-ID و set-group-ID و sticky.) تختلف استدعاءات النظام هذه فقط في كيفية تحديد الملف:

•   يغير chmod() وضع الملف المحدد الذي يُعطى اسم مساره في path، والذي يُفك مرجعه إذا كان رابطًا رمزيًا.

•   يغير fchmod() وضع الملف المشار إليه بواصف الملف المفتوح fd.

يُحدد وضع الملف الجديد في mode، وهو قناع بتات يُنشأ بجمع صفر أو أكثر مما يلي بعملية OR:

S_ISUID  (04000)
    set-user-ID (تعيين معرف المستخدم الفعّال للعملية عند execve(2))

S_ISGID  (02000)
    set-group-ID (تعيين معرف المجموعة الفعّال للعملية عند execve(2); القفل الإلزامي، كما هو موصوف في fcntl(2); أخذ مجموعة ملف جديد من الدليل الأب، كما هو موصوف في chown(2) و mkdir(2))

S_ISVTX  (01000)
    البت اللاصق (علم الحذف المقيد، كما هو موصوف في unlink(2))

S_IRUSR  (00400)
    قراءة من المالك

S_IWUSR  (00200)
    كتابة من المالك

S_IXUSR  (00100)
    تنفيذ/بحث من المالك (ينطبق "بحث" على الأدلة، ويعني أنه يمكن الوصول إلى الإدخالات داخل الدليل)

S_IRGRP  (00040)
    قراءة من المجموعة

S_IWGRP  (00020)
    كتابة من المجموعة

S_IXGRP  (00010)
    تنفيذ/بحث من المجموعة

S_IROTH  (00004)
    قراءة من قبل الآخرين

S_IWOTH  (00002)
    كتابة من قبل الآخرين

S_IXOTH  (00001)
    تنفيذ/بحث من قبل الآخرين

يجب أن يتطابق UID الفعال للعملية المستدعية مع مالك الملف، أو يجب أن تكون العملية مميزة (لينكس: يجب أن تمتلك القدرة CAP_FOWNER).

إذا لم تكن العملية المستدعية مميزة (لينكس: لا تمتلك القدرة CAP_FSETID)، ولم تتطابق مجموعة الملف مع معرف المجموعة الفعال للعملية أو أحد معرفات مجموعاتها الإضافية، فسيتم إيقاف بت S_ISGID، لكن هذا لن يتسبب في إرجاع خطأ.

كإجراء أمني، اعتمادًا على نظام الملفات، قد يتم إيقاف بتات تنفيذ set-user-ID و set-group-ID إذا تمت كتابة ملف. (في لينكس، يحدث هذا إذا لم تمتلك عملية الكتابة القدرة CAP_FSETID.) في بعض أنظمة الملفات، يمكن للمستخدم الفائق فقط تعيين البت اللاصق، والذي قد يكون له معنى خاص. بالنسبة للبت اللاصق، وبتات set-user-ID و set-group-ID على الدلائل، انظر inode(7).

في أنظمة ملفات NFS، سيؤثر تقييد الأذونات فورًا على الملفات المفتوحة بالفعل، لأن التحكم في الوصول يتم على الخادم، لكن الملفات المفتوحة تُحتفظ بها من قبل العميل. قد يتأخر توسيع الأذونات للعملاء الآخرين إذا تم تمكين التخزين المؤقت للسمات عليهم.

  fchmodat()
تعمل استدعاء النظام fchmodat() بنفس طريقة chmod() تمامًا، باستثناء الاختلافات الموصوفة هنا.

إذا كان path نسبيًا، فسيتم تفسيره نسبة إلى الدليل المشار إليه بواسطة واصف الملف dirfd (بدلاً من نسبته إلى دليل العمل الحالي للعملية المستدعية، كما تفعل chmod() لمسار نسبي).

إذا كان path نسبيًا وكان dirfd هو القيمة الخاصة AT_FDCWD، فسيتم تفسير path نسبة إلى دليل العمل الحالي للعملية المستدعية (مثل chmod()).

إذا كان المسار path مطلقاً، فُيتجاهل dirfd.

يمكن أن يكون flags إما 0، أو يتضمن الأعلام التالية:

AT_EMPTY_PATH (منذ لينكس 6.6)
    إذا كان path سلسلة فارغة، فسيُعمل على الملف الذي يشير إليه dirfd (والذي ربما تم الحصول عليه باستخدام الراية O_PATH في open(2)). في هذه الحالة، يمكن لـ dirfd أن يشير إلى أي نوع من الملفات، وليس فقط المجلدات. وإذا كان dirfd هو AT_FDCWD، فسيُنادى على مجلد العمل الحالي. هذه الراية خاصة بلينكس؛ عرّف _GNU_SOURCE للحصول على تعريفها.

AT_SYMLINK_NOFOLLOW
    إذا كان path رابطًا رمزيًا، لا تقم بإلغاء الإشارة إليه: بدلاً من ذلك، تعامل مع الرابط نفسه.

انظر openat(2) لشرح الحاجة إلى fchmodat().

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

الأخطاء
اعتماداً على نظام الملفات، قد تُرَد أخطاء أخرى غير تلك المذكورة أدناه.

الأخطاء الأكثر عمومية لـ chmod() مدرجة أدناه:

EACCES
    أُذونات البحث مرفوضة في أحد مكونات بادئة المسار. (انظر أيضًا path_resolution(7).)

EBADF
    (fchmod()) واصف الملف fd غير صالح.

EBADF
    (fchmodat()) path نسبي لكن dirfd ليس AT_FDCWD ولا واصف ملف صالح.

EFAULT
    المسار path يشير إلى خارج مساحة العناوين التي يمكن الوصول إليها.

EINVAL
    (fchmodat()) علم غير صالح محدد في flags.

EIO حدث خطأ إدخال/إخراج.

ELOOP
    وُجد عدد كبير جدًا من الوصلات الرمزية أثناء تحليل path.

ENAMETOOLONG
    المسار path طويل جداً.

ENOENT
    الملف غير موجود.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

ENOTDIR
    أحد مكونات بادئة المسار ليس دليلاً.

ENOTDIR
    (fchmodat()) path نسبي و dirfd هو واصف ملف يشير إلى ملف غير دليل.

ENOTSUP
    (fchmodat()) flags حدد AT_SYMLINK_NOFOLLOW، وهو غير مدعوم.

EPERM
    لا يتطابق UID الفعال مع مالك الملف، والعملية ليست مميزة (لينكس: لا تمتلك القدرة CAP_FOWNER).

EPERM
    الملف معلم بأنه غير قابل للتغيير أو للإلحاق فقط. (انظر FS_IOC_SETFLAGS(2const).)

EROFS
    الملف المسمى يقع في نظام ملفات للقراءة فقط.

الإصدارات

  الاختلافات بين مكتبة C والنواة
تنفذ دالة الغلاف fchmodat() لمكتبة GNU C الواجهة المحددة بواسطة POSIX الموصوفة في هذه الصفحة. تختلف هذه الواجهة عن استدعاء النظام الأساسي للينكس، الذي لا يحتوي على وسيطة flags.

  ملاحظات glibc
على النوى الأقدم حيث fchmodat() غير متوفرة، تتراجع دالة غلاف glibc إلى استخدام chmod(). عندما يكون path اسم مسار نسبي، تقوم glibc ببناء اسم مسار بناءً على الرابط الرمزي في /proc/self/fd الذي يتوافق مع وسيطة dirfd.

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

التاريخ

chmod()
    SVr4, POSIX.1-1988, 4.4BSD.

fchmod()
    SVr4, 4.4BSD, SUSv1, POSIX.1-1996.

fchmodat()
    POSIX.1-2008. لينكس 2.6.16،‏ glibc 2.4.

AT_SYMLINK_NOFOLLOW
    POSIX.1-2008، glibc 2.32، لينكس 6.5.

انظر أيضًا
chmod(1)، chown(2)، execve(2)، open(2)، stat(2)، inode(7)، path_resolution(7)، symlink(7)

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

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

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