]>
Commit | Line | Data |
---|---|---|
97d07967 | 1 | diff -ur bsd-finger-0.17/finger/util.c bsd-finger-0.17-iconv/finger/util.c |
48e3f119 JR |
2 | --- bsd-finger-0.17/finger/util.c 2008-10-04 00:48:15.000000000 +0200 |
3 | +++ bsd-finger-0.17-iconv/finger/util.c 2008-10-04 00:47:47.000000000 +0200 | |
97d07967 JR |
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 */ | |
48e3f119 JR |
19 | @@ -183,7 +191,7 @@ |
20 | { | |
21 | char *p; | |
22 | int i, j, ct, rv=0; | |
23 | - char *rname; | |
24 | + char *rname, *irname = NULL; | |
25 | ||
26 | strncpy(tbuf, pw->pw_gecos, TBUFLEN); | |
27 | tbuf[TBUFLEN-1] = 0; /* guarantee null termination */ | |
28 | @@ -222,11 +230,62 @@ | |
29 | } | |
30 | } | |
31 | rname[j] = 0; | |
32 | +#if defined(HAVE_LANGINFO_H) && defined(HAVE_ICONV) | |
33 | + irname = malloc(2*strlen(rname) + 1); | |
34 | + if (irname) | |
35 | + strcpy(irname, rname); | |
36 | +#endif | |
37 | ||
38 | for (p = strtok(rname, "\t "); p && !rv; p = strtok(NULL, "\t ")) { | |
97d07967 JR |
39 | if (!strcasecmp(p, user)) |
40 | rv = 1; | |
41 | } | |
42 | + | |
43 | +#if defined(HAVE_LANGINFO_H) && defined(HAVE_ICONV) | |
48e3f119 JR |
44 | + if (!rv && has_locale && irname) { |
45 | + char *iuser, *inbuf, *outbuf; | |
97d07967 JR |
46 | + iconv_t cd; |
47 | + size_t il, ol; | |
48 | + | |
97d07967 JR |
49 | + iuser = malloc(2*strlen(user) + 1); |
50 | + if (!iuser) | |
48e3f119 JR |
51 | + goto done; |
52 | + strcpy(rname, irname); | |
97d07967 JR |
53 | + memset(iuser, 0, 2*strlen(user) + 1); |
54 | + memset(irname, 0, 2*strlen(rname) + 1); | |
55 | + | |
56 | + cd = iconv_open("ascii//translit", nl_langinfo(CODESET)); | |
57 | + if (cd == (iconv_t)-1) | |
58 | + goto done_user; | |
59 | + | |
60 | + il = strlen(rname); | |
61 | + ol = 2*strlen(rname); | |
62 | + inbuf = rname; | |
63 | + outbuf = irname; | |
64 | + i = iconv(cd, &inbuf, &il, &outbuf, &ol); | |
65 | + | |
66 | + il = strlen(user); | |
67 | + ol = 2*strlen(user); | |
68 | + inbuf = (char *)user; | |
69 | + outbuf = iuser; | |
70 | + j = iconv(cd, &inbuf, &il, &outbuf, &ol); | |
71 | + | |
72 | + if (i < 0 || j < 0 ) | |
73 | + goto done_iconv; | |
74 | + | |
75 | + for (p = strtok(irname, "\t "); p && !rv; p = strtok(NULL, "\t ")) { | |
76 | + if (!strcasecmp(p, iuser)) | |
77 | + rv = 1; | |
78 | + } | |
79 | +done_iconv: | |
80 | + iconv_close(cd); | |
81 | +done_user: | |
82 | + free(iuser); | |
97d07967 JR |
83 | + } |
84 | +done: | |
48e3f119 JR |
85 | + if (irname) |
86 | + free(irname); | |
97d07967 JR |
87 | +#endif |
88 | free(rname); | |
89 | ||
90 | return rv; |