diff --git a/frida/device.go b/frida/device.go index aaf6aae..cd36be3 100644 --- a/frida/device.go +++ b/frida/device.go @@ -18,7 +18,7 @@ type DeviceInt interface { Bus() *Bus Manager() *DeviceManager IsLost() bool - Params() (map[string]any, error) + Params(opts ...OptFunc) (map[string]any, error) FrontmostApplication(scope Scope) (*Application, error) EnumerateApplications(identifier string, scope Scope) ([]*Application, error) ProcessByPID(pid int, scope Scope) (*Process, error) @@ -113,19 +113,27 @@ func (d *Device) IsLost() bool { } // Params returns system parameters of the device -func (d *Device) Params() (map[string]any, error) { - if d.device != nil { - var err *C.GError - ht := C.frida_device_query_system_parameters_sync(d.device, nil, &err) - if err != nil { - return nil, &FError{err} - } +func (d *Device) Params(opts ...OptFunc) (map[string]any, error) { + o := &options{} + for _, opt := range opts { // <--- this all can become a helper func + opt(o) + } - params := gHashTableToMap(ht) + return d.params(o) +} - return params, nil +func (d *Device) params(opts *options) (map[string]any, error) { + if d.device == nil { + return nil, errors.New("could not obtain params for nil device") } - return nil, errors.New("could not obtain params for nil device") + + var err *C.GError + ht := C.frida_device_query_system_parameters_sync(d.device, opts.cancellable, &err) + if err != nil { + return nil, &FError{err} + } + + return gHashTableToMap(ht), nil } // FrontmostApplication will return the frontmost application or the application in focus diff --git a/frida/misc.go b/frida/misc.go index bee19ce..46c954a 100644 --- a/frida/misc.go +++ b/frida/misc.go @@ -9,6 +9,32 @@ import ( "unsafe" ) +type Cancellable struct { + cancellable *C.GCancellable +} + +func NewCancellable() *Cancellable { + return &Cancellable{ + cancellable: C.g_cancellable_new(), + } +} + +func (c *Cancellable) Cancel() { + C.g_cancellable_cancel(c.cancellable) +} + +type options struct { + cancellable *C.GCancellable +} + +type OptFunc func(o *options) + +func WithCancel(cancel *Cancellable) OptFunc { + return func(o *options) { + o.cancellable = cancel.cancellable + } +} + // FError holds a pointer to GError type FError struct { error *C.GError