xpp: clean 'Extrainfo' EEPROM field
authorOron Peled <oron.peled@xorcom.com>
Thu, 15 Mar 2012 20:29:09 +0000 (20:29 +0000)
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>
Thu, 15 Mar 2012 20:29:09 +0000 (20:29 +0000)
* Extrainfo field contains junk data
* Caused by:
  - The field is initialized to 0xFF values
  - There was no null termination (and no room to add it)
* New code:
  - Ensure that show_extrainfo() have null termination even if EEPROM
    field is full.
  - Replace trailing 0xFF characters with '\0' when reading this field
  - Since our default burned EEPROM contain Extrainfo field full of
    0xFF characters, this would make them look as null filled.

Internal Issue-Id: #1341
Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

git-svn-id: http://svn.astersk.org/svn/dahdi/tools/trunk@10491 17933a7a-c749-41c5-a318-cba88f637d49

xpp/mpp.h
xpp/mpptalk.c
xpp/mpptalk_defs.h

index 23a0ce9..e6b8e3a 100644 (file)
--- a/xpp/mpp.h
+++ b/xpp/mpp.h
@@ -83,7 +83,7 @@ struct capkey {
 } PACKED;
 
 struct extrainfo {
-       char            text[24];
+       char            text[EXTRAINFO_SIZE];
 } PACKED;
 
 struct mpp_header {
index a8bf12a..6b33743 100644 (file)
@@ -366,7 +366,17 @@ int mpp_extrainfo_get(struct astribank_device *astribank, struct extrainfo *info
        }
        assert(reply->header.op == MPP_EXTRAINFO_GET_REPLY);
        if(info) {
+               int i;
+
                memcpy(info, (void *)&CMD_FIELD(reply, MPP, EXTRAINFO_GET_REPLY, info), sizeof(*info));
+               /*
+                * clean non-printing characters
+                */
+               for (i = sizeof(*info) - 1; i >= 0; i--) {
+                       if (info->text[i] != (char)0xFF)
+                               break;
+                       info->text[i] = '\0';
+               }
        }
        free_command(reply);
        return 0;
@@ -876,7 +886,11 @@ void show_astribank_status(struct astribank_device *astribank, FILE *fp)
 
 void show_extrainfo(const struct extrainfo *extrainfo, FILE *fp)
 {
-       fprintf(fp, "Extrainfo:             : %s\n", (const char *)(extrainfo->text));
+       char    buf[EXTRAINFO_SIZE + 1];
+
+       memcpy(buf, extrainfo->text, EXTRAINFO_SIZE);
+       buf[EXTRAINFO_SIZE] = '\0';     /* assure null termination */
+       fprintf(fp, "Extrainfo:             : '%s'\n", buf);
 }
 
 int twinstar_show(struct astribank_device *astribank, FILE *fp)
index e38f381..bc0b83b 100644 (file)
@@ -108,4 +108,6 @@ enum dev_dest {
        DEST_EEPROM     = 0x02,
 };
 
+#define        EXTRAINFO_SIZE  24
+
 #endif /* MPPTALK_DEFS_H */