حفترض ان الي بيقرأ الدرس عارف وفاهم كويس معني التصاريح في اللينكس وفاهم التعامل مع الملفات
الموضوع بيتكلم عن حاجه بسيطه جدا بنتعرضلها كلنا , التعامل مع الملفات وانشاء ملفات جديده
ده مش درس مطول عن التعامل مع الملفات انا هتكلم عن نطقه واحده الي هي التصاريح خلال انشاء الملف
جرب الكود الاتي وبعديها نفذ الامرين دول وشوف الناتج
#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]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 الخاصه بينا
#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 بقي شكله ايه