Amazing no one else has written this... Someone with an intel mac should test this to check the uint32_t works there too (I have a powerpc).

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/attr.h> /* !!! */
#include <sys/stat.h>
#include <unistd.h>

int my_lchmod(const char *path, mode_t mode) {
        struct attrlist attrList;
        uint32_t m;

        /* manpage is wrong! not mode_t, but uint32_t is required */
        memset(&attrList, 0, sizeof(attrList));
        attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
        attrList.commonattr = ATTR_CMN_ACCESSMASK;
        m = mode;
return setattrlist(path, &attrList, &m, sizeof(m), FSOPT_NOFOLLOW);
}

int main(int argc, const char **argv) {
        struct stat st;
        const char *file;
        int perms;

        file = argv[1];
        perms = strtol(argv[2], 0, 0);

        if (lstat(file, &st) != 0) {
                perror("stat");
                return 1;
        }

        st.st_mode = (st.st_mode & ~0777) | perms;

        if (my_lchmod(file, st.st_mode) != 0) {
                perror("lchmod");
                return 1;
        }

        return 0;
}


--
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to