summaryrefslogtreecommitdiff
path: root/rhtvision/compat/fileattrs.c
diff options
context:
space:
mode:
Diffstat (limited to 'rhtvision/compat/fileattrs.c')
-rw-r--r--rhtvision/compat/fileattrs.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/rhtvision/compat/fileattrs.c b/rhtvision/compat/fileattrs.c
new file mode 100644
index 0000000..2993a01
--- /dev/null
+++ b/rhtvision/compat/fileattrs.c
@@ -0,0 +1,197 @@
+/**[txh]********************************************************************
+
+ Description:
+ This module provides some functions to know the file attributes and altere
+some of them in an abstract way. Note that I wrote only the functions I need
+for SETEdit and not a full set.
+
+ Copyright (C) 2000-2001 by Salvador E. Tropea
+ Covered by the GPL license.
+
+***************************************************************************/
+
+#define Uses_CLYFileAttrs
+#define Uses_alloca
+#include <compatlayer.h>
+
+
+#ifdef TVCompf_djgpp
+/*
+ In DOS owr best choice is _chmod, it can give information as file hidden
+ or system file.
+*/
+#include <io.h>
+
+void CLY_GetFileAttributes(CLY_mode_t *mode, struct stat *statVal,
+ const char *fileName)
+{
+ *mode=_chmod(fileName,0,0);
+}
+
+int CLY_SetFileAttributes(CLY_mode_t *newmode, const char *fileName)
+{
+ return _chmod(fileName,1,*newmode)==-1 ? 0 : 1;
+}
+
+void CLY_FileAttrReadOnly(CLY_mode_t *mode)
+{
+ *mode|=1;
+}
+
+void CLY_FileAttrReadWrite(CLY_mode_t *mode)
+{
+ *mode&=0xFE;
+}
+
+int CLY_FileAttrIsRO(CLY_mode_t *mode)
+{
+ return (*mode) & 1;
+}
+
+void CLY_FileAttrModified(CLY_mode_t *mode)
+{
+ *mode|=0x20;
+}
+
+void CLY_GetDefaultFileAttr(CLY_mode_t *mode)
+{
+ *mode=0x20;
+}
+#define FILE_ATTRS_DEFINED
+#endif // TVCompf_djgpp
+
+
+
+#if (defined(TVOS_UNIX) || defined(TVCompf_Cygwin)) && \
+ !defined(FILE_ATTRS_DEFINED)
+/*
+ In UNIX the best way is just use chmod which is POSIX and should be
+enough.
+*/
+#include <unistd.h>
+
+void CLY_GetFileAttributes(CLY_mode_t *mode, struct stat *statVal,
+ const char *fileName)
+{
+ int ngroups,val;
+ gid_t *groups;
+ uid_t user;
+
+ mode->mode =statVal->st_mode;
+ mode->user =statVal->st_uid;
+ mode->group=statVal->st_gid;
+
+ // Compute the write mask:
+ user=getuid();
+
+ // Is our file? (or we are the superuser)
+ if (user==0 || mode->user==user)
+ {
+ mode->writemask=S_IWUSR;
+ return;
+ }
+
+ // Are we from their group?
+ ngroups=getgroups(0,NULL);
+ groups=(gid_t *)alloca(ngroups*sizeof(gid_t));
+ val=getgroups(ngroups,groups);
+ if (val>=0)
+ {
+ int i;
+ for (i=0; i<ngroups; i++)
+ if (groups[i]==mode->group)
+ {
+ if (mode->mode & S_IWGRP)
+ mode->writemask=S_IWGRP;
+ else
+ mode->writemask=S_IWOTH;
+ return;
+ }
+ }
+
+ // Ok, the `others' apply
+ mode->writemask=S_IWOTH;
+}
+
+int CLY_SetFileAttributes(CLY_mode_t *newmode, const char *fileName)
+{
+ return !(chmod(fileName,newmode->mode) ||
+ chown(fileName,newmode->user,newmode->group));
+}
+
+void CLY_FileAttrReadOnly(CLY_mode_t *mode)
+{
+ mode->mode&= ~mode->writemask;
+}
+
+void CLY_FileAttrReadWrite(CLY_mode_t *mode)
+{
+ mode->mode|=mode->writemask;
+}
+
+int CLY_FileAttrIsRO(CLY_mode_t *mode)
+{
+ return (mode->mode & mode->writemask)==0;
+}
+
+void CLY_FileAttrModified(CLY_mode_t *mode)
+{
+}
+
+void CLY_GetDefaultFileAttr(CLY_mode_t *mode)
+{ // 644, umask will kill the denied ones if that's needed
+ mode->mode=S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR;
+ mode->user=getuid();
+ mode->group=getgid();
+ mode->writemask=S_IWUSR;
+}
+#define FILE_ATTRS_DEFINED
+#endif
+
+
+
+#if defined(TVOS_Win32) && !defined(FILE_ATTRS_DEFINED)
+/*
+ In Win32 systems there are an API call for it.
+*/
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+void CLY_GetFileAttributes(CLY_mode_t *mode, struct stat *statVal,
+ const char *fileName)
+{
+ *mode=statVal->st_mode; // Just to avoid unused warning
+ *mode=GetFileAttributes(fileName);
+}
+
+int CLY_SetFileAttributes(CLY_mode_t *newmode, const char *fileName)
+{
+ return SetFileAttributes(fileName,*newmode);
+}
+
+void CLY_FileAttrReadOnly(CLY_mode_t *mode)
+{
+ *mode|=FILE_ATTRIBUTE_READONLY;
+}
+
+void CLY_FileAttrReadWrite(CLY_mode_t *mode)
+{
+ *mode&=~FILE_ATTRIBUTE_READONLY;
+}
+
+int CLY_FileAttrIsRO(CLY_mode_t *mode)
+{
+ return (*mode & FILE_ATTRIBUTE_READONLY);
+}
+
+void CLY_FileAttrModified(CLY_mode_t *mode)
+{
+ *mode|=FILE_ATTRIBUTE_ARCHIVE;
+}
+
+void CLY_GetDefaultFileAttr(CLY_mode_t *mode)
+{
+ *mode=(CLY_mode_t)FILE_ATTRIBUTE_ARCHIVE;
+}
+#define FILE_ATTRS_DEFINED
+#endif