#include "scrcpy.h" #include #include #include #include #define DEFAULT_LOCAL_PORT 27183 #define DEFAULT_MAX_SIZE 0 struct args { const char *serial; Uint16 port; Uint16 max_size; }; static int parse_args(struct args *args, int argc, char *argv[]) { static const struct option long_options[] = { {"port", required_argument, NULL, 'p'}, {"max-size", required_argument, NULL, 'm'}, {NULL, 0, NULL, 0 }, }; int c; while ((c = getopt_long(argc, argv, "p:m:", long_options, NULL)) != -1) { switch (c) { case 'p': { char *endptr; long value = strtol(optarg, &endptr, 0); if (*optarg == '\0' || *endptr != '\0') { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Invalid port: %s\n", optarg); return -1; } if (value & ~0xffff) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Port out of range: %ld\n", value); return -1; } args->port = (Uint16) value; break; } case 'm': { char *endptr; long value = strtol(optarg, &endptr, 0); if (*optarg == '\0' || *endptr != '\0') { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Invalid max size: %s\n", optarg); return -1; } if (value & ~0xffff) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Max size must be between 0 and 65535: %ld\n", value); return -1; } args->max_size = (Uint16) value; break; } default: // getopt prints the error message on stderr return -1; } } int index = optind; if (index < argc) { args->serial = argv[index++]; } if (index < argc) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unexpected additional argument: %s\n", argv[index]); return -1; } return 0; } int main(int argc, char *argv[]) { int res; struct args args = { .serial = NULL, .max_size = DEFAULT_MAX_SIZE, .port = DEFAULT_LOCAL_PORT, }; if (parse_args(&args, argc, argv)) { return 1; } av_register_all(); if (avformat_network_init()) { return 1; } SDL_LogSetAllPriority(SDL_LOG_PRIORITY_DEBUG); res = scrcpy(args.serial, args.port, args.max_size) ? 0 : 1; avformat_network_deinit(); // ignore failure return res; }