static void mh_get_last_num(Folder *folder, FolderItem *item)
{
- gchar *path;
+ gchar *path, *fullpath;
GDir *dp;
const gchar *d;
GError *error = NULL;
path = folder_item_get_path(item);
cm_return_if_fail(path != NULL);
- if (change_dir(path) < 0) {
- g_free(path);
- return;
- }
- g_free(path);
- if ((dp = g_dir_open(".", 0, &error)) == NULL) {
+ if ((dp = g_dir_open(path, 0, &error)) == NULL) {
g_message("Couldn't open current directory: %s (%d).\n",
error->message, error->code);
g_error_free(error);
+ g_free(path);
return;
}
while ((d = g_dir_read_name(dp)) != NULL) {
+ fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, d, NULL);
if ((num = to_number(d)) > 0 &&
- g_file_test(d, G_FILE_TEST_IS_REGULAR)) {
+ g_file_test(fullpath, G_FILE_TEST_IS_REGULAR)) {
if (max < num)
max = num;
}
+ g_free(fullpath);
+
if (num % 2000 == 0)
GTK_EVENTS_FLUSH();
}
g_dir_close(dp);
+ g_free(path);
debug_print("Last number in dir %s = %d\n", item->path?item->path:"(null)", max);
item->last_num = max;
path = folder_item_get_path(item);
cm_return_val_if_fail(path != NULL, -1);
- if (change_dir(path) < 0) {
- g_free(path);
- return -1;
- }
- g_free(path);
- if ((dp = g_dir_open(".", 0, &error)) == NULL) {
+ if ((dp = g_dir_open(path, 0, &error)) == NULL) {
g_message("Couldn't open current directory: %s (%d).\n",
error->message, error->code);
g_error_free(error);
+ g_free(path);
return -1;
}
+ g_free(path);
while ((d = g_dir_read_name(dp)) != NULL) {
if ((num = to_number(d)) > 0) {
MsgInfo *msginfo)
{
GStatBuf s;
+ gchar *path;
- if (g_stat(itos(msginfo->msgnum), &s) < 0 ||
+ path = g_strdup_printf("%s%c%d", folder_item_get_path(item),
+ G_DIR_SEPARATOR, msginfo->msgnum);
+ if (g_stat((path), &s) < 0 ||
msginfo->size != s.st_size || (
(msginfo->mtime - s.st_mtime != 0) &&
(msginfo->mtime - s.st_mtime != 3600) &&
- (msginfo->mtime - s.st_mtime != -3600)))
+ (msginfo->mtime - s.st_mtime != -3600))) {
+ g_free(path);
return TRUE;
+ }
+ g_free(path);
return FALSE;
}
static gint mh_scan_tree(Folder *folder)
{
FolderItem *item;
- gchar *rootpath;
cm_return_val_if_fail(folder != NULL, -1);
} else
item = FOLDER_ITEM(folder->node->data);
- rootpath = folder_item_get_path(item);
- if (change_dir(rootpath) < 0) {
- g_free(rootpath);
- return -1;
- }
- g_free(rootpath);
-
mh_create_tree(folder);
mh_remove_missing_folder_items(folder);
mh_scan_tree_recursive(item);
} \
if (make_dir_hier(dir) < 0) \
return -1; \
+ debug_print("Created dir '%s'\n", dir); \
} \
}
static gint mh_create_tree(Folder *folder)
{
- gchar *rootpath, *f;
+ gchar *rootpath, *f, *path;
cm_return_val_if_fail(folder != NULL, -1);
- CHDIR_RETURN_VAL_IF_FAIL(get_mail_base_dir(), -1);
rootpath = LOCAL_FOLDER(folder)->rootpath;
+#ifdef G_OS_UNIX
+ if (*rootpath == '/') {
+#elif defined G_OS_WIN32
+ if (g_ascii_isalpha(*rootpath) && !strncmp(rootpath + 1, "\:", 2)) {
+#endif
+ /* Folder path is absolute. */
+ rootpath = g_strdup(rootpath);
+ } else {
+ /* Folder path is relative, using mail base dir. */
+ rootpath = g_strconcat(get_mail_base_dir(), G_DIR_SEPARATOR_S,
+ rootpath, NULL);
+ }
+
MAKE_DIR_IF_NOT_EXIST(rootpath);
- CHDIR_RETURN_VAL_IF_FAIL(rootpath, -1);
/* Create special directories as needed */
if (folder->inbox != NULL &&
f = folder->inbox->path;
else
f = INBOX_DIR;
- MAKE_DIR_IF_NOT_EXIST(f);
+ path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL);
+ MAKE_DIR_IF_NOT_EXIST(path);
+ g_free(path);
if (folder->outbox != NULL &&
folder->outbox->path != NULL)
f = folder->outbox->path;
else
f = OUTBOX_DIR;
- MAKE_DIR_IF_NOT_EXIST(f);
+ path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL);
+ MAKE_DIR_IF_NOT_EXIST(path);
+ g_free(path);
if (folder->draft != NULL &&
folder->draft->path != NULL)
f = folder->draft->path;
else
f = DRAFT_DIR;
- MAKE_DIR_IF_NOT_EXIST(f);
+ path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL);
+ MAKE_DIR_IF_NOT_EXIST(path);
+ g_free(path);
if (folder->queue != NULL &&
folder->queue->path != NULL)
f = folder->queue->path;
else
f = QUEUE_DIR;
- MAKE_DIR_IF_NOT_EXIST(f);
+ path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL);
+ MAKE_DIR_IF_NOT_EXIST(path);
+ g_free(path);
if (folder->trash != NULL &&
folder->trash->path != NULL)
f = folder->trash->path;
else
f = TRASH_DIR;
- MAKE_DIR_IF_NOT_EXIST(f);
+ path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL);
+ MAKE_DIR_IF_NOT_EXIST(path);
+ g_free(path);
+ g_free(rootpath);
return 0;
}
MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
if (info != NULL) {
gboolean ok = mh_renumber_msg(info);
- procmsg_msginfo_free(info);
+ procmsg_msginfo_free(&info);
if (!ok) {
g_free(fullpath);
return NULL;
Folder *folder;
GDir *dir;
const gchar *dir_name;
- gchar *real_path, *entry, *utf8entry, *utf8name;
+ gchar *entry, *utf8entry, *utf8name, *path;
gint n_msg = 0;
GError *error = NULL;
folder = item->folder;
- real_path = item->path ? mh_filename_from_utf8(item->path) : g_strdup(".");
- dir = g_dir_open(real_path, 0, &error);
+ path = folder_item_get_path(item);
+ debug_print("mh_scan_tree_recursive() opening '%s'\n", path);
+ dir = g_dir_open(path, 0, &error);
if (!dir) {
g_warning("failed to open directory '%s': %s (%d)",
- real_path, error->message, error->code);
+ path, error->message, error->code);
g_error_free(error);
- g_free(real_path);
+ g_free(path);
return;
}
- g_free(real_path);
debug_print("scanning %s ...\n",
item->path ? item->path
while ((dir_name = g_dir_read_name(dir)) != NULL) {
if (dir_name[0] == '.') continue;
+ entry = g_strconcat(path, G_DIR_SEPARATOR_S, dir_name, NULL);
+
utf8name = mh_filename_to_utf8(dir_name);
if (item->path)
utf8entry = g_strconcat(item->path, G_DIR_SEPARATOR_S,
utf8name, NULL);
else
utf8entry = g_strdup(utf8name);
- entry = mh_filename_from_utf8(utf8entry);
if (g_file_test(entry, G_FILE_TEST_IS_DIR)) {
FolderItem *new_item = NULL;
node = item->node;
for (node = node->children; node != NULL; node = node->next) {
FolderItem *cur_item = FOLDER_ITEM(node->data);
- gchar *curpath = mh_filename_from_utf8(cur_item->path);
+ gchar *curpath = folder_item_get_path(cur_item);
if (!strcmp2(curpath, entry)) {
new_item = cur_item;
g_free(curpath);
}
g_dir_close(dir);
+ g_free(path);
mh_set_mtime(folder, item);
}