Exemple #1
0
int
main(int argc, char *argv[])
{
    Boolean recalcMask, useDefaultACL;
    Boolean modifyACL, removeACL, removeDefaultACL, checkValidity;
    int optCnt, j, opt, numEntries, en;
    acl_type_t type;
    char *aclSpec;
    acl_t acl;
    acl_entry_t entry;
    struct AccessControlEntry aclist[MAX_ENTRIES];

    if (argc < 2 || strcmp(argv[1], "--help") == 0)
        usageError(argv[0], NULL, FALSE);

    /* Parse command-line options */

    recalcMask = TRUE;
    useDefaultACL = FALSE;
    modifyACL = FALSE;
    removeACL = FALSE;
    checkValidity = FALSE;
    removeDefaultACL = FALSE;
    optCnt = 0;

    while ((opt = getopt(argc, argv, "m:x:kdnV:")) != -1) {
        switch (opt) {
        case 'm':
            modifyACL = TRUE;
            aclSpec = optarg;
            optCnt++;
            break;

        case 'x':
            removeACL = TRUE;
            aclSpec = optarg;
            optCnt++;
            break;

        case 'k':
            removeDefaultACL = TRUE;
            optCnt++;
            break;

        case 'V':
            checkValidity = TRUE;
            aclSpec = optarg;
            optCnt++;
            break;

        case 'd':
            useDefaultACL = TRUE;
            break;

        case 'n':
            recalcMask = FALSE;
            break;

        default:
            usageError(argv[0], "Bad option\n", TRUE);
            break;
        }
    }

    if (optCnt != 1)
        usageError(argv[0], "Specify exactly one of -m, -x, -k, or -V\n", TRUE);

    if (checkValidity && useDefaultACL)
        usageError(argv[0], "Can't specify -d with -V\n", TRUE);

    if (checkValidity) {
        if (parseACL(aclSpec, aclist, TRUE) == -1) {
            fatal("Bad ACL entry specification");
        } else {
            printf("ACL is valid\n");
            exit(EXIT_SUCCESS);
        }
    }

    if (modifyACL || removeACL) {
        numEntries = parseACL(aclSpec, aclist, modifyACL);
        if (numEntries == -1)
            usageError(argv[0], "Bad ACL specification\n", TRUE);
    }

    type = useDefaultACL ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS;

    /* Perform the operation on each file argument */

    for (j = optind; j < argc; j++) {
        if (removeDefaultACL) {
            if (acl_delete_def_file(argv[j]) == -1)
                errExit("acl_delete_def_file: %s", argv[j]);

        } else if (modifyACL || removeACL) {

            acl = acl_get_file(argv[j], type);
            if (acl == NULL)
                errExit("acl_get_file");

            /* Apply each of the entries in 'aclist' to the
               current file */

            for (en = 0; en < numEntries; en++) {
                entry = findEntry(acl, aclist[en].tag, aclist[en].qual);

                if (removeACL) {
                    if (entry != NULL)
                        if (acl_delete_entry(acl, entry) == -1)
                            errExit("acl_delete_entry");

                } else {        /* modifyACL */

                    if (entry == NULL) {

                        /* Entry didn't exist in ACL -- create a new
                           entry with required tag and qualifier */

                        if (acl_create_entry(&acl, &entry) == -1)
                            errExit("acl_create_entry");
                        if (acl_set_tag_type(entry, aclist[en].tag) == -1)
                            errExit("acl_set_tag_type");
                        if (aclist[en].tag == ACL_USER ||
                                aclist[en].tag == ACL_GROUP)
                            if (acl_set_qualifier(entry,
                                        &aclist[en].qual) == -1)
                                errExit("acl_set_qualifier");
                    }

                    setPerms(entry, aclist[en].perms);
                }

                /* Recalculate the mask entry if requested */

                if (recalcMask)
                    if (acl_calc_mask(&acl) == -1)
                        errExit("acl_calc_mask");

                /* Update the file ACL */

                if (acl_valid(acl) == -1)
                    errExit("acl_valid");

                if (acl_set_file(argv[j], type, acl) == -1)
                    errExit("acl_set_file");
            }

            if (acl_free(acl) == -1)
                errExit("acl_free");
        } else {
            fatal("Bad logic!");
        }
    }

    exit(EXIT_SUCCESS);
}
/*
 * Setup Display related nodes & permissions. For HDMI, it can be fb1 or fb2
 * Loop through the sysfs nodes and determine the HDMI(dtv panel)
 */
void set_display_node_perms()
{
    char panel_type[] = "dtv panel";
    char buf[BUF_SIZE];
    int num;

    for (num=0; num<=2; num++) {
        snprintf(tmp,sizeof(tmp),"%sfb%d/msm_fb_type", sys_fb_path, num);
        if(read_file2(tmp, buf, sizeof(buf))) {
            if(!strncmp(buf, panel_type, strlen(panel_type))) {
                // Set appropriate permissions for the nodes
                snprintf(tmp, sizeof(tmp), "%sfb%d/hpd", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
                snprintf(tmp, sizeof(tmp), "%sfb%d/res_info", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
                snprintf(tmp, sizeof(tmp), "%sfb%d/vendor_name", sys_fb_path,
                             num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
                snprintf(tmp, sizeof(tmp), "%sfb%d/product_description",
                            sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
                snprintf(tmp, sizeof(tmp), "%sfb%d/video_mode",
                            sys_fb_path, num);
                setPerms(tmp, 0664);
                snprintf(tmp, sizeof(tmp), "%sfb%d/format_3d", sys_fb_path,
                            num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/s3d_mode", sys_fb_path,
                            num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/hdcp/tp", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/cec/enable", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/cec/logical_addr", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/cec/rd_msg", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/pa", sys_fb_path, num);
                setPerms(tmp, 0664);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d/cec/wr_msg", sys_fb_path, num);
                setPerms(tmp, 0600);
                setOwners(tmp, AID_SYSTEM, AID_SYSTEM);
                snprintf(tmp, sizeof(tmp), "%sfb%d", dev_fb_path, num);
                symlink(tmp, DEV_GFX_HDMI);
                break;
            }
        }
    }
    // Set the permission for idle_time.
    snprintf(tmp, sizeof(tmp), "%sfb0/idle_time", sys_fb_path);
    setPerms(tmp, 0664);
    setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
    // Set write permission for dynamic_fps node.
    snprintf(tmp, sizeof(tmp), "%sfb0/dynamic_fps", sys_fb_path);
    setPerms(tmp, 0664);
    setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
    // Set permissions for dynamic partial update
    snprintf(tmp, sizeof(tmp), "%sfb0/dyn_pu", sys_fb_path);
    setPerms(tmp, 0664);
    setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);

    snprintf(tmp, sizeof(tmp), "%sfb0/modes", sys_fb_path);
    setPerms(tmp, 0664);
    setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);

    snprintf(tmp, sizeof(tmp), "%sfb0/mode", sys_fb_path);
    setPerms(tmp, 0664);
    setOwners(tmp, AID_SYSTEM, AID_GRAPHICS);
}