एक फ़ाइल(UNIX/C) के विस्तारित विशेषताओं को कैसे प्राप्त करें?




osx permissions (2)

ऐप्पल द्वारा दिए गए ls के आधिकारिक कार्यान्वयन से मैं कुछ कोड काट रहा हूं, जिसे आप यहां मिलेगा। कोड लंबा है इसलिए सीएमडी + एफ और "प्रिंट्लॉन्ग" के लिए खोज करें।

#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>
#include <sys/acl.h>
#include <stdio.h>

int main () {
    acl_t acl = NULL;
    acl_entry_t dummy;
    ssize_t xattr = 0;
    char str[10];
    char * filename = "/Users/john/desktop/mutations.txt";

    acl = acl_get_link_np(filename, ACL_TYPE_EXTENDED);
    if (acl && acl_get_entry(acl, ACL_FIRST_ENTRY, &dummy) == -1) {
        acl_free(acl);
        acl = NULL;
    }
    xattr = listxattr(filename, NULL, 0, XATTR_NOFOLLOW);
    if (xattr < 0)
        xattr = 0;

    str[1] = '\0';
    if (xattr > 0)
        str[0] = '@';
    else if (acl != NULL)
        str[0] = '+';
    else
        str[0] = ' ';

    printf("%s\n", str);
 }

इस्तेमाल की गई फ़ाइल के आधार पर, आउटपुट एक रिक्त, @, या + वैसे ही होगा जैसा ls -l इसे प्रदर्शित करता है। उम्मीद है की यह मदद करेगा !

जब मैं कमांड लाइन में ls -l टाइप करता हूं, तो कभी-कभी किसी @ या + चिह्न फ़ाइल अनुमतियों (बीटीडब्ल्यू, मैं ओएस एक्स पर हूं) के साथ आता है, जैसा कि नीचे दिखाया गया है:

-rw-r[email protected]  1 john  staff      6731 Sep 28 01:10 mutations.txt
drwxr-xr-x+ 71 john  staff      2414 Mar 25 18:16 ..

मुझे पता है कि stat संरचना का उपयोग करने की अनुमति बिट्स को कैसे प्राप्त करना है, लेकिन मुझे नहीं लगता कि इन विस्तारित अनुमति मान हैं। क्या कोई मुझे सी या पॉसिक्स एपीआई के माध्यम से इन मूल्यों को प्राप्त करने के तरीके के रूप में सही दिशा में बता सकता है?

संपादित करें :

मैंने निम्न प्रयास किए:

#include <sys/types.h>
#include <sys/xattr.h>
#include <sys/types.h>

int main () {
    char  l[1024];
    listxattr("/Users/john/desktop/mutations.txt", l, 1024,  XATTR_SHOWCOMPRESSION);

    printf("%s\n", l);
}

और आउटपुट के रूप में मिला:

com.apple.metadata:kMDItemWhereFroms

फिर भी यह समझने की कोशिश कर रहा है कि कैसे इसे @ या + परिवर्तित करें?


@ अर्थ है कि फ़ाइल में विस्तारित विशेषताएं हैं सभी विशेषताओं के नामों की एक सूची प्राप्त करने के लिए listxattr() का उपयोग करें, और एक विशेष विशेषता का मूल्य प्राप्त करने के लिए getxattr() यदि listxattr नॉन-शून्य परिणाम देता है, तो आप इस को इंगित करने के लिए @ प्रदर्शित करेंगे।

विस्तारित विशेषताएं POSIX में नहीं हैं, लेकिन यह एपीआई कम से कम लिनक्स और ओएस एक्स में उपलब्ध है।

आप इन फ़ंक्शन का उपयोग कैसे करें इसका उदाहरण यहां मिल सकता है

+ अर्थ है फ़ाइल में एक अभिगम नियंत्रण सूची है। कुछ फाइल सिस्टम में, इसे एक विशेष विस्तारित विशेषता के रूप में संग्रहीत किया जाता है; दूसरों में इसे अलग से संग्रहीत किया जाता है अभिगम नियंत्रण सूचियों के लिए, संदर्भ के लिए acl(5) देखें, और आप यहां एक उदाहरण प्रोग्राम पा सकते हैं जो इसे यहां दिखाता है





xattr