Skip to content

Commit

Permalink
airdrop scan: Add --timeout
Browse files Browse the repository at this point in the history
This timeout will default to 30 seconds.
  • Loading branch information
CRKatri committed Feb 4, 2022
1 parent 296f94d commit 4db984b
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ NO_AIRPLANE ?= 0
CFLAGS += -DNO_CELLULAR=$(NO_CELLULAR) -DNO_WIFI=$(NO_WIFI) -DNO_AIRDROP=$(NO_AIRDROP) -DNO_AIRPLANE=$(NO_AIRPLANE)

SRC := netctl.c
SRC += utils/output.m
SRC += utils/output.m utils/strtonum.c
ifneq ($(NO_CELLULAR),1)
SRC += cellular/cellular.m
LIBS += -framework CoreTelephony
Expand Down
23 changes: 22 additions & 1 deletion airdrop/airdrop-scan.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,27 @@ void airdropBrowserCallBack(SFBrowserRef browser, SFNodeRef node, CFStringRef pr
}

int airdropscan(int argc, char **argv) {
int ch, index;
int timeout = 30;
const char *errstr;

struct option opts[] = {
{ "timeout", required_argument, 0, 't' },
{ NULL, 0, NULL, 0 }
};

while ((ch = getopt_long(argc, argv, "t:", opts, &index)) != -1) {
switch (ch) {
case 't':
timeout = strtonum(optarg, 0, INT_MAX, &errstr);
if (errstr != NULL)
err(1, "%s", optarg);
break;
}
}
argc -= optind;
argv += optind;

discovered = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
SFBrowserRef browser = SFBrowserCreate(kCFAllocatorDefault, kSFBrowserKindAirDrop);
SFBrowserSetDispatchQueue(browser, dispatch_get_main_queue());
Expand All @@ -32,7 +53,7 @@ int airdropscan(int argc, char **argv) {
SFBrowserSetClient(browser, airdropBrowserCallBack, &context);
SFBrowserOpenNode(browser, 0, 0, 0);

CFRunLoopRun();
CFRunLoopRunInMode(kCFRunLoopDefaultMode, timeout, false);

CFRelease(discovered);
SFBrowserInvalidate(browser);
Expand Down
64 changes: 64 additions & 0 deletions utils/strtonum.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*-
* Copyright (c) 2004 Ted Unangst and Todd Miller
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $OpenBSD: strtonum.c,v 1.7 2013/04/17 18:40:58 tedu Exp $
*/

#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

#define INVALID 1
#define TOOSMALL 2
#define TOOLARGE 3

long long strtonum(const char *numstr, long long minval, long long maxval,
const char **errstrp) {
long long ll = 0;
int error = 0;
char *ep;
struct errval {
const char *errstr;
int err;
} ev[4] = {
{NULL, 0},
{"invalid", EINVAL},
{"too small", ERANGE},
{"too large", ERANGE},
};

ev[0].err = errno;
errno = 0;
if (minval > maxval) {
error = INVALID;
} else {
ll = strtoll(numstr, &ep, 10);
if (errno == EINVAL || numstr == ep || *ep != '\0')
error = INVALID;
else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
error = TOOSMALL;
else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
error = TOOLARGE;
}
if (errstrp != NULL) *errstrp = ev[error].errstr;
errno = ev[error].err;
if (error) ll = 0;

return (ll);
}

0 comments on commit 4db984b

Please sign in to comment.