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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
                                        }
                                }
                        }
                }
        }
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
                                }
                        }
                }
        }