Re: [PATCH / request for votes] Support double byte characters
Bill Fenner <[email protected]>
| Newsgroups | gmane.network.net-snmp.devel |
|---|---|
| Message-ID | <CAF4SogZFXMNZvUySVs5cYwwCHBBH1ythVrtqoZgZ-DKjFmqOXg@mail.gmail.com> |
I agree with the concept of handling UTF-8, but I do not like this implementation. We discussed this a couple of months ago, https://sourceforge.net/p/net-snmp/mailman/message/36322758/ Bill On Mon, Jul 16, 2018 at 5:16 AM Josef Ridky <[email protected]> wrote: > Net-SNMP isn't able to handle double byte characters like UTF-8. > Though it can handle single byte characters (US-ASCII characters) > properly, UTF-8 and ShiftJIS characters are displays as "........." > > Steps to Reproduce: > - Edit /etc/snmp/snmptrapd.conf and add or uncomment the following line. > > authCommunity log,execute,net public > > Start snmptrapd service. > > # systemctl start snmptrapd > > Run following command. > > # snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.2.1.3 > .1.3.6.1.4.1.8072.2.1.3 s "データ" > > Check the /var/log/messages or journalctl > > Following patch brings support for double byte characters (UTF-8). > All comments are welcome. > > --- > diff -urNp old/snmplib/mib.c new/snmplib/mib.c > --- old/snmplib/mib.c 2017-10-18 09:47:39.345569965 +0200 > +++ new/snmplib/mib.c 2017-10-18 14:05:11.237452328 +0200 > @@ -370,7 +371,31 @@ sprint_realloc_hexstring(u_char ** buf, > return 1; > } > > +/** > + * Check, if given character contains value specific for UTF-8 encoding. > + * > + * @param cp character to check > + * > + * @return 0 on failure, 2 for two-byte character, 3 for three-byte > character > + * and 4 for four-byte character > + */ > +int > +isUTF8MultiByte(const u_char cp) > +{ > + if(cp >= 0xC2 && cp <= 0xDF){ > + return 2; > + } > + > + if(cp >= 0xE0 && cp <= 0xEF){ > + return 3; > + } > > + if(cp >= 0xF2 && cp <= 0xFF){ > + return 4; > + } > + > + return 0; > +} > > /** > * Prints an ascii string into a buffer. > @@ -396,22 +421,36 @@ sprint_realloc_asciistring(u_char ** buf > size_t * out_len, int allow_realloc, > const u_char * cp, size_t len) > { > - int i; > + int i, j, multibyte; > > for (i = 0; i < (int) len; i++) { > - if (isprint(*cp) || isspace(*cp)) { > - if (*cp == '\\' || *cp == '"') { > + if (isprint(*cp) || isspace(*cp) || isUTF8MultiByte(*cp) > 0) { > + > + multibyte = isUTF8MultiByte(*cp); > + > + if(multibyte > 0){ > + for(j = 0; j < multibyte; j++, i++) { > + if ((*out_len >= *buf_len) && > + !(allow_realloc && snmp_realloc(buf, buf_len))) { > + return 0; > + } > + *(*buf + (*out_len)++) = *cp++; > + > + } > + } else { > + if (*cp == '\\' || *cp == '"') { > + if ((*out_len >= *buf_len) && > + !(allow_realloc && snmp_realloc(buf, buf_len))) { > + return 0; > + } > + *(*buf + (*out_len)++) = '\\'; > + } > if ((*out_len >= *buf_len) && > !(allow_realloc && snmp_realloc(buf, buf_len))) { > return 0; > } > - *(*buf + (*out_len)++) = '\\'; > - } > - if ((*out_len >= *buf_len) && > - !(allow_realloc && snmp_realloc(buf, buf_len))) { > - return 0; > + *(*buf + (*out_len)++) = *cp++; > } > - *(*buf + (*out_len)++) = *cp++; > } else { > if ((*out_len >= *buf_len) && > !(allow_realloc && snmp_realloc(buf, buf_len))) { > --- > > Regards > > Josef Ridky > Associate Software Engineer > Core Services Team > Red Hat Czech, s.r.o. > > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Net-snmp-coders mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/net-snmp-coders > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Net-snmp-coders mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/net-snmp-coders