]>
Commit | Line | Data |
---|---|---|
97d07967 JR |
1 | diff -ur bsd-finger-0.17/finger/util.c bsd-finger-0.17-iconv/finger/util.c |
2 | --- bsd-finger-0.17/finger/util.c 2008-10-03 23:13:12.000000000 +0200 | |
3 | +++ bsd-finger-0.17-iconv/finger/util.c 2008-10-03 23:11:21.000000000 +0200 | |
4 | @@ -53,6 +53,14 @@ | |
5 | #include <stdlib.h> | |
6 | #include "finger.h" | |
7 | ||
8 | +#define HAVE_LANGINFO_H 1 | |
9 | +#define HAVE_ICONV 1 | |
10 | + | |
11 | +#if defined(HAVE_LANGINFO_H) && defined(HAVE_ICONV) | |
12 | +#include <langinfo.h> | |
13 | +#include <iconv.h> | |
14 | +#endif | |
15 | + | |
16 | #define HBITS 8 /* number of bits in hash code */ | |
17 | #define HSIZE (1 << 8) /* hash table size */ | |
18 | #define HMASK (HSIZE - 1) /* hash code mask */ | |
19 | @@ -227,6 +235,54 @@ | |
20 | if (!strcasecmp(p, user)) | |
21 | rv = 1; | |
22 | } | |
23 | + | |
24 | +#if defined(HAVE_LANGINFO_H) && defined(HAVE_ICONV) | |
25 | + if (!rv && has_locale) { | |
26 | + char *irname, *iuser, *inbuf, *outbuf; | |
27 | + iconv_t cd; | |
28 | + size_t il, ol; | |
29 | + | |
30 | + irname = malloc(2*strlen(rname) + 1); | |
31 | + if (!irname) | |
32 | + goto done; | |
33 | + iuser = malloc(2*strlen(user) + 1); | |
34 | + if (!iuser) | |
35 | + goto done_rname; | |
36 | + memset(iuser, 0, 2*strlen(user) + 1); | |
37 | + memset(irname, 0, 2*strlen(rname) + 1); | |
38 | + | |
39 | + cd = iconv_open("ascii//translit", nl_langinfo(CODESET)); | |
40 | + if (cd == (iconv_t)-1) | |
41 | + goto done_user; | |
42 | + | |
43 | + il = strlen(rname); | |
44 | + ol = 2*strlen(rname); | |
45 | + inbuf = rname; | |
46 | + outbuf = irname; | |
47 | + i = iconv(cd, &inbuf, &il, &outbuf, &ol); | |
48 | + | |
49 | + il = strlen(user); | |
50 | + ol = 2*strlen(user); | |
51 | + inbuf = (char *)user; | |
52 | + outbuf = iuser; | |
53 | + j = iconv(cd, &inbuf, &il, &outbuf, &ol); | |
54 | + | |
55 | + if (i < 0 || j < 0 ) | |
56 | + goto done_iconv; | |
57 | + | |
58 | + for (p = strtok(irname, "\t "); p && !rv; p = strtok(NULL, "\t ")) { | |
59 | + if (!strcasecmp(p, iuser)) | |
60 | + rv = 1; | |
61 | + } | |
62 | +done_iconv: | |
63 | + iconv_close(cd); | |
64 | +done_user: | |
65 | + free(iuser); | |
66 | +done_rname: | |
67 | + free(irname); | |
68 | + } | |
69 | +done: | |
70 | +#endif | |
71 | free(rname); | |
72 | ||
73 | return rv; |