cmd.c
changeset 33 5052c1200b68
parent 30 b60076874691
child 34 5b818c7467ad
equal deleted inserted replaced
32:ca6ef5ecb3ce 33:5052c1200b68
   117 			scr_log_print (LPRINT_DEBUG, "cmd: Reading error: %s.", error -> message);
   117 			scr_log_print (LPRINT_DEBUG, "cmd: Reading error: %s.", error -> message);
   118 			g_clear_error (&error);
   118 			g_clear_error (&error);
   119 		}
   119 		}
   120 
   120 
   121 		if (chstat == G_IO_STATUS_ERROR || chstat == G_IO_STATUS_EOF) {
   121 		if (chstat == G_IO_STATUS_ERROR || chstat == G_IO_STATUS_EOF) {
   122 			cb->source = 0;
   122 
   123 			return FALSE; // XXX
   123 			return FALSE; // XXX
   124 		}
   124 		}
   125 		
   125 		
   126 		if (endpos) {
   126 		if (endpos) {
   127 			GString *input = cb->input;
   127 			GString *input = cb->input;
   193 
   193 
   194 			} else {
   194 			} else {
   195 
   195 
   196 				scr_log_print (LPRINT_LOGNORM, "cmd: Character conversion error: %s", error->message);
   196 				scr_log_print (LPRINT_LOGNORM, "cmd: Character conversion error: %s", error->message);
   197 				g_error_free (error);
   197 				g_error_free (error);
   198 				cb->source = 0;
   198 
   199 				return FALSE;
   199 				return FALSE;
   200 			}
   200 			}
   201 		}
   201 		}
   202 
   202 
   203 	} else if (condition & (G_IO_ERR|G_IO_NVAL|G_IO_HUP)) {
   203 	} else if (condition & (G_IO_ERR|G_IO_NVAL|G_IO_HUP)) {
   204 		cb->source = 0;
   204 
   205 		return FALSE; // XXX
   205 		return FALSE; // XXX
   206 	}
   206 	}
   207 
   207 
   208 	return TRUE;
   208 	return TRUE;
   209 }
   209 }
   212 {
   212 {
   213 	cmd_cb_t *cb = (cmd_cb_t *) data;
   213 	cmd_cb_t *cb = (cmd_cb_t *) data;
   214 
   214 
   215 	cmd_channels = g_slist_remove (cmd_channels, data);
   215 	cmd_channels = g_slist_remove (cmd_channels, data);
   216 
   216 
   217 	if (cb->source)
       
   218 		g_source_remove (cb->source);
       
   219 	if (cb->channel)
       
   220 		g_io_channel_unref (cb->channel);
       
   221 	if (cb -> subject)
   217 	if (cb -> subject)
   222 		g_free (cb -> subject);
   218 		g_free (cb -> subject);
   223 	g_free (cb->jid);
   219 	g_free (cb->jid);
   224 	g_slice_free (cmd_cb_t, cb);
   220 	g_slice_free (cmd_cb_t, cb);
   225 }
   221 }
   315 
   311 
   316 			cb -> jid     = g_strdup (jid);
   312 			cb -> jid     = g_strdup (jid);
   317 			cb -> input   = g_string_new (NULL);
   313 			cb -> input   = g_string_new (NULL);
   318 			cb -> seq     = 0;
   314 			cb -> seq     = 0;
   319 			cb -> channel = channel;
   315 			cb -> channel = channel;
       
   316 			
       
   317 			cmd_channels  = g_slist_append (cmd_channels, cb);
       
   318 
   320 			cb -> source  = g_io_add_watch_full (channel, 0, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
   319 			cb -> source  = g_io_add_watch_full (channel, 0, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
   321 			                                     cmd_reader, (gpointer) cb, cmd_destroy_data);
   320 			                                     cmd_reader, (gpointer) cb, cmd_destroy_data);
   322 
   321 
   323 			cmd_channels = g_slist_append (cmd_channels, cb);
   322 			g_io_channel_unref ( channel );
       
   323 
   324 		}
   324 		}
   325 	}
   325 	}
   326 }
   326 }
   327 
   327 
   328 void mcmd_init (void)
   328 void mcmd_init (void)
   343 #else
   343 #else
   344 	if (mcmd_cmid)
   344 	if (mcmd_cmid)
   345 		cmd_del (mcmd_cmid);
   345 		cmd_del (mcmd_cmid);
   346 #endif
   346 #endif
   347 
   347 
   348 	for (sel = cmd_channels; sel; sel = sel->next) {
   348 	for (sel = cmd_channels; sel; ) {
   349 		cmd_cb_t *cb = (cmd_cb_t *) sel->data;
   349 		cmd_cb_t *cb = (cmd_cb_t *) sel->data;
       
   350 		sel = sel -> next;
   350 		if (cb->source)
   351 		if (cb->source)
   351 			g_source_remove (cb->source);
   352 			g_source_remove (cb->source);
   352 		if (cb->channel)
   353 	}
   353 			g_io_channel_unref (cb->channel);
       
   354 		g_free (cb->jid);
       
   355 		g_slice_free (cmd_cb_t, cb);
       
   356 	}
       
   357 
       
   358 	g_slist_free (cmd_channels);
       
   359 }
   354 }
   360 
   355 
   361 /* vim: se ts=4 sw=4: */
   356 /* vim: se ts=4 sw=4: */