static gboolean gst_vdp_output_buffer_pool_check_caps (GstVdpBufferPool * bpool, const GstCaps * caps) { GstVdpOutputBufferPool *opool = GST_VDP_OUTPUT_BUFFER_POOL (bpool); VdpChromaType rgba_format; gint width, height; if (!parse_caps (caps, &rgba_format, &width, &height)) return FALSE; if (rgba_format != opool->rgba_format || width != opool->width || height != opool->height) return FALSE; return TRUE; }
static gboolean gst_vdp_video_buffer_pool_check_caps (GstVdpBufferPool * bpool, const GstCaps * caps) { GstVdpVideoBufferPool *vpool = GST_VDP_VIDEO_BUFFER_POOL (bpool); VdpChromaType chroma_type; gint width, height; if (!parse_caps (caps, &chroma_type, &width, &height)) return FALSE; if (chroma_type != vpool->chroma_type || width != vpool->width || height != vpool->height) return FALSE; return TRUE; }
int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) { uint64_t missing; int r; assert(c); assert(c->allocated); if (!(mask & SD_BUS_CREDS_AUGMENT)) return 0; /* Try to retrieve PID from creds if it wasn't passed to us */ if (pid > 0) { c->pid = pid; c->mask |= SD_BUS_CREDS_PID; } else if (c->mask & SD_BUS_CREDS_PID) pid = c->pid; else /* Without pid we cannot do much... */ return 0; /* Try to retrieve TID from creds if it wasn't passed to us */ if (tid <= 0 && (c->mask & SD_BUS_CREDS_TID)) tid = c->tid; /* Calculate what we shall and can add */ missing = mask & ~(c->mask|SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_DESCRIPTION|SD_BUS_CREDS_AUGMENT); if (missing == 0) return 0; if (tid > 0) { c->tid = tid; c->mask |= SD_BUS_CREDS_TID; } if (missing & (SD_BUS_CREDS_PPID | SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_SUID | SD_BUS_CREDS_FSUID | SD_BUS_CREDS_GID | SD_BUS_CREDS_EGID | SD_BUS_CREDS_SGID | SD_BUS_CREDS_FSGID | SD_BUS_CREDS_SUPPLEMENTARY_GIDS | SD_BUS_CREDS_EFFECTIVE_CAPS | SD_BUS_CREDS_INHERITABLE_CAPS | SD_BUS_CREDS_PERMITTED_CAPS | SD_BUS_CREDS_BOUNDING_CAPS)) { _cleanup_fclose_ FILE *f = NULL; const char *p; p = procfs_file_alloca(pid, "status"); f = fopen(p, "re"); if (!f) { if (errno == ENOENT) return -ESRCH; else if (errno != EPERM && errno != EACCES) return -errno; } else { char line[LINE_MAX]; FOREACH_LINE(line, f, return -errno) { truncate_nl(line); if (missing & SD_BUS_CREDS_PPID) { p = startswith(line, "PPid:"); if (p) { p += strspn(p, WHITESPACE); /* Explicitly check for PPID 0 (which is the case for PID 1) */ if (!streq(p, "0")) { r = parse_pid(p, &c->ppid); if (r < 0) return r; } else c->ppid = 0; c->mask |= SD_BUS_CREDS_PPID; continue; } } if (missing & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID)) { p = startswith(line, "Uid:"); if (p) { unsigned long uid, euid, suid, fsuid; p += strspn(p, WHITESPACE); if (sscanf(p, "%lu %lu %lu %lu", &uid, &euid, &suid, &fsuid) != 4) return -EIO; if (missing & SD_BUS_CREDS_UID) c->uid = (uid_t) uid; if (missing & SD_BUS_CREDS_EUID) c->euid = (uid_t) euid; if (missing & SD_BUS_CREDS_SUID) c->suid = (uid_t) suid; if (missing & SD_BUS_CREDS_FSUID) c->fsuid = (uid_t) fsuid; c->mask |= missing & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID); continue; } } if (missing & (SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID)) { p = startswith(line, "Gid:"); if (p) { unsigned long gid, egid, sgid, fsgid; p += strspn(p, WHITESPACE); if (sscanf(p, "%lu %lu %lu %lu", &gid, &egid, &sgid, &fsgid) != 4) return -EIO; if (missing & SD_BUS_CREDS_GID) c->gid = (gid_t) gid; if (missing & SD_BUS_CREDS_EGID) c->egid = (gid_t) egid; if (missing & SD_BUS_CREDS_SGID) c->sgid = (gid_t) sgid; if (missing & SD_BUS_CREDS_FSGID) c->fsgid = (gid_t) fsgid; c->mask |= missing & (SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID); continue; } } if (missing & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) { p = startswith(line, "Groups:"); if (p) { size_t allocated = 0; for (;;) { unsigned long g; int n = 0; p += strspn(p, WHITESPACE); if (*p == 0) break; if (sscanf(p, "%lu%n", &g, &n) != 1) return -EIO; if (!GREEDY_REALLOC(c->supplementary_gids, allocated, c->n_supplementary_gids+1)) return -ENOMEM; c->supplementary_gids[c->n_supplementary_gids++] = (gid_t) g; p += n; } c->mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS; continue; } } if (missing & SD_BUS_CREDS_EFFECTIVE_CAPS) { p = startswith(line, "CapEff:"); if (p) { r = parse_caps(c, CAP_OFFSET_EFFECTIVE, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_EFFECTIVE_CAPS; continue; } } if (missing & SD_BUS_CREDS_PERMITTED_CAPS) { p = startswith(line, "CapPrm:"); if (p) { r = parse_caps(c, CAP_OFFSET_PERMITTED, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_PERMITTED_CAPS; continue; } } if (missing & SD_BUS_CREDS_INHERITABLE_CAPS) { p = startswith(line, "CapInh:"); if (p) { r = parse_caps(c, CAP_OFFSET_INHERITABLE, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_INHERITABLE_CAPS; continue; } } if (missing & SD_BUS_CREDS_BOUNDING_CAPS) { p = startswith(line, "CapBnd:"); if (p) { r = parse_caps(c, CAP_OFFSET_BOUNDING, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_BOUNDING_CAPS; continue; } } } } }
static bool parse_command_line( int argc, char *argv[] ) { int n; for (n = 1; n < argc; n++) { const char *arg = argv[n]; if (strcmp (arg, "-h") == 0 || strcmp (arg, "--help") == 0) { print_usage (argv[0]); return false; } if (strcmp (arg, "-v") == 0 || strcmp (arg, "--version") == 0) { fprintf (stderr, "dfbg version %s\n", DIRECTFB_VERSION); return false; } if (strcmp (arg, "-T") == 0 || strcmp (arg, "--top-level") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_id( argv[n], &m_toplevel_id )) return false; continue; } if (strcmp (arg, "-W") == 0 || strcmp (arg, "--wait-at-end") == 0) { m_wait_at_end = DFB_TRUE; continue; } if (strcmp (arg, "-r") == 0 || strcmp (arg, "--run") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_test( argv[n], false )) return false; continue; } if (strcmp (arg, "-p") == 0 || strcmp (arg, "--pos") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_position( argv[n], &m_desc_top.posx, &m_desc_top.posy )) return false; continue; } if (strcmp (arg, "-s") == 0 || strcmp (arg, "--size") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_size( argv[n], &m_desc_top.width, &m_desc_top.height )) return false; continue; } if (strcmp (arg, "-f") == 0 || strcmp (arg, "--format") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_format( argv[n], &m_desc_top.pixelformat )) return false; continue; } if (strcmp (arg, "-c") == 0 || strcmp (arg, "--caps") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_caps( argv[n], &m_desc_top.caps )) return false; continue; } if (strcmp (arg, "-l") == 0 || strcmp (arg, "--color") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_color( argv[n], &m_topcolor.color )) return false; m_topcolor.valid = true; continue; } if (strcmp (arg, "-o") == 0 || strcmp (arg, "--option") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_option( argv[n], &m_desc_top.options )) return false; continue; } if (strcmp (arg, "-a") == 0 || strcmp (arg, "--associate") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_id( argv[n], &m_desc_top.parent_id )) return false; // m_desc_top.flags |= DWDESC_PARENT; m_desc_top.options |= DWOP_FOLLOW_BOUNDS; continue; } if (strcmp (arg, "-R") == 0 || strcmp (arg, "--sub-run") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_test( argv[n], true )) return false; continue; } if (strcmp (arg, "-P") == 0 || strcmp (arg, "--sub-pos") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_position( argv[n], &m_desc_sub.posx, &m_desc_sub.posy )) return false; continue; } if (strcmp (arg, "-S") == 0 || strcmp (arg, "--sub-size") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_size( argv[n], &m_desc_sub.width, &m_desc_sub.height )) return false; continue; } if (strcmp (arg, "-F") == 0 || strcmp (arg, "--sub-format") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_format( argv[n], &m_desc_sub.pixelformat )) return false; continue; } if (strcmp (arg, "-C") == 0 || strcmp (arg, "--sub-caps") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_caps( argv[n], &m_desc_sub.caps )) return false; continue; } if (strcmp (arg, "-L") == 0 || strcmp (arg, "--sub-color") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_color( argv[n], &m_subcolor.color )) return false; m_subcolor.valid = true; continue; } if (strcmp (arg, "-O") == 0 || strcmp (arg, "--sub-option") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_option( argv[n], &m_desc_sub.options )) return false; continue; } if (strcmp (arg, "-A") == 0 || strcmp (arg, "--sub-associate") == 0) { if (++n == argc) { print_usage (argv[0]); return false; } if (!parse_id( argv[n], &m_desc_sub.parent_id )) return false; // m_desc_sub.flags |= DWDESC_PARENT; m_desc_sub.options |= DWOP_FOLLOW_BOUNDS; continue; } print_usage (argv[0]); return false; } return true; }
int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) { uint64_t missing; int r; assert(c); assert(c->allocated); missing = mask & ~c->mask; if (missing == 0) return 0; /* Try to retrieve PID from creds if it wasn't passed to us */ if (pid <= 0 && (c->mask & SD_BUS_CREDS_PID)) pid = c->pid; if (tid <= 0 && (c->mask & SD_BUS_CREDS_TID)) tid = c->pid; /* Without pid we cannot do much... */ if (pid <= 0) return 0; if (missing & (SD_BUS_CREDS_UID | SD_BUS_CREDS_GID | SD_BUS_CREDS_EFFECTIVE_CAPS | SD_BUS_CREDS_INHERITABLE_CAPS | SD_BUS_CREDS_PERMITTED_CAPS | SD_BUS_CREDS_BOUNDING_CAPS)) { _cleanup_fclose_ FILE *f = NULL; char line[LINE_MAX]; const char *p; p = procfs_file_alloca(pid, "status"); f = fopen(p, "re"); if (!f) return errno == ENOENT ? -ESRCH : -errno; FOREACH_LINE(line, f, return -errno) { truncate_nl(line); if (missing & SD_BUS_CREDS_UID) { p = startswith(line, "Uid:"); if (p) { unsigned long uid; p += strspn(p, WHITESPACE); if (sscanf(p, "%lu", &uid) != 1) return -EIO; c->uid = (uid_t) uid; c->mask |= SD_BUS_CREDS_UID; continue; } } if (missing & SD_BUS_CREDS_GID) { p = startswith(line, "Gid:"); if (p) { unsigned long gid; p += strspn(p, WHITESPACE); if (sscanf(p, "%lu", &gid) != 1) return -EIO; c->gid = (uid_t) gid; c->mask |= SD_BUS_CREDS_GID; continue; } } if (missing & SD_BUS_CREDS_EFFECTIVE_CAPS) { p = startswith(line, "CapEff:"); if (p) { r = parse_caps(c, CAP_OFFSET_EFFECTIVE, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_EFFECTIVE_CAPS; continue; } } if (missing & SD_BUS_CREDS_PERMITTED_CAPS) { p = startswith(line, "CapPrm:"); if (p) { r = parse_caps(c, CAP_OFFSET_PERMITTED, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_PERMITTED_CAPS; continue; } } if (missing & SD_BUS_CREDS_INHERITABLE_CAPS) { p = startswith(line, "CapInh:"); if (p) { r = parse_caps(c, CAP_OFFSET_INHERITABLE, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_INHERITABLE_CAPS; continue; } } if (missing & SD_BUS_CREDS_BOUNDING_CAPS) { p = startswith(line, "CapBnd:"); if (p) { r = parse_caps(c, CAP_OFFSET_BOUNDING, p); if (r < 0) return r; c->mask |= SD_BUS_CREDS_BOUNDING_CAPS; continue; } } } }