CollectionData *command_collection;
};
+/* To enable file names containing newlines to be processed correctly,
+ * the --print0 remote option sets returned data to be terminated with a null
+ * character rather a newline
+ */
+static gboolean print0 = FALSE;
+
/* Remote commands from main.c are prepended with the current dir the remote
* command was made from. Some remote commands require this. The
* value is stored here
GError *error = NULL;
gsize termpos;
/* FIXME: it should be possible to terminate the command with a null character */
- g_io_channel_set_line_term(source, "<gq_end_of_command>\n", -1);
+ g_io_channel_set_line_term(source, "<gq_end_of_command>", -1);
while ((status = g_io_channel_read_line(source, &buffer, NULL, &termpos, &error)) == G_IO_STATUS_NORMAL)
{
if (buffer)
if (strlen(buffer) > 0)
{
if (rc->read_func) rc->read_func(rc, buffer, source, rc->read_data);
- g_io_channel_write_chars(source, "\n", -1, NULL, NULL); /* empty line finishes the command */
+ g_io_channel_write_chars(source, "<gq_end_of_command>", -1, NULL, NULL); /* empty line finishes the command */
g_io_channel_flush(source, NULL);
}
g_free(buffer);
channel = g_io_channel_unix_new(rc->fd);
g_io_channel_write_chars(channel, text, -1, NULL, &error);
- g_io_channel_write_chars(channel, "<gq_end_of_command>\n", -1, NULL, &error);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, &error);
g_io_channel_flush(channel, &error);
if (error)
{
gchar *buffer = NULL;
gsize termpos;
+ g_io_channel_set_line_term(channel, "<gq_end_of_command>", -1);
while (g_io_channel_read_line(channel, &buffer, NULL, &termpos, &error) == G_IO_STATUS_NORMAL)
{
if (buffer)
{
- if (buffer[0] == '\n') /* empty line finishes the command */
+ if (g_strstr_len(buffer, -1, "<gq_end_of_command>") == buffer) /* empty line finishes the command */
{
g_free(buffer);
fflush(stdout);
break;
}
buffer[termpos] = '\0';
- printf("%s\n", buffer);
+ if (g_strstr_len(buffer, -1, "print0") != 0)
+ {
+ print0 = TRUE;
+ }
+ else
+ {
+ if (print0)
+ {
+ printf("%s%c", buffer, 0);
+ }
+ else
+ {
+ printf("%s\n", buffer);
+ }
+ }
g_free(buffer);
buffer = NULL;
}
r_mouse, g_mouse, b_mouse);
g_io_channel_write_chars(channel, pixel_info, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_free(pixel_info);
}
(y2 > y1) ? y1 : y2);
g_io_channel_write_chars(channel, rectangle_info, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_free(rectangle_info);
}
}
g_io_channel_write_chars(channel, render_intent, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_free(render_intent);
}
}
g_io_channel_write_chars(channel, out_string->str, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_string_free(out_string, TRUE);
filelist_free(list);
}
g_io_channel_write_chars(channel, contents->str, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_string_free(contents, TRUE);
}
}
g_io_channel_write_chars(channel, out_string->str, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
string_list_free(collection_list);
g_string_free(out_string, TRUE);
}
g_io_channel_write_chars(channel, out_string, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_free(collection_name);
g_free(out_string);
}
g_io_channel_write_chars(channel, out_string->str, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_free(country_name);
g_free(country_code);
if (fd->parent) fd = fd->parent;
g_io_channel_write_chars(channel, fd->path, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
work = fd->sidecar_files;
fd = work->data;
work = work->next;
g_io_channel_write_chars(channel, fd->path, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
}
g_free(filename);
}
if (fd->change && fd->change->dest)
{
g_io_channel_write_chars(channel, fd->change->dest, -1, NULL, NULL);
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
}
g_free(filename);
}
pwd = g_strdup(text);
}
+static void gr_print0(const gchar *text, GIOChannel *channel, gpointer data)
+{
+ LayoutWindow *lw = NULL;
+
+ g_io_channel_write_chars(channel, "print0", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
+}
+
#ifdef HAVE_LUA
static void gr_lua(const gchar *text, GIOChannel *channel, gpointer data)
{
g_io_channel_write_chars(channel, N_("lua error: no data"), -1, NULL, NULL);
}
- g_io_channel_write_chars(channel, "\n", -1, NULL, NULL);
+ g_io_channel_write_chars(channel, "<gq_end_of_command>", -1, NULL, NULL);
g_strfreev(lua_command);
g_free(result);
{ NULL, "--lua:", gr_lua, TRUE, FALSE, N_("<FILE>,<lua script>"), N_("run lua script on FILE") },
#endif
{ NULL, "--PWD:", gr_pwd, TRUE, FALSE, N_("<PWD>"), N_("use PWD as working directory for following commands") },
+ { NULL, "--print0", gr_print0, TRUE, FALSE, NULL, N_("terminate returned data with null character instead of newline") },
{ NULL, NULL, NULL, FALSE, FALSE, NULL, NULL }
};