19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* Copyright 2008 The Android Open Source Project
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef _BINDER_H_
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define _BINDER_H_
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/ioctl.h>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <linux/binder.h>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_state;
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_object
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t type;
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t flags;
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *pointer;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *cookie;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_txn
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *target;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *cookie;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t flags;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t sender_pid;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t sender_euid;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t data_size;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t offs_size;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *data;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *offs;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_io
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *data;            /* pointer to read/write from */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t *offs;        /* array of offsets */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t data_avail;   /* bytes available in data buffer */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t offs_avail;   /* entries available in offsets array */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char *data0;           /* start of data buffer */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t *offs0;       /* start of offsets buffer */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t flags;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t unused;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_death {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void (*func)(struct binder_state *bs, void *ptr);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void *ptr;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* the one magic object */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define BINDER_SERVICE_MANAGER ((void*) 0)
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SVC_MGR_NAME "android.os.IServiceManager"
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SVC_MGR_GET_SERVICE = 1,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SVC_MGR_CHECK_SERVICE,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SVC_MGR_ADD_SERVICE,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SVC_MGR_LIST_SERVICES,
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int (*binder_handler)(struct binder_state *bs,
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              struct binder_txn *txn,
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              struct binder_io *msg,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              struct binder_io *reply);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct binder_state *binder_open(unsigned mapsize);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_close(struct binder_state *bs);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* initiate a blocking binder call
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - returns zero on success
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint binder_call(struct binder_state *bs,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                struct binder_io *msg, struct binder_io *reply,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void *target, uint32_t code);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* release any state associate with the binder_io
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - call once any necessary data has been extracted from the
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   binder_io after binder_call() returns
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - can safely be called even if binder_call() fails
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_done(struct binder_state *bs,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 struct binder_io *msg, struct binder_io *reply);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* manipulate strong references */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_acquire(struct binder_state *bs, void *ptr);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_release(struct binder_state *bs, void *ptr);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_link_to_death(struct binder_state *bs, void *ptr, struct binder_death *death);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid binder_loop(struct binder_state *bs, binder_handler func);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint binder_become_context_manager(struct binder_state *bs);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* allocate a binder_io, providing a stack-allocated working
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * buffer, size of the working buffer, and how many object
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * offset entries to reserve from the buffer
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_init(struct binder_io *bio, void *data,
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           uint32_t maxdata, uint32_t maxobjects);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_destroy(struct binder_io *bio);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_put_obj(struct binder_io *bio, void *ptr);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_put_ref(struct binder_io *bio, void *ptr);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_put_uint32(struct binder_io *bio, uint32_t n);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_put_string16(struct binder_io *bio, const uint16_t *str);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid bio_put_string16_x(struct binder_io *bio, const char *_str);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint32_t bio_get_uint32(struct binder_io *bio);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint16_t *bio_get_string16(struct binder_io *bio, uint32_t *sz);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *bio_get_obj(struct binder_io *bio);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *bio_get_ref(struct binder_io *bio);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
120