Author: iratqq
Date: Fri Apr 11 00:19:04 2008
New Revision: 5407
Modified:
trunk/helper/dict-canna.c
Log:
* helper/dict-canna.c (dict_canna_get_priv_dic_dir):
- Change API.
- Fix misused snprintf.
- Plug memleak.
(dict_canna_read_priv_dic_list):
- Sync API.
(dict_canna_add_entry_to_priv_dic)
(dict_canna_delete_entry_from_priv_dic):
- Use asprintf.
Modified: trunk/helper/dict-canna.c
==============================================================================
--- trunk/helper/dict-canna.c (original)
+++ trunk/helper/dict-canna.c Fri Apr 11 00:19:04 2008
@@ -35,6 +35,7 @@
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
+#include <sys/param.h>
#include <canna/RK.h>
@@ -100,26 +101,21 @@
return 0;
}
-static char *
-dict_canna_get_priv_dic_dir()
+static int
+dict_canna_get_priv_dic_dir(char *dirname, size_t len)
{
struct passwd *pw;
- char *username;
- char *dirname = NULL;
char dir[] = ":user/";
- if ((pw = getpwuid(getuid()))) {
- if ((username = strdup(pw->pw_name))) {
- int len;
- /* dirname := ":user/username" */
- len = strlen(dir) + strlen(username) + 1;
- if ((dirname = malloc(len))) {
- snprintf(dirname, len, "%s%s", dir, username);
- }
- }
+ if ((pw = getpwuid(getuid())) != NULL) {
+ /* dirname := ":user/username" */
+ snprintf(dirname, len, "%s%s", dir, pw->pw_name);
+ endpwent();
+ return 1;
}
+ endpwent();
- return dirname;
+ return 0;
}
static void
@@ -207,9 +203,9 @@
unsigned char buf[CANNA_PRIV_DIC_BUFLEN];
unsigned char dicname[] = CANNA_DEFAULT_PRIV_DICNAME;
- char *dirname;
+ char dirname[MAXPATHLEN];
- if (!(dirname = dict_canna_get_priv_dic_dir()))
+ if (!dict_canna_get_priv_dic_dir(dirname, sizeof(dirname)))
return status;
status = RkGetWordTextDic(CANNA_STD_CONTEXT, (unsigned char *)dirname,
@@ -224,7 +220,6 @@
status = RkGetWordTextDic(CANNA_STD_CONTEXT, (unsigned char *)"",
(unsigned char *)"", buf, CANNA_PRIV_DIC_BUFLEN);
}
- free(dirname);
return status;
}
@@ -244,16 +239,12 @@
status = RkMountDic(CANNA_STD_CONTEXT, dicname, 0);
if (status == 0) {
- int len;
- len = strlen(phon) + strlen(cclass_native) + strlen(desc) + 4;
- entry = malloc(len);
- if (entry) {
- snprintf(entry, len, "%s %s %s\n", phon, cclass_native, desc);
+ if (asprintf(&entry, "%s %s %s\n", phon, cclass_native, desc) < 0 |
| entry == NULL) {
status = RkDefineDic(CANNA_STD_CONTEXT, dicname, entry);
free(entry);
}
RkUnmountDic(CANNA_STD_CONTEXT, dicname);
- }
+ }
RkFinalize();
return status ? 0 : 1;
@@ -274,16 +265,12 @@
status = RkMountDic(CANNA_STD_CONTEXT, dicname, 0);
if (status == 0) {
- int len;
- len = strlen(phon) + strlen(cclass_native) + strlen(desc) + 4;
- entry = malloc(len);
- if (entry) {
- snprintf(entry, len, "%s %s %s\n", phon, cclass_native, desc);
+ if (asprintf(&entry, "%s %s %s\n", phon, cclass_native, desc) < 0 |
| entry == NULL) {
status = RkDeleteDic(CANNA_STD_CONTEXT, dicname, entry);
free(entry);
}
RkUnmountDic(CANNA_STD_CONTEXT, dicname);
- }
+ }
RkFinalize();
return status ? 0 : 1;