Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: open and umask permission | اعطاء التصاريح الصحيحه في انشاء الملفات  (Read 996 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 214
  • Why So serious ?
    • View Profile
    • My blog | This fucking story
    • Email

حفترض ان الي بيقرأ الدرس عارف وفاهم كويس معني التصاريح في اللينكس وفاهم التعامل مع الملفات
الموضوع بيتكلم عن حاجه بسيطه جدا بنتعرضلها كلنا , التعامل مع الملفات وانشاء ملفات جديده
ده مش درس مطول عن التعامل مع الملفات انا هتكلم عن نطقه واحده الي هي التصاريح خلال انشاء الملف
جرب الكود الاتي وبعديها نفذ الامرين دول وشوف الناتج

Code: ($2) [Select]
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc , char **argv)
{
        char *file_name = "test_default";
        int fd;


        if(argv[1])
                file_name = argv[1];

        fd = open(file_name , O_RDWR | O_CREAT | O_TRUNC | O_EXCL,
                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );

        if(fd == -1)
                perror("open");
        close(fd);


        return 0;
}

Code: ($2) [Select]
[code]ls -al test_default
rm test_default
[/code]
لو ملاحظ انا اديت تصريح قرايه وكتابه لكل الناس
لكن النتيجه معاكسه تماما للواقع والمطلوب !!
النتجيه بنسبة 90% من الناس هتظهر كده
-rw-r--r-- 1 root root 0 2008-12-11 14:16 test_default
ايه السبب ؟ رغم انك عامل التصريح قرائه وكتابه لكل الناس سواء ان كان صاحب الملف او مجموعة صاحب الملف او باقي الناس ! انت طلبت كده فعلا في ال open call
السبب بسيط خالص وهو ال masking ال masking دوت عباره عن octal value بتكون موجوده في السيستيم بتاعك ووجودها لسبب وحيد فقط انها تعمل limit علي ال permissions الي انت بتطلبها وده لاسباب امنيه اكيد
وانت بتمرر الvalues الي انت طلبتها في ال mode argument في open الي بيحصل الاتي
values & ~mask
بيتم عمل turn off الكل ال bytes الموجوده في ال mask
ولما بيتكتب الملف علي الديسك الي بيتم عمل mask لل permission عشان يتعمل limit لل permission الي انت طلبتها
كمثال بسيط علي ذلك من قلب ال man pages الخاصه ب umask
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH & ~ 022 = 0644 = -rw-r--r--
وبالتالي التصريح بيظهر ذي مانت شفت
الحل بسيط وسلسل جدا وهو استخدام umask() عشان نقدر نعدل في ال mask bits الخاصه بينا


Code: ($2) [Select]
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc , char **argv)
{
        char *file_name = "test_default";
        int fd;

        mode_t mask = umask(0000);

        if(argv[1])
                file_name = argv[1];

        fd = open(file_name , O_RDWR | O_CREAT | O_TRUNC | O_EXCL,
                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );

        if(fd == -1)
                perror("open");
        close(fd);

        mask = umask(mask);
        return 0;
}
[/rtl]
لاحظ  استخدام umask في تعديل وارجاع ال mask value
ودلوقتي اعمل list للملف وشوف ال permission بقي شكله ايه
Logged