Skip to content

Commit

Permalink
FileAttributes 1.4.0: File permissions and ownership
Browse files Browse the repository at this point in the history
Add the ability to modify the posix permissions (chmod()) and user and
group ids (chown()).

Also properly declare cPathString in unixPathToOop:.
  • Loading branch information
akgrant committed Aug 28, 2018
1 parent 905fbb6 commit ec50a09
Showing 1 changed file with 128 additions and 7 deletions.
135 changes: 128 additions & 7 deletions src/plugins/FileAttributesPlugin/FileAttributesPlugin.c
@@ -1,9 +1,9 @@
/* Automatically generated by
VMPluginCodeGenerator VMMaker.oscog-eem.2430 uuid: 4966a4b7-293a-4911-8f2d-396a7b97d82a
from
FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.35 uuid: 135d275f-e31a-4b07-9803-20061aeecbaa
FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.36 uuid: eb4e9dcc-d749-4b64-820b-b7fb8e9d9991
*/
static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.35 uuid: 135d275f-e31a-4b07-9803-20061aeecbaa " __DATE__ ;
static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.36 uuid: eb4e9dcc-d749-4b64-820b-b7fb8e9d9991 " __DATE__ ;



Expand All @@ -13,8 +13,10 @@ static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin.oscog-Ali
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <limits.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#if _WIN32 || _WIN64
# include <windows.h>
Expand All @@ -24,7 +26,11 @@ static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin.oscog-Ali
# if !defined(PATH_MAX) /* work around bug in 64-bit cygwin; sigh :-( */
# define PATH_MAX 4096
# endif
# define HAVE_CHMOD 0
# define HAVE_CHOWN 0
#else
#define HAVE_CHMOD 1
#define HAVE_CHOWN 1
# include "sqUnixCharConv.h"
#endif
typedef struct dirptrstruct {
Expand Down Expand Up @@ -91,6 +97,8 @@ static int openDirectoryStreamptr(char *cPathName, osdir **osdirPtr);
static int pathOoptoBuffermaxLen(sqInt pathNameOop, char *cPathName, sqInt maxLen);
static void * pointerFrom(sqInt directoryPointerBytes);
static sqInt posixFileTimesFromto(struct stat *statBufPointer, sqInt attributeArray);
EXPORT(sqInt) primitiveChangeMode(void);
EXPORT(sqInt) primitiveChangeOwner(void);
EXPORT(sqInt) primitiveClosedir(void);
EXPORT(sqInt) primitiveFileAttribute(void);
EXPORT(sqInt) primitiveFileAttributes(void);
Expand All @@ -101,6 +109,7 @@ EXPORT(sqInt) primitiveOpendir(void);
EXPORT(sqInt) primitivePathMax(void);
EXPORT(sqInt) primitiveReaddir(void);
EXPORT(sqInt) primitiveRewinddir(void);
EXPORT(sqInt) primitiveSymlinkChangeOwner(void);
EXPORT(sqInt) primitiveVersionString(void);
static sqInt putLStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop);
static sqInt putStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop);
Expand All @@ -109,7 +118,7 @@ EXPORT(sqInt) setInterpreter(struct VirtualMachine*anInterpreter);
static sqInt squeakPathtoUnixmaxLen(sqInt pathOop, char *cPathString, sqInt maxLength);
static sqInt statArrayFortoArrayfromfileName(char *cPathName, sqInt attributeArray, struct stat *statBufPointer, sqInt fileNameOop);
static sqInt stringFromCString(const char *aCString);
static sqInt unixPathToOop(sqInt cPathString);
static sqInt unixPathToOop(char *cPathString);
#if _WIN32
static sqInt winFileAttributesForlengthto(char *pathString, sqInt pathLength, WIN32_FILE_ATTRIBUTE_DATA *winAttrs);
#endif /* _WIN32 */
Expand Down Expand Up @@ -142,6 +151,7 @@ static sqInt (*integerObjectOf)(sqInt value);
static void * (*ioLoadFunctionFrom)(char *functionName, char *moduleName);
static sqInt (*isKindOf)(sqInt oop, char *aString);
static sqInt (*isBytes)(sqInt oop);
static sqInt (*methodReturnValue)(sqInt oop);
static sqInt (*nilObject)(void);
static sqInt (*popthenPush)(sqInt nItems, sqInt oop);
static sqInt (*popRemappableOop)(void);
Expand Down Expand Up @@ -171,6 +181,7 @@ extern sqInt integerObjectOf(sqInt value);
extern void * ioLoadFunctionFrom(char *functionName, char *moduleName);
extern sqInt isKindOf(sqInt oop, char *aString);
extern sqInt isBytes(sqInt oop);
extern sqInt methodReturnValue(sqInt oop);
extern sqInt nilObject(void);
extern sqInt popthenPush(sqInt nItems, sqInt oop);
extern sqInt popRemappableOop(void);
Expand All @@ -193,9 +204,9 @@ extern
struct VirtualMachine* interpreterProxy;
static const char *moduleName =
#ifdef SQUEAK_BUILTIN_PLUGIN
"FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.35 (i)"
"FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.36 (i)"
#else
"FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.35 (e)"
"FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.36 (e)"
#endif
;
static void * sCLPfn;
Expand Down Expand Up @@ -832,6 +843,74 @@ posixFileTimesFromto(struct stat *statBufPointer, sqInt attributeArray)
}


/* Set the mode of the supplied file using chmod(). */

/* FileAttributesPlugin>>#primitiveChangeMode */
EXPORT(sqInt)
primitiveChangeMode(void)
{
char cString[PATH_MAX+1];
sqInt fileNameOop;
sqInt newMode;
sqInt status;

fileNameOop = stackObjectValue(1);
newMode = stackIntegerValue(0);
if ((failed())
|| (!(isBytes(fileNameOop)))) {
return primitiveFailFor(PrimErrBadArgument);
}
squeakPathtoUnixmaxLen(fileNameOop, cString, PATH_MAX);
if (failed()) {
return primitiveFailForOSError(primitiveFailureCode());
}

# if HAVE_CHMOD
status = chmod(cString, newMode);
if (status != 0) {
return primitiveFailForOSError(errno);
}
return methodReturnValue(nilObject());
# endif /* HAVE_CHMOD */
return primitiveFailForOSError(-13 /* unsupportedOperation */);
}


/* Set the owner of the supplied file using chown(). */

/* FileAttributesPlugin>>#primitiveChangeOwner */
EXPORT(sqInt)
primitiveChangeOwner(void)
{
char cString[PATH_MAX+1];
sqInt fileNameOop;
sqInt groupId;
sqInt ownerId;
sqInt status;

fileNameOop = stackObjectValue(2);
ownerId = stackIntegerValue(1);
groupId = stackIntegerValue(0);
if ((failed())
|| (!(isBytes(fileNameOop)))) {
return primitiveFailFor(PrimErrBadArgument);
}
squeakPathtoUnixmaxLen(fileNameOop, cString, PATH_MAX);
if (failed()) {
return primitiveFailForOSError(primitiveFailureCode());
}

# if HAVE_CHOWN
status = chown(cString, ownerId, groupId);
if (status != 0) {
return primitiveFailForOSError(errno);
}
return methodReturnValue(nilObject());
# endif /* HAVE_CHOWN */
return primitiveFailForOSError(-13 /* unsupportedOperation */);
}


/* Close the directory stream for dirPointerOop. Answer dirPointerOop on
success. Raise PrimErrBadArgument if the parameter is not a ByteArray
length size(void *).
Expand Down Expand Up @@ -1362,13 +1441,48 @@ primitiveRewinddir(void)
}


/* Set the owner of the supplied file using chown(). */

/* FileAttributesPlugin>>#primitiveSymlinkChangeOwner */
EXPORT(sqInt)
primitiveSymlinkChangeOwner(void)
{
char cString[PATH_MAX+1];
sqInt fileNameOop;
sqInt groupId;
sqInt ownerId;
sqInt status;

fileNameOop = stackObjectValue(2);
ownerId = stackIntegerValue(1);
groupId = stackIntegerValue(0);
if ((failed())
|| (!(isBytes(fileNameOop)))) {
return primitiveFailFor(PrimErrBadArgument);
}
squeakPathtoUnixmaxLen(fileNameOop, cString, PATH_MAX);
if (failed()) {
return primitiveFailForOSError(primitiveFailureCode());
}

# if HAVE_CHOWN
status = lchown(cString, ownerId, groupId);
if (status != 0) {
return primitiveFailForOSError(errno);
}
return methodReturnValue(nilObject());
# endif /* HAVE_CHOWN */
return primitiveFailForOSError(-13 /* unsupportedOperation */);
}


/* Answer a string containing the version string for this plugin. */

/* FileAttributesPlugin>>#primitiveVersionString */
EXPORT(sqInt)
primitiveVersionString(void)
{
popthenPush(1, stringFromCString("1.3.4"));
popthenPush(1, stringFromCString("1.4.0"));
return 0;
}

Expand Down Expand Up @@ -1485,6 +1599,7 @@ setInterpreter(struct VirtualMachine*anInterpreter)
ioLoadFunctionFrom = interpreterProxy->ioLoadFunctionFrom;
isKindOf = interpreterProxy->isKindOf;
isBytes = interpreterProxy->isBytes;
methodReturnValue = interpreterProxy->methodReturnValue;
nilObject = interpreterProxy->nilObject;
popthenPush = interpreterProxy->popthenPush;
popRemappableOop = interpreterProxy->popRemappableOop;
Expand Down Expand Up @@ -1623,7 +1738,7 @@ stringFromCString(const char *aCString)

/* FileAttributesPlugin>>#unixPathToOop: */
static sqInt
unixPathToOop(sqInt cPathString)
unixPathToOop(char *cPathString)
{
sqInt pathOop;
sqInt status;
Expand Down Expand Up @@ -1788,6 +1903,8 @@ static char _m[] = "FileAttributesPlugin";
void* FileAttributesPlugin_exports[][3] = {
{(void*)_m, "getModuleName", (void*)getModuleName},
{(void*)_m, "initialiseModule", (void*)initialiseModule},
{(void*)_m, "primitiveChangeMode\000\001", (void*)primitiveChangeMode},
{(void*)_m, "primitiveChangeOwner\000\001", (void*)primitiveChangeOwner},
{(void*)_m, "primitiveClosedir\000\001", (void*)primitiveClosedir},
{(void*)_m, "primitiveFileAttribute\000\001", (void*)primitiveFileAttribute},
{(void*)_m, "primitiveFileAttributes\000\001", (void*)primitiveFileAttributes},
Expand All @@ -1798,19 +1915,23 @@ void* FileAttributesPlugin_exports[][3] = {
{(void*)_m, "primitivePathMax\000\377", (void*)primitivePathMax},
{(void*)_m, "primitiveReaddir\000\001", (void*)primitiveReaddir},
{(void*)_m, "primitiveRewinddir\000\001", (void*)primitiveRewinddir},
{(void*)_m, "primitiveSymlinkChangeOwner\000\001", (void*)primitiveSymlinkChangeOwner},
{(void*)_m, "primitiveVersionString\000\377", (void*)primitiveVersionString},
{(void*)_m, "setInterpreter", (void*)setInterpreter},
{NULL, NULL, NULL}
};

#else /* ifdef SQ_BUILTIN_PLUGIN */

signed char primitiveChangeModeAccessorDepth = 1;
signed char primitiveChangeOwnerAccessorDepth = 1;
signed char primitiveClosedirAccessorDepth = 1;
signed char primitiveFileAttributeAccessorDepth = 1;
signed char primitiveFileAttributesAccessorDepth = 1;
signed char primitiveFileExistsAccessorDepth = 1;
signed char primitiveOpendirAccessorDepth = 1;
signed char primitiveReaddirAccessorDepth = 1;
signed char primitiveRewinddirAccessorDepth = 1;
signed char primitiveSymlinkChangeOwnerAccessorDepth = 1;

#endif /* ifdef SQ_BUILTIN_PLUGIN */

0 comments on commit ec50a09

Please sign in to comment.