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); }