00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00027 #include <unistd.h>
00028 #include <signal.h>
00029 #include <sys/types.h>
00030
00031 #include "connectionMgrLog.h"
00032 #ifdef ECDC_LIBRARY
00033 #include "ecdc.h"
00034 #else
00035 #include "ecdc_err.h"
00036 #endif
00037 #include "connectScreenData.h"
00038 #include "connectionMgr.h"
00039 #include "pingThread.h"
00040 #include "system.h"
00041
00042 static volatile GThread* g_ping_thread = NULL;
00043 static volatile gboolean g_ping_abort = FALSE;
00044
00045
00046 static gpointer pingThread(gpointer arg)
00047 {
00048 #ifdef ECDC_LIBRARY
00049 pecd_connection_t pecd_connection;
00050 #endif
00051 gboolean connected = FALSE;
00052
00053 ping_thread_parms *parms = (ping_thread_parms*)arg;
00054 #ifdef ECDC_LIBRARY
00055 gchar *redirectUrl = connect_data_get_ecd_url();
00056 #else
00057 gchar *redirectUrl = NULL;
00058 #endif
00059 gchar *errmsg;
00060
00061 int i;
00062 int rc;
00063 int argc;
00064 char* argv[10];
00065
00066
00067 CN_LOGPRINTF("entry");
00068
00069 gdk_threads_enter();
00070 gtk_label_set_text(GTK_LABEL(parms->pingStatus), "ping-started");
00071 gdk_threads_leave();
00072
00073 parms->err = connect_enable_network(parms->settings);
00074 if ( g_ping_abort == FALSE
00075 && parms->err == ECD_NO_ERROR)
00076 {
00077 if (parms->pcshare == NULL)
00078 {
00079 #ifdef ECDC_LIBRARY
00080
00081 pecd_connection = ecd_connection_create(redirectUrl,
00082 DUMMY_EUI64,
00083 DUMMY_PRODUCT_ID);
00084 if (pecd_connection)
00085 {
00086 if (ecd_ping(pecd_connection))
00087 {
00088 connected = TRUE;
00089 }
00090 else
00091 {
00092 connect_disable_network();
00093 }
00094 parms->err = ecd_errno(pecd_connection);
00095 ecd_connection_destroy(pecd_connection);
00096 }
00097 #else
00098 connected = TRUE;
00099 #endif
00100 }
00101 else
00102 {
00103
00104 argc = 0;
00105 argv[argc++] = COMMAND_MOUNT_SAMBA;
00106 argv[argc++] = "mount";
00107 argv[argc++] = parms->pcshare->pcname ? parms->pcshare->pcname : "";
00108 argv[argc++] = parms->pcshare->sharename ? parms->pcshare->sharename : "";
00109 argv[argc++] = parms->pcshare->workgroup ? parms->pcshare->workgroup : "";
00110 if ( parms->pcshare->username
00111 && parms->pcshare->username[0] != '\0' )
00112 {
00113 argv[argc++] = parms->pcshare->username;
00114 argv[argc++] = parms->pcshare->password;
00115 }
00116 argv[argc] = NULL;
00117 g_assert( argc < (sizeof(argv)/sizeof(argv[0])) );
00118
00119 CN_LOGPRINTF("execute command [%s]", argv[0]);
00120 for (i = 0 ; i < argc ; i++)
00121 {
00122 CN_LOGPRINTF(" argv[%d] = [%s]", i, argv[i]);
00123 }
00124 rc = fork_exec(argc, argv);
00125 CN_LOGPRINTF("fork_exec [%s] returned [%d]", argv[0], rc);
00126 if (rc == 0)
00127 {
00128 connected = TRUE;
00129 }
00130 else
00131 {
00132 CN_ERRORPRINTF("Execute [%s] failed - "
00133 "fork_exec returns [%d]",
00134 argv[0], rc);
00135 connect_disable_network();
00136 parms->err = ECD_NO_CONNECTION;
00137 }
00138 }
00139 }
00140
00141 g_free(redirectUrl);
00142
00143
00144 gdk_threads_enter();
00145 {
00146 g_ping_thread = NULL;
00147 if (gtk_main_level() == 0)
00148 {
00149 CN_WARNPRINTF(" -- oops, gtk_main has quit!");
00150 }
00151 else
00152 {
00153 if (connected)
00154 {
00155 gtk_label_set_text(GTK_LABEL(parms->pingStatus),
00156 "ping-done-ok");
00157 }
00158 else
00159 {
00160 if (g_ping_abort)
00161 {
00162 errmsg = "ping-done-abort";
00163 }
00164 else
00165 {
00166 if ( ((parms->settings->connection == wireless_t)
00167 && (parms->err == ECD_WIRELESS_ERROR))
00168 || ((parms->settings->connection == wired_t)
00169 && (parms->err == ECD_WIRED_ERROR))
00170 || ((parms->settings->connection == dialup_t)
00171 && (parms->err == ECD_DIALUP_ERROR)) )
00172 {
00173 errmsg = "ping-network-error";
00174 }
00175 else
00176 {
00177 if (parms->pcshare)
00178 {
00179 errmsg = "ping-pcshare-error";
00180 }
00181 else
00182 {
00183 errmsg = "ping-done-error";
00184 }
00185 }
00186 }
00187 gtk_label_set_text(GTK_LABEL(parms->pingStatus), errmsg);
00188 }
00189 }
00190 }
00191 gdk_threads_leave();
00192
00193
00194 CN_LOGPRINTF("exit, connected [%d]", connected);
00195 return (gpointer)connected;
00196 }
00197
00198
00199 gboolean pingThread_start(ping_thread_parms* ping_parms)
00200 {
00201 GThread* thread = NULL;
00202 GError* error = NULL;
00203
00204 CN_LOGPRINTF("entry");
00205 if (g_ping_thread)
00206 {
00207 CN_ERRORPRINTF("ping thread already running");
00208 return FALSE;
00209 }
00210
00211
00212 g_ping_abort = FALSE;
00213 thread = g_thread_create(pingThread, ping_parms, FALSE, &error);
00214 if (error != NULL)
00215 {
00216 CN_ERRORPRINTF("Failed to create ping thread - %s [%d]",
00217 error->message, error->code);
00218 g_free(error);
00219 error = NULL;
00220 }
00221 else
00222 {
00223 g_ping_thread = thread;
00224 }
00225
00226 return TRUE;
00227 }
00228
00229
00230 gboolean pingThread_stop()
00231 {
00232 CN_LOGPRINTF("entry");
00233
00234 if (g_ping_thread)
00235 {
00236
00237 g_ping_abort = TRUE;
00238
00239
00240 connect_enable_network_abort();
00241
00242
00243 pid_t pid = get_forkexec_child_pid();
00244 if (pid > 0)
00245 {
00246 kill(pid, SIGTERM);
00247 }
00248
00249 return TRUE;
00250 }
00251 else
00252 {
00253 CN_ERRORPRINTF("ping thread not running");
00254 return FALSE;
00255 }
00256 }
00257
00258
00259 gboolean pingThread_wait(int timeout_sec)
00260 {
00261 int max_ticks = 2 * timeout_sec;
00262
00263 CN_LOGPRINTF("entry");
00264
00265 if (g_ping_thread)
00266 {
00267
00268
00269 while (g_ping_thread && --max_ticks >= 0)
00270 {
00271 g_usleep(500*1000L);
00272 }
00273 return TRUE;
00274 }
00275 else
00276 {
00277 CN_ERRORPRINTF("ping thread not running");
00278 return FALSE;
00279 }
00280 }
00281
00282 gboolean pingThread_stopped(void)
00283 {
00284 CN_LOGPRINTF("entry");
00285
00286 if (g_ping_thread)
00287 {
00288 return FALSE;
00289 }
00290 else
00291 {
00292 return TRUE;
00293 }
00294 }
00295