[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [gftp] site chgrp



søn, 2003-09-21 kl. 13:14 skrev Niels Andersen:
> I'd like to see support for "site chgrp" in gFTP.

I don't know much C, and GTK is worse. But I tried making chgrp work
anyway. This is how far I could get, I don't know if it is any help. :)

Notes:
lib/local.c: local_chgrp should be created
src/gtk/misc-gtk.c:  Increased some numbers to make room for chgrp, I
have no idea if it's right
./src/gtk/chgrp_dialog.c: I've just change "chmod" to "chgrp" a few
places, the real work still needs to be done.
/lib/sshv2.c: Not changed, should also support chgrp.

Test-results:
If I right-click on a file on an ftp-server, "Chmod..." is grey.
If I right-click on a file on an ftp-server and select "Chgrp..." I get
the message "Chgrp: This feature is not available using this protocol"

A patch is attached.

If I spent a lot more time on it, I should be able to make a better
patch. But I think that at least one person on this list should be able
to complete it in a lot less time. ;-)

-- 
Mvh.

Niels Andersen
diff -r -u gftp-2.0.15.orig/lib/bookmark.c gftp-2.0.15/lib/bookmark.c
--- gftp-2.0.15.orig/lib/bookmark.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/lib/bookmark.c	2003-09-21 18:40:16.000000000 +0200
@@ -80,6 +80,7 @@
   request->mkdir = NULL;
   request->rename = NULL;
   request->chmod = NULL;
+  request->chgrp = NULL;
   request->set_file_time = NULL;
   request->site = NULL;
   request->parse_url = bookmark_parse_url;
diff -r -u gftp-2.0.15.orig/lib/gftp.h gftp-2.0.15/lib/gftp.h
--- gftp-2.0.15.orig/lib/gftp.h	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/lib/gftp.h	2003-09-21 18:21:37.000000000 +0200
@@ -415,6 +415,9 @@
   int (*chmod)				( gftp_request * request, 
 					  const char *filename, 
 					  int mode );
+  int (*chgrp)				( gftp_request * request, 
+					  const char *filename, 
+					  const char *group );
   int (*set_file_time)			( gftp_request * request, 
 					  const char *filename, 
 					  time_t datettime );
@@ -864,6 +867,10 @@
 					  const char *file, 
 					  int mode );
 
+int gftp_chgrp 				( gftp_request * request, 
+					  const char *file, 
+					  const char *group );
+
 int gftp_set_file_time 			( gftp_request * request, 
 					  const char *file, 
 					  time_t datetime );
diff -r -u gftp-2.0.15.orig/lib/protocols.c gftp-2.0.15/lib/protocols.c
--- gftp-2.0.15.orig/lib/protocols.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/lib/protocols.c	2003-09-21 18:21:53.000000000 +0200
@@ -851,6 +851,17 @@
 
 
 int
+gftp_chgrp (gftp_request * request, const char *file, const char *group)
+{
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+
+  if (request->chgrp == NULL)
+    return (GFTP_EFATAL);
+  return (request->chgrp (request, file, group));
+}
+
+
+int
 gftp_set_file_time (gftp_request * request, const char *file, time_t datetime)
 {
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
diff -r -u gftp-2.0.15.orig/lib/rfc2068.c gftp-2.0.15/lib/rfc2068.c
--- gftp-2.0.15.orig/lib/rfc2068.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/lib/rfc2068.c	2003-09-21 18:27:32.000000000 +0200
@@ -902,6 +902,7 @@
   request->mkdir = NULL;
   request->rename = NULL;
   request->chmod = NULL;
+  request->chgrp = NULL;
   request->site = NULL;
   request->parse_url = NULL;
   request->swap_socks = NULL;
diff -r -u gftp-2.0.15.orig/lib/rfc959.c gftp-2.0.15/lib/rfc959.c
--- gftp-2.0.15.orig/lib/rfc959.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/lib/rfc959.c	2003-09-21 18:26:05.000000000 +0200
@@ -1592,6 +1592,30 @@
 
 
 static int
+rfc959_chgrp (gftp_request * request, const char *file, const char *group)
+{
+  char *tempstr, ret;
+
+  g_return_val_if_fail (request != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL);
+  g_return_val_if_fail (file != NULL, GFTP_EFATAL);
+  g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
+
+  tempstr = g_malloc (strlen (file) + strlen(group) + 16);
+  sprintf (tempstr, "SITE CHGRP %s %s\r\n", group, file);
+  ret = rfc959_send_command (request, tempstr);
+  g_free (tempstr);
+
+  if (ret < 0)
+    return (ret);
+  else if (ret == '2')
+    return (0);
+  else
+    return (GFTP_ERETRYABLE);
+}
+
+
+static int
 rfc959_site (gftp_request * request, const char *command)
 {
   char *tempstr, ret;
diff -r -u gftp-2.0.15.orig/src/gtk/Makefile gftp-2.0.15/src/gtk/Makefile
--- gftp-2.0.15.orig/src/gtk/Makefile	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/Makefile	2003-09-21 18:06:01.000000000 +0200
@@ -112,7 +112,7 @@
 
 bin_PROGRAMS = gftp-gtk
 EXTRA_PROGRAMS = gftp-gtk
-gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c delete_dialog.c dnd.c                      gftp-gtk.c menu-items.c misc-gtk.c mkdir_dialog.c                      options_dialog.c rename_dialog.c transfer.c view_dialog.c
+gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c chgrp_dialog.c delete_dialog.c dnd.c                      gftp-gtk.c menu-items.c misc-gtk.c mkdir_dialog.c                      options_dialog.c rename_dialog.c transfer.c view_dialog.c
 
 INCLUDES = -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/X11R6/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -D_REENTRANT -DSHARE_DIR=\"$(datadir)/gftp\" -DLOCALE_DIR=\"$(localedir)\" -I../../intl
 LDADD = ../../lib/libgftp.a -Wl,--export-dynamic -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0   -lpthread -lutil -lnsl -lm -lgthread-2.0 -lcrypto -lssl
@@ -129,7 +129,7 @@
 CPPFLAGS = 
 LDFLAGS = 
 LIBS = 
-gftp_gtk_OBJECTS =  bookmarks.o chmod_dialog.o delete_dialog.o dnd.o \
+gftp_gtk_OBJECTS =  bookmarks.o chmod_dialog.o chgrp_dialog.o delete_dialog.o dnd.o \
 gftp-gtk.o menu-items.o misc-gtk.o mkdir_dialog.o options_dialog.o \
 rename_dialog.o transfer.o view_dialog.o
 gftp_gtk_LDADD = $(LDADD)
diff -r -u gftp-2.0.15.orig/src/gtk/Makefile.am gftp-2.0.15/src/gtk/Makefile.am
--- gftp-2.0.15.orig/src/gtk/Makefile.am	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/Makefile.am	2003-09-21 18:05:15.000000000 +0200
@@ -2,7 +2,7 @@
 
 bin_PROGRAMS = @GFTP_GTK@
 EXTRA_PROGRAMS = gftp-gtk
-gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c delete_dialog.c dnd.c \
+gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c chgrp_dialog.c delete_dialog.c dnd.c \
                      gftp-gtk.c menu-items.c misc-gtk.c mkdir_dialog.c \
                      options_dialog.c rename_dialog.c transfer.c view_dialog.c
 INCLUDES = @GTK_CFLAGS@ @PTHREAD_CFLAGS@ -DSHARE_DIR=\"$(datadir)/gftp\" -DLOCALE_DIR=\"$(localedir)\" -I../../intl
diff -r -u gftp-2.0.15.orig/src/gtk/Makefile.in gftp-2.0.15/src/gtk/Makefile.in
--- gftp-2.0.15.orig/src/gtk/Makefile.in	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/Makefile.in	2003-09-21 18:05:50.000000000 +0200
@@ -112,7 +112,7 @@
 
 bin_PROGRAMS = @GFTP_GTK@
 EXTRA_PROGRAMS = gftp-gtk
-gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c delete_dialog.c dnd.c                      gftp-gtk.c menu-items.c misc-gtk.c mkdir_dialog.c                      options_dialog.c rename_dialog.c transfer.c view_dialog.c
+gftp_gtk_SOURCES = bookmarks.c chmod_dialog.c chgrp_dialog.c delete_dialog.c dnd.c                      gftp-gtk.c menu-items.c misc-gtk.c mkdir_dialog.c                      options_dialog.c rename_dialog.c transfer.c view_dialog.c
 
 INCLUDES = @GTK_CFLAGS@ @PTHREAD_CFLAGS@ -DSHARE_DIR=\"$(datadir)/gftp\" -DLOCALE_DIR=\"$(localedir)\" -I../../intl
 LDADD = ../../lib/libgftp.a @GTK_LIBS@ @PTHREAD_LIBS@ @EXTRA_LIBS@ @GTHREAD_LIBS@ @SSL_LIBS@
@@ -129,7 +129,7 @@
 CPPFLAGS = @CPPFLAGS@
 LDFLAGS = @LDFLAGS@
 LIBS = @LIBS@
-gftp_gtk_OBJECTS =  bookmarks.o chmod_dialog.o delete_dialog.o dnd.o \
+gftp_gtk_OBJECTS =  bookmarks.o chmod_dialog.o chgrp_dialog.o delete_dialog.o dnd.o \
 gftp-gtk.o menu-items.o misc-gtk.o mkdir_dialog.o options_dialog.o \
 rename_dialog.o transfer.o view_dialog.o
 gftp_gtk_LDADD = $(LDADD)
diff -r -u gftp-2.0.15.orig/src/gtk/gftp-gtk.c gftp-2.0.15/src/gtk/gftp-gtk.c
--- gftp-2.0.15.orig/src/gtk/gftp-gtk.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/gftp-gtk.c	2003-09-21 18:12:13.000000000 +0200
@@ -184,6 +184,7 @@
     {N_("/Local/Send SITE Command..."), NULL, site_dialog, 0, MN_(NULL)},
     {N_("/Local/Change Directory"), NULL, chfunc, 0, MN_(NULL)},
     {N_("/Local/Chmod..."), NULL, chmod_dialog, 0, MN_(NULL)},
+    {N_("/Local/Chgrp..."), NULL, chgrp_dialog, 0, MN_(NULL)},
     {N_("/Local/Make Directory..."), NULL, mkdir_dialog, 0, MN_(NULL)},
     {N_("/Local/Rename..."), NULL, rename_dialog, 0, MN_(NULL)},
     {N_("/Local/Delete..."), NULL, delete_dialog, 0, MN_(NULL)},
@@ -207,6 +208,7 @@
     {N_("/Remote/Send SITE Command..."), NULL, site_dialog, 0, MN_(NULL)},
     {N_("/Remote/Change Directory"), NULL, chfunc, 0, MN_(NULL)},
     {N_("/Remote/Chmod..."), NULL, chmod_dialog, 0, MN_(NULL)},
+    {N_("/Remote/Chgrp..."), NULL, chgrp_dialog, 0, MN_(NULL)},
     {N_("/Remote/Make Directory..."), NULL, mkdir_dialog, 0, MN_(NULL)},
     {N_("/Remote/Rename..."), NULL, rename_dialog, 0, MN_(NULL)},
     {N_("/Remote/Delete..."), NULL, delete_dialog, 0, MN_(NULL)},
diff -r -u gftp-2.0.15.orig/src/gtk/gftp-gtk.h gftp-2.0.15/src/gtk/gftp-gtk.h
--- gftp-2.0.15.orig/src/gtk/gftp-gtk.h	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/gftp-gtk.h	2003-09-21 18:12:54.000000000 +0200
@@ -187,6 +187,9 @@
 /* chmod_dialog.c */ 
 void chmod_dialog 				( gpointer data );
 
+/* chgrp_dialog.c */ 
+void chgrp_dialog 				( gpointer data );
+
 /* delete_dialog.c */ 
 void delete_dialog 				( gpointer data );
 
diff -r -u gftp-2.0.15.orig/src/gtk/misc-gtk.c gftp-2.0.15/src/gtk/misc-gtk.c
--- gftp-2.0.15.orig/src/gtk/misc-gtk.c	2003-09-21 17:48:44.000000000 +0200
+++ gftp-2.0.15/src/gtk/misc-gtk.c	2003-09-21 18:49:51.000000000 +0200
@@ -348,17 +348,19 @@
   set_menu_sensitive (wdata, menus[start + 14].path, connected &&
                       wdata->request->chmod != NULL);
   set_menu_sensitive (wdata, menus[start + 15].path, connected &&
-                      wdata->request->mkdir != NULL);
+                      wdata->request->chgrp != NULL); // I've increased the numbers in the next few lines, I have no idea if that's correct.
   set_menu_sensitive (wdata, menus[start + 16].path, connected &&
-                      wdata->request->rename != NULL);
+                      wdata->request->mkdir != NULL);
   set_menu_sensitive (wdata, menus[start + 17].path, connected &&
+                      wdata->request->rename != NULL);
+  set_menu_sensitive (wdata, menus[start + 18].path, connected &&
                       wdata->request->rmdir != NULL &&
                       wdata->request->rmfile != NULL);
-  set_menu_sensitive (wdata, menus[start + 18].path, connected &&
-                      wdata->request->get_file != NULL);
   set_menu_sensitive (wdata, menus[start + 19].path, connected &&
                       wdata->request->get_file != NULL);
-  set_menu_sensitive (wdata, menus[start + 20].path, connected);
+  set_menu_sensitive (wdata, menus[start + 20].path, connected &&
+                      wdata->request->get_file != NULL);
+  set_menu_sensitive (wdata, menus[start + 21].path, connected);
 }  
 
 
diff -r -u gftp-2.0.15.orig/src/text/gftp-text.c gftp-2.0.15/src/text/gftp-text.c
--- gftp-2.0.15.orig/src/text/gftp-text.c	2003-09-21 17:48:45.000000000 +0200
+++ gftp-2.0.15/src/text/gftp-text.c	2003-09-21 18:55:31.000000000 +0200
@@ -38,6 +38,8 @@
          N_("Changes the remote working directory"), NULL},
         {N_("chmod"), 	3, gftp_text_chmod,	&gftp_text_remreq,
          N_("Changes the permissions of a remote file"), NULL},
+        {N_("chgrp"), 	3, gftp_text_chgrp,	&gftp_text_remreq,
+         N_("Changes the group of a remote file"), NULL},
         {N_("clear"),	3, gftp_text_clear,	NULL,
          N_("Available options: cache"), 	gftp_text_clear_show_subhelp},
         {N_("close"), 	3, gftp_text_close, 	&gftp_text_remreq,
@@ -54,6 +56,8 @@
          N_("Changes the local working directory"), NULL},
         {N_("lchmod"), 	4, gftp_text_chmod, 	&gftp_text_locreq,
          N_("Changes the permissions of a local file"), NULL},
+        {N_("lchgrp"), 	4, gftp_text_chmod, 	&gftp_text_locreq,
+         N_("Changes the group of a local file"), NULL},
         {N_("ldelete"), 2, gftp_text_delete, 	&gftp_text_locreq,
          N_("Removes a local file"), NULL},
 	{N_("lls"), 	2, gftp_text_ls, 	&gftp_text_locreq,
@@ -591,6 +595,34 @@
 
 
 int
+gftp_text_chgrp (gftp_request * request, char *command, gpointer *data)
+{
+  char *pos;
+
+  if (!GFTP_IS_CONNECTED (request))
+    {
+      gftp_text_log (gftp_logging_error, request,
+                     _("Error: Not connected to a remote site\n"));
+      return (1);
+    }
+
+  if ((pos = strchr (command, ' ')) != NULL)
+    *pos++ = '\0';
+
+  if (*command == '\0' || pos == NULL || *pos == '\0')
+    {
+      gftp_text_log (gftp_logging_error, request,
+                     _("usage: chgrp <group> <file>\n"));
+    }
+  else
+    {
+      gftp_chgrp (request, pos, command);
+    }
+  return (1);
+}
+
+
+int
 gftp_text_ls (gftp_request * request, char *command, gpointer *data)
 {
   GList * files, * templist, * delitem;
diff -r -u gftp-2.0.15.orig/src/text/gftp-text.h gftp-2.0.15/src/text/gftp-text.h
--- gftp-2.0.15.orig/src/text/gftp-text.h	2003-09-21 17:48:45.000000000 +0200
+++ gftp-2.0.15/src/text/gftp-text.h	2003-09-21 18:51:57.000000000 +0200
@@ -87,6 +87,9 @@
 int gftp_text_chmod				( gftp_request * request, 
 						  char *command, 
 						  gpointer *data);
+int gftp_text_chgrp				( gftp_request * request, 
+						  char *command, 
+						  gpointer *data);
 int gftp_text_ls				( gftp_request * request, 
 						  char *command, 
 						  gpointer *data);