mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
7bb86c1b13
to check for stat64 and friends, and then changes much of Samba
to use the data type SMB_OFF_T for file size information.
stat/fstat/lstat/lseek/ftruncate have now become sys_stat etc. to hide
the 64 bit calls if needed.
Note that this still does not expose 64 bit functionality to the
client, as the changes to the reply_xxx smb's are not yet done.
This code change should make these changes possible.
Still to do before full 64 bit-ness to the client:
fcntl lock code.
statfs code
widening of dev_t and ino_t (now possible due to SMB_DEV_T and SMB_OFF_T
types being in place).
Let me know if wierd things happen after this check-in and I'll
fix them :-).
Jeremy.
(This used to be commit 14500936c3
)
160 lines
4.1 KiB
C
160 lines
4.1 KiB
C
/*
|
|
Unix SMB/Netbios implementation.
|
|
Version 1.9.
|
|
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 02139, 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
|
|
|
|
extern int DEBUGLEVEL;
|
|
|
|
/*****************
|
|
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;
|
|
SMB_STRUCT_STAT dirstats;
|
|
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;
|
|
sys_lstat(fdir, &dirstats);
|
|
|
|
/* 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 */
|