1998-08-13 22:46:35 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
1998-08-13 22:46:35 +04:00
Copyright ( C ) Andrew Tridgell 1992 - 1998
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/*
netatalk . c : routines for improving interaction between Samba and netatalk .
Copyright ( C ) John D . Blair < jdblair @ cobaltnet . com > 1998
Cobalt Networks , Inc .
*/
# include "includes.h"
# ifdef WITH_NETATALK
/*****************
ntalk_resourcepath : creates the path to the netatalk resource fork for
a given file
fname : normal filename
doublename : buffer that will contain the location of the resource fork
length : length of this buffer ( to prevent overflows )
NOTE : doesn ' t currently gracefully deal with buffer overflows - it just
doesn ' t allow them to occur .
* * * * * * * * * * * * * * * * * */
void ntalk_resourcepath ( const char * fname , char * doublename , const int length )
{
int i ;
int charnum ;
int lastslash ;
char appledouble [ ] = APPLEDOUBLE ;
/* copy fname to doublename and find last slash */
for ( i = 0 ; ( fname [ i ] ! = 0 ) & & ( i < = length ) ; i + + ) {
if ( fname [ i ] = = ' / ' ) {
lastslash = i ;
}
doublename [ i ] = fname [ i ] ;
}
lastslash + + ; /* location just after last slash */
/* insert .AppleDouble */
charnum = lastslash ;
for ( i = 0 ; ( appledouble [ i ] ! = 0 ) & & ( i < = length ) ; i + + ) {
doublename [ charnum ] = appledouble [ i ] ;
charnum + + ;
}
/* append last part of file name */
for ( i = lastslash ; ( fname [ i ] ! = 0 ) & & ( i < = length ) ; i + + ) {
doublename [ charnum ] = fname [ i ] ;
charnum + + ;
}
doublename [ charnum ] = 0 ;
}
/**********************
ntalk_mkresdir : creates a new . AppleDouble directory ( if necessary )
for the resource fork of a specified file
* * * * * * * * * * * * * * * * * * * * * */
int ntalk_mkresdir ( const char * fname )
{
char fdir [ 255 ] ;
int i ;
int lastslash ;
1998-09-02 00:11:54 +04:00
SMB_STRUCT_STAT dirstats ;
1998-08-13 22:46:35 +04:00
char appledouble [ ] = APPLEDOUBLE ;
/* find directory containing fname */
for ( i = 0 ; ( fname [ i ] ! = 0 ) & & ( i < = 254 ) ; i + + ) {
fdir [ i ] = fname [ i ] ;
if ( fdir [ i ] = = ' / ' ) {
lastslash = i ;
}
}
lastslash + + ;
fdir [ lastslash ] = 0 ;
1998-09-03 22:40:31 +04:00
sys_lstat ( fdir , & dirstats ) ;
1998-08-13 22:46:35 +04:00
/* append .AppleDouble */
for ( i = 0 ; ( appledouble [ i ] ! = 0 ) & & ( lastslash < = 254 ) ; i + + ) {
fdir [ lastslash ] = appledouble [ i ] ;
lastslash + + ;
}
fdir [ lastslash ] = 0 ;
/* create this directory */
/* silently ignore EEXIST error */
if ( ( mkdir ( fdir , dirstats . st_mode ) < 0 ) & & ( errno ! = EEXIST ) ) {
return errno ;
}
/* set ownership of this dir to the same as its parent */
/* holy race condition, batman! */
/* warning: this doesn't check for errors */
chown ( fdir , dirstats . st_uid , dirstats . st_gid ) ;
printf ( " %s \n " , fdir ) ;
return 1 ;
}
/**********************
ntalk_unlink : unlink a file and its resource fork
* * * * * * * * * * * * * * * * * * * * * */
int ntalk_unlink ( const char * fname )
{
char buf [ 255 ] ;
ntalk_resourcepath ( fname , buf , 255 ) ;
unlink ( buf ) ;
return unlink ( fname ) ;
}
/**********************
ntalk_chown : chown a file and its resource fork
* * * * * * * * * * * * * * * * * * * * * */
int ntalk_chown ( const char * fname , const uid_t uid , const gid_t gid )
{
char buf [ 255 ] ;
ntalk_resourcepath ( fname , buf , 255 ) ;
chown ( buf , uid , gid ) ;
return chown ( fname , uid , gid ) ;
}
/**********************
ntalk_chmod : chmod a file and its resource fork
* * * * * * * * * * * * * * * * * * * * * */
int ntalk_chmod ( const char * fname , mode_t perms )
{
char buf [ 255 ] ;
ntalk_resourcepath ( fname , buf , 255 ) ;
chmod ( buf , perms ) ;
return chmod ( fname , perms ) ;
}
# endif /* WITH_NETATALK */