diff options
author | dos-reis <gdr@axiomatics.org> | 2007-09-02 21:56:58 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2007-09-02 21:56:58 +0000 |
commit | 7eb38fea596969878a33f30e36fe33b125f9c4bd (patch) | |
tree | 2e4222a4406fb5ed3d69b781f528b9ac08bb9fbc /src/lib/cfuns-c.c | |
parent | 869512ac1dd0bc9c80182cbef6e01b39540fef7f (diff) | |
download | open-axiom-7eb38fea596969878a33f30e36fe33b125f9c4bd.tar.gz |
* XSpadFill.c: New. Replace corresponding pamphlet.
* XSpadFill.c.pamphlet: Remove.
* XShade.c: New. Replace corresponding pamphlet.
* XShade.c.pamphlet: Remove.
* XDither.c: New. Replace corresponding pamphlet.
* XDither.c.pamphlet: Remove.
* wct.c: New. Replace corresponding pamphlet.
* wct.c.pamphlet: Remove.
* util.c: New. Replace corresponding pamphlet.
* util.c.pamphlet: Remove.
* spadcolors.c: New. Replace corresponding pamphlet.
* spadcolors.c.pamphlet: Remove.
* sockio-c.c: New. Replace corresponding pamphlet.
* sockio-c.c.pamphlet: Remove.
* prt.c: New. Replace corresponding pamphlet.
* prt.c.pamphlet: Remove.
* pixmap.c: New. Replace corresponding pamphlet.
* pixmap.c.pamphlet: Remove.
* openpty.c: New. Replace corresponding pamphlet.
* openpty.c.pamphlet: Remove.
* hash.c: New. Replace corresponding pamphlet.
* hash.c.pamphlet: Remove.
* halloc.c: New. Replace corresponding pamphlet.
* halloc.c.pamphlet: Remove.
* fnct_key.c: New. Replace corresponding pamphlet.
* fnct_key.c.pamphlet: Remove.
* edin.c: New. Replace corresponding pamphlet.
* edin.c.pamphlet: Remove.
* bsdsignal.c: New. Replace correponding pamphlet.
* bsdsignal.c.pamphlet: Remove.
* cursor.c: New. Replace corresponding pamphlet.
* cursor.c.pamphlet: Remove.
* cfuns-c.c: New. Replace corresponding pamphlet.
* cfuns-c.c.pamphlet: Remove.
Diffstat (limited to 'src/lib/cfuns-c.c')
-rw-r--r-- | src/lib/cfuns-c.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/src/lib/cfuns-c.c b/src/lib/cfuns-c.c new file mode 100644 index 00000000..de00deee --- /dev/null +++ b/src/lib/cfuns-c.c @@ -0,0 +1,265 @@ +/* + Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of The Numerical ALgorithms Group Ltd. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Copyright (C) 2007, Gabriel Dos Reis +*/ + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include "axiom-c-macros.h" + +#include "cfuns-c.H1" + +/* Most versions of Windows don't have the POSIX functions getuid(), + geteuid(), getgid(), and getegid(). The following definitions are + approximations, to patch for the deficiencies of Windows + POSIX interface. */ + +#if !HAVE_DECL_GETUID +# define getuid() 0 +#endif + +#if !HAVE_DECL_GETGID +# define getgid() 0 +#endif + +#if !HAVE_DECL_GETEUID +# define geteuid() getuid() +#endif + +#if !HAVE_DECL_GETEGID +# define getegid() getgid() +#endif + +int +addtopath(char *dir) +{ + char *path, *newpath; + + path = getenv("PATH"); + if (path == NULL) + return -1; + + newpath = (char *) malloc(1 + strlen(path) + strlen(dir) + strlen("PATH=:")); + if (newpath == NULL) + return -1; + + sprintf(newpath, "PATH=%s:%s", path, dir); + + return putenv(newpath); +} + +/* + * Test whether the path is the name of a directory. Returns 1 if so, 0 if + * not, -1 if it doesn't exist. + */ + + +int +directoryp(char *path) +{ + struct stat buf; + int code = stat(path, &buf); + + return code == -1 ? -1 : S_ISDIR(buf.st_mode); +} + +int +make_path_from_file(char *s, char *t) +{ + char *pos = ""; + char *c; + + /** simply copies the path name from t into s **/ + for (c = t + strlen(t); c != s; c--) + if (*c == '/') { + pos = c; + break; + } + /** Check to see if the path was actually present **/ + if (c == t) { /** No Path, so return the pwd **/ + return (-1); + } + /** now just do the copying **/ + strncpy(s, t, pos - t); + return 1; +} + +/* The functions writeablep() and readablep() determine write and + read access of a file designated by its name. The function + axiom_has_write_access is a sub-routine of writeablep. + + The access is determined based on the POSIX semantics; see + "Advanced Programming in the UNIX Environement", section 4.5. + + 1. If the effective user ID of the process is 0 (the superuser), + access is allowed. This gives the superuser free rein throughout + the entire file system. + + 2. If the effective user ID of the process equals the owner ID of + the file (i.e., the process owns the file), access is allowed + if the appropriate user access permission bit is set. [...] + + 3. If the effective group ID of the process or one of the + supplementary group IDs of the process equals the group ID + of the file, access is allowed if the appropriate + group access permission bit is set. Otherwise, permission + is denied. + + 4. If the appropriate other access permission bit is set, access is + allowed. Otherwise, permission is defined. */ + + +/* Return 1 if the process has write access of file as explained above. + Otherwise, return 0. */ + +static inline int +axiom_has_write_access(const struct stat* file_info) +{ + int effetive_uid = geteuid(); + + if (effetive_uid == 0) + return 1; + + if (effetive_uid == file_info->st_uid) + return file_info->st_mode & S_IWUSR; + +#ifdef S_IWGRP + if (getegid() == file_info->st_gid) + return file_info->st_mode & S_IWGRP; +#endif + +#ifdef S_IWOTH + return file_info->st_mode & S_IWOTH; +#else + return 0; +#endif +} + + +/* Return + -1 if the file designated by PATH is inexistent. + 0 if the file exists but wirte access is denied. + 1 if the file exists and process has write access. + 2 if the file does not exists but process has write + has write access to the dirname of path. */ + +int +writeablep(char *path) +{ + struct stat buf; + char newpath[100]; + int code; + + code = stat(path, &buf); + if (code == -1) { + /** The file does not exist, so check to see + if the directory is writable *****/ + if (make_path_from_file(newpath, path) == -1 + || stat(newpath, &buf) == -1) + return -1; + + return 2 * axiom_has_write_access(&buf); + } + + return axiom_has_write_access(&buf); +} + + +/* Return + -1 if the file designated by PATH is inexistent. + 0 if the file exists but process has no read access. + 1 if the file exists and read access is granted. */ + +int +readablep(char *path) +{ + struct stat buf; + int code; + + code = stat(path, &buf); + if (code == -1) + return -1; + + if (geteuid() == buf.st_uid) + return ((buf.st_mode & S_IREAD) != 0); + +#ifdef S_IRGRP + if (getegid() == buf.st_gid) + return ((buf.st_mode & S_IRGRP) != 0); +#endif + +#ifdef S_IROTH + return ((buf.st_mode & S_IROTH) != 0); +#else + return 0; +#endif +} + + + +long +findString(char *file, char *string) +{ + int nstring, charpos; + FILE *fn; + char buffer[1024]; + + if ((fn = fopen(file, "r")) == NULL) + return -1; + + for (charpos = 0, nstring = strlen(string); + fgets(buffer, sizeof buffer, fn) != NULL; + charpos += strlen(buffer) + ) + if (!strncmp(buffer, string, nstring)) + return charpos; + return -1; + +} + +int +copyEnvValue(char *varName, char *buffer) +{ + char *s; + + s = getenv(varName); + if (s == NULL) + return 0; + strcpy(buffer, s); + return strlen(s); +} + |