Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp7387492rwl; Thu, 23 Mar 2023 03:45:30 -0700 (PDT) X-Google-Smtp-Source: AK7set+vLK/aTa2DmtaOR/U+GqW0n9bN5za/EWaTWLC+IG+oKGEr9Wg3DpmPF0BpMIz1umLonWOh X-Received: by 2002:a05:6402:896:b0:4fe:3374:7081 with SMTP id e22-20020a056402089600b004fe33747081mr9802313edy.8.1679568330748; Thu, 23 Mar 2023 03:45:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679568330; cv=none; d=google.com; s=arc-20160816; b=SalC9SL3eYNz+JbBK/7k2osKd57Dy+7e9QC/ZzCLu7IJu5qY07xKMPFS4qr8mBrXOK Uovq1zF2ONfPL/xLo9WUz+gFNNLb+Eo2llY6DF8D2s1e7N8DFFvyeNGDq3F6WEqyFWBg 62uzzz5A5Q6rNuJxKuxcddCbCOFTbvfFO+9cgqC/u5TNhvJ363qdN/PrTTs0UgvyvSP/ J/Jrgk7WPvtyBVBKNmpc6GLS5uew+H0J8mcNB7DXLfL7xcCa7RkXWtKgt2LtBYWpD9ua YWFVGd0W5G8/sX+qhAMBvQ9cqLQVleEY0ocHtHr0ncaZIwB2ztsrEwAScoadHec94aSW Ki0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=joJx6HhFwXvoHrCIHTeLaTTrK8R0VHAtHSi1abn1ul8=; b=WMNDcaM7TDs0FVmz9BCH8GU3cg6essf8BaW52G4TTipXbQzs4vGPMFpf/CPUcSxx4i i/QwMQ4SFk0yyxJY954pC2rfnLk43Clmj9o6L9fBH9Kl+xifrc0id48E6LfUEYGB1/RR qJ9+/k1jEdrvIpGZk2nZDYJMLt46cbDVkwcKseIgFS5kL4C+fX4eLbHcnZwEIsggpUGV f02AeKGQbkKjnx3fQg9b6GKVuor0Gk7xDY2EYCgzXYu1FMtWnbykmadRALbsNyB2JkGR Ob9hB9+G0fGrl8OacDXCat7CHiwaWCbm39dunU13TQHbBjQqazHu7gt9X8c41NvZMY8c E1Rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@streamunlimited.com header.s=google header.b=npW8+DGd; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=streamunlimited.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id mh11-20020a170906eb8b00b009272de342c3si17942852ejb.927.2023.03.23.03.45.07; Thu, 23 Mar 2023 03:45:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@streamunlimited.com header.s=google header.b=npW8+DGd; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=streamunlimited.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230257AbjCWKmE (ORCPT + 99 others); Thu, 23 Mar 2023 06:42:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230366AbjCWKlo (ORCPT ); Thu, 23 Mar 2023 06:41:44 -0400 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AFB0D36095 for ; Thu, 23 Mar 2023 03:38:49 -0700 (PDT) Received: by mail-ed1-x536.google.com with SMTP id x3so84329110edb.10 for ; Thu, 23 Mar 2023 03:38:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=streamunlimited.com; s=google; t=1679567923; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=joJx6HhFwXvoHrCIHTeLaTTrK8R0VHAtHSi1abn1ul8=; b=npW8+DGdWsIlmJyLIVyBFlMzhsaZ61rW+nOlmLqaSDeS+Ol35dwcJADPazMGe57Ebw SIgRyzxO8WFKRDwr80qPEO6xJ1kZORdNyfuAVF4VST2lMX5zETAeg2dfpmcszcvklHuD SvW2SQsODTbHMEvWBnJUvHuk/c7q8gvuz9WFs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679567923; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=joJx6HhFwXvoHrCIHTeLaTTrK8R0VHAtHSi1abn1ul8=; b=QGH+Ze/jAwYrfbnJahfMMm7taoQTDYGsu7NcKDnpj/Ks+DL8IWVOPoq/+vMSSXHv2Y HIa1bT4u51dPghqcVJsjY62exPqfO3igEEqFxyIS6hOFRLTmjsQNq2xPGR9IOS3hkGk7 qbK28Wnk0joxNPbvZkuWV72EE7hzRhC4B+ZKun79j1wxyycSjjS8p2PHNhuJX5j09Gb4 0kaB7Oj5kNVWhUq8vDGB4Oxb9UiW09/YYQOk5JtJpOX+u0kVLgu5Hd92VGf+nX7Zcoz4 s4hOG/CDMVL1rivLO/7AGGX4SAxvmc3iw451UpD3JkJOgXlcPdvY6+prFKQxyeCS4XMI q+mg== X-Gm-Message-State: AO0yUKU7pE1i42F4YrM//vK9QLOFnWyXlC/EdgOD5IwlkhQ+9IOMoqN4 Qnsc1mp550Gt0+5AO8/imbDFcpsm0HzRG2S4VPg= X-Received: by 2002:a17:907:987c:b0:92f:de0d:104b with SMTP id ko28-20020a170907987c00b0092fde0d104bmr10613520ejc.9.1679567923146; Thu, 23 Mar 2023 03:38:43 -0700 (PDT) Received: from smi-ubuntu.sueba ([2a01:390:0:101:4f8c:7da4:48b2:8bd2]) by smtp.gmail.com with ESMTPSA id bv1-20020a170906b1c100b00939e76a0cabsm3513208ejb.111.2023.03.23.03.38.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Mar 2023 03:38:42 -0700 (PDT) From: Simon Mikuda To: linux-bluetooth@vger.kernel.org Cc: Simon Mikuda Subject: [PATCH BlueZ 7/9] btgatt-client: Implement common read bytes procedure Date: Thu, 23 Mar 2023 11:38:33 +0100 Message-Id: <20230323103835.571037-8-simon.mikuda@streamunlimited.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230323103835.571037-1-simon.mikuda@streamunlimited.com> References: <20230323103835.571037-1-simon.mikuda@streamunlimited.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org --- tools/btgatt-client.c | 130 ++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 88 deletions(-) diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c index 0681074f9..c4311d067 100644 --- a/tools/btgatt-client.c +++ b/tools/btgatt-client.c @@ -664,6 +664,40 @@ static void write_cb(bool success, uint8_t att_ecode, void *user_data) } } +static uint8_t *read_bytes(char **argv, int *length) +{ + int i, byte; + uint8_t *value; + char *endptr = NULL; + + if (*length <= 0) { + error("Nothing to write"); + return NULL; + } + if (*length > BT_ATT_MAX_VALUE_LEN) { + error("Write value too long"); + return NULL; + } + + value = malloc(*length); + if (!value) { + error("Failed to construct write value"); + return NULL; + } + + for (i = 0; i < *length; i++) { + byte = strtol(argv[i], &endptr, 0); + if (endptr == argv[i] || *endptr != '\0' + || errno == ERANGE || byte < 0 || byte > 255) { + error("Invalid value byte: %s", argv[i]); + free(value); + return NULL; + } + value[i] = byte; + } + return value; +} + static void cmd_write_value(int argc, char **argv) { int opt, i, val; @@ -705,30 +739,9 @@ static void cmd_write_value(int argc, char **argv) } length = argc - 1; - - if (length > 0) { - if (length > UINT16_MAX) { - error("Write value too long"); - return; - } - - value = malloc(length); - if (!value) { - error("Failed to construct write value"); - return; - } - - for (i = 1; i < argc; i++) { - val = strtol(argv[i], &endptr, 0); - if (endptr == argv[i] || *endptr != '\0' - || errno == ERANGE || val < 0 || val > 255) { - error("Invalid value byte: %s", - argv[i]); - goto done; - } - value[i-1] = val; - } - } + value = read_bytes(argv + 1, &length); + if (!value) + return; if (without_response) { if (!bt_gatt_client_write_without_response(cli->gatt, handle, @@ -801,13 +814,6 @@ static void cmd_write_long_value(int argc, char **argv) argv += optind; optind = 0; - if (argc > 514) { - error("Too many arguments"); - bt_shell_usage(); - optind = 0; - return; - } - handle = strtol(argv[0], &endptr, 0); if (!endptr || *endptr != '\0' || !handle) { error("Invalid handle: %s", argv[1]); @@ -822,31 +828,9 @@ static void cmd_write_long_value(int argc, char **argv) } length = argc - 2; - - if (length > 0) { - if (length > UINT16_MAX) { - error("Write value too long"); - return; - } - - value = malloc(length); - if (!value) { - error("Failed to construct write value"); - return; - } - - for (i = 2; i < argc; i++) { - val = strtol(argv[i], &endptr, 0); - if (endptr == argv[i] || *endptr != '\0' - || errno == ERANGE || val < 0 || val > 255) { - error("Invalid value byte: %s", - argv[i]); - free(value); - return; - } - value[i-2] = val; - } - } + value = read_bytes(argv + 2, &length); + if (!value) + return; if (!bt_gatt_client_write_long_value(cli->gatt, reliable_writes, handle, offset, value, length, @@ -894,13 +878,6 @@ static void cmd_write_prepare(int argc, char **argv) argv += optind; optind = 0; - if (argc > 514) { - error("Too many arguments"); - bt_shell_usage(); - optind = 0; - return; - } - if (cli->reliable_session_id != id) { error("Session id != Ongoing session id (%u!=%u)", id, cli->reliable_session_id); @@ -925,33 +902,10 @@ static void cmd_write_prepare(int argc, char **argv) * length */ length = argc - 2; - - if (length == 0) - goto done; - - if (length > UINT16_MAX) { - error("Write value too long"); - return; - } - - value = malloc(length); - if (!value) { - error("Failed to allocate memory for value"); + value = read_bytes(argv + 2, &length); + if (!value) return; - } - - for (i = 2; i < argc; i++) { - val = strtol(argv[i], &endptr, 0); - if (endptr == argv[i] || *endptr != '\0' || errno == ERANGE - || val < 0 || val > 255) { - error("Invalid value byte: %s", argv[i]); - free(value); - return; - } - value[i-2] = val; - } -done: cli->reliable_session_id = bt_gatt_client_prepare_write(cli->gatt, id, handle, offset, -- 2.34.1