diff src/gtk/transfer.c @ 129:fe0b21c006f6

2003-4-13 Brian Masney <masneyb@gftp.org> * lib/config_file.c - implemented gftp_set_global_option() * lib/gftp.h lib/misc.c - added gftp_tdata_new() * src/text/gftp-text.c src/gtk/transfer.c - use gftp_tdata_new() * src/gtk/bookmarks.c - In run_bookmark(), use gftp_parse_bookmark() function. Renamed all instances of gftp_bookmarks to gftp_bookmarks_var * src/gtk/gftp-gtk.[ch] - added global variables viewedit_processes and viewedit_processes_done. These used to be declared in lib/options.h * src/gtk/gftp-gtk.h (struct gftp_window_data) - removed sortcol and sortasds variables. Added prefix_col_str variable. This will either be local or remote * src/gtk/misc-gtk.c - removed r_gethostbyname() and r_getservbyname() * src/gtk/transfer.c - removed gftp_gtk_calc_kbs(), get_status() and parse_attribs(). These are in the lib/ directory now. Also, use g_static_mutex_*() functions from glib instead of pthread_mutex_*() * src/gtk/bookmark.c src/gtk/dnd.c src/gtk/menu-items.c src/gtk/transfer.c - use g_strdup() instead of g_malloc()/strcpy() * src/gtk/options_dialog.c - commented out large parts of this file. This file is busted at the moment * src/gtk/*.[ch] - Use new configuration interface in all source files. Updated copyright dates on all source files
author masneyb
date Sun, 13 Apr 2003 15:21:13 +0000
parents 759c7d019a89
children 84b3e69807a2
line wrap: on
line diff
--- a/src/gtk/transfer.c	Fri Apr 11 06:35:43 2003 +0000
+++ b/src/gtk/transfer.c	Sun Apr 13 15:21:13 2003 +0000
@@ -21,6 +21,7 @@
 static const char cvsid[] = "$Id$";
 
 static GtkWidget * dialog;
+static int num_transfers_in_progress = 0;
 
 static void 
 wakeup_main_thread (gpointer data, gint source, GdkInputCondition condition)
@@ -136,8 +137,7 @@
       if (!havedotdot)
         {
           fle = g_malloc0 (sizeof (*fle));
-          fle->file = g_malloc (3);
-          strcpy (fle->file, "..");
+          fle->file = g_strdup ("..");
           fle->user = g_malloc0 (1);
           fle->group = g_malloc0 (1);
           fle->attribs = g_malloc0 (1);
@@ -207,7 +207,7 @@
     }
 
   wdata->sorted = 0;
-  sortrows (GTK_CLIST (wdata->listbox), *wdata->sortcol, (gpointer) wdata);
+  sortrows (GTK_CLIST (wdata->listbox), -1, (gpointer) wdata);
   if (IS_NONE_SELECTED (wdata))
     gtk_clist_select_row (GTK_CLIST (wdata->listbox), 0, 0);
   return (1);
@@ -232,12 +232,16 @@
 static void *
 connect_thread (void *data)
 {
+  int ret, sj, retries, sleep_time, network_timeout;
   static int conn_num;
   gftp_request * request;
-  int ret, sj;
 
   request = data;
 
+  gftp_lookup_request_option (request, "retries", &retries);
+  gftp_lookup_request_option (request, "sleep_time", &sleep_time);
+  gftp_lookup_request_option (request, "network_timeout", &network_timeout);
+
   conn_num = 0;
   if (request->use_threads)
     {
@@ -254,11 +258,11 @@
       gftp_disconnect (request);
     }
 
-  while (sj != 1 && (request->retries == 0 || conn_num < request->retries))
+  while (sj != 1 && (retries == 0 || conn_num < retries))
     {
       conn_num++;
-      if (request->network_timeout > 0)
-        alarm (request->network_timeout);
+      if (network_timeout > 0)
+        alarm (network_timeout);
       ret = gftp_connect (request);
       alarm (0);
 
@@ -272,12 +276,12 @@
           ret = 1;
           break;
         }
-      else if (request->retries == 0 || conn_num < request->retries)
+      else if (retries == 0 || conn_num < retries)
         {
           request->logging_function (gftp_logging_misc, request->user_data,
                      _("Waiting %d seconds until trying to connect again\n"),
-		     request->sleep_time);
-          alarm (request->sleep_time);
+		     sleep_time);
+          alarm (sleep_time);
           pause ();
         }  
     }
@@ -328,8 +332,7 @@
 #endif
             }
 
-          if (GFTP_GET_PASSWORD (request) == NULL || 
-              *GFTP_GET_PASSWORD (request) == '\0')
+          if (request->password == NULL || *request->password == '\0')
             return (0);
         }
       else
@@ -496,13 +499,7 @@
       g_free (transfer);
     }
   else
-    {
-      if (transfer->statmutex)
-        pthread_mutex_destroy (transfer->statmutex);
-      if (transfer->structmutex)
-        pthread_mutex_destroy (transfer->structmutex);
-      free_tdata (transfer);
-    }
+    free_tdata (transfer);
 }
 
 void *
@@ -544,211 +541,12 @@
 }
 
 
-static void
-gftp_gtk_calc_kbs (gftp_transfer * tdata, ssize_t num_read)
-{
-  unsigned long waitusecs;
-  double difftime, curkbs;
-  gftp_file * tempfle;
-  struct timeval tv;
-  unsigned long toadd;
-
-  gettimeofday (&tv, NULL);
-  pthread_mutex_lock (tdata->statmutex);
-
-  tempfle = tdata->curfle->data;
-  tdata->trans_bytes += num_read;
-  tdata->curtrans += num_read;
-  tdata->stalled = 0;
-
-  difftime = (tv.tv_sec - tdata->starttime.tv_sec) + ((double) (tv.tv_usec - tdata->starttime.tv_usec) / 1000000.0);
-  if (difftime <= 0)
-    tdata->kbs = (double) tdata->trans_bytes / 1024.0;
-  else
-    tdata->kbs = (double) tdata->trans_bytes / 1024.0 / difftime;
-
-  difftime = (tv.tv_sec - tdata->lasttime.tv_sec) + ((double) (tv.tv_usec - tdata->lasttime.tv_usec) / 1000000.0);
-
-  if (difftime <= 0)
-    curkbs = (double) (num_read / 1024.0);
-  else
-    curkbs = (double) (num_read / 1024.0 / difftime);
-
-  if (tdata->fromreq->maxkbs > 0 &&
-      curkbs > tdata->fromreq->maxkbs)
-    {
-      waitusecs = (double) num_read / 1024.0 / tdata->fromreq->maxkbs * 1000000.0 - difftime;
-
-      if (waitusecs > 0)
-        {
-          pthread_mutex_unlock (tdata->statmutex);
-          difftime += ((double) waitusecs / 1000000.0);
-          usleep (waitusecs);
-          pthread_mutex_lock (tdata->statmutex);
-        }
-    }
-
-  /* I don't call gettimeofday (&tdata->lasttime) here because this will use
-     less system resources. This will be close enough for what we need */
-  difftime += tdata->lasttime.tv_usec / 1000000.0;
-  toadd = (long) difftime;
-  difftime -= toadd;
-  tdata->lasttime.tv_sec += toadd;
-  tdata->lasttime.tv_usec = difftime * 1000000.0;
-
-  pthread_mutex_unlock (tdata->statmutex);
-}
-
-
-static int
-get_status (gftp_transfer * tdata, ssize_t num_read)
-{
-  gftp_file * tempfle;
-  struct timeval tv;
-  int ret1 = 0, 
-      ret2 = 0;
-
-  pthread_mutex_lock (tdata->structmutex);
-  if (tdata->curfle == NULL)
-    {
-      pthread_mutex_unlock (tdata->structmutex);
-      return (-1);
-    }
-  tempfle = tdata->curfle->data;
-  pthread_mutex_unlock (tdata->structmutex);
-
-  gftp_disconnect (tdata->fromreq);
-  gftp_disconnect (tdata->toreq);
-  if (num_read < 0 || tdata->skip_file)
-    {
-      if (num_read == GFTP_EFATAL)
-        return (-1);
-      else if (tdata->fromreq->retries != 0 && 
-               tdata->current_file_retries >= tdata->fromreq->retries)
-        {
-          tdata->fromreq->logging_function (gftp_logging_error, 
-                   tdata->fromreq->user_data,
-                   _("Error: Remote site %s disconnected. Max retries reached...giving up\n"),
-                   tdata->fromreq->hostname != NULL ? 
-                         tdata->fromreq->hostname : tdata->toreq->hostname);
-          return (-1);
-        }
-      else
-        {
-          tdata->fromreq->logging_function (gftp_logging_error, 
-                     tdata->fromreq->user_data,
-                     _("Error: Remote site %s disconnected. Will reconnect in %d seconds\n"),
-                     tdata->fromreq->hostname != NULL ? 
-                           tdata->fromreq->hostname : tdata->toreq->hostname, 
-                     tdata->fromreq->sleep_time);
-        }
-
-      while (tdata->fromreq->retries == 0 || 
-             tdata->current_file_retries <= tdata->fromreq->retries)
-        {
-          if (!tdata->skip_file)
-            {
-              tv.tv_sec = tdata->fromreq->sleep_time;
-              tv.tv_usec = 0;
-              select (0, NULL, NULL, NULL, &tv);
-            }
-
-          if ((ret1 = gftp_connect (tdata->fromreq)) == 0 &&
-              (ret2 = gftp_connect (tdata->toreq)) == 0)
-            {
-              pthread_mutex_lock (tdata->structmutex);
-              tdata->resumed_bytes = tdata->resumed_bytes + tdata->trans_bytes - tdata->curresumed - tdata->curtrans;
-              tdata->trans_bytes = 0;
-              if (tdata->skip_file)
-                {
-                  tdata->total_bytes -= tempfle->size;
-                  tdata->curtrans = 0;
-
-                  tdata->curfle = tdata->curfle->next;
-                  tdata->next_file = 1;
-                  tdata->skip_file = 0;
-                  tdata->cancel = 0;
-                  tdata->fromreq->cancel = 0;
-                  tdata->toreq->cancel = 0;
-                }
-              else
-                {
-                  tempfle->transfer_action = GFTP_TRANS_ACTION_RESUME;
-                  tempfle->startsize = tdata->curtrans + tdata->curresumed;
-                  /* We decrement this here because it will be incremented in 
-                     the loop again */
-                  tdata->curresumed = 0;
-                  tdata->current_file_number--; /* Decrement this because it 
-                                                   will be incremented when we 
-                                                   continue in the loop */
-                }
-              gettimeofday (&tdata->starttime, NULL);
-              pthread_mutex_unlock (tdata->structmutex);
-              return (1);
-            }
-          else if (ret1 == GFTP_EFATAL || ret2 == GFTP_EFATAL)
-            {
-              gftp_disconnect (tdata->fromreq);
-              gftp_disconnect (tdata->toreq);
-              return (-1);
-            }
-          else
-            tdata->current_file_retries++;
-        }
-    }
-  else if (tdata->cancel)
-    return (-1);
-
-  return (0);
-}
-
-
-static mode_t
-parse_attribs (char *attribs)
-{
-  mode_t mode;
-  int cur;
-
-  cur = 0;
-  if (attribs[1] == 'r')
-    cur += 4;
-  if (attribs[2] == 'w')
-    cur += 2;
-  if (attribs[3] == 'x' ||
-      attribs[3] == 's')
-    cur += 1;
-  mode = cur;
-
-  cur = 0;
-  if (attribs[4] == 'r')
-    cur += 4;
-  if (attribs[5] == 'w')
-    cur += 2;
-  if (attribs[6] == 'x' ||
-      attribs[6] == 's')
-    cur += 1;
-  mode = (mode * 10) + cur;
-
-  cur = 0;
-  if (attribs[7] == 'r')
-    cur += 4;
-  if (attribs[8] == 'w')
-    cur += 2;
-  if (attribs[9] == 'x' ||
-      attribs[9] == 's')
-    cur += 1;
-  mode = (mode * 10) + cur;
-
-  return (mode);
-}
-
-
 void * 
 gftp_gtk_transfer_files (void *data)
 {
-  int i, mode, dl_type, tofd, fromfd, old_from_datatype;
+  int i, mode, tofd, fromfd;
   gftp_transfer * transfer;
-  char *tempstr, buf[8192];
+  char buf[8192];
   off_t fromsize, total;
   gftp_file * curfle; 
   ssize_t num_read, ret;
@@ -760,22 +558,20 @@
   memcpy (&transfer->lasttime, &transfer->starttime, 
           sizeof (transfer->lasttime));
 
-  dl_type = transfer->fromreq->data_type;
-  old_from_datatype = transfer->fromreq->data_type;
-
   while (transfer->curfle != NULL)
     {
-      pthread_mutex_lock (transfer->structmutex);
+      num_read = -1;
+      g_static_mutex_lock (&transfer->structmutex);
       curfle = transfer->curfle->data;
       transfer->current_file_number++; 
-      pthread_mutex_unlock (transfer->structmutex);
+      g_static_mutex_unlock (&transfer->structmutex);
  
       if (curfle->transfer_action == GFTP_TRANS_ACTION_SKIP)
         {
-          pthread_mutex_lock (transfer->structmutex);
+          g_static_mutex_lock (&transfer->structmutex);
           transfer->next_file = 1;
           transfer->curfle = transfer->curfle->next;
-          pthread_mutex_unlock (transfer->structmutex);
+          g_static_mutex_unlock (&transfer->structmutex);
           continue;
         }
 
@@ -792,21 +588,13 @@
                     break;
                 }
 
-              pthread_mutex_lock (transfer->structmutex);
+              g_static_mutex_lock (&transfer->structmutex);
               transfer->next_file = 1;
               transfer->curfle = transfer->curfle->next;
-              pthread_mutex_unlock (transfer->structmutex);
+              g_static_mutex_unlock (&transfer->structmutex);
               continue;
             }
 
-          if (transfer->fromreq->maxkbs > 0)
-            {
-              transfer->fromreq->logging_function (gftp_logging_misc, 
-                            transfer->fromreq->user_data, 
-                            _("File transfer will be throttled to %.2f KB/s\n"),
-                            transfer->fromreq->maxkbs);
-            }
-
           if (curfle->is_fd)
             {
               if (transfer->transfer_direction == GFTP_DIRECTION_DOWNLOAD)
@@ -835,27 +623,6 @@
           if (GFTP_IS_CONNECTED (transfer->fromreq) &&
               GFTP_IS_CONNECTED (transfer->toreq))
             {
-              if (!curfle->ascii && old_from_datatype == GFTP_TYPE_BINARY)
-                dl_type = GFTP_TYPE_BINARY;
-              else
-                dl_type = GFTP_GET_DATA_TYPE (transfer->fromreq) == GFTP_TYPE_ASCII || curfle->ascii ? GFTP_TYPE_ASCII : GFTP_TYPE_BINARY;
-
-              if (dl_type != transfer->fromreq->data_type)
-                {
-                   if (gftp_set_data_type (transfer->fromreq, dl_type) != 0)
-                     gftp_disconnect (transfer->fromreq);
-                 }
-
-              if (dl_type != transfer->toreq->data_type)
-                {
-                   if (gftp_set_data_type (transfer->toreq, dl_type) != 0)
-                     gftp_disconnect (transfer->toreq);
-                 }
-            }
-
-          if (GFTP_IS_CONNECTED (transfer->fromreq) &&
-              GFTP_IS_CONNECTED (transfer->toreq))
-            {
               fromsize = gftp_transfer_file (transfer->fromreq, curfle->file, 
                           fromfd,
                           curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ?
@@ -872,7 +639,6 @@
           transfer->fromreq->logging_function (gftp_logging_misc, 
                          transfer->fromreq->user_data, 
                          _("Error: Remote site disconnected after trying to transfer file\n"));
-          num_read = -1;
         }
       else if (fromsize < 0)
         {
@@ -884,20 +650,20 @@
                 transfer->fromreq->datafd = -1;
             }
 
-          pthread_mutex_lock (transfer->structmutex);
+          g_static_mutex_lock (&transfer->structmutex);
           curfle->transfer_action = GFTP_TRANS_ACTION_SKIP;
           transfer->next_file = 1;
           transfer->curfle = transfer->curfle->next;
-          pthread_mutex_unlock (transfer->structmutex);
+          g_static_mutex_unlock (&transfer->structmutex);
           continue;
         }
       else
         {
-          pthread_mutex_lock (transfer->structmutex);
+          g_static_mutex_lock (&transfer->structmutex);
           transfer->curtrans = 0;
           transfer->curresumed = curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ? curfle->startsize : 0;
           transfer->resumed_bytes += transfer->curresumed;
-          pthread_mutex_unlock (transfer->structmutex);
+          g_static_mutex_unlock (&transfer->structmutex);
   
           total = 0;
           i = 0;
@@ -906,25 +672,14 @@
                                                        buf, sizeof (buf))) > 0)
             {
               total += num_read;
-              gftp_gtk_calc_kbs (transfer, num_read);
+              gftp_calc_kbs (transfer, num_read);
 
-              if (dl_type == GFTP_TYPE_ASCII)
-                tempstr = gftp_convert_ascii (buf, &num_read, 1);
-              else
-                tempstr = buf;
-
-              if ((ret = gftp_put_next_file_chunk (transfer->toreq, tempstr, 
+              if ((ret = gftp_put_next_file_chunk (transfer->toreq, buf, 
                                                    num_read)) < 0)
                 {
                   num_read = (int) ret;
                   break;
                 }
-
-              /* We don't have to free tempstr for a download because new 
-                 memory is not allocated for it in that case */
-              if (dl_type == GFTP_TYPE_ASCII &&
-                  transfer->transfer_direction == GFTP_DIRECTION_UPLOAD)
-                g_free (tempstr);
             }
         }
 
@@ -944,7 +699,7 @@
                                         curfle->file,
                                         transfer->fromreq->hostname);
 
-          if (get_status (transfer, num_read) == 1)
+          if (gftp_get_transfer_status (transfer, num_read) == GFTP_ERETRYABLE)
             continue;
 
           break;
@@ -963,7 +718,7 @@
 
           if (gftp_end_transfer (transfer->fromreq) != 0)
             {
-              if (get_status (transfer, -1) == 1)
+              if (gftp_get_transfer_status (transfer, -1) == GFTP_ERETRYABLE)
                 continue;
 
               break;
@@ -980,10 +735,9 @@
         {
           if (curfle->attribs)
             {
-              mode = parse_attribs (curfle->attribs);
+              mode = gftp_parse_attribs (curfle->attribs);
               if (mode != 0)
-                gftp_chmod (transfer->toreq, curfle->destfile,
-                            parse_attribs (curfle->attribs));
+                gftp_chmod (transfer->toreq, curfle->destfile, mode);
             }
 
           if (curfle->datetime != 0)
@@ -991,11 +745,11 @@
                                 curfle->datetime);
         }
 
-      pthread_mutex_lock (transfer->structmutex);
+      g_static_mutex_lock (&transfer->structmutex);
       transfer->next_file = 1;
       curfle->transfer_done = 1;
       transfer->curfle = transfer->curfle->next;
-      pthread_mutex_unlock (transfer->structmutex);
+      g_static_mutex_unlock (&transfer->structmutex);
 
       if (transfer->cancel && !transfer->skip_file)
         break;
@@ -1013,12 +767,12 @@
                    gftp_window_data * fromwdata, gftp_window_data * towdata, 
                    GList * files, int copy_req)
 {
+  int dialog, append_file_transfers;
   gftp_curtrans_data * transdata;
   GList * templist, *curfle;
   gftp_transfer * tdata;
   gftp_file * tempfle;
   char *pos, *text[2];
-  int dialog;
 
   for (templist = files; templist != NULL; templist = templist->next)
     { 
@@ -1028,13 +782,16 @@
     }
   dialog = templist != NULL;
 
+  gftp_lookup_request_option (fromreq, "append_file_transfers", 
+                              &append_file_transfers);
+
   if (append_file_transfers)
     {
       pthread_mutex_lock (&transfer_mutex);
-      for (templist = file_transfers; templist != NULL; templist = templist->next)
+      for (templist = gftp_file_transfers; templist != NULL; templist = templist->next)
         {
           tdata = templist->data;
-          pthread_mutex_lock (tdata->structmutex);
+          g_static_mutex_lock (&tdata->structmutex);
           if (compare_request (tdata->fromreq, fromreq, 0) &&
               compare_request (tdata->toreq, toreq, 0) &&
               tdata->curfle != NULL)
@@ -1082,20 +839,20 @@
                       text[1] = _("Waiting...");
                     }
 
-                  tempfle->node = gtk_ctree_insert_node (GTK_CTREE (dlwdw),  
-                                                         tdata->node, NULL, text, 5,
-                                                         NULL, NULL, NULL, NULL, 
-                                                         FALSE, FALSE);
+                  tempfle->user_data = gtk_ctree_insert_node (GTK_CTREE (dlwdw),  
+                                             tdata->user_data, NULL, text, 5,
+                                             NULL, NULL, NULL, NULL, 
+                                             FALSE, FALSE);
                   transdata = g_malloc (sizeof (*transdata));
                   transdata->transfer = tdata;
                   transdata->curfle = curfle;
-                  gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tempfle->node, 
+                  gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tempfle->user_data, 
                                                transdata);
                 }
-              pthread_mutex_unlock (tdata->structmutex);
+              g_static_mutex_unlock (&tdata->structmutex);
               break; 
             }
-          pthread_mutex_unlock (tdata->structmutex);
+          g_static_mutex_unlock (&tdata->structmutex);
         }
       pthread_mutex_unlock (&transfer_mutex);
     }
@@ -1104,7 +861,7 @@
     
   if (templist == NULL)
     {
-      tdata = g_malloc0 (sizeof (*tdata));
+      tdata = gftp_tdata_new ();
       if (copy_req)
         {
           tdata->fromreq = copy_request (fromreq);
@@ -1130,13 +887,11 @@
           else
             tdata->numfiles++;
         }
-      tdata->structmutex = g_malloc (sizeof (pthread_mutex_t));
-      pthread_mutex_init (tdata->structmutex, NULL);
-      tdata->statmutex = g_malloc (sizeof (pthread_mutex_t));
-      pthread_mutex_init (tdata->statmutex, NULL);
+
       pthread_mutex_lock (&transfer_mutex);
-      file_transfers = g_list_append (file_transfers, tdata);
+      gftp_file_transfers = g_list_append (gftp_file_transfers, tdata);
       pthread_mutex_unlock (&transfer_mutex);
+
       if (dialog)
         gftp_gtk_ask_transfer (tdata);
     }
@@ -1269,8 +1024,8 @@
 static void
 on_next_transfer (gftp_transfer * tdata)
 {
+  int fd, refresh_files;
   gftp_file * tempfle;
-  int fd;
 
   tdata->next_file = 0;
   for (; tdata->updfle != tdata->curfle; tdata->updfle = tdata->updfle->next)
@@ -1310,13 +1065,15 @@
 	tdata->fromreq->rmfile (tdata->fromreq, tempfle->file);
       
       if (tempfle->transfer_action == GFTP_TRANS_ACTION_SKIP)
-        gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->node, 1,
+        gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->user_data, 1,
   			         _("Skipped"));
       else
-        gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->node, 1,
+        gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->user_data, 1,
   			         _("Finished"));
     }
 
+  gftp_lookup_request_option (tdata->fromreq, "refresh_files", &refresh_files);
+
   if (refresh_files && tdata->curfle && tdata->curfle->next &&
       compare_request (tdata->toreq, 
                        ((gftp_window_data *) tdata->towdata)->request, 1))
@@ -1338,7 +1095,7 @@
   if (tdata->fromreq->stopable == 0)
     return;
 
-  pthread_mutex_lock (tdata->structmutex);
+  g_static_mutex_lock (&tdata->structmutex);
   if (tdata->started)
     {
       tdata->cancel = 1;
@@ -1350,7 +1107,7 @@
 
   tdata->fromreq->stopable = 0;
   tdata->toreq->stopable = 0;
-  pthread_mutex_unlock (tdata->structmutex);
+  g_static_mutex_unlock (&tdata->structmutex);
 
   ftp_log (gftp_logging_misc, NULL, _("Stopping the transfer of %s\n"),
 	   ((gftp_file *) tdata->curfle->data)->file);
@@ -1370,9 +1127,10 @@
   gftp_get_pixmap (dlwdw, "open_dir.xpm", &opendir_pixmap, &opendir_bitmap);
   gftp_get_pixmap (dlwdw, "dir.xpm", &closedir_pixmap, &closedir_bitmap);
 
-  text[0] = GFTP_GET_HOSTNAME (tdata->fromreq);
+  text[0] = tdata->fromreq->hostname;
   text[1] = _("Waiting...");
-  tdata->node = gtk_ctree_insert_node (GTK_CTREE (dlwdw), NULL, NULL, text, 5,
+  tdata->user_data = gtk_ctree_insert_node (GTK_CTREE (dlwdw), NULL, NULL, 
+                                       text, 5,
                                        closedir_pixmap, closedir_bitmap, 
                                        opendir_pixmap, opendir_bitmap, 
                                        FALSE, 
@@ -1380,7 +1138,7 @@
   transdata = g_malloc (sizeof (*transdata));
   transdata->transfer = tdata;
   transdata->curfle = NULL;
-  gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tdata->node, transdata);
+  gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tdata->user_data, transdata);
   tdata->show = 0;
   tdata->curfle = tdata->updfle = tdata->files;
 
@@ -1401,13 +1159,15 @@
           text[1] = _("Waiting...");
         }
 
-      tempfle->node = gtk_ctree_insert_node (GTK_CTREE (dlwdw), tdata->node, 
+      tempfle->user_data = gtk_ctree_insert_node (GTK_CTREE (dlwdw), 
+                                             tdata->user_data, 
                                              NULL, text, 5, NULL, NULL, NULL, 
                                              NULL, FALSE, FALSE);
       transdata = g_malloc (sizeof (*transdata));
       transdata->transfer = tdata;
       transdata->curfle = templist;
-      gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tempfle->node, transdata);
+      gtk_ctree_node_set_row_data (GTK_CTREE (dlwdw), tempfle->user_data, 
+                                   transdata);
     }
 
   if (!tdata->toreq->stopable && tdata->toreq->need_userpass &&
@@ -1467,30 +1227,32 @@
                            ((gftp_window_data *) tdata->towdata)->request, 1)) 
 	refresh (tdata->towdata);
 
-      transfer_in_progress--;
+      num_transfers_in_progress--;
     }
 
   if (!tdata->show && tdata->started)
     {
-      transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), tdata->node);
+      transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), 
+                                               tdata->user_data);
       if (transdata != NULL)
         g_free (transdata);
 
       for (templist = tdata->files; templist != NULL; templist = templist->next)
         {
           tempfle = templist->data;
-          transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), tempfle->node);
+          transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), 
+                                                   tempfle->user_data);
           if (transdata != NULL)
             g_free (transdata);
         }
           
-      gtk_ctree_remove_node (GTK_CTREE (dlwdw), tdata->node);
+      gtk_ctree_remove_node (GTK_CTREE (dlwdw), tdata->user_data);
     }
+
   pthread_mutex_lock (&transfer_mutex);
-  file_transfers = g_list_remove_link (file_transfers, node);
+  gftp_file_transfers = g_list_remove_link (gftp_file_transfers, node);
   pthread_mutex_unlock (&transfer_mutex);
-  pthread_mutex_destroy (tdata->structmutex);
-  pthread_mutex_destroy (tdata->statmutex);
+
   free_tdata (tdata);
 }
 
@@ -1514,10 +1276,10 @@
                            ((gftp_window_data *) tdata->fromwdata)->request);
 	  update_window_info ();
 	}
-      transfer_in_progress++;
+      num_transfers_in_progress++;
       tdata->started = 1;
       tdata->stalled = 1;
-      gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->node, 1,
+      gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->user_data, 1,
 			       _("Connecting..."));
       pthread_create (&tid, NULL, gftp_gtk_transfer_files, tdata);
     }
@@ -1533,7 +1295,7 @@
   gftp_file * tempfle;
   struct timeval tv;
 
-  pthread_mutex_lock (tdata->statmutex);
+  g_static_mutex_lock (&tdata->statmutex);
   tempfle = tdata->curfle->data;
 
   gettimeofday (&tv, NULL);
@@ -1549,7 +1311,7 @@
 
   if (hours < 0 || mins < 0 || secs < 0)
     {
-      pthread_mutex_unlock (tdata->statmutex);
+      g_static_mutex_unlock (&tdata->statmutex);
       return;
     }
 
@@ -1597,12 +1359,12 @@
         }
     }
 
-  pthread_mutex_unlock (tdata->statmutex);
+  g_static_mutex_unlock (&tdata->statmutex);
 
-  gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->node, 1, totstr);
+  gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tdata->user_data, 1, totstr);
 
   if (*dlstr != '\0')
-    gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->node, 1, dlstr);
+    gtk_ctree_node_set_text (GTK_CTREE (dlwdw), tempfle->user_data, 1, dlstr);
 }
 
 static void
@@ -1630,10 +1392,11 @@
 gint
 update_downloads (gpointer data)
 {
+  int do_one_transfer_at_a_time, start_file_transfers;
   GList * templist, * next;
   gftp_transfer * tdata;
 
-  if (file_transfer_logs != NULL)
+  if (gftp_file_transfer_logs != NULL)
     display_cached_logs ();
 
   if (window1.request->gotbytes != 0)
@@ -1644,12 +1407,12 @@
   if (viewedit_process_done)
     check_done_process ();
 
-  for (templist = file_transfers; templist != NULL;)
+  for (templist = gftp_file_transfers; templist != NULL;)
     {
       tdata = templist->data;
       if (tdata->ready)
         {
-          pthread_mutex_lock (tdata->structmutex);
+          g_static_mutex_lock (&tdata->structmutex);
 
 	  if (tdata->next_file)
 	    on_next_transfer (tdata);
@@ -1658,7 +1421,7 @@
 	  else if (tdata->done)
 	    {
 	      next = templist->next;
-              pthread_mutex_unlock (tdata->structmutex);
+              g_static_mutex_unlock (&tdata->structmutex);
 	      transfer_done (templist);
 	      templist = next;
 	      continue;
@@ -1666,14 +1429,19 @@
 
 	  if (tdata->curfle != NULL)
 	    {
+              gftp_lookup_global_option ("do_one_transfer_at_a_time", 
+                                         &do_one_transfer_at_a_time);
+              gftp_lookup_global_option ("start_file_transfers",  /* FIXME - this is gone now */
+                                         &start_file_transfers);
+
 	      if (!tdata->started && start_file_transfers &&
-                  (transfer_in_progress == 0 || !do_one_transfer_at_a_time))
+                 (num_transfers_in_progress == 0 || !do_one_transfer_at_a_time))
                 create_transfer (tdata);
 
 	      if (tdata->started)
                 update_file_status (tdata);
 	    }
-          pthread_mutex_unlock (tdata->structmutex);
+          g_static_mutex_unlock (&tdata->structmutex);
         }
       templist = templist->next;
     }
@@ -1698,10 +1466,10 @@
   node = GTK_CLIST (dlwdw)->selection->data;
   transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), node);
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
   if (!transdata->transfer->started)
     create_transfer (transdata->transfer);
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 }
 
 
@@ -1720,7 +1488,7 @@
   node = GTK_CLIST (dlwdw)->selection->data;
   transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), node);
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
   if (transdata->transfer->started)
     {
       transdata->transfer->cancel = 1;
@@ -1730,7 +1498,7 @@
     }
   else
     transdata->transfer->done = 1;
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 
   ftp_log (gftp_logging_misc, NULL, _("Stopping the transfer on host %s\n"),
 	   transdata->transfer->fromreq->hostname);
@@ -1754,7 +1522,7 @@
   node = GTK_CLIST (dlwdw)->selection->data;
   transdata = gtk_ctree_node_get_row_data (GTK_CTREE (dlwdw), node);
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
   if (transdata->transfer->curfle != NULL)
     {
       curfle = transdata->transfer->curfle->data;
@@ -1771,7 +1539,7 @@
     }
   else
     file = NULL;
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 
   ftp_log (gftp_logging_misc, NULL, _("Skipping file %s on host %s\n"), 
            file, transdata->transfer->fromreq->hostname);
@@ -1804,7 +1572,7 @@
   if (curfle->transfer_action & GFTP_TRANS_ACTION_SKIP)
     return;
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
 
   curfle->transfer_action = GFTP_TRANS_ACTION_SKIP;
 
@@ -1819,12 +1587,12 @@
   else if (transdata->curfle != transdata->transfer->curfle &&
            !curfle->transfer_done)
     {
-      gtk_ctree_node_set_text (GTK_CTREE (dlwdw), curfle->node, 1,
+      gtk_ctree_node_set_text (GTK_CTREE (dlwdw), curfle->user_data, 1,
                                _("Skipped"));
       transdata->transfer->total_bytes -= curfle->size;
     }
 
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 
   ftp_log (gftp_logging_misc, NULL, _("Skipping file %s on host %s\n"),
            curfle->file, transdata->transfer->fromreq->hostname);
@@ -1850,7 +1618,7 @@
   if (transdata->curfle == NULL)
     return;
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
   if (transdata->curfle->prev != NULL && (!transdata->transfer->started ||
       (transdata->transfer->curfle != transdata->curfle && 
        transdata->transfer->curfle != transdata->curfle->prev)))
@@ -1882,13 +1650,12 @@
         }
 
       gtk_ctree_move (GTK_CTREE (dlwdw), 
-                      ((gftp_file *) transdata->curfle->data)->node,
-                      transdata->transfer->node, 
+                      ((gftp_file *) transdata->curfle->data)->user_data,
+                      transdata->transfer->user_data, 
                       transdata->curfle->next != NULL ?
-                          ((gftp_file *) transdata->curfle->next->data)->node :
-                          NULL);
+                          ((gftp_file *) transdata->curfle->next->data)->user_data: NULL);
     }
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 }
 
 void
@@ -1910,7 +1677,7 @@
   if (transdata->curfle == NULL)
     return;
 
-  pthread_mutex_lock (transdata->transfer->structmutex);
+  g_static_mutex_lock (&transdata->transfer->structmutex);
   if (transdata->curfle->next != NULL && (!transdata->transfer->started ||
       (transdata->transfer->curfle != transdata->curfle && 
        transdata->transfer->curfle != transdata->curfle->next)))
@@ -1942,13 +1709,12 @@
         }
 
       gtk_ctree_move (GTK_CTREE (dlwdw), 
-                      ((gftp_file *) transdata->curfle->data)->node,
-                      transdata->transfer->node, 
+                      ((gftp_file *) transdata->curfle->data)->user_data,
+                      transdata->transfer->user_data, 
                       transdata->curfle->next != NULL ?
-                          ((gftp_file *) transdata->curfle->next->data)->node :
-                          NULL);
+                          ((gftp_file *) transdata->curfle->next->data)->user_data: NULL);
     }
-  pthread_mutex_unlock (transdata->transfer->structmutex);
+  g_static_mutex_unlock (&transdata->transfer->structmutex);
 }
 
 
@@ -2046,7 +1812,7 @@
   GList * templist;
 
   tdata = data;
-  pthread_mutex_lock ((pthread_mutex_t *) tdata->structmutex);
+  g_static_mutex_lock (&tdata->structmutex);
   for (templist = tdata->files; templist != NULL; templist = templist->next)
     {
       tempfle = templist->data;
@@ -2061,7 +1827,7 @@
     }
   else
     tdata->show = tdata->ready = 1;
-  pthread_mutex_unlock ((pthread_mutex_t *) tdata->structmutex);
+  g_static_mutex_unlock (&tdata->structmutex);
 }
 
 
@@ -2071,10 +1837,10 @@
   gftp_transfer * tdata;
 
   tdata = data;
-  pthread_mutex_lock ((pthread_mutex_t *) tdata->structmutex);
+  g_static_mutex_lock (&tdata->structmutex);
   tdata->show = 0;
   tdata->done = tdata->ready = 1;
-  pthread_mutex_unlock ((pthread_mutex_t *) tdata->structmutex);
+  g_static_mutex_unlock (&tdata->structmutex);
 }
 
 
@@ -2104,10 +1870,10 @@
   char *dltitles[4], *add_data[4] = { NULL, NULL, NULL, NULL },
        tempstr[50], temp1str[50], *pos, *title;
   GtkWidget * tempwid, * scroll, * hbox;
+  int i, overwrite_by_default;
   gftp_file * tempfle;
   GList * templist;
   size_t len;
-  int i;
 
   dltitles[0] = _("Filename");
   dltitles[1] = _("Local Size");
@@ -2173,6 +1939,9 @@
   gtk_widget_show (tdata->clist);
   gtk_widget_show (scroll);
 
+  gftp_lookup_request_option (tdata->fromreq, "overwrite_by_default",
+                              &overwrite_by_default);
+
   for (templist = tdata->files; templist != NULL; 
        templist = templist->next)
     {
@@ -2185,8 +1954,8 @@
       tempfle->shown = 1;
 
       pos = tempfle->destfile;
-      len = strlen (GFTP_GET_DIRECTORY (tdata->toreq));
-      if (strncmp (pos, GFTP_GET_DIRECTORY (tdata->toreq), len) == 0)
+      len = strlen (tdata->toreq->directory);
+      if (strncmp (pos, tdata->toreq->directory, len) == 0)
         pos = tempfle->destfile + len + 1;
       add_data[0] = pos;