1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-29 11:21:54 +03:00
samba-mirror/source3/lib/netatalk.c
Jeremy Allison 7bb86c1b13 Ok - this is the 64 bit widening check in. It changes the configure
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)
1998-09-03 18:40:31 +00:00

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 */