Samba network recycle bin (fwd)

Rafal Szczesniak mimir at spin.ict.pwr.wroc.pl
Mon Nov 5 12:37:01 GMT 2001


On Sun, 4 Nov 2001, Gerald (Jerry) Carter wrote:

> What do people think about this?  Do you like the
> idea of implementing a network trash bin?

Who's going to implement it ? That's the main problem usually. The
patch seems to be good start, but there may be some errors to solve...

Eitherway, the idea looks interesting :)

> cheers, jerry
>
> ---------- Forwarded message ----------
> Date: Thu, 01 Nov 2001 23:07:55 +0200
> From: Eelco Vriezekolk <eelco at nexus.com.na>
> To: samba at lists.samba.org
> Subject: Re: Samba network recycle bin
>
> This is the patch I use. No warranties other than that it seems to
> work fine for me. Hope that the line-wrapping doesn't mess this up.
>
> diff -Nabur samba-2.2.2-orig/source/include/proto.h samba-2.2.2/source/include/proto.h
> --- samba-2.2.2-orig/source/include/proto.h	Sat Oct 13 23:09:22 2001
> +++ samba-2.2.2/source/include/proto.h	Tue Oct 23 12:49:37 2001
> @@ -1909,6 +1909,7 @@
>   char *lp_hide_files(int );
>   char *lp_veto_oplocks(int );
>   char *lp_driverlocation(int );
> +char *lp_recyclebin(int );
>   BOOL lp_msdfs_root(int );
>   BOOL lp_autoloaded(int );
>   BOOL lp_preexec_close(int );
> diff -Nabur samba-2.2.2-orig/source/param/loadparm.c samba-2.2.2/source/param/loadparm.c
> --- samba-2.2.2-orig/source/param/loadparm.c	Sat Oct 13 23:09:31 2001
> +++ samba-2.2.2/source/param/loadparm.c	Tue Oct 23 12:49:37 2001
> @@ -332,6 +332,7 @@
>   	char *printer_admin;
>   	char *volume;
>   	char *fstype;
> +
> char *recycle_bin;
>   	char *szVfsObjectFile;
>   	char *szVfsOptions;
>   	int iMinPrintSpace;
> @@ -447,6 +448,7 @@
>   	NULL, 	/* printer admin */
>   	NULL, 	/* volume */
>   	NULL, 	/* fstype */
> + 	NULL, 	/* recycle_bin */
>   	NULL, 	/* vfs object */
>   	NULL, 	/* vfs options */
>   	0,
> 		/* iMinPrintSpace */
> @@ -1034,6 +1036,7 @@
>   	{"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, 0},
>   	{"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL,
>   	 NULL, 0},
> + {"recycle bin", P_STRING, P_LOCAL, &sDefault.recycle_bin, NULL, NULL,  FLAG_SHARE},
>
>   	{"VFS options", P_SEP, P_SEPARATOR},
>
> @@ -1660,6 +1663,7 @@
>   FN_LOCAL_STRING(lp_hide_files, szHideFiles)
>   FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
>   FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)
> +FN_LOCAL_STRING(lp_recyclebin,recycle_bin)
>   FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
>   FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
>   FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
> diff -Nabur samba-2.2.2-orig/source/smbd/reply.c samba-2.2.2/source/smbd/reply.c
> --- samba-2.2.2-orig/source/smbd/reply.c	Sat Oct 13 23:09:41 2001
> +++ samba-2.2.2/source/smbd/reply.c	Tue Oct 23 12:49:37 2001
> @@ -1960,6 +1960,63 @@
>     return(True);
>   }
>
> +/********************************************************************
> +check if file should be recycled
> +*********************************************************************/
> +static int recycle(connection_struct *conn, char *fname, char *recycle_bin)
> +{
> +  char *base, *ext;
> +  pstring bin;
> +  int i=1, len, addlen;
> +
> +  SMB_BIG_UINT dfree,dsize,bsize;
> +
> +  if(!recycle_bin || !*recycle_bin) {
> +    DEBUG(3, ("recycle bin: share parameter not set, purging %s...\n", fname));
> +    return vfs_unlink(conn,fname);
> + }
> +
> +  if(get_file_size(fname) == 0) {
> +    DEBUG(3, ("recycle bin: file %s is empty, purging...\n", fname));
> +    return vfs_unlink(conn,fname);
> +  }
> +
> +  base = strrchr(fname, '/') + 1;
> +  if(base == (char*)1) base = fname;
> +
> +  ext = strrchr(base, '.');
> +
> +  pstrcpy(bin, recycle_bin);
> +  pstrcat(bin, "/");
> +  pstrcat(bin, base);
> +
> +  if(strcmp(fname,bin) == 0) {
> +    DEBUG(3, ("recycle bin: file %s exists, purging...\n", fname));
> +    return vfs_unlink(conn,fname);
> +  }
> +
> +  if(!directory_exist(recycle_bin,NULL)) {
> +    vfs_mkdir(conn,recycle_bin,unix_mode(conn,aDIR,recycle_bin));
> +  }
> +
> +  len = strlen(bin);
> +  addlen = sizeof(pstring)-len-1;
> +  while(vfs_file_exist(conn,bin, NULL)) {
> +    slprintf(bin+len, addlen, " (Copy #%d)", i++);
> +    pstrcat(bin, ext);
> +  }
> +
> +  DEBUG(3, ("recycle bin: moving source=%s to  dest=%s\n", fname, bin));
> +  sys_disk_free(".",True,&bsize,&dfree,&dsize);
> +  if((unsigned int)dfree > 0) {
> +    DEBUG(3, ("recycle bin: move successful\n"));
> +    return rename(fname, bin);
> +  } else {
> +    DEBUG(3, ("recycle bin: move failed, purging...\n"));
> +    return vfs_unlink(conn,fname);
> +  }
> +}
> +
>   /****************************************************************************
>    The guts of the unlink command, split out so it may be called by the NT SMB
>    code.
> @@ -1971,6 +2028,7 @@
>     pstring directory;
>     pstring mask;
>     char *p;
> +  char *recycle_bin = lp_recyclebin(SNUM(conn));
>     int count=0;
>     int error = ERRnoaccess;
>     BOOL has_wild;
> @@ -2010,7 +2068,7 @@
>     if (!has_wild) {
>       pstrcat(directory,"/");
>       pstrcat(directory,mask);
> -    if (can_delete(directory,conn,dirtype) && !vfs_unlink(conn,directory))
> +    if (can_delete(directory,conn,dirtype) && !recycle(conn, directory, recycle_bin))
>         count++;
>       if (!count)
>         exists = vfs_file_exist(conn,directory,&sbuf);
> @@ -2043,7 +2101,7 @@
>   	    error = ERRnoaccess;
>   	    slprintf(fname,sizeof(fname)-1, "%s/%s",directory,dname);
>   	    if (!can_delete(fname,conn,dirtype)) continue;
> -
>      if (!vfs_unlink(conn,fname)) count++;
> +
>      if (!recycle(conn, fname, recycle_bin)) count++;
>   	    DEBUG(3,("unlink_internals: succesful unlink [%s]\n",fname));
>   	  }
>   	CloseDir(dirptr);
>
>
> --
> Nexus Consultants cc, Eelco Vriezekolk <eelco at nexus.com.na>
> Phone:  +264 61 252345     AOL IM: "vriezekolk"
> Fax:    +264 61 250392
> Mobile: +264 81 2495182
>
>
> --
> To unsubscribe from this list go to the following URL and read the
> instructions:  http://lists.samba.org/mailman/listinfo/samba
>
>
>

cheers,
+--------------------------------------------------------+
|Rafal 'Mimir' Szczesniak <mimir at spin.ict.pwr.wroc.pl>   |
|*BSD, Linux and Samba                                  /
|______________________________________________________/





More information about the samba-technical mailing list