253
253
// if function succeeded, return new path and it's folder length.
254
254
gchar* ug_plugin_create_file (UgPlugin* plugin, const gchar* folder, const gchar* file, guint* folder_len)
256
UgPathPart* pathpart;
257
const gchar* tail_str;
258
259
guint location_len;
260
const gchar* tail_str; // string of '.' + filename extension
261
guint head_len; // length of folder + primary filename
263
if (folder == NULL && file == NULL) {
264
ug_plugin_post (plugin, ug_message_new_error (UG_MESSAGE_ERROR_FILE_CREATE_FAILED, NULL));
267
// concatenate full path
265
268
gstr = g_string_sized_new (80);
266
// concatenate full path
268
270
g_string_append (gstr, folder);
269
271
if (gstr->len && gstr->str [gstr->len -1] != G_DIR_SEPARATOR)
273
275
g_string_append (gstr, file);
274
// use UgPathPart to get head_len, tail_str, location_len
275
pathpart = ug_path_part_new (gstr->str, gstr->len);
276
head_len = gstr->len - pathpart->file_ext_len;
277
tail_str = file + strlen (file) - pathpart->file_ext_len;
278
if (pathpart->file_ext) {
282
location_len = UG_PATH_PART_LOCATION_LEN (pathpart);
283
ug_path_part_free (pathpart);
276
// get location_len (length of path - filename).
277
tail_str = strrchr (gstr->str, G_DIR_SEPARATOR);
278
if (tail_str == NULL)
281
location_len = tail_str - gstr->str + 1; // + G_DIR_SEPARATOR
285
283
if (location_len && ug_create_dir_all (gstr->str, location_len) == -1) {
286
284
ug_plugin_post (plugin, ug_message_new_error (UG_MESSAGE_ERROR_FOLDER_CREATE_FAILED, NULL));
287
g_string_free (gstr, TRUE);
285
return g_string_free (gstr, TRUE);
287
// get head_len (length of folder + primary filename)
288
// and tail_str ('.' + filename extension)
289
tail_str = strrchr (gstr->str + location_len, '.');
290
if (tail_str == NULL)
291
tail_str = gstr->str + gstr->len;
292
head_len = tail_str - gstr->str;
293
tail_str = g_strdup (tail_str);
292
for (retry_count=0; retry_count < 100; retry_count++) {
293
// fd = open (gstr->str, O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE | S_IRGRP | S_IROTH);
294
fd = ug_fd_open (gstr->str, UG_FD_O_CREATE | UG_FD_O_EXCL | UG_FD_O_RDWR, UG_FD_S_IREAD | UG_FD_S_IWRITE | UG_FD_S_IRGRP | UG_FD_S_IROTH);
295
for (count=0; count < 100; count++) {
296
// fd = open (gstr->str, O_CREAT | O_EXCL | O_RDWR,
297
// S_IREAD | S_IWRITE | S_IRGRP | S_IROTH);
298
fd = ug_fd_open (gstr->str, UG_FD_O_CREATE | UG_FD_O_EXCL | UG_FD_O_RDWR,
299
UG_FD_S_IREAD | UG_FD_S_IWRITE | UG_FD_S_IRGRP | UG_FD_S_IROTH);
297
302
ug_fd_close (fd);
300
305
g_string_truncate (gstr, head_len);
301
g_string_append_printf (gstr, "(%d)", retry_count);
306
g_string_append_printf (gstr, "(%d)", count);
302
307
g_string_append (gstr, tail_str);
304
if (retry_count == 100) {
310
g_free ((gpointer) tail_str);
305
313
ug_plugin_post (plugin, ug_message_new_error (UG_MESSAGE_ERROR_FILE_CREATE_FAILED, NULL));
306
g_string_free (gstr, TRUE);
314
return g_string_free (gstr, TRUE);
310
317
ug_plugin_post (plugin, ug_message_new_data (UG_MESSAGE_DATA_FILE_CHANGED, gstr->str + location_len));
313
319
*folder_len = location_len;
314
321
return g_string_free (gstr, FALSE);