Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ppc64-diag for openSUSE:Factory 
checked in at 2024-09-17 18:20:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ppc64-diag (Old)
 and      /work/SRC/openSUSE:Factory/.ppc64-diag.new.29891 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ppc64-diag"

Tue Sep 17 18:20:04 2024 rev:53 rq:1201651 version:2.7.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/ppc64-diag/ppc64-diag.changes    2024-02-26 
19:50:41.105392336 +0100
+++ /work/SRC/openSUSE:Factory/.ppc64-diag.new.29891/ppc64-diag.changes 
2024-09-17 18:20:41.241123679 +0200
@@ -1,0 +2,20 @@
+Tue Sep 17 14:28:38 UTC 2024 - Michal Suchanek <msucha...@suse.com>
+
+- Version 2.6.10 (jsc#PED-9918).
+  * Add support for multiple platform dumps
+  * Add support for light path diagnostics for rtas events
+  * Enable correct display of model and system-id for IPS Power systems
+  * Fix call home feature for nvmf devices
+  * Fix crash in rtas_errd due to invalid -f option values
+  * Fix build warnings with GCC-15
+- Remove upstreamed patches
+  * rtas_errd-Handle-multiple-platform-dumps.patch
+  * 0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
+  * 0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
+  * 0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
+  * nvme_call_home-remove-d-and-f-as-visible-options.patch
+  * nvme_call_home-remove-d-and-f-from-usage-message.patch
+  * diag_nvme-improvements-to-status-and-err-messages.patch
+  * diags-diag_nvme-call_home-command-fails-on-nvmf-driv.patch
+
+-------------------------------------------------------------------

Old:
----
  0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
  0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
  0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
  diag_nvme-improvements-to-status-and-err-messages.patch
  diags-diag_nvme-call_home-command-fails-on-nvmf-driv.patch
  nvme_call_home-remove-d-and-f-as-visible-options.patch
  nvme_call_home-remove-d-and-f-from-usage-message.patch
  ppc64-diag-2.7.9.tar.gz
  rtas_errd-Handle-multiple-platform-dumps.patch

New:
----
  ppc64-diag-2.7.10.tar.gz

BETA DEBUG BEGIN:
  Old:  * rtas_errd-Handle-multiple-platform-dumps.patch
  * 0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
  * 0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
  Old:  * 0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
  * 0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
  * 0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
  Old:  * 0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
  * 0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
  * nvme_call_home-remove-d-and-f-as-visible-options.patch
  Old:  * nvme_call_home-remove-d-and-f-from-usage-message.patch
  * diag_nvme-improvements-to-status-and-err-messages.patch
  * diags-diag_nvme-call_home-command-fails-on-nvmf-driv.patch
  Old:  * diag_nvme-improvements-to-status-and-err-messages.patch
  * diags-diag_nvme-call_home-command-fails-on-nvmf-driv.patch
  Old:  * 0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
  * nvme_call_home-remove-d-and-f-as-visible-options.patch
  * nvme_call_home-remove-d-and-f-from-usage-message.patch
  Old:  * nvme_call_home-remove-d-and-f-as-visible-options.patch
  * nvme_call_home-remove-d-and-f-from-usage-message.patch
  * diag_nvme-improvements-to-status-and-err-messages.patch
  Old:- Remove upstreamed patches
  * rtas_errd-Handle-multiple-platform-dumps.patch
  * 0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ppc64-diag.spec ++++++
--- /var/tmp/diff_new_pack.XD2Mex/_old  2024-09-17 18:20:41.877149393 +0200
+++ /var/tmp/diff_new_pack.XD2Mex/_new  2024-09-17 18:20:41.881149555 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           ppc64-diag
-Version:        2.7.9
+Version:        2.7.10
 Release:        0
 Summary:        Linux for Power Platform Diagnostics
 License:        GPL-2.0-or-later
@@ -30,16 +30,6 @@
 Source4:        ppc64-diag-nvme.timer
 #PATCH-FIX-OPENSUSE - ppc64-diag.varunused.patch - fix unused variables
 Patch1:         ppc64-diag.varunused.patch
-#PATCH-FIX-UPSTREAM - rtas_errd-Handle-multiple-platform-dumps.patch - store 
multiple dumps
-Patch2:         rtas_errd-Handle-multiple-platform-dumps.patch
-#PATCH-FIX-UPSTREAM - Enclosure fault LED support
-Patch3:         0001-ppc64-diag-Move-trim_trail_space-function-to-common-.patch
-Patch4:         0002-ppc64-diag-lp_diag-Utilize-trim_trail_space-function.patch
-Patch5:         0003-ppc64-diag-lp_diag-Enable-light-path-diagnostics-for.patch
-Patch6:         nvme_call_home-remove-d-and-f-as-visible-options.patch
-Patch7:         nvme_call_home-remove-d-and-f-from-usage-message.patch
-Patch8:         diag_nvme-improvements-to-status-and-err-messages.patch
-Patch9:         diags-diag_nvme-call_home-command-fails-on-nvmf-driv.patch
 BuildRequires:  autoconf
 BuildRequires:  automake
 BuildRequires:  bison

++++++ ppc64-diag-2.7.9.tar.gz -> ppc64-diag-2.7.10.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/.travis.yml 
new/ppc64-diag-2.7.10/.travis.yml
--- old/ppc64-diag-2.7.9/.travis.yml    2022-10-14 11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/.travis.yml   2024-09-13 07:24:56.000000000 +0200
@@ -1,8 +1,7 @@
 language: c
 
-os: linux-ppc64le
-group: ibm-cloud
-dist: bionic
+arch: ppc64le
+group: power-focal
 
 sudo: required
 
@@ -11,7 +10,7 @@
 env:
     matrix:
     - RUN_ON_CONTAINER=fedora-37
-    - RUN_ON_CONTAINER=ubuntu-22.10
+    - RUN_ON_CONTAINER=ubuntu-23.04
 
 install:
     - docker build --pull -t ${RUN_ON_CONTAINER} -f 
ppc64-diag-ci/Dockerfile-${RUN_ON_CONTAINER} .
@@ -25,3 +24,10 @@
       --tmpfs /tmp/
       --rm -t $RUN_ON_CONTAINER
       bash -c "./ppc64-diag-ci/build-${RUN_ON_CONTAINER}.sh";
+
+notifications:
+  slack: 
+    on_failure: always
+    on_success: always
+    rooms:
+      - secure: 
"kjiysvfyVNaN9/NrGQu5CVxDnTC04pepsw0e//ClYPTj/C439KL+mcNjOhqK620pOCIC4f+HcDSQbXWyVb8WLBqszLvwt000qdzUPOSJPIXXD1cjnoGGKPaWIzCipIpGQ0vIXxBAJ34bC8VxxI4hls0hG61S+yjMOnVQrG8jlwEFrPQmkDckt/ydvB3YC5YN6kOnzwwzXaKLtWRsQbxmnmxjX6ydQrExofS3OojCmLA+nyYH5+HcquSZcrjfMJPJ5X/cfiqxeBdfVNOBWfNPPoj5tRlME9SP8CE8N265IJjomGLumFi5UEIjUCwF5U+kDk8zIjmQxA5wNHUuQnpajfQemZx6rIi7cNDTns4HItBGLJXbtbsuxxuQhVCndg5F5FKLaGpUWBvCnMjJf5/eoDhDGlLR/m3/d70X00gWJndC2tMoSinVB4SFoAoCecmt0P5WrgOwycwg8L9F7Bvtcpldgy7LgJi88xrnqykc4jAnYRT0nu8T9foy9s6jfDzWcF03P/cw60ueKAr61ljFfDmlYorFHuuqaxKL99EEwY2i6y9VqgjwHu3j7LRMMmng2nz94EQYUpXPHQThHTymonxKiHTBTj+tuT7sDcosqgNdQezMHxd8FjDWQghOMqejAiIGpRXAohoqAEu0lbwkf4bt0AGjrUGyCgCXDLa0kqk="
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/common/utils.c 
new/ppc64-diag-2.7.10/common/utils.c
--- old/ppc64-diag-2.7.9/common/utils.c 2022-10-14 11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/common/utils.c        2024-09-13 07:24:56.000000000 
+0200
@@ -24,9 +24,34 @@
 #include <fcntl.h>
 #include <string.h>
 #include <assert.h>
+#include <ctype.h>
 
 #include "utils.h"
 
+/* trim_trail_space - Trim trailing white spaces from string
+ * @string - Null terminated string to remove white spaces from
+ *
+ * This function will alter the passed string by removing any trailing white 
spaces and null
+ * terminating it at that point.
+ */
+void trim_trail_space(char *string)
+{
+       char *end;
+       size_t length;
+
+       if (string == NULL)
+               return;
+
+       length = strlen(string);
+       if (length == 0)
+               return;
+
+       end = string + length - 1;
+       while (end >= string && isspace(*end))
+               end--;
+       *(end + 1) = '\0';
+}
+
 static int process_child(char *argv[], int pipefd[])
 {
        int     nullfd;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/common/utils.h 
new/ppc64-diag-2.7.10/common/utils.h
--- old/ppc64-diag-2.7.9/common/utils.h 2022-10-14 11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/common/utils.h        2024-09-13 07:24:56.000000000 
+0200
@@ -18,6 +18,7 @@
 #ifndef UTILS_H
 #define UTILS_H
 
+void trim_trail_space(char *string);
 FILE   *spopen(char **, pid_t *);
 int    spclose(FILE *, pid_t);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/configure.ac 
new/ppc64-diag-2.7.10/configure.ac
--- old/ppc64-diag-2.7.9/configure.ac   2022-10-14 11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/configure.ac  2024-09-13 07:24:56.000000000 +0200
@@ -1,6 +1,6 @@
 #                                               -*- Autoconf -*-
 # Process this file with autoconf to produce a configure script.
-m4_define([ppc64_diag_version], 2.7.9)
+m4_define([ppc64_diag_version], 2.7.10)
 
 AC_PREREQ([2.69])
 AC_INIT([ppc64-diag], ppc64_diag_version, [mah...@linux.ibm.com, 
s...@linux.ibm.com])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/diags/Makefile.am 
new/ppc64-diag-2.7.10/diags/Makefile.am
--- old/ppc64-diag-2.7.9/diags/Makefile.am      2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/diags/Makefile.am     2024-09-13 07:24:56.000000000 
+0200
@@ -13,7 +13,8 @@
                   $(diag_common_h_files)
 
 diag_nvme_h_files = diags/diag_nvme.h \
-                   common/platform.h
+                   common/platform.h \
+                   common/utils.h
 
 sbin_PROGRAMS += diags/diag_encl diags/encl_led diags/diag_nvme
 
@@ -41,6 +42,7 @@
 
 diags_diag_nvme_SOURCES = diags/diag_nvme.c \
                          common/platform.c \
+                         common/utils.c    \
                          $(diag_nvme_h_files)
 diags_diag_nvme_LDADD = -lservicelog -lm
 diags_diag_nvme_CFLAGS = $(AM_CFLAGS) -Wno-stringop-truncation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/diags/diag_disk.c 
new/ppc64-diag-2.7.10/diags/diag_disk.c
--- old/ppc64-diag-2.7.9/diags/diag_disk.c      2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/diags/diag_disk.c     2024-09-13 07:24:56.000000000 
+0200
@@ -43,7 +43,9 @@
 #define SYSFS_SG_PATH                  "/sys/class/scsi_generic"
 #define DEVICE_TREE                    "/proc/device-tree/"
 #define DEVICE_TREE_SYSTEM_ID          DEVICE_TREE"system-id"
+#define DEVICE_TREE_VENDOR_SYSTEM_ID   DEVICE_TREE"ibm,vendor-system-id"
 #define DEVICE_TREE_MODEL              DEVICE_TREE"model"
+#define DEVICE_TREE_VENDOR_MODEL       DEVICE_TREE"ibm,vendor-model"
 
 #define BUFFER_LENGTH                  16
 #define SERIAL_NUM_LEN                 8
@@ -248,9 +250,18 @@
        char model[BUFFER_LENGTH] = {0};
        char *temp;
 
-       device_fd = open(DEVICE_TREE_SYSTEM_ID, O_RDONLY);
-       if (device_fd < 0)
-               return -1;
+       /*
+        * Always use ibm,vendor-system-id device-tree property
+        * to get machine serial number. If it does not exist,
+        * then fallback to system-id property to get machine
+        * serial number.
+        */
+       device_fd = open(DEVICE_TREE_VENDOR_SYSTEM_ID, O_RDONLY);
+       if (device_fd < 0) {
+               device_fd = open(DEVICE_TREE_SYSTEM_ID, O_RDONLY);
+               if (device_fd < 0)
+                       return -1;
+       }
 
        rc = read(device_fd, serial, BUFFER_LENGTH);
        close(device_fd);
@@ -266,9 +277,17 @@
        memcpy(machine_serial, serial + start_index, SERIAL_NUM_LEN);
        machine_serial[SERIAL_NUM_LEN - 1] = '\0';
 
-       device_fd = open(DEVICE_TREE_MODEL, O_RDONLY);
-       if (device_fd < 0)
-               return -1;
+       /*
+        * Always use ibm,vendor-model device-tree property
+        * to get model info. If it does not exist, then
+        * fallback to model property to get model info.
+        */
+       device_fd = open(DEVICE_TREE_VENDOR_MODEL, O_RDONLY);
+       if (device_fd < 0) {
+               device_fd = open(DEVICE_TREE_MODEL, O_RDONLY);
+               if (device_fd < 0)
+                       return -1;
+       }
 
        rc = read(device_fd, model, BUFFER_LENGTH);
        close(device_fd);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/diags/diag_encl.c 
new/ppc64-diag-2.7.10/diags/diag_encl.c
--- old/ppc64-diag-2.7.9/diags/diag_encl.c      2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/diags/diag_encl.c     2024-09-13 07:24:56.000000000 
+0200
@@ -75,8 +75,7 @@
  */
 static void
 print_usage(const char *name) {
-       printf("Usage: %s [-h] [-V] [-s [-c][-l]] [-v] [-f <path.pg2>]"
-                                                       " [<scsi_enclosure>]\n"
+       printf("Usage: %s [-h] [-V] [-s [-c][-l]] [-v] [-f <path.pg2>] [<sgn 
...>]\n"
                "\n\t-h: print this help message\n"
                "\t-s: generate serviceable events for any failures and\n"
                "\t      write events to the servicelog\n"
@@ -87,7 +86,7 @@
                "\t-V: print the version of the command and exit\n"
                "\t-f: for testing, read SES data from path.pg2 and VPD\n"
                "\t      from path.vpd\n"
-               "\t<scsi_enclosure>: the sg device on which to operate, such\n"
+               "\t<sgn ...>: the scsi device on which to operate, such\n"
                "\t                    as sg7; if not specified, all such\n"
                "\t                    devices will be diagnosed\n", name);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/diags/diag_nvme.c 
new/ppc64-diag-2.7.10/diags/diag_nvme.c
--- old/ppc64-diag-2.7.9/diags/diag_nvme.c      2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/diags/diag_nvme.c     2024-09-13 07:24:56.000000000 
+0200
@@ -27,6 +27,7 @@
 #include <sys/utsname.h>
 #include "diag_nvme.h"
 #include "platform.h"
+#include "utils.h"
 
 #define ITEM_DATA_LENGTH       255
 #define MIN_HOURS_ON           720
@@ -71,7 +72,6 @@
 static int raw_data_vpd(unsigned char **raw_data, uint32_t *raw_data_len, 
struct nvme_ibm_vpd *vpd);
 static int regex_controller(char *controller_name, char *device_name);
 static void set_notify(struct notify *notify, struct dictionary *dict, int 
num_elements);
-static void trim_trail_space(char *string);
 static long double uint128_to_long_double(uint8_t *data);
 
 int main(int argc, char *argv[]) {
@@ -165,6 +165,11 @@
                optind++;
        }
 
+       if (rc == 0)
+               fprintf(stdout, "NVMe diag command completed successfully\n");
+       else
+               fprintf(stderr, "NVMe diag command failed with rc %d\n", rc);
+
        return rc;
 }
 
@@ -310,6 +315,7 @@
        int fd, rc;
        FILE *fp;
        struct nvme_smart_log_page smart_log = { 0 };
+       char ans;
 
        /* Read SMART data from device */
        snprintf(dev_path,sizeof(dev_path), "/dev/%s", device_name);
@@ -331,8 +337,16 @@
        }
        fp = fopen(dump_path, "wx");
        if (fp == NULL) {
-               fprintf(stderr, "%s open failed: %s\n", dump_path, 
strerror(errno));
-               return -1;
+               if (errno == EEXIST) {
+                       fprintf(stdout, "File %s exists. Overwrite (y/n)? ", 
dump_path);
+                       rc = scanf("%c", &ans);
+                       if (ans == 'y' || ans == 'Y')
+                               fp = fopen(dump_path, "w");
+               }
+               if (fp == NULL) {
+                       fprintf(stderr, "%s open failed: %s\n", dump_path, 
strerror(errno));
+                       return -1;
+               }
        }
        write_smart_file(fp, &smart_log);
        fclose(fp);
@@ -361,9 +375,40 @@
        char endurance_s[sizeof(vpd.endurance) + 1], 
capacity_s[sizeof(vpd.capacity)+1];
         uint64_t event_id;
        uint8_t severity;
+       FILE *fp;
+       char tr_file_path[PATH_MAX];
        uint32_t raw_data_len = 0;
        unsigned char *raw_data = NULL;
 
+       /*
+        * Skip diag test if NVMe is connected over fabric
+        */
+       snprintf(tr_file_path, sizeof(tr_file_path),
+                       NVME_SYS_PATH"/%s/%s", device_name, "transport");
+       fp = fopen(tr_file_path, "r");
+       if (fp) {
+               char buf[12];
+               int n = fread(buf, 1, sizeof(buf), fp);
+
+               if (n) {
+                       /*
+                        * If NVMe transport is anything but pcie then skip the 
diag test
+                        */
+                       if (strncmp(buf, "pcie", 4) != 0) {
+                               fprintf(stdout, "Skipping diagnostics for nvmf 
: %s\n",
+                                               device_name);
+                               fclose(fp);
+                               return 0;
+                       }
+               }
+               fclose(fp);
+       } else {
+               fprintf(stderr, "Skipping diagnostics for %s:\n"
+                               "Unable to find the nvme transport type\n",
+                               device_name);
+               return -1;
+       }
+
        tmp_rc = regex_controller(controller_name, device_name);
        if (tmp_rc != 0)
                return -1;
@@ -710,8 +755,11 @@
        int num_elements = 0;
        struct dictionary dict[MAX_DICT_ELEMENTS];
 
-       if ((num_elements = read_file_dict(file_path, dict, MAX_DICT_ELEMENTS)) 
< 0)
+       if ((num_elements = read_file_dict(file_path, dict, MAX_DICT_ELEMENTS)) 
< 0) {
+               fprintf(stderr, "read_file_dict failed: %s, rc % d\n",
+                               file_path, num_elements);
                return num_elements;
+       }
        return set_smart_log_field(log, dict, num_elements);
 }
 
@@ -972,14 +1020,9 @@
 }
 
 static void print_usage(char *command) {
-       printf("Usage: %s [-h] [-d <file>] [-f <file>] [<nvme_devices>]\n"
+       printf("Usage: %s [-h] [<nvmen ...>]\n"
                "\t-h or --help: print this help message\n"
-               "\t-d or --dump: dump SMART data to the specified path and file 
name <file>\n"
-               "\t                  one <nvme_device> is expected with this 
option\n"
-               "\t-f or --file: use SMART data from the specified path and 
file name <file>\n"
-               "\t                  instead of device, one <nvme_device> is 
expected with\n"
-               "\t                  this option\n"
-               "\t<nvme_devices>: the NVMe devices on which to operate, for\n"
+               "\t<nvmen ...>: the NVMe devices on which to operate, for\n"
                "\t                  example nvme0; if not specified, all 
detected\n"
                "\t                  nvme devices will be diagnosed\n", 
command);
 }
@@ -1426,28 +1469,6 @@
                strncpy(vpd->firmware_level, vpd_data, 
sizeof(vpd->firmware_level));
 }
 
-/* trim_trail_space - Trim trailing white spaces from string
- * @string - Null terminated string to remove white spaces from
- *
- * This function will alter the passed string by removing any trailing white 
spaces and null
- * terminating it at that point.
- */
-static void trim_trail_space(char *string) {
-       char *end;
-       size_t length;
-
-       if (string == NULL)
-               return;
-
-       if ((length = strlen(string)) == 0)
-               return;
-
-       end = string + length - 1;
-       while (end >= string && isspace(*end))
-               end--;
-       *(end + 1) = '\0';
-}
-
 static long double uint128_to_long_double(uint8_t *data) {
        int i;
        long double value = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/diags/man/diag_nvme.8 
new/ppc64-diag-2.7.10/diags/man/diag_nvme.8
--- old/ppc64-diag-2.7.9/diags/man/diag_nvme.8  2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/diags/man/diag_nvme.8 2024-09-13 07:24:56.000000000 
+0200
@@ -1,7 +1,7 @@
 .\"
-.\" Copyright (C) 2022 IBM Corporation
+.\" Copyright (C) 2022, 2023 IBM Corporation
 .\"
-.TH "DIAG_NVME" "8" "June 2022" "Linux" "PowerLinux Diagnostic Tools"
+.TH "DIAG_NVME" "8" "September 2023" "Linux" "PowerLinux Diagnostic Tools"
 .hy
 .SH NAME
 .PP
@@ -12,7 +12,7 @@
 .PD 0
 .P
 .PD
-\f[B]diag_nvme\f[] [\-d <\f[I]file\f[]>] [\-f <\f[I]file\f[]>]
+\f[B]diag_nvme\f[]
 <\f[B]nvme\f[]\f[I]n\f[]>
 .PD 0
 .P
@@ -29,52 +29,10 @@
 The user can control which events will be reported through the
 configuration file \f[I]/etc/ppc64\-diag/diag_nvme.config\f[]
 .SH OPTIONS
-.TP
-.B \f[B]\-d\f[], \f[B]--dump\f[] \f[I]file\f[]
-Dump SMART data to the specified path and file name \f[I]file\f[].
-The SMART data is extracted from an NVMe device, so specifying one is
-mandatory if this option is selected.
-File created is in a simple key=value format.
-.RS
-.RE
-.TP
-.B \f[B]\-f\f[], \f[B]--file\f[] \f[I]file\f[]
-This option usage is for testing only.
-Use SMART data from the specified path and file name \f[I]file\f[]
-instead of device, one NVMe is mandatory if this option is selected.
-The expected format of the file is a simple key=value that is the same
-one provided with the \-d / --dump option.
-If \f[I]file\f[] is missing from the filesystem it will be treated as a
-failure to retrieve SMART data and an event will be reported.
-.RS
-.RE
-.TP
-.B \f[B]\-h\f[], \f[B]--help\f[]
-Print a help message and exit
-.RS
-.RE
-.SH EXAMPLES
-.TP
-.B \f[B]diag_nvme\f[]
-Run diagnostics in all NVMe devices detected in the system.
-.RS
-.RE
-.TP
 .B \f[B]diag_nvme nvme0 nvme1\f[]
 Run diagnostics only in nvme0 and nvme1 devices.
 .RS
 .RE
-.TP
-.B \f[B]diag_nvme \-d smart.txt nvme0\f[]
-Dump SMART data from nvme0 into file smart.txt.
-.RS
-.RE
-.TP
-.B \f[B]diag_nvme \-f smart.txt nvme0\f[]
-Read SMART data from file smart.txt and use it as health information for
-diagnostics of device nvme0.
-.RS
-.RE
 .SH REPORTING BUGS
 .PP
 Patches and issues may be submitted at
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/lpd/lp_diag.c 
new/ppc64-diag-2.7.10/lpd/lp_diag.c
--- old/ppc64-diag-2.7.9/lpd/lp_diag.c  2022-10-14 11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/lpd/lp_diag.c 2024-09-13 07:24:56.000000000 +0200
@@ -35,6 +35,9 @@
 #include "servicelog.h"
 #include "indicator.h"
 #include "lp_util.h"
+#include "utils.h"
+
+static int rtas_event;
 
 /* FRU callout priority as defined in PAPR+
  *
@@ -172,8 +175,10 @@
                        return 0;
                }
                break;
-       case SL_TYPE_BMC:
        case SL_TYPE_RTAS:
+               rtas_event = 1;
+               break;
+       case SL_TYPE_BMC:
        case SL_TYPE_BASIC:
        default:
                return 0;
@@ -344,6 +349,8 @@
                /* get FRUs nearest fault indicator */
                strncpy(location, callout->location, LOCATION_LENGTH);
                location[LOCATION_LENGTH - 1] = '\0';
+               trim_trail_space(location);
+
                loc_led = get_fru_indicator(list, location, &truncated);
                if (!loc_led) { /* No indicator found for the given loc code */
                        *attn_on = 1;
@@ -443,14 +450,20 @@
        attn_loc = &list[0];
 
        if (operating_mode == LED_MODE_LIGHT_PATH) {
-               if (event->callouts)
+               if (event->callouts) {
                        /* Run over FRU callout priority in order and
                         * enable fault indicator
                         */
-                       for (i = 0; FRU_CALLOUT_PRIORITY[i]; i++)
+                       if (!rtas_event) {
+                               for (i = 0; FRU_CALLOUT_PRIORITY[i]; i++)
+                                       rc = event_fru_callout(event->callouts, 
list,
+                                                       FRU_CALLOUT_PRIORITY[i],
+                                                       &attn_on);
+                       } else {
                                rc = event_fru_callout(event->callouts, list,
-                                                      FRU_CALLOUT_PRIORITY[i],
-                                                      &attn_on);
+                                               'H', &attn_on);
+                       }
+               }
                else {
                        /* No callout list, enable check log indicator */
                        indicator_log_write("Empty callout list");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/lpd/usysident.c 
new/ppc64-diag-2.7.10/lpd/usysident.c
--- old/ppc64-diag-2.7.9/lpd/usysident.c        2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/lpd/usysident.c       2024-09-13 07:24:56.000000000 
+0200
@@ -429,7 +429,7 @@
                                 * next elements in the list (which may match 
the device name);
                                 * for this we need to retry, re-starting on 
the next element.
                                 */
-                               if (dvalue && current->devname &&
+                               if (dvalue && current->devname[0] != '\0' &&
                                    strncmp(dvalue, current->devname, 
DEV_LENGTH)) {
                                        list_start = current->next;
                                        goto retry;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/opal_errd/extract_opal_dump.c 
new/ppc64-diag-2.7.10/opal_errd/extract_opal_dump.c
--- old/ppc64-diag-2.7.9/opal_errd/extract_opal_dump.c  2022-10-14 
11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/opal_errd/extract_opal_dump.c 2024-09-13 
07:24:56.000000000 +0200
@@ -77,8 +77,10 @@
        if (bsize >= DUMP_HDR_PREFIX_OFFSET + sizeof(uint16_t))
                *prefix_size = be16toh(*(uint16_t *)(buf + 
DUMP_HDR_PREFIX_OFFSET));
 
-       if (bsize >= DUMP_HDR_FNAME_OFFSET + DUMP_MAX_FNAME_LEN)
-               strncpy(dfile, buf + DUMP_HDR_FNAME_OFFSET, dfile_size);
+       if (bsize >= DUMP_HDR_FNAME_OFFSET + DUMP_MAX_FNAME_LEN) {
+               strncpy(dfile, buf + DUMP_HDR_FNAME_OFFSET, dfile_size - 1);
+               dfile[dfile_size - 1] = '\0';
+       }
        else
                strncpy(dfile, "platform.dumpid.PARTIAL", dfile_size);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ppc64-diag-2.7.9/ppc64-diag-ci/Dockerfile-ubuntu-22.10 
new/ppc64-diag-2.7.10/ppc64-diag-ci/Dockerfile-ubuntu-22.10
--- old/ppc64-diag-2.7.9/ppc64-diag-ci/Dockerfile-ubuntu-22.10  2022-10-14 
11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/ppc64-diag-ci/Dockerfile-ubuntu-22.10 1970-01-01 
01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-FROM ubuntu:22.10
-ENV DEBIAN_FRONTEND    noninteractive
-
-RUN apt-get update -qq
-RUN apt-get update -qq && apt-get install -y gcc g++ libstdc++-10-dev git make 
flex bison automake libtool pkg-config
-RUN apt-get update -qq && apt-get install -y debianutils xz-utils perl-base 
device-tree-compiler
-RUN apt-get update -qq && apt-get install -y libsqlite3-dev zlib1g-dev 
libvpd-dev librtas-dev librtasevent-dev
-RUN apt-get update -qq && apt-get install -y libservicelog-dev libncurses5-dev 
libsystemd-dev libudev-dev
-#RUN dnf -y install servicelog powerpc-utils lsvpd
-COPY . /build/
-WORKDIR /build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ppc64-diag-2.7.9/ppc64-diag-ci/Dockerfile-ubuntu-23.04 
new/ppc64-diag-2.7.10/ppc64-diag-ci/Dockerfile-ubuntu-23.04
--- old/ppc64-diag-2.7.9/ppc64-diag-ci/Dockerfile-ubuntu-23.04  1970-01-01 
01:00:00.000000000 +0100
+++ new/ppc64-diag-2.7.10/ppc64-diag-ci/Dockerfile-ubuntu-23.04 2024-09-13 
07:24:56.000000000 +0200
@@ -0,0 +1,11 @@
+FROM ubuntu:23.04
+ENV DEBIAN_FRONTEND    noninteractive
+
+RUN apt-get update -qq
+RUN apt-get update -qq && apt-get install -y gcc g++ libstdc++-10-dev git make 
flex bison automake libtool pkg-config
+RUN apt-get update -qq && apt-get install -y debianutils xz-utils perl-base 
device-tree-compiler
+RUN apt-get update -qq && apt-get install -y libsqlite3-dev zlib1g-dev 
libvpd-dev librtas-dev librtasevent-dev
+RUN apt-get update -qq && apt-get install -y libservicelog-dev libncurses5-dev 
libsystemd-dev libudev-dev
+#RUN dnf -y install servicelog powerpc-utils lsvpd
+COPY . /build/
+WORKDIR /build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/ppc64-diag-ci/build-ubuntu-22.10.sh 
new/ppc64-diag-2.7.10/ppc64-diag-ci/build-ubuntu-22.10.sh
--- old/ppc64-diag-2.7.9/ppc64-diag-ci/build-ubuntu-22.10.sh    2022-10-14 
11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/ppc64-diag-ci/build-ubuntu-22.10.sh   1970-01-01 
01:00:00.000000000 +0100
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-set -uo pipefail
-set -e
-set -vx
-MAKE_J=$(grep -c processor /proc/cpuinfo)
-BUILDDIR=`pwd`
-
-#Build the sources
-./autogen.sh
-./configure
-make -j $MAKE_J
-make -j $MAKE_J check
-
-#Run tests
-cd $BUILDDIR/opal_errd/ && ./run_tests
-cd $BUILDDIR/common && ./run_tests
-cd $BUILDDIR/diags/test && ./run_tests
-cd $BUILDDIR
-
-#Build rpms
-make dist-gzip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/ppc64-diag-ci/build-ubuntu-23.04.sh 
new/ppc64-diag-2.7.10/ppc64-diag-ci/build-ubuntu-23.04.sh
--- old/ppc64-diag-2.7.9/ppc64-diag-ci/build-ubuntu-23.04.sh    1970-01-01 
01:00:00.000000000 +0100
+++ new/ppc64-diag-2.7.10/ppc64-diag-ci/build-ubuntu-23.04.sh   2024-09-13 
07:24:56.000000000 +0200
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -uo pipefail
+set -e
+set -vx
+MAKE_J=$(grep -c processor /proc/cpuinfo)
+BUILDDIR=`pwd`
+
+#Build the sources
+./autogen.sh
+./configure
+make -j $MAKE_J
+make -j $MAKE_J check
+
+#Run tests
+cd $BUILDDIR/opal_errd/ && ./run_tests
+cd $BUILDDIR/common && ./run_tests
+cd $BUILDDIR/diags/test && ./run_tests
+cd $BUILDDIR
+
+#Build rpms
+make dist-gzip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/ppc64-diag.spec.in 
new/ppc64-diag-2.7.10/ppc64-diag.spec.in
--- old/ppc64-diag-2.7.9/ppc64-diag.spec.in     2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/ppc64-diag.spec.in    2024-09-13 07:24:56.000000000 
+0200
@@ -124,6 +124,15 @@
 fi
 
 %changelog
+* Fri Sep 13 2024 - Mahesh Salgaonkar <mah...@linux.ibm.com> - 2.7.10
+- Add support for multiple platform dumps
+- Add support for light path diagnostics for rtas events
+- Enable correct display of model and system-id for IPS Power systems
+- Fix call home feature for nvmf devices
+- Fix crash in rtas_errd due to invalid -f option values
+- Fix build warnings with GCC-15
+- Update travis build to use v3 supported tags
+
 * Wed Oct 12 2022 - Mahesh Salgaonkar <mah...@linux.ibm.com> - 2.7.9
 - Add NVMe diagnostics support (Murilo).
 - Update travis build to use fedora37 and Ubuntu22.10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/rtas_errd/dump.c 
new/ppc64-diag-2.7.10/rtas_errd/dump.c
--- old/ppc64-diag-2.7.9/rtas_errd/dump.c       2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/rtas_errd/dump.c      2024-09-13 07:24:56.000000000 
+0200
@@ -30,8 +30,10 @@
 #include <fcntl.h>
 #include <librtas.h>
 #include <librtasevent.h>
+#include <syslog.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <sys/statvfs.h>
 #include "utils.h"
 #include "rtas_errd.h"
 
@@ -41,6 +43,7 @@
 #define SCANLOG_DUMP_FILE      "/proc/ppc64/scan-log-dump"
 #define SCANLOG_DUMP_EXISTS    "/proc/device-tree/chosen/ibm,scan-log-data"
 #define SYSID_FILE             "/proc/device-tree/system-id"
+#define SYSID_VENDOR_FILE      "/proc/device-tree/ibm,vendor-system-id"
 #define SCANLOG_MODULE         "scanlog"
 #define MODPROBE_PROGRAM       "/sbin/modprobe"
 
@@ -60,21 +63,26 @@
 {
        FILE *fp;
        char buf[20] = {0,}, *ret = NULL;
+       char *filename = SYSID_VENDOR_FILE;
 
        /*
         * Odds of SYSID_FILE, open failing is almost none.
         * But, better to catch the odds.
         */
-       fp = fopen(SYSID_FILE, "r");
+       fp = fopen(filename, "r");
        if (!fp) {
-               log_msg(NULL, "%s: Failed to open %s, %s",
-                               __func__, SYSID_FILE, strerror(errno));
-               return ret;
+               filename = SYSID_FILE;
+               fp = fopen(filename, "r");
+               if (!fp) {
+                       log_msg(NULL, "%s: Failed to open %s, %s", __func__,
+                                       filename, strerror(errno));
+                       return ret;
+               }
        }
 
        if (fgets(buf, sizeof(buf), fp) == NULL) {
                log_msg(NULL, "%s: Reading file %s failed, %s",
-                               __func__, SYSID_FILE, strerror(errno));
+                               __func__, filename, strerror(errno));
        } else {
                ret = strdup(buf + 4);
                if (!ret) {
@@ -284,7 +292,9 @@
 check_platform_dump(struct event *event)
 {
        struct rtas_dump_scn *dump_scn;
+       struct statvfs vfs;
        uint64_t dump_tag;
+       uint64_t dump_size;
        char    filename[DUMP_MAX_FNAME_LEN + 20], *pos;
        char    *pathname = NULL;
        FILE    *f;
@@ -306,11 +316,34 @@
                return;
        }
 
-       /* Retrieve the dump */
+       /* Retrieve the dump tag */
        dump_tag = dump_scn->id;
        dump_tag |= ((uint64_t)dump_scn->v6hdr.subtype << 32);
        dbg("Dump ID: 0x%016LX", dump_tag);
 
+       if (statvfs(d_cfg.platform_dump_path, &vfs) == -1) {
+               log_msg(event, "statvfs() failed on %s: %s",
+                               d_cfg.platform_dump_path, strerror(errno));
+               return;
+       }
+
+       /* Retrieve the size of the platform dump */
+       dump_size = dump_scn->size_hi;
+       dump_size <<= 32;
+       dump_size |= dump_scn->size_lo;
+
+       /* Check if there is sufficient space in the file system to store the 
dump */
+       if (vfs.f_bavail * vfs.f_frsize < dump_size) {
+               syslog(LOG_ERR, "Insufficient space in %s to store platform 
dump for dump ID: "
+                               "0x%016lX (required: %lu bytes, available: %lu 
bytes)",
+                               d_cfg.platform_dump_path, dump_tag, dump_size,
+                               (vfs.f_bavail * vfs.f_frsize));
+               syslog(LOG_ERR, "After clearing space, run 'extract_platdump "
+                               "0x%016lX'.\n", dump_tag);
+               return;
+       }
+
+       /* Retrieve the dump */
        snprintf(tmp_sys_arg, 60, "0x%016LX", (long long unsigned int)dump_tag);
        system_args[0] = EXTRACT_PLATDUMP_CMD;
        system_args[1] = tmp_sys_arg;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/rtas_errd/extract_platdump.c 
new/ppc64-diag-2.7.10/rtas_errd/extract_platdump.c
--- old/ppc64-diag-2.7.9/rtas_errd/extract_platdump.c   2022-10-14 
11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/rtas_errd/extract_platdump.c  2024-09-13 
07:24:56.000000000 +0200
@@ -220,7 +220,7 @@
        char    filename[DUMP_MAX_FNAME_LEN + 1];
        char    pathname[PATH_MAX];
        char    dump_err[RTAS_ERROR_LOG_MAX];
-       char    dumpid[5];
+       char    dumpid[5] = "";
        int     out=-1, rc, librtas_rc, dump_complete=0, ret=0;
 
        msg("Dump tag: 0x%016LX", dump_tag);
@@ -290,12 +290,6 @@
                }
        }
 
-       /*
-        * Before writing the new dump out, we need to see if any older
-        * dumps need to be removed first
-        */
-       remove_old_dumpfiles(filename, prefix_size);
-
        /* Copy the dump off to the filesystem */
        pathname[0] = '\0';
        strcpy(pathname, d_cfg.platform_dump_path);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/rtas_errd/files.c 
new/ppc64-diag-2.7.10/rtas_errd/files.c
--- old/ppc64-diag-2.7.9/rtas_errd/files.c      2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/rtas_errd/files.c     2024-09-13 07:24:56.000000000 
+0200
@@ -284,10 +284,27 @@
                proc_error_log_fd = open(proc_error_log2, O_RDONLY);
 
        if (proc_error_log_fd < 0) {
-               log_msg(NULL, "Could not open error log file at either %s or "
-                       "%s, %s\nThe rtas_errd daemon cannot continue and will "
-                       "exit", proc_error_log1, proc_error_log2,
-                       strerror(errno));
+
+               if (strlen(proc_error_log1) <= 2048) {
+                       log_msg(NULL, "Could not open error log file at either 
%s or "
+                                       "%s, %s\nThe rtas_errd daemon cannot 
continue and will "
+                                       "exit", proc_error_log1, 
proc_error_log2,
+                                       strerror(errno));
+               } else {
+                       /* If the filename is too long, truncate it */
+                       char truncated_filename[2048];
+
+                       strncpy(truncated_filename, proc_error_log1,
+                                       sizeof(truncated_filename) - 1);
+                       truncated_filename[sizeof(truncated_filename) - 1] = 
'\0';
+
+                       log_msg(NULL, "Truncating the filename since it is too 
long "
+                                       "(%d characters)", 
strlen(proc_error_log1));
+                       log_msg(NULL, "Could not open error log file at either 
%s or "
+                                       "%s, %s\nThe rtas_errd daemon cannot 
continue and will "
+                                       "exit", truncated_filename, 
proc_error_log2,
+                                       strerror(errno));
+               }
                return -1;
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/rtas_errd/rtas_errd.c 
new/ppc64-diag-2.7.10/rtas_errd/rtas_errd.c
--- old/ppc64-diag-2.7.9/rtas_errd/rtas_errd.c  2022-10-14 11:41:34.000000000 
+0200
+++ new/ppc64-diag-2.7.10/rtas_errd/rtas_errd.c 2024-09-13 07:24:56.000000000 
+0200
@@ -30,6 +30,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <librtas.h>
+#include <limits.h>
 
 #include "rtas_errd.h"
 #include "platform.h"
@@ -474,6 +475,12 @@
 
                                f_flag++;
                                proc_error_log1 = optarg;
+                               if (strlen(proc_error_log1) > PATH_MAX) {
+                                       fprintf(stderr, "The specified file 
path %s exceeds"
+                                                       " the maximum supported 
file length of 4096 characters.\n",
+                                                       proc_error_log1);
+                                       goto error_out;
+                               }
                                proc_error_log2 = NULL;
                                break;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ppc64-diag-2.7.9/scripts/ppc64_diag_mkrsrc 
new/ppc64-diag-2.7.10/scripts/ppc64_diag_mkrsrc
--- old/ppc64-diag-2.7.9/scripts/ppc64_diag_mkrsrc      2022-10-14 
11:41:34.000000000 +0200
+++ new/ppc64-diag-2.7.10/scripts/ppc64_diag_mkrsrc     2024-09-13 
07:24:56.000000000 +0200
@@ -122,11 +122,18 @@
        $partition_no = "000";
 }
 
-# Retrieve CEC MTMS from /proc/device-tree/model and 
/proc/device-tree/system-id
-$cec_machinetype = `cat /proc/device-tree/model | cut -c5- 2>/dev/null`;
+# Retrieve CEC MTMS from /proc/device-tree/*model and 
/proc/device-tree/*system-id
+$cec_machinetype = -e '/proc/device-tree/ibm,vendor-model' ?
+`cat /proc/device-tree/ibm,vendor-model | cut -c5- 2>/dev/null` :
+`cat /proc/device-tree/model | cut -c5- 2>/dev/null`;
+
 chomp $cec_machinetype;
 chop $cec_machinetype;
-$cec_machineserial = `cat /proc/device-tree/system-id | cut -c7- 2>/dev/null`;
+
+$cec_machineserial = -e '/proc/device-tree/ibm,vendor-system-id' ?
+`cat /proc/device-tree/ibm,vendor-system-id | cut -c5- 2>/dev/null` :
+`cat /proc/device-tree/system-id | cut -c5- 2>/dev/null` :
+
 chomp $cec_machineserial;
 chop $cec_machineserial;
 

Reply via email to