2 * CORBA/ORBit client side of Vfs object of sandbox_parent()
3 * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; exactly version 2 of June 1991 is required
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "captive/parent-Vfs.h" /* self */
23 #include <glib/gmessages.h>
25 #include "../client/vfs.h"
28 #include "server-GLogFunc.h"
29 #include "server-CaptiveIOChannel.h"
30 #include <signal.h> /* for kill(2) */
32 #include "../client/giochannel-blind.h" /* for captive_giochannel_blind_commit() */
36 #include "captive/macros.h"
39 static GnomeVFSResult captive_sandbox_parent_vfs_new_silent(CaptiveVfsObject *captive_vfs_object)
43 g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
45 captive_vfs_object->is_sandbox_parent=TRUE;
47 errbool=captive_sandbox_spawn(captive_vfs_object);
48 g_return_val_if_fail(errbool==TRUE,GNOME_VFS_ERROR_GENERIC);
54 GnomeVFSResult captive_sandbox_parent_vfs_new(CaptiveVfsObject *captive_vfs_object)
58 g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
60 r=captive_sandbox_parent_vfs_new_silent(captive_vfs_object);
62 if (captive_vfs_object->corba_bug_action) {
65 xml_action=xmlNewTextChild(captive_vfs_object->corba_bug_action,NULL,"vfs_new",NULL);
66 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_vfs_object));
73 static void bug_doc_generate(CaptiveVfsObject *captive_vfs_object)
75 size_t out_fname_size;
77 gchar out_fname[PATH_MAX];
80 g_return_if_fail(captive_vfs_object!=NULL);
82 captive_giochannel_blind_readreport_to_xml(captive_vfs_object->corba_bug,captive_vfs_object->corba_parent_giochanel_blind);
83 xmlSetDocCompressMode(captive_vfs_object->corba_bug_doc,9);
86 if (!(out_fname_size=strftime(out_fname,sizeof(out_fname),captive_vfs_object->options.bug_pathname,
87 localtime(&time_t_local)))) {
88 g_assert_not_reached();
92 /* xmlSaveFormatFileEnc() would be better to prevent rewriting
93 * of target 'out_fname' but it does not support compression.
95 errint=xmlSaveFormatFileEnc(out_fname,captive_vfs_object->corba_bug_doc,"UTF-8",
96 1); /* format; ==output indenting; FIXME: Is it really indented? */
101 static GnomeVFSResult captive_sandbox_parent_vfs_close_silent(CaptiveVfsObject *captive_vfs_object)
105 impl_POA_Captive_GLogFunc *GLogFunc_servant;
106 impl_POA_Captive_CaptiveIOChannel *CaptiveIOChannel_servant;
107 GIOStatus erriostatus;
109 g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
111 Captive_Vfs_shutdown(captive_vfs_object->corba_Vfs_object,&captive_corba_ev);
112 r=captive_sandbox_parent_return_from_CORBA_Environment(&captive_corba_ev);
114 CORBA_Object_release(captive_vfs_object->corba_Vfs_object,&captive_corba_ev);
115 g_assert(validate_CORBA_Environment(&captive_corba_ev));
117 /* Shutdown 'GLogFunc' servant. */
118 GLogFunc_servant=PortableServer_POA_reference_to_servant(captive_corba_poa,
119 captive_vfs_object->corba_GLogFunc_object,&captive_corba_ev);
120 g_assert(validate_CORBA_Environment(&captive_corba_ev));
121 CORBA_Object_release(captive_vfs_object->corba_GLogFunc_object,&captive_corba_ev);
122 g_assert(validate_CORBA_Environment(&captive_corba_ev));
123 impl_Captive_GLogFunc__destroy(GLogFunc_servant,&captive_corba_ev);
124 g_assert(validate_CORBA_Environment(&captive_corba_ev));
126 /* Shutdown 'CaptiveIOChannel' servant. */
127 CaptiveIOChannel_servant=PortableServer_POA_reference_to_servant(captive_corba_poa,
128 captive_vfs_object->corba_CaptiveIOChannel_object,&captive_corba_ev);
129 g_assert(validate_CORBA_Environment(&captive_corba_ev));
130 CORBA_Object_release(captive_vfs_object->corba_CaptiveIOChannel_object,&captive_corba_ev);
131 g_assert(validate_CORBA_Environment(&captive_corba_ev));
132 impl_Captive_CaptiveIOChannel__destroy(CaptiveIOChannel_servant,&captive_corba_ev);
133 g_assert(validate_CORBA_Environment(&captive_corba_ev));
135 /* Close parentheart_fd_write. */
136 if (captive_vfs_object->corba_parentheart_fds_1!=-1) {
137 errint=close(captive_vfs_object->corba_parentheart_fds_1);
138 g_return_val_if_fail(errint==0,FALSE);
141 /* Cleanup the child process. */
142 if (captive_vfs_object->corba_child_pid!=(pid_t)-1) {
149 kill(captive_vfs_object->corba_child_pid,SIGKILL); /* errors ignored */
153 waitpid(captive_vfs_object->corba_child_pid,
155 WNOHANG); /* options */
158 if (r==GNOME_VFS_OK) {
159 erriostatus=captive_giochannel_blind_commit(captive_vfs_object->corba_parent_giochanel_blind);
160 g_assert(erriostatus==G_IO_STATUS_NORMAL);
162 else { /* sandbox child failure */
163 /* Flush the channel to catch all the disk accesses to the bugreport. */
164 erriostatus=g_io_channel_flush(
165 captive_vfs_object->corba_parent_giochanel_blind, /* channel */
167 g_assert(erriostatus==G_IO_STATUS_NORMAL);
169 /* Summarize the bugreport. */
170 if (captive_vfs_object->corba_bug_doc)
171 bug_doc_generate(captive_vfs_object);
173 g_io_channel_unref(captive_vfs_object->corba_parent_giochanel_blind);
174 captive_vfs_object->corba_parent_giochanel_blind=NULL;
176 if (captive_vfs_object->corba_bug_doc) {
177 xmlFreeDoc(captive_vfs_object->corba_bug_doc);
178 captive_vfs_object->corba_bug_doc=NULL;
179 captive_vfs_object->corba_bug=NULL;
180 captive_vfs_object->corba_bug_action=NULL;
181 captive_vfs_object->corba_bug_log=NULL;
188 GnomeVFSResult captive_sandbox_parent_vfs_close(CaptiveVfsObject *captive_vfs_object)
190 g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
192 if (captive_vfs_object->corba_bug_action) {
195 xml_action=xmlNewTextChild(captive_vfs_object->corba_bug_action,NULL,"vfs_close",NULL);
196 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_vfs_object));
199 return captive_sandbox_parent_vfs_close_silent(captive_vfs_object);
203 GnomeVFSResult captive_sandbox_parent_vfs_commit(CaptiveVfsObject *captive_vfs_object)
205 GnomeVFSResult r_close,r_new;
206 xmlNode *xml_action=NULL;
208 g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
210 if (captive_vfs_object->corba_bug_action) {
211 xmlNewTextChild(captive_vfs_object->corba_bug_action,NULL,"vfs_commit",NULL);
212 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_vfs_object));
215 r_close=captive_sandbox_parent_vfs_close_silent(captive_vfs_object); /* errors ignored */
216 r_new=captive_sandbox_parent_vfs_new_silent(captive_vfs_object);
218 if (captive_vfs_object->corba_bug_action) {
219 xml_action=xmlNewTextChild(captive_vfs_object->corba_bug_action,NULL,"vfs_commit",NULL);
220 xmlNewProp(xml_action,"object",captive_printf_alloca("%p",captive_vfs_object));
221 xmlNewProp(xml_action,"result_prev_close",gnome_vfs_result_to_string(r_close));
222 xmlNewProp(xml_action,"result",gnome_vfs_result_to_string(r_new));
225 return (r_new!=GNOME_VFS_OK ? r_new : r_close);