I did this in a May 17th cut of in 2.2.x, which was right around the 2.2.4
release. I didn't submit a patch, because I didn't think there were that
many people using a file system that has extended attributes.

NOTE: Need to define lp_store_dos_mode config option and pick a name for
DOSMODE_ATTR_NAME for this code to work.

This is how I did it in 2.2:

sambma/source/smbd/dosmode.c:

/***************************************************************************
*
  change a unix mode to a dos mode
****************************************************************************
/
int dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf)
{
  int result = 0;

  DEBUG(8,("dos_mode: %s\n", path));
  
+       /* Load dos mode from EAs if enabled */
+       if (lp_store_dos_mode()) {
+               
+               int size = sizeof(result);
+               if (conn->vfs_ops.get_ea(conn, path, DOSMODE_ATTR_NAME,
(char*)&result, &size) == -1) {
+
+                       if (S_ISDIR(sbuf->st_mode)) {
+                               result = FILE_ATTRIBUTE_DIRECTORY;
+                       }
+                       else {
+                               result = FILE_ATTRIBUTE_ARCHIVE;
+                       }
+               }
+       }
+
+       /* Otherwise perform the usual mapping */
+       else {

...

/*******************************************************************
chmod a file - but preserve some bits
********************************************************************/
int file_chmod(connection_struct *conn,char *fname,int
dosmode,SMB_STRUCT_STAT *st)
{
        SMB_STRUCT_STAT st1;
        int mask=0;
        mode_t tmp;
        mode_t unixmode;
        int ret = -1;

        if (!st) {
                st = &st1;
                if (vfs_stat(conn,fname,st))
                        return(-1);
        }

        if (S_ISDIR(st->st_mode))
                dosmode |= aDIR;
        else
                dosmode &= ~aDIR;

+       /* Store dos mode in EAs if enabled */
+       if (lp_store_dos_mode()) {
+               return conn->vfs_ops.set_ea(conn, fname, DOSMODE_ATTR_NAME,
(char*)&dosmode, sizeof(dosmode));
+       }

        if (dos_mode(conn,fname,st) == dosmode)
                return(0);

        unixmode = unix_mode(conn,dosmode,fname);

        /* preserve the s bits */
        mask |= (S_ISUID | S_ISGID);

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: Friday, March 21, 2003 10:33 AM
To: Olaf Frączyk
Cc: [EMAIL PROTECTED]
Subject: Re: Extended Attributes and Hidden, System, Archive attrs?


On Fri, Mar 21, 2003 at 09:44:26AM +0100, Olaf Frączyk wrote:
> Hi,
> 
> I remember some time ago several people were discussing about putting
> the Hidden, System, Archive, Read-Only bits in EAs.
> 
> Has it been done in 3.0?
> Will it be in 2.2.x serie?

Not done for 2.2., I'm thinking about it for 3.0.

Jeremy.

Reply via email to