mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Rebooting 93u+m
This commit reboots ksh 93u+m development with a new fork based off the archived official AT&T ast repo, master branch. README: - Removed. Having two READMEs is a botch. README.md: - Imported and edited from the archived fork, https://github.com/modernish/ksh -- the newer instructions will become applicable as I cherry-pick all the changes from there :) - Copy-edits. - Added policy and rationale for this 93u+m fork. - Incorporated info from old README that is still relevant. .gitignore: - Added. bin/execrate: - Removed. This one keeps changing its license header, causing git to show an uncommitted file. It's always re-copied anyway, and not for direct invocation, so, exclude and add to .gitignore. The source file is: src/cmd/INIT/execrate.sh src/cmd/*, src/lib/*: - Remove historical baggage: everything except ksh93 and dependencies. This is the same stuff the ksh-community fork removed. I wouldn't mind keeping it, but some of this stuff causes build failures on macOS (and probably other systems), and I need to get on with fixing ksh93. Hopefully, we can figure out how to re-add stuff we can use later -- particularly the pty command (pseudo-terminal utility for scripting interactive sessions) which is needed for regression-testing the interactive shell.
This commit is contained in:
parent
cc1f2bf81d
commit
2940b3f536
2271 changed files with 93 additions and 1162987 deletions
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
# Project-specific files
|
||||
=
|
||||
arch
|
||||
tgz
|
||||
lcl
|
||||
|
||||
# This one keeps changing its license header, causing git to show an
|
||||
# uncommitted file. It's always re-copied anyway, and not for direct
|
||||
# invocation, so exclude. The source file is: src/cmd/INIT/execrate.sh
|
||||
bin/execrate
|
||||
|
||||
# Miscellaneous artefacts
|
||||
*.bak
|
||||
*.sav
|
||||
*.old
|
||||
*.orig
|
||||
.*.swp
|
||||
*.DS_Store
|
||||
*~
|
||||
.nfs*
|
||||
*.tmp
|
||||
*.rej
|
||||
*.project
|
||||
*.core
|
||||
core
|
29
README
29
README
|
@ -1,29 +0,0 @@
|
|||
This is a package root directory $PACKAGEROOT. Source and binary
|
||||
packages in this directory tree are controlled by the command
|
||||
|
||||
bin/package
|
||||
|
||||
Binary files may be in this directory or in the install root directory
|
||||
|
||||
INSTALLROOT=$PACKAGEROOT/arch/`bin/package`
|
||||
|
||||
For more information run
|
||||
|
||||
bin/package help
|
||||
|
||||
Many of the packaged commands self-document via the --man and --html
|
||||
options; those that do have no separate man page.
|
||||
|
||||
Each package is covered by one of the license files
|
||||
|
||||
lib/package/LICENSES/<license>
|
||||
|
||||
where <license> is the license type for the package. At the top
|
||||
of each license file is a URL; the license covers all software that
|
||||
refers to this URL. For details run
|
||||
|
||||
bin/package license [<package>]
|
||||
|
||||
Any archives, distributions or packages made from source or
|
||||
binaries covered by license(s) must contain the corresponding
|
||||
license file(s).
|
92
README.md
92
README.md
|
@ -1,36 +1,78 @@
|
|||
# AST
|
||||
# KornShell 93u+m
|
||||
|
||||
This is the AT&T Software Technology (AST) toolkit from AT&T Research.
|
||||
It includes many tools and libraries, like KSH, NMAKE, SFIO, VMALLOC, VCODEX,
|
||||
etc. It also includes more efficient replacements for a lot of the POSIX tools.
|
||||
It was designed to be portable across many UNIX systems and also works
|
||||
under UWIN on Microsoft Windows (see UWIN repo on GitHub under att/uwin).
|
||||
This repository is used to develop bugfixes
|
||||
to the last stable release (93u+ 2012-08-01) of
|
||||
[ksh93](http://www.kornshell.com/),
|
||||
formerly developed by AT&T Software Technology (AST).
|
||||
The sources in this repository were forked from the
|
||||
Github [AST repository](https://github.com/att/ast)
|
||||
which is no longer under active development.
|
||||
|
||||
## ksh93u+ and v-
|
||||
To see what's fixed, see [NEWS](https://github.com/modernish/ast/blame/master/NEWS)
|
||||
and click on commit messages for full details.
|
||||
|
||||
This repo contains the **ksh93u+** and **ksh93v-** versions of KSH.
|
||||
To see what's left to fix, see [TODO](./TODO).
|
||||
|
||||
* **ksh93u+**, the master branch, was the last version released by the main AST
|
||||
authors in 2012, while they were at AT&T. It also has some later build
|
||||
fixes but it is not actively maintained.
|
||||
* ksh93v-, [ksh93v tag](https://github.com/att/ast/tree/ksh93v), contains
|
||||
contributions from the main authors through 2014 (after they left) and is
|
||||
considered less stable
|
||||
## Policy
|
||||
|
||||
Please search the web for forks of this repo (or check the
|
||||
[Network graph](https://github.com/att/ast/network) on GitHub) if you are
|
||||
looking for an actively maintained version of ksh.
|
||||
1. No new features. Bug fixes only.
|
||||
2. No major rewrites. No refactoring code that is not fully understood.
|
||||
3. No changes in documented behaviour, except if required for compliance with the
|
||||
[POSIX shell language standard](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html)
|
||||
which David Korn [intended](http://www.kornshell.com/info/) for ksh to follow.
|
||||
4. No 100% bug compatibility. Broken and undocumented behaviour gets fixed.
|
||||
5. No bureaucracy, no formalities. Just fix it, or report it: create issues,
|
||||
send pull requests. Every interested party is invited to contribute.
|
||||
6. To help increase everyone's understanding of this code base, fixes and
|
||||
significant changes should be fully documented in commit messages.
|
||||
|
||||
## Why?
|
||||
|
||||
Between 2017 and 2020 there was an ultimately unsuccessful
|
||||
[attempt](https://github.com/att/ast/tree/2020.0.1)
|
||||
to breathe new life into the KornShell by extensively refactoring the last
|
||||
unstable AST beta version (93v-).
|
||||
While that ksh2020 branch is now abandoned and still has many critical bugs,
|
||||
it also had a lot of bugs fixed. More importantly, the AST issue tracker
|
||||
now contains a lot of documentation on how to fix those bugs, which makes
|
||||
it possible to backport many of them to the last stable release instead.
|
||||
|
||||
In February 2020, having concluded the AST 93v- beta was too broken to
|
||||
base new work on, others decided to start a new fork based on the last stable
|
||||
93u+ 2012-08-01 release. Unfortunately, as of June 2020, the new
|
||||
[ksh-community](https://github.com/ksh-community/ksh/)
|
||||
organisation is yet to see any significant activity four months after its
|
||||
bootstrapping. I hope that will change; I am ready to join efforts with them
|
||||
at any time, as well as anyone else who wants to contribute.
|
||||
|
||||
The last stable ksh93 release from 2012 is the least buggy release currently
|
||||
available, but it still has many serious bugs. So it is well past time to
|
||||
start fixing those bugs, leave the rest of the code alone, and get an
|
||||
improved release out there.
|
||||
|
||||
## Build
|
||||
|
||||
This software is used to build itself, using NMAKE. After cloning this repo, cd
|
||||
to the top directory of it and run:
|
||||
|
||||
After cloning this repo, cd to the top directory of it and run:
|
||||
```sh
|
||||
./bin/package make
|
||||
```
|
||||
If you have trouble or want to tune the binaries, you may pass additional
|
||||
compiler and linker flags by appending it to the command shown above. E.g.:
|
||||
```sh
|
||||
./bin/package make \
|
||||
SHELL=/bin/bash CCFLAGS="-xc99 -D_XPG6 -m64 -xO4" LDFLAGS="-m64"
|
||||
```
|
||||
For more information run
|
||||
```sh
|
||||
bin/package help
|
||||
```
|
||||
Many other commands in this repo self-document via the `--help`, `--man` and
|
||||
`--html` options; those that do have no separate manual page.
|
||||
|
||||
Almost all the tools in this package (including the bin/package script are
|
||||
self-documenting; run <tool> --man (or --html) for the man page for the tool.
|
||||
## Test
|
||||
|
||||
(If you were used to the old AST packaging mechanism, on www.research.att.com,
|
||||
this repo is equivalent to downloading the INIT and ast-open packages and
|
||||
running: ./bin/package read on them).
|
||||
After compiling, you can run the regression tests.
|
||||
Start by reading the information printed by:
|
||||
```sh
|
||||
./bin/shtests --man
|
||||
```
|
||||
|
|
180
bin/execrate
180
bin/execrate
|
@ -1,180 +0,0 @@
|
|||
USAGE_LICENSE="[-author?Glenn Fowler <gsf@research.att.com>][-copyright?Copyright (c) 2002-2020 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html]"
|
||||
########################################################################
|
||||
# #
|
||||
# This software is part of the ast package #
|
||||
# Copyright (c) 1994-2011 AT&T Intellectual Property #
|
||||
# and is licensed under the #
|
||||
# Eclipse Public License, Version 1.0 #
|
||||
# by AT&T Intellectual Property #
|
||||
# #
|
||||
# A copy of the License is available at #
|
||||
# http://www.eclipse.org/org/documents/epl-v10.html #
|
||||
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
||||
# #
|
||||
# Information and Software Systems Research #
|
||||
# AT&T Research #
|
||||
# Florham Park NJ #
|
||||
# #
|
||||
# Glenn Fowler <gsf@research.att.com> #
|
||||
# #
|
||||
########################################################################
|
||||
: wrapper for .exe challenged win32 systems/commands
|
||||
|
||||
command=execrate
|
||||
|
||||
bins='/bin /usr/bin /usr/sbin'
|
||||
|
||||
case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
|
||||
0123) ARGV0="-a $command"
|
||||
USAGE=$'
|
||||
[-?
|
||||
@(#)$Id: execrate (AT&T Labs Research) 2002-02-02 $
|
||||
]
|
||||
'$USAGE_LICENSE$'
|
||||
[+NAME?execrate - wrapper for .exe challenged commands]
|
||||
[+DESCRIPTION?\bexecrate\b runs \acommand\a after checking the \afile\a
|
||||
operands for standard semantics with respect to \bwin32\b \b.exe\b
|
||||
suffix conventions. This command is only needed on \bwin32\b
|
||||
systems that inconsistently handle \b.exe\b across library and
|
||||
command interfaces. \acommand\a may be one of \bcat\b(1), \bchmod\b(1),
|
||||
\bcmp\b(1), \bcp\b(1), \bln\b(1), \bmv\b(1), or \brm\b(1).
|
||||
Only the 2 argument forms of \bcp\b, \bln\b and \bmv\b are handled.
|
||||
Unsupported commands and commands requiring no change are
|
||||
silently executed.]
|
||||
[+?With no arguments \bexecrate\b exits with status 0 if the current system
|
||||
is \b.exe\b challenged, 1 if the current system is normal.]
|
||||
[n:show?Show the underlying commands but do not execute.]
|
||||
|
||||
command [ option ... ] file ...
|
||||
|
||||
[+SEE ALSO?\bwebster\b(1)]
|
||||
'
|
||||
usage()
|
||||
{
|
||||
OPTIND=0
|
||||
getopts $ARGV0 "$USAGE" OPT '-?'
|
||||
exit 2
|
||||
}
|
||||
exec=1
|
||||
while getopts $ARGV0 "$USAGE" OPT
|
||||
do case $OPT in
|
||||
n) exec=0 ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
done
|
||||
shift `expr $OPTIND - 1`
|
||||
;;
|
||||
*) usage()
|
||||
{
|
||||
echo "Usage: execrate [ -n ] [ command [ option ... ] file ... ]" >&2
|
||||
exit 2
|
||||
}
|
||||
exec=1
|
||||
while :
|
||||
do case $1 in
|
||||
-n) exec=0 ;;
|
||||
-*) usage ;;
|
||||
*) break ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
;;
|
||||
esac
|
||||
case $# in
|
||||
0) if test ! -x /bin/cat.exe
|
||||
then exit 1 # normal
|
||||
fi
|
||||
if /bin/cat /bin/cat >/dev/null 2>&1
|
||||
then exit 1 # normal
|
||||
fi
|
||||
exit 0 # challenged
|
||||
;;
|
||||
1) usage
|
||||
;;
|
||||
esac
|
||||
case $1 in
|
||||
*cat|*rm)
|
||||
NUM=0
|
||||
;;
|
||||
*chgrp|*chmod)
|
||||
NUM=1
|
||||
;;
|
||||
*cmp|*cp|*ln|*mv)
|
||||
NUM=2
|
||||
;;
|
||||
*) case $exec in
|
||||
0) echo "$@" ;;
|
||||
*) "$@" ;;
|
||||
esac
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
CMD=$1
|
||||
shift
|
||||
case $CMD in
|
||||
*/*) ;;
|
||||
*) for d in $bins
|
||||
do if test -x $d/$1 -o -x $d/$1.exe
|
||||
then CMD=$d/$1
|
||||
break
|
||||
fi
|
||||
done
|
||||
;;
|
||||
esac
|
||||
while :
|
||||
do case $1 in
|
||||
-*) CMD="$CMD $1" ;;
|
||||
*) break ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
case $exec in
|
||||
0) CMD="echo $CMD" ;;
|
||||
esac
|
||||
case $NUM:$# in
|
||||
*:0) ;;
|
||||
1:*) CMD="$CMD $1"
|
||||
NUM=0
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
case $NUM:$# in
|
||||
0:*) status=0
|
||||
for f
|
||||
do if test "$f" -ef "$f".exe
|
||||
then f=$f.exe
|
||||
fi
|
||||
$CMD "$f"
|
||||
case $? in
|
||||
0) ;;
|
||||
*) status=$? ;;
|
||||
esac
|
||||
done
|
||||
exit $status
|
||||
;;
|
||||
2:2) f=$1
|
||||
case $f in
|
||||
*.exe) ;;
|
||||
*) if test "$f" -ef "$f".exe
|
||||
then f=$f.exe
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
case $f in
|
||||
*.exe) if test -d "$2"
|
||||
then t=$2/$f
|
||||
else t=$2
|
||||
fi
|
||||
case $t in
|
||||
*/*) b=`basename "$t"` ;;
|
||||
*) b=$t ;;
|
||||
esac
|
||||
case $b in
|
||||
*.*) $CMD "$f" "$t"; exit ;;
|
||||
*) $CMD "$f" "$t".exe; exit ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
$CMD "$@"
|
|
@ -1,4 +1,4 @@
|
|||
USAGE_LICENSE="[-author?Glenn Fowler <gsf@research.att.com>][-copyright?Copyright (c) 1994-2020 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html]"
|
||||
USAGE_LICENSE="[-author?Glenn Fowler <gsf@research.att.com>][-copyright?Copyright (c) 1994-2012 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html]"
|
||||
########################################################################
|
||||
# #
|
||||
# This software is part of the ast package #
|
||||
|
|
609
src/cmd/3d/3d.h
609
src/cmd/3d/3d.h
|
@ -1,609 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* Glenn Fowler
|
||||
* David Korn
|
||||
* Eduardo Krell
|
||||
*
|
||||
* AT&T Research
|
||||
*
|
||||
* 3d file system implementation interface
|
||||
*/
|
||||
|
||||
#ifndef _3D_H
|
||||
#define _3D_H
|
||||
|
||||
#undef _BLD_DEBUG
|
||||
|
||||
#define _def_map_ast 1
|
||||
#define _std_strtol 1
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide fchown ftruncate mount readlink sbrk strmode truncate utimes __utimes
|
||||
#else
|
||||
#undef fchown
|
||||
#define fchown ______fchown
|
||||
#undef ftruncate
|
||||
#define ftruncate ______ftruncate
|
||||
#undef mount
|
||||
#define mount ______mount
|
||||
#undef readlink
|
||||
#define readlink ______readlink
|
||||
#undef sbrk
|
||||
#define sbrk ______sbrk
|
||||
#undef strmode
|
||||
#define strmode ______strmode
|
||||
#undef truncate
|
||||
#define truncate ______truncate
|
||||
#undef utimes
|
||||
#define utimes ______utimes
|
||||
#undef __utimes
|
||||
#define __utimes ________utimes
|
||||
#endif
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__note)
|
||||
__STDPP__directive pragma pp:note off64_t
|
||||
#endif
|
||||
|
||||
#include <ast_std.h>
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide strmode
|
||||
#else
|
||||
#undef strmode
|
||||
#endif
|
||||
|
||||
#include "lib_3d.h"
|
||||
|
||||
#include <ls.h>
|
||||
#include <sig.h>
|
||||
#include <times.h>
|
||||
#include <error.h>
|
||||
#include <debug.h>
|
||||
#include <hashkey.h>
|
||||
#include <dlldefs.h>
|
||||
|
||||
#if _lib_strerror && defined(strerror)
|
||||
#undef strerror
|
||||
extern char* strerror();
|
||||
#endif
|
||||
|
||||
#undef mount
|
||||
#define mount ______mount
|
||||
#include <fs3d.h>
|
||||
#undef mount
|
||||
|
||||
#include "msg.h"
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide fchown ftruncate mount readlink sbrk strmode truncate utimes __utimes
|
||||
#else
|
||||
#undef fchown
|
||||
#undef ftruncate
|
||||
#undef mount
|
||||
#undef readlink
|
||||
#undef sbrk
|
||||
#undef strmode
|
||||
#undef truncate
|
||||
#undef utimes
|
||||
#undef __utimes
|
||||
#endif
|
||||
|
||||
#if FS && defined(MIX)
|
||||
#define LICENSED 1
|
||||
#endif
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__note)
|
||||
#if !_typ_off64_t && !noticed(off64_t)
|
||||
#undef off64_t
|
||||
#if _typ_int64_t
|
||||
#define off64_t int64_t
|
||||
#else
|
||||
#define off64_t long
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct stat64;
|
||||
|
||||
#undef fcntl
|
||||
#undef open
|
||||
#undef stat
|
||||
#undef strtol
|
||||
#undef strtoul
|
||||
#undef strtoll
|
||||
#undef strtoull
|
||||
|
||||
#define MSG_read3d (MSG_read|MSG_EXT(MSG_ARG_number,4))
|
||||
#define MSG_write3d (MSG_write|MSG_EXT(MSG_ARG_number,4))
|
||||
|
||||
struct Fs;
|
||||
|
||||
typedef long (*Sysfunc_t)();
|
||||
|
||||
typedef int (*Fs_get_t)(struct Fs*, char*, const char*, int);
|
||||
|
||||
typedef int (*Fs_set_t)(struct Fs*, const char*, int, const char*, int);
|
||||
|
||||
#define _3D_LINK_MAX 999 /* for nice ls -l */
|
||||
|
||||
#ifndef _3D_LINK_MAX
|
||||
#ifdef LINK_MAX
|
||||
#define _3D_LINK_MAX LINK_MAX
|
||||
#else
|
||||
#define _3D_LINK_MAX 30000
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ATTR_MAX 121
|
||||
|
||||
#include "FEATURE/peek"
|
||||
#include "FEATURE/syscall"
|
||||
#include "FEATURE/syslib"
|
||||
|
||||
typedef struct Fs
|
||||
{
|
||||
long flags;
|
||||
short fd;
|
||||
short retry;
|
||||
short specialsize;
|
||||
Fs_get_t get;
|
||||
Fs_set_t set;
|
||||
unsigned long key;
|
||||
unsigned long ack;
|
||||
unsigned long call;
|
||||
unsigned long terse;
|
||||
char special[10];
|
||||
char attr[ATTR_MAX];
|
||||
struct stat st;
|
||||
char* match;
|
||||
char* service;
|
||||
short matchsize;
|
||||
short servicesize;
|
||||
} Fs_t;
|
||||
|
||||
#if FS
|
||||
|
||||
typedef struct Mount
|
||||
{
|
||||
long channel;
|
||||
Fs_t* fs;
|
||||
struct Mount* global;
|
||||
char* logical;
|
||||
char* physical;
|
||||
char attr[ATTR_MAX];
|
||||
short logicalsize;
|
||||
short physicalsize;
|
||||
short flags;
|
||||
} Mount_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
dev_t dev;
|
||||
ino_t ino;
|
||||
char path[1];
|
||||
} Dir_t;
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mount;
|
||||
Dir_t* dir;
|
||||
#endif
|
||||
short* reserved;
|
||||
Msg_file_t id;
|
||||
unsigned long open;
|
||||
unsigned char flags;
|
||||
unsigned char oflag;
|
||||
} File_t;
|
||||
|
||||
#if VCS
|
||||
#include "vcs_3d.h"
|
||||
#endif
|
||||
|
||||
#define NOSYS nosys
|
||||
|
||||
#define TABLE_FD (OPEN_MAX>22?22:(OPEN_MAX-1)) /* 0 for env */
|
||||
#define TABLE_MAX (1<<(TABBITS+7))/* max 3d table image size */
|
||||
#define TABLE_PREFIX "vpath " /* for external consistency */
|
||||
#define TABLE_VERSION 1 /* to verify TABLE_FD */
|
||||
|
||||
#define TABBITS 5 /* max vpath,vmap table index bits (<6) */
|
||||
#define TABSIZE (1<<TABBITS) /* v* tab size */
|
||||
#define VERMODE (S_IRWXU|S_IRWXG|S_IRWXO) /* ver dir mode */
|
||||
#define INSTANCE TABSIZE /* under ver */
|
||||
|
||||
#define INTERCEPT_MAX 8 /* max # call intercept layers */
|
||||
|
||||
#define LICENSE_ALL '+' /* everything licensed */
|
||||
#define LICENSE_NONE '-' /* nothing licensed */
|
||||
#define LICENSE_SEP ',' /* feature separator */
|
||||
|
||||
/*
|
||||
* File_t flags
|
||||
*/
|
||||
|
||||
#define RESERVED_FD 10 /* reserved fds >= this */
|
||||
|
||||
#define FILE_CLOEXEC (1<<0)
|
||||
#define FILE_ERROR (1<<1)
|
||||
#define FILE_LOCK (1<<2)
|
||||
#define FILE_OPEN (1<<3)
|
||||
#define FILE_REGULAR (1<<4)
|
||||
#define FILE_WRITE (1<<5)
|
||||
#define FILE_VIRTUAL (1<<6)
|
||||
|
||||
#define FILE_LOCAL (1<<8)
|
||||
|
||||
/*
|
||||
* map flags
|
||||
*/
|
||||
|
||||
#define MAP_EXEC (1<<0) /* get info for exec */
|
||||
#define MAP_INIT (1<<1) /* get info for init */
|
||||
|
||||
/*
|
||||
* Mount_t flags
|
||||
*/
|
||||
|
||||
#define MOUNT_PRIMARY (1<<0)
|
||||
|
||||
/*
|
||||
* pathreal() flags
|
||||
*/
|
||||
|
||||
#define P_ABSOLUTE (1<<0) /* no relative conversion */
|
||||
#define P_DOTDOT (1<<1) /* add /.. to end of path */
|
||||
#define P_LSTAT (1<<2) /* lstat() calling */
|
||||
#define P_NOOPAQUE (1<<3) /* remove if opaque object */
|
||||
#define P_NOSLASH (1<<4) /* remove trailing /'s */
|
||||
#define P_PATHONLY (1<<5) /* just canonicalize path */
|
||||
#define P_READLINK (1<<6) /* readlink() calling */
|
||||
#define P_SAFE (1<<7) /* must be in safe tree */
|
||||
#define P_SLASH (1<<8) /* add trailing / */
|
||||
#define P_TOP (1<<9) /* copy to top level */
|
||||
|
||||
#ifndef ENOTEMPTY
|
||||
#define ENOTEMPTY EEXIST
|
||||
#endif
|
||||
|
||||
#define T_ALLOCATE (1<<15)
|
||||
#define T_PREFIX (1<<14)
|
||||
#define T_DELETE (T_ALLOCATE|T_PREFIX)
|
||||
#define T_SIZE (T_PREFIX-1)
|
||||
|
||||
#define T_VALSIZE(p) (((p)->valsize&T_SIZE)?((p)->valsize&T_SIZE):strlen((p)->val))
|
||||
|
||||
#define T_MOUNT (T_SIZE-0)
|
||||
|
||||
#define FS_null 0
|
||||
#define FS_option 1
|
||||
#define FS_view 2
|
||||
#define FS_pwd 3
|
||||
#define FS_fs 4
|
||||
#define FS_map 5
|
||||
#define FS_safe 6
|
||||
#define FS_fd 7
|
||||
#define FS_intercept 8
|
||||
|
||||
#define FS_ACTIVE (1<<0)
|
||||
#define FS_BOUND (1<<1)
|
||||
#define FS_CLOSE (1<<2)
|
||||
#define FS_ERROR (1<<3)
|
||||
#define FS_FLUSH (1<<4)
|
||||
#define FS_FORK (1<<5)
|
||||
#define FS_FS (1<<6)
|
||||
#define FS_GLOBAL (1<<7)
|
||||
#define FS_INIT (1<<8)
|
||||
#define FS_INTERACTIVE (1<<9)
|
||||
#define FS_INTERNAL (1<<10)
|
||||
#define FS_LICENSED (1<<11)
|
||||
#define FS_LOAD (1<<12)
|
||||
#define FS_LOCK (1<<13)
|
||||
#define FS_MAGIC (1<<14)
|
||||
#define FS_MONITOR (1L<<15)
|
||||
#define FS_NAME (1L<<16)
|
||||
#define FS_ON (1L<<17)
|
||||
#define FS_OPEN (1L<<18)
|
||||
#define FS_RAW (1L<<19)
|
||||
#define FS_RECEIVE (1L<<20)
|
||||
#define FS_REFERENCED (1L<<21)
|
||||
#define FS_REGULAR (1L<<22)
|
||||
#define FS_UNIQUE (1L<<23)
|
||||
#define FS_VALIDATED (1L<<24)
|
||||
#define FS_WRITE (1L<<25)
|
||||
|
||||
#define FS_LOCAL (1L<<26)
|
||||
|
||||
#define cancel(p) (*(p)>=RESERVED_FD?(state.file[*(p)].reserved=0,CLOSE(*(p)),*(p)=0):(-1))
|
||||
#define fsfd(p) ((((p)->flags&(FS_ERROR|FS_ON|FS_OPEN))==(FS_ON|FS_OPEN))?(p)->fd:((((p)->flags&(FS_BOUND|FS_ERROR|FS_INIT|FS_ON))==(FS_BOUND|FS_ON))?fsinit(p,-1):-1))
|
||||
#define fson(p) (((p)->flags&(FS_BOUND|FS_ERROR|FS_ON))==(FS_BOUND|FS_ON))
|
||||
#define initialize() do { if (!state.pid) init(0,0,0); else if (state.control.note) control(); } while(0)
|
||||
#define monitored() ((state.path.monitor&&!state.path.mount)?state.path.monitor:(Mount_t*)0)
|
||||
#define mounted() ((state.path.monitor&&state.path.mount)?state.path.monitor:(Mount_t*)0)
|
||||
#if _hdr_alloca
|
||||
#define reclaim()
|
||||
#else
|
||||
#define reclaim() do { if (state.brk.beg) fix(); } while (0)
|
||||
#endif
|
||||
#define reserve(p) ((state.file[*(p)].flags|=FILE_LOCK,*(state.file[*(p)].reserved=(p)))<RESERVED_FD?close(*(p)):0)
|
||||
|
||||
#if FS
|
||||
#define fgetmount(f) ((f)>=0&&(f)<=state.cache?state.file[f].mount:(Mount_t*)0)
|
||||
#define fsmonitored(p) ((state.path.monitor=getmount((p),NiL))&&(state.path.monitor->fs->flags&(FS_ERROR|FS_MONITOR|FS_ON))==(FS_MONITOR|FS_ON))
|
||||
#define fsmount(p) (((p)->channel&&(p)->fs->fd)?((p)->channel==-1?-1:(p)->fs->fd):fschannel(p))
|
||||
#define fssys(p,c) (fson((p)->fs)&&(((p)->fs->call&MSG_MASK(c))||((p)->fs->flags&FS_GLOBAL)&&(fsmount(p),0)))
|
||||
#endif
|
||||
|
||||
#define var_3d "__="
|
||||
#define var_pwd "PWD="
|
||||
#define var_shell "SHELL="
|
||||
#define var_view "VPATH="
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char* key;
|
||||
char* val;
|
||||
unsigned short keysize;
|
||||
unsigned short valsize;
|
||||
} Map_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int size;
|
||||
Map_t table[TABSIZE];
|
||||
} Table_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int level;
|
||||
int open_level;
|
||||
int synthesize;
|
||||
int nlinks;
|
||||
char* linkname;
|
||||
int linksize;
|
||||
#if FS
|
||||
Mount_t* monitor;
|
||||
#endif
|
||||
char* mount;
|
||||
Table_t* table;
|
||||
#if VCS && defined(VCS_PATH_STATE)
|
||||
VCS_PATH_STATE;
|
||||
#endif
|
||||
struct stat st;
|
||||
char name[4 * PATH_MAX];
|
||||
} Path_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Fs_t* fs;
|
||||
char* prefix;
|
||||
int prelen;
|
||||
} Visit_t;
|
||||
|
||||
struct Intercept_s; typedef struct Intercept_s Intercept_t;
|
||||
|
||||
typedef long (*Intercept_f)(Intercept_t*, int, int, void*, void*, void*, void*, void*, void*);
|
||||
|
||||
struct Intercept_s
|
||||
{
|
||||
Intercept_f call;
|
||||
unsigned long mask;
|
||||
};
|
||||
|
||||
#if _no_exit_exit
|
||||
typedef void (*Exitfunc_t)(int);
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* the first elements are explicitly initialized */
|
||||
|
||||
const char* id;
|
||||
char* cmd;
|
||||
char dot[2];
|
||||
char null[1];
|
||||
char one[2];
|
||||
char* binsh;
|
||||
char env3d[sizeof(var_3d)];
|
||||
char envpwd[sizeof(var_pwd) + 4 * PATH_MAX];
|
||||
char envshell[sizeof(var_shell) + PATH_MAX];
|
||||
char envview[sizeof(var_view)];
|
||||
Fs_t fs[TABSIZE];
|
||||
char vdefault[8];
|
||||
char opaque[8];
|
||||
int limit;
|
||||
|
||||
/* the rest are implicitly initialized */
|
||||
|
||||
struct
|
||||
{
|
||||
short monitor;
|
||||
short name;
|
||||
} call;
|
||||
struct
|
||||
{
|
||||
short fd;
|
||||
unsigned long internal;
|
||||
} channel;
|
||||
struct
|
||||
{
|
||||
int note;
|
||||
int pathsize;
|
||||
char* path;
|
||||
} control;
|
||||
#if VCS && defined(VCS_STATE)
|
||||
VCS_STATE;
|
||||
#endif
|
||||
int boundary;
|
||||
struct
|
||||
{
|
||||
char* beg;
|
||||
char* end;
|
||||
} brk;
|
||||
int cache;
|
||||
char** env;
|
||||
char* envpath;
|
||||
void* freedirp;
|
||||
int in_2d;
|
||||
gid_t gid;
|
||||
int kernel;
|
||||
int level;
|
||||
char license[64];
|
||||
int open;
|
||||
pid_t pid;
|
||||
char* pwd;
|
||||
int pwdsize;
|
||||
char pwdbuf[4 * PATH_MAX + 1];
|
||||
long ret;
|
||||
Fs_t* safe;
|
||||
char* shell;
|
||||
uid_t uid;
|
||||
struct
|
||||
{
|
||||
char* value;
|
||||
char* invert;
|
||||
char* next;
|
||||
int valsize;
|
||||
int invertsize;
|
||||
} key;
|
||||
struct
|
||||
{
|
||||
short fd;
|
||||
short version;
|
||||
int size;
|
||||
char buf[TABLE_MAX];
|
||||
} table;
|
||||
unsigned long test;
|
||||
struct
|
||||
{
|
||||
unsigned long call;
|
||||
short count;
|
||||
pid_t pid;
|
||||
} trace;
|
||||
Table_t vmap;
|
||||
Table_t vmount;
|
||||
Table_t vpath;
|
||||
Table_t vsafe;
|
||||
Table_t vintercept;
|
||||
File_t file[OPEN_MAX];
|
||||
Visit_t visit;
|
||||
Path_t path;
|
||||
int real;
|
||||
struct
|
||||
{
|
||||
int size;
|
||||
Intercept_t intercept[INTERCEPT_MAX];
|
||||
} trap;
|
||||
#if _no_exit_exit
|
||||
Exitfunc_t libexit;
|
||||
#endif
|
||||
#if FS
|
||||
Mount_t* global;
|
||||
Mount_t mount[2 * TABSIZE];
|
||||
#endif
|
||||
} State_t;
|
||||
|
||||
#include "std_3d.h"
|
||||
|
||||
extern State_t state;
|
||||
|
||||
extern int bprintf(char**, char*, const char*, ...);
|
||||
extern ssize_t bvprintf(char**, char*, const char*, va_list);
|
||||
extern void calldump(char**, char*);
|
||||
extern void callinit(void);
|
||||
extern int checklink(const char*, struct stat*, int);
|
||||
extern void control(void);
|
||||
extern int fs3d_copy(int, int, struct stat*);
|
||||
extern int fs3d_dup(int, int);
|
||||
extern int fs3d_mkdir(const char*, mode_t);
|
||||
extern int fs3d_open(const char*, int, mode_t);
|
||||
extern void fsdrop(Fs_t*, int);
|
||||
extern int fsinit(Fs_t*, int);
|
||||
extern unsigned long getkey(const char*, const char*, int);
|
||||
extern int init(int, const char*, int);
|
||||
extern int instance(char*, char*, struct stat*, int);
|
||||
extern int iterate(Table_t*, int(*)(Map_t*, char*, int), char*, int);
|
||||
extern int keep(const char*, size_t, int);
|
||||
extern int mapdump(Table_t*, char*, int);
|
||||
extern int mapget(Map_t*, char*, int);
|
||||
extern int mapinit(const char*, int);
|
||||
extern int mapset(Table_t*, const char*, int, const char*, int);
|
||||
extern int nosys(void);
|
||||
extern char* pathcanon(char*, size_t, int);
|
||||
extern char* pathcat(const char*, int, const char*, const char*, char*, size_t);
|
||||
extern char* pathreal(const char*, int, struct stat*);
|
||||
extern ssize_t peek(int, void*, size_t);
|
||||
extern Map_t* search(Table_t*, const char*, int, const char*, int);
|
||||
extern Sysfunc_t sysfunc(int);
|
||||
extern int intercept(Intercept_f, unsigned long);
|
||||
|
||||
#if FS
|
||||
extern int fileinit(int, struct stat*, Mount_t*, int);
|
||||
extern int fscall(Mount_t*, long, int, ...);
|
||||
extern int fschannel(Mount_t*);
|
||||
extern char* fsreal(Mount_t*, long, const char*);
|
||||
extern int getattr(const char*, char*);
|
||||
extern Mount_t* getmount(const char*, const char**);
|
||||
extern const char* setattr(char*, const char*, const char*);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* non-standard standards
|
||||
*/
|
||||
|
||||
#if ! _UWIN
|
||||
extern void* sbrk(ssize_t);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* backwards compatibility fixups
|
||||
* these should go away in 94 (ha!)
|
||||
*/
|
||||
|
||||
#if _int_st_spare1
|
||||
#define NIVIEW(p,v) ((p)->st_spare1=(v))
|
||||
#else
|
||||
#if _ary_st_spare4
|
||||
#define NIVIEW(p,v) ((p)->st_spare4[0]=(v))
|
||||
#else
|
||||
#if _ary_st_pad4
|
||||
#define NIVIEW(p,v) ((p)->st_pad4[0]=(v))
|
||||
#else
|
||||
#define NIVIEW(p,v)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef IVIEW
|
||||
|
||||
#if _mem_st_rdev_stat
|
||||
#define IVIEW(p,v) do{NIVIEW(p,(v)&(INSTANCE-1));if(!S_ISBLK((p)->st_mode)&&!S_ISCHR((p)->st_mode))(p)->st_rdev=(v)&(INSTANCE-1);}while(0)
|
||||
#else
|
||||
#define IVIEW(p,v) NIVIEW(p,(v)&(INSTANCE-1))
|
||||
#endif
|
||||
|
||||
#endif
|
376
src/cmd/3d/3d.sh
376
src/cmd/3d/3d.sh
|
@ -1,376 +0,0 @@
|
|||
########################################################################
|
||||
# #
|
||||
# This software is part of the ast package #
|
||||
# Copyright (c) 1989-2011 AT&T Intellectual Property #
|
||||
# and is licensed under the #
|
||||
# Eclipse Public License, Version 1.0 #
|
||||
# by AT&T Intellectual Property #
|
||||
# #
|
||||
# A copy of the License is available at #
|
||||
# http://www.eclipse.org/org/documents/epl-v10.html #
|
||||
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
||||
# #
|
||||
# Information and Software Systems Research #
|
||||
# AT&T Research #
|
||||
# Florham Park NJ #
|
||||
# #
|
||||
# Glenn Fowler <gsf@research.att.com> #
|
||||
# David Korn <dgk@research.att.com> #
|
||||
# Eduardo Krell <ekrell@adexus.cl> #
|
||||
# #
|
||||
########################################################################
|
||||
# NOTE: retain this comment
|
||||
dir=$_ # NOTE: this line must appear before any commands
|
||||
|
||||
command=3d
|
||||
|
||||
case $RANDOM in
|
||||
$RANDOM)exec ksh 3d "$@" ;;
|
||||
esac
|
||||
|
||||
case $(getopts '[-][123:xyz]' opt --xyz 2>/dev/null; echo 0$opt) in
|
||||
0123) ARGV0="-a $command"
|
||||
USAGE=$'
|
||||
[-?
|
||||
@(#)$Id: 3d (AT&T Labs Research) 2006-10-01 $
|
||||
]
|
||||
'$USAGE_LICENSE$'
|
||||
[+NAME?3d - execute a command with nDFS filesystem services enabled]
|
||||
[+DESCRIPTION?\b3d\b executes a dynamically linked \acommand\a
|
||||
with \an\a\bDFS\b filesystem services enabled. It intercepts pathname
|
||||
system calls and applies the \an\a\bDFS\b operations specified
|
||||
by the \bVPATH\b environment variable, the command line mounts,
|
||||
and the \bvpath\b command. If \acommand\a is omitted then an
|
||||
interactive \bsh\b(1) is started. All processes executed by \acommand\a
|
||||
also have \an\a\bDFS\b enabled.]
|
||||
[+?The main \b3d\b service is \aviewpathing\a. A \aviewpath\a mounts one
|
||||
directory tree on top of another. Files in the top level
|
||||
(directory tree) obscure files in the lower level. Lower level files
|
||||
have copy-on-write semantics to the top level. i.e., files in the lower
|
||||
level are readonly; if a lower level file is modified it is first
|
||||
copied to the top level before modification. Viewpath mounted
|
||||
directories can be chained. All levels but the top in a chain are
|
||||
readonly. The traditional \bVPATH=\b\ad1:d2:d3\a viewpathing is
|
||||
specified by the two \b3d\b mounts "\ad1 d2\a" and "\ad2 d3\a".]
|
||||
[+?The following service mounts are initialized by default:]{
|
||||
[+/dev/fd?\b/dev/fd/\b\an\a refers to the open file descriptor \an\a
|
||||
in the current process.]
|
||||
[+/dev/fdp?\b/dev/fdp/local/\aservice\a opens a 2-way stream to
|
||||
\aservice\a on the local host. The stream supports file
|
||||
descriptor exchange.]
|
||||
[+/dev/tcp?\b/dev/tcp/\b\ahost\a\b/\b\aservice\a opens a 2-way
|
||||
connection to \aservice\a on \ahost\a. \binetd\b(8) services
|
||||
are named either by \binet.\b\aservice\a or by port number.]
|
||||
[+/dev/udp?\b/dev/udb/\b\ahost\a\b/\b\aservice\a opens a datagram
|
||||
connection to \aservice\a on \ahost\a. \binetd\b(8) services
|
||||
are named either by \binet.\b\aservice\a or by port number.]
|
||||
}
|
||||
[c:command?Ignored; allows \b3d\b to be invoked like \bsh\b(1).]
|
||||
[d:debug?Set the debug trace level to \alevel\a. Higher levels produce more
|
||||
output.]#[level]
|
||||
[l:lite?Disable the default service mounts.]
|
||||
[m:mount?Mount the path \atop\a onto the path \abottom\a. If \abottom\a is a
|
||||
directory then the directory \atop\a is viewpathed on top of \abottom\a.
|
||||
Otherwise \abottom\a must match a \b3d\b \bfs\b path of the form
|
||||
\b/#\b\aspecial\a.]:["top bottom"]
|
||||
[n!:exec?Execute \acommand\a. \b--noexec\b shows how \acommand\a would be
|
||||
invoked but does not execute.]
|
||||
[o:output?\b--trace\b and \b--debug\b output is written to \afile\a instead
|
||||
of the standard error.]:[file]
|
||||
[s:shell?Sets the \bsh\b(1) executable path to \afile\a.]:[file:=ksh]
|
||||
[t:trace?If \aid\a is \b1\b then intercepted system calls for all child
|
||||
processes will be traced. If \aid\a is greater than \b1\b then
|
||||
intercepted system calls for the current process and all
|
||||
children will be traced.]#[id]
|
||||
[v:version?Use \b3d\b version \amajor.minor\a instead of the latest
|
||||
version.]:[major.minor]
|
||||
[x:?Passed to the \b3d\b \bsh\b(1).]
|
||||
[+FS PATHS?\b3d\b \bfs\b paths of the form \b/#\b\aspecial\a[\b/\b...]]
|
||||
control the semantics of \b3d\b and allow services to be attached to
|
||||
the file namespace. Unsupported \bfs\b paths are silently ignored. The
|
||||
supported \bfs\b paths are:]{
|
||||
[+/#fd? ]
|
||||
[+/#fs/\aname\a[/\aoption\a/...]]? ]
|
||||
[+/#map? ]
|
||||
[+/#null? ]
|
||||
[+/#option? ]{
|
||||
[+2d? ]
|
||||
[+3d? ]
|
||||
[+boundary? ]
|
||||
[+call=\avalue\a? ]
|
||||
[+count=\avalue\a? ]
|
||||
[+debug=\alevel\a? ]
|
||||
[+dump=\b[\avalue\a]]? ]{
|
||||
[+call=\avalue\a? ]
|
||||
[+file=\avalue\a? ]
|
||||
[+fs=\avalue\a? ]
|
||||
[+map=\avalue\a? ]
|
||||
[+mount=\avalue\a? ]
|
||||
[+safe=\avalue\a? ]
|
||||
[+state=\avalue\a? ]
|
||||
[+view=\avalue\a? ]
|
||||
}
|
||||
[+file=\avalue\a? ]
|
||||
[+fork? ]
|
||||
[+init? ]
|
||||
[+license=\apath\a? ]
|
||||
[+mount=\avalue\a? ]
|
||||
[+table=\avalue\a? ]
|
||||
[+test=\abitmask\a? ]
|
||||
[+timeout=\avalue\a? ]
|
||||
[+timestamp? ]
|
||||
[+trace=\avalue\a? ]
|
||||
[+version=1? ]
|
||||
}
|
||||
[+/#pwd? ]
|
||||
[+/#safe? ]
|
||||
[+/#view? ]
|
||||
}
|
||||
[+DETAILS?\an\a\bDFS\b semantics are applied by intercepting system calls with
|
||||
a dll that is preloaded at process startup before \amain\a() is called.
|
||||
The interception mechanism may involve the environment on some systems;
|
||||
in those cases commands like \benv\b(1) that clear the enviroment
|
||||
before execution may defeat the \b3d\b intercepts. The intercepted
|
||||
system calls are listed by \bvpath - /#option/dump=call\b. Note that
|
||||
implementation system call names may differ from those listed in
|
||||
section 2 of the manual; \bstat\b(2) is especially vulnerbale to
|
||||
mangling.]
|
||||
[+?\b3d\b ignores calls not present in a particular host system. In addition,
|
||||
\b3d\b only works on dynamically linked executables that have neither
|
||||
set-uid nor set-gid permissions. It may not have the intended effect
|
||||
on programs written in a language or linked with a language runtime
|
||||
that hides or mangles system call library symbols, or that
|
||||
directly emit system call instruction sequences rather than using
|
||||
the corresponding library functions, or that dynamically link
|
||||
libraries outside of the scope of the \b3d\b intercepts.]
|
||||
[+?Multi-process client-server applications may misbehave if the \b3d\b
|
||||
environment between the related processes is not kept in sync.]
|
||||
|
||||
[ command [ arg ... ] ]
|
||||
|
||||
[+ENVIRONMENT?\b3d\b is implemented by four components: the \b3d\b script,
|
||||
located on \b$PATH\b; the \b3d\b dll (shared library), located either
|
||||
on \b$PATH\b or in one of the \b../lib\b* directories on \b$PATH\b,
|
||||
depending on local compilation system conventions; and the \b2d\b
|
||||
\bsh\b(1) alias and \b_2d\b \bsh\b(1) function that allow commands
|
||||
to be run with \an\a\bDFS\b semantics disabled. Systems like
|
||||
\bsgi.mips3\b that support multiple a.out formats may have multiple
|
||||
versions of the \b3d\b dll. In all cases the \b3d\b script handles
|
||||
the dll search.]
|
||||
[+EXAMPLES?]{
|
||||
[+\b$ 3d]
|
||||
[+\b$ VPATH=$INSTALLROOT::$PACKAGEROOT 3d]
|
||||
[+\b$ 3d ls -l]
|
||||
[+\b$ 2d ls -l]
|
||||
}
|
||||
[+SEE ALSO?\benv\b(1), \bie\b(1), \bsh\b(1), \btrace\b(1), \bwarp\b(1),
|
||||
\bstat\b(2)]
|
||||
'
|
||||
;;
|
||||
*) ARGV0=""
|
||||
USAGE='clnxd:m:o:s:t:v:[ command [ arg ... ] ]'
|
||||
;;
|
||||
esac
|
||||
|
||||
test . -ef "$PWD" || PWD=`pwd`
|
||||
case $dir in
|
||||
*/3d) ;;
|
||||
*) case $0 in
|
||||
*/*) dir=$0
|
||||
;;
|
||||
*) dir=`whence 3d 2>/dev/null`
|
||||
dir=`whence -p $dir 2>/dev/null`
|
||||
;;
|
||||
esac
|
||||
esac
|
||||
case $dir in
|
||||
/*) dir=${dir%/*} ;;
|
||||
*) dir=${dir#./}; dir=$PWD/${dir%/*} ;;
|
||||
esac
|
||||
abi=
|
||||
dir=${dir%/*}
|
||||
case $dir in
|
||||
*/arch/sgi.mips[0123456789]*)
|
||||
if test -d /lib32 -o -d /lib64
|
||||
then d=${dir%-*}
|
||||
d=${d%?}
|
||||
for a in 2: 3:N32 4:64
|
||||
do t=${a#*:}
|
||||
a=${a%:*}
|
||||
if test -d $d$a
|
||||
then abi="$abi $d$a:$t"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
cflag=
|
||||
full="/dev/fdp/local/nam/user /#fs/nam/name/unique /dev/fdp /#nam /dev/tcp /#nam /dev/udp /#nam /dev/fd /#fd"
|
||||
mount="- -"
|
||||
options=
|
||||
output=
|
||||
show=
|
||||
shell=$SHELL
|
||||
trace=
|
||||
SHELL=
|
||||
version=
|
||||
case $VPATH in
|
||||
*:*) ifs=${IFS-'
|
||||
'}
|
||||
IFS=:
|
||||
o=
|
||||
for a in $VPATH
|
||||
do case $a in
|
||||
""|-) ;;
|
||||
*) case $o in
|
||||
""|-) ;;
|
||||
*) mount="$mount $o $a" ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
o=$a
|
||||
done
|
||||
IFS=$ifs
|
||||
;;
|
||||
esac
|
||||
|
||||
: grab the options
|
||||
|
||||
while getopts $ARGV0 "$USAGE" OPT
|
||||
do case $OPT in
|
||||
c) cflag=1; break ;;
|
||||
d) trace="$trace/debug=$OPTARG" ;;
|
||||
l) full= ;;
|
||||
m) mount="$mount $OPTARG" ;;
|
||||
n) show="print -u2 --" ;;
|
||||
o) output=$OPTARG ;;
|
||||
s) SHELL=$OPTARG ;;
|
||||
t) trace="$trace/trace=$OPTARG" ;;
|
||||
v) case $OPTARG in
|
||||
/*) version=$OPTARG ;;
|
||||
*) version=.$OPTARG ;;
|
||||
esac
|
||||
;;
|
||||
x) options="$options -$OPT" ;;
|
||||
*) exit 2 ;;
|
||||
esac
|
||||
done
|
||||
set x "$@"
|
||||
shift $OPTIND
|
||||
case $cflag in
|
||||
1) set -- -c "$@" ;;
|
||||
esac
|
||||
|
||||
case $full in
|
||||
?*) mount="$full $mount" ;;
|
||||
esac
|
||||
mount="- /#option/3d$trace $mount"
|
||||
case $output in
|
||||
?*) mount="$output /#fs/option $mount" ;;
|
||||
esac
|
||||
default=$version
|
||||
case $version in
|
||||
/*) ;;
|
||||
*) if getconf LIBPREFIX >/dev/null 2>&1
|
||||
then d=$(getconf LIBPATH)
|
||||
d=${d##*,}
|
||||
d=${d%%:*}
|
||||
p=$(getconf LIBPREFIX)
|
||||
s=$(getconf LIBSUFFIX)
|
||||
else d=lib
|
||||
p=lib
|
||||
s='.s[lo]'
|
||||
fi
|
||||
for x in $dir/$d/${p}3d${s}$version $dir/$d/${p}3d${version//./}${s}
|
||||
do case $x in
|
||||
*/${p}3d${s}*[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]*|*/${p}3d$*[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]*${s})
|
||||
;;
|
||||
*) version=$x
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
esac
|
||||
exp=
|
||||
if test -f "$version"
|
||||
then if test -d $dir/3d
|
||||
then dir=$dir/3d
|
||||
fi
|
||||
case :$FPATH: in
|
||||
*:$dir/fun:*) ;;
|
||||
*) export FPATH=$dir/fun${FPATH:+:$FPATH} ;;
|
||||
esac
|
||||
case :$PATH: in
|
||||
*:$dir/bin:*) ;;
|
||||
*) export PATH=$dir/bin:$PATH ;;
|
||||
esac
|
||||
exp="$exp LD_PRELOAD=$version"
|
||||
case $abi:-:$version in
|
||||
?*:-:$dir/*)
|
||||
v=${version#$dir/}
|
||||
for a in $abi
|
||||
do d=${a%:*}
|
||||
a=${a#*:}
|
||||
exp="$exp _RLD${a}_LIST=$d/$v:DEFAULT"
|
||||
done
|
||||
;;
|
||||
*) v=${version%.*}
|
||||
s=${version##*.}
|
||||
if test -f ${v}-n32.$s
|
||||
then exp="$exp _RLD64_LIST=$version:DEFAULT _RLDN32_LIST=$version-n32.$s:DEFAULT _RLD_LIST=${v}-o32.$s:DEFAULT"
|
||||
elif test -f ${v}-64.$s -o -f ${v}-o32.$s
|
||||
then exp="$exp _RLD64_LIST=$version-64.$s:DEFAULT _RLDN32_LIST=$version:DEFAULT _RLD_LIST=${v}-o32.$s:DEFAULT"
|
||||
else exp="$exp _RLD_LIST=$version:DEFAULT"
|
||||
fi
|
||||
if test -f ${dir}/lib/libdir64.$s
|
||||
then exp="$exp:${dir}/lib/libdir64.$s"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
export $exp
|
||||
case $mount in
|
||||
??*) export __=${mount#' '} ;;
|
||||
*) unset __ ;;
|
||||
esac
|
||||
unset VPATH
|
||||
else print -u2 "$command: $version: no shared library"
|
||||
case $default in
|
||||
"*") ;;
|
||||
*) exit 1 ;;
|
||||
esac
|
||||
version=
|
||||
options=
|
||||
fi
|
||||
case $SHELL in
|
||||
"") t=`whence ksh 2>/dev/null`
|
||||
SHELL=`PATH=$dir/bin:$PATH whence -p $t 2>/dev/null`
|
||||
;;
|
||||
esac
|
||||
SHELL=${SHELL:-$shell}
|
||||
SHELL=${SHELL:-/bin/sh}
|
||||
export SHELL
|
||||
case `vpath /#option/3d 2>/dev/null` in
|
||||
*/2d) $show vpath $mount ;;
|
||||
esac
|
||||
case $1:$#:$options in
|
||||
-*) ;;
|
||||
*:0:*|*:*:?*)
|
||||
shell="$SHELL $options"
|
||||
;;
|
||||
*) t=`whence $1 2>/dev/null`
|
||||
t=`whence -p $t 2>/dev/null`
|
||||
case $t in
|
||||
""|"''"|'""') shell="$SHELL $options" ;;
|
||||
*) shell= ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
case $show in
|
||||
"") exec $shell "$@" ;;
|
||||
*) case $version in
|
||||
"") $show __="'$__'" exec $shell "$@" ;;
|
||||
*) $show __="'$__'" $exp exec $shell "$@" ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
|
@ -1,350 +0,0 @@
|
|||
: 3d regression tests
|
||||
#
|
||||
# 3d.tst (AT&T Research) 2004-07-01
|
||||
#
|
||||
# the first section defines the test harness
|
||||
# the next section defines individual test functions
|
||||
# the tests are in the last section
|
||||
#
|
||||
|
||||
( vpath ) >/dev/null 2>&1 || {
|
||||
print -u2 $0: must be run from 3d shell
|
||||
exit 1
|
||||
}
|
||||
|
||||
export LC_ALL=C
|
||||
|
||||
integer seconds=0
|
||||
|
||||
COMMAND=3d
|
||||
|
||||
FILE=
|
||||
FORMAT="%K"
|
||||
GROUP=
|
||||
INIT=
|
||||
NEW="new-and-improved"
|
||||
NUKE=
|
||||
OLD="original"
|
||||
pwd=$PWD
|
||||
PREFIX=
|
||||
STAMP="2005-07-17+04:05:06"
|
||||
VIRTUAL=
|
||||
|
||||
TWD
|
||||
|
||||
function ACTIVE
|
||||
{
|
||||
DO return 0
|
||||
}
|
||||
|
||||
function TEST
|
||||
{
|
||||
case $INIT in
|
||||
"") INIT=1
|
||||
mkdir -p $TWD/bottom || exit 1
|
||||
cd $TWD
|
||||
INTRO
|
||||
;;
|
||||
esac
|
||||
cd $TWD
|
||||
case $NUKE in
|
||||
?*) rm -rf $NUKE; NUKE= ;;
|
||||
esac
|
||||
PREFIX=
|
||||
GROUP=$1
|
||||
ACTIVE || return 1
|
||||
vpath - -
|
||||
shift
|
||||
print "$GROUP $*"
|
||||
}
|
||||
|
||||
function FAIL # file message
|
||||
{
|
||||
print -u2 " FAIL $@"
|
||||
rm -rf $1
|
||||
(( ERRORS++ ))
|
||||
return 0
|
||||
}
|
||||
|
||||
function VERIFY # command ...
|
||||
{
|
||||
(( TESTS++ ))
|
||||
"$@" || FAIL "$@"
|
||||
}
|
||||
|
||||
function PREFIX
|
||||
{
|
||||
PREFIX=$1
|
||||
case $1 in
|
||||
/*) NUKE="$NUKE $1" ;;
|
||||
*) NUKE="$NUKE $PWD/$1" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
function VIRTUAL
|
||||
{
|
||||
case $VIRTUAL in
|
||||
?*) pwd=$PWD
|
||||
cd $TWD
|
||||
rm -rf $TWD/$VIRTUAL
|
||||
cd $pwd
|
||||
;;
|
||||
esac
|
||||
VIRTUAL=$1
|
||||
}
|
||||
|
||||
function CD
|
||||
{
|
||||
VERIFY cd $TWD/$1
|
||||
}
|
||||
|
||||
function VPATH
|
||||
{
|
||||
VERIFY vpath "$@"
|
||||
}
|
||||
|
||||
function CP
|
||||
{
|
||||
VERIFY cp "$@"
|
||||
shift $#-1
|
||||
NUKE="$NUKE $1"
|
||||
}
|
||||
|
||||
function LN
|
||||
{
|
||||
VERIFY ln "$@"
|
||||
shift $#-1
|
||||
NUKE="$NUKE $1"
|
||||
}
|
||||
|
||||
function MV
|
||||
{
|
||||
VERIFY mv "$@"
|
||||
shift $#-1
|
||||
NUKE="$NUKE $1"
|
||||
}
|
||||
|
||||
function MKDIR
|
||||
{
|
||||
VERIFY mkdir -p $*
|
||||
for i
|
||||
do case $i in
|
||||
/*) NUKE="$NUKE $i" ;;
|
||||
*) NUKE="$NUKE $i" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
function DATA
|
||||
{
|
||||
VIRTUAL $VIRTUAL
|
||||
case $1 in
|
||||
-) remove=1; shift ;;
|
||||
*) remove=0 ;;
|
||||
esac
|
||||
case $# in
|
||||
0) return 0 ;;
|
||||
1) ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
path=$1
|
||||
case $PREFIX in
|
||||
"") FILE=$path ;;
|
||||
*) FILE=$PREFIX/$path ;;
|
||||
esac
|
||||
file=bottom/$path
|
||||
if [[ ! -f $TWD/$file ]]
|
||||
then case $remove in
|
||||
0) if [[ $path == */* && ! -d $TWD/${file%/*} ]]
|
||||
then mkdir -p $TWD/${file%/*} || FAIL $TWD/${file%/*} DATA mkdir
|
||||
fi
|
||||
print $OLD > $TWD/$file
|
||||
mode=${file%???}
|
||||
mode=${file#$mode}
|
||||
chmod $mode $TWD/$file || FAIL $TWD/$file DATA chmod
|
||||
;;
|
||||
esac
|
||||
else case $remove in
|
||||
1) rm -f $TWD/$file ;;
|
||||
esac
|
||||
fi
|
||||
(( TESTS++ ))
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# the remaining functions implement individiual parameterized tests
|
||||
#
|
||||
|
||||
function APPEND
|
||||
{
|
||||
DATA $*
|
||||
print "$NEW" >> $FILE || FAIL $FILE write error
|
||||
if [[ $(<$FILE) != "$OLD"$'\n'"$NEW" ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
fi
|
||||
}
|
||||
|
||||
function MODE
|
||||
{
|
||||
DATA $*
|
||||
chmod 000 $FILE || FAIL $FILE chmod error
|
||||
if [[ -f $FILE/... && ! -r $FILE/... ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
elif [[ -r $FILE ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
fi
|
||||
}
|
||||
|
||||
function REMOVE
|
||||
{
|
||||
DATA $*
|
||||
rm $FILE || FAIL $FILE rm error
|
||||
if [[ ! -f $FILE/... ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
fi
|
||||
print "$NEW" > $FILE || FAIL $FILE write error
|
||||
rm $FILE || FAIL $FILE rm error
|
||||
if [[ $(<$FILE) != "$OLD" ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
elif [[ $(<$FILE/...) != "$OLD" ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
fi
|
||||
}
|
||||
|
||||
function TOUCH
|
||||
{
|
||||
DATA $*
|
||||
touch -t "#$((seconds++))" $FILE/... || FAIL $FILE/... touch error
|
||||
touch -t "#$((seconds++))" $TWD/reference || FAIL $TWD/reference touch error
|
||||
touch -t "#$((seconds++))" $FILE || FAIL $FILE touch error
|
||||
if [[ $FILE/... -nt $TWD/reference ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
elif [[ ! $FILE -nt $TWD/reference ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
fi
|
||||
touch -t $STAMP $FILE
|
||||
if [[ $(date -m -f $FORMAT $FILE) != "$STAMP" ]]
|
||||
then FAIL $FILE modfiy time does not match $STAMP
|
||||
fi
|
||||
}
|
||||
|
||||
function UPDATE
|
||||
{
|
||||
DATA $*
|
||||
print "$NEW" 1<> $FILE || FAIL $FILE write error
|
||||
if [[ $(<$FILE) != "$NEW" ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
fi
|
||||
}
|
||||
|
||||
function WRITE
|
||||
{
|
||||
DATA $*
|
||||
print "$NEW" > $FILE || FAIL $FILE write error
|
||||
if [[ $(<$FILE) != "$NEW" ]]
|
||||
then FAIL $FILE unchanged by $0
|
||||
elif [[ -f $FILE/... && $(<$FILE/...) != "$OLD" ]]
|
||||
then FAIL $FILE/... changed by $0
|
||||
fi
|
||||
}
|
||||
|
||||
function RUN
|
||||
{
|
||||
[[ $1 == 3d ]] || return
|
||||
DATA
|
||||
WRITE w666
|
||||
WRITE w600
|
||||
TOUCH t777
|
||||
MODE m444
|
||||
WRITE dir/w666
|
||||
WRITE dir/w600
|
||||
TOUCH dir/t777
|
||||
MODE dir/m444
|
||||
UPDATE u644
|
||||
UPDATE u640
|
||||
APPEND a644
|
||||
APPEND a640
|
||||
UPDATE dir/u644
|
||||
UPDATE dir/u640
|
||||
APPEND dir/a644
|
||||
APPEND dir/a640
|
||||
VIRTUAL
|
||||
REMOVE r644
|
||||
WRITE r644
|
||||
REMOVE r644
|
||||
}
|
||||
|
||||
#
|
||||
# finally the tests
|
||||
#
|
||||
|
||||
TEST 01 PWD==top top exists &&
|
||||
{
|
||||
VPATH top bottom
|
||||
MKDIR top
|
||||
CD top
|
||||
RUN 3d
|
||||
}
|
||||
|
||||
TEST 02 PWD!=top top exists &&
|
||||
{
|
||||
VPATH top bottom
|
||||
MKDIR top
|
||||
MKDIR junk
|
||||
CD junk
|
||||
PREFIX ../top
|
||||
RUN 3d
|
||||
}
|
||||
|
||||
TEST 03 PWD==top top virtual &&
|
||||
{
|
||||
VIRTUAL top
|
||||
VPATH top bottom
|
||||
CD top
|
||||
RUN 3d
|
||||
}
|
||||
|
||||
TEST 04 PWD!=top top virtual &&
|
||||
{
|
||||
VIRTUAL top
|
||||
VPATH top bottom
|
||||
MKDIR junk
|
||||
CD junk
|
||||
PREFIX ../top
|
||||
RUN 3d
|
||||
}
|
||||
|
||||
TEST 05 top symlink &&
|
||||
{
|
||||
if LN -s text link
|
||||
then [[ -L link ]] || FAIL lstat does stat
|
||||
fi
|
||||
}
|
||||
|
||||
TEST 06 symlink spaghetti &&
|
||||
{
|
||||
MKDIR usr/bin sbin
|
||||
echo : > sbin/cmd && chmod +x sbin/cmd
|
||||
LN -s usr/bin bin
|
||||
LN -s ../../sbin/cmd usr/bin/cmd
|
||||
CD bin
|
||||
PATH=:$PATH cmd
|
||||
}
|
||||
|
||||
TEST 07 PWD==top top exists, bot virtual &&
|
||||
{
|
||||
VPATH top bot
|
||||
MKDIR top
|
||||
CD top
|
||||
echo foo > foo && echo bar > bar
|
||||
CP foo ...
|
||||
MV bar ...
|
||||
CP foo ...
|
||||
[[ -d ... ]] && FAIL ... is a directory && return
|
||||
[[ $(cat foo 2>/dev/null) != foo ]] && FAIL top garbled -- $(cat foo 2>&1)
|
||||
}
|
|
@ -1,110 +0,0 @@
|
|||
if CC.HOSTTYPE == "no_build"
|
||||
/*
|
||||
* 3d fs library
|
||||
*
|
||||
* NOTE: ld -r does not work with $(CC.DLL) so lib3d.o is not possible
|
||||
* (unless we compile it in one file -- no thanks)
|
||||
* so a static link needs -u _exit -l3d other-libs
|
||||
*/
|
||||
|
||||
:PACKAGE: ast:nolibrary
|
||||
|
||||
LICENSE = since=1989,author=gsf+dgk+ekrell
|
||||
|
||||
ID = 3d
|
||||
VERSION = 4.0
|
||||
CATALOG = 3d
|
||||
|
||||
CCFLAGS = -O $(CC.DLL) /* NOTE: gcc $(CC.OPTIMIZE) fails here! */
|
||||
IFFEREFS = -last
|
||||
TMP = 3.$(tmp)
|
||||
|
||||
DEBUG == 1
|
||||
DEBUG_TABLE == 0
|
||||
FS == 1
|
||||
IDNAME == "$(ID)"
|
||||
PATHCHECK == "$(ID)"
|
||||
MIX ==
|
||||
VCS == 1
|
||||
|
||||
if LITE
|
||||
DEBUG = 0
|
||||
DEBUG_TABLE = 0
|
||||
FS = 0
|
||||
VCS = 0
|
||||
end
|
||||
|
||||
$(ID)$(VARIANTID) $(VERSION) id=$(ID) :LIBRARY: README RELEASE PROMO.mm \
|
||||
3d.h lib_3d.h dir_3d.h \
|
||||
init.c \
|
||||
bio.c copy.c error.c execv.c fs.c lib.c map.c \
|
||||
pathcanon.c pathnext.c pathreal.c peek.c \
|
||||
ast.c cs.c license.c \
|
||||
vcs_3d.h vcs.c \
|
||||
access3d.c brk3d.c chdir3d.c chmod3d.c chown3d.c close3d.c \
|
||||
creat3d.c dir3d.c dup23d.c dup3d.c execve3d.c exit3d.c \
|
||||
fchdir3d.c fchmod3d.c fchown3d.c fcntl3d.c fork3d.c fpathconf3d.c \
|
||||
fstat3d.c fstatfs3d.c fstatvfs3d.c fsync3d.c \
|
||||
ftruncate3d.c getdents3d.c kill3d.c link3d.c lseek3d.c \
|
||||
lstat3d.c mkdir3d.c mknod3d.c mount3d.c open3d.c pathconf3d.c \
|
||||
pipe3d.c read3d.c readlink3d.c rename3d.c rmdir3d.c sbrk3d.c \
|
||||
stat3d.c statfs3d.c statvfs3d.c symlink3d.c syscall3d.c \
|
||||
sysent3d.c truncate3d.c unlink3d.c utime3d.c utimes3d.c utimets3d.c \
|
||||
vfork3d.c write3d.c \
|
||||
acl3d.c facl3d.c \
|
||||
dll3d.c \
|
||||
utimensat3d.c \
|
||||
-ldl
|
||||
|
||||
if ! VARIANTID
|
||||
|
||||
3d :: 3d.sh
|
||||
|
||||
opaque :: opaque.sh
|
||||
|
||||
vex :: vex.sh
|
||||
|
||||
$(FUNDIR) :INSTALLDIR: mode=+x _2d
|
||||
|
||||
end
|
||||
|
||||
:VARIANT:
|
||||
|
||||
/*
|
||||
* -l<library> :lib: <subdir> ...
|
||||
*
|
||||
* snarf src from <library> and its <subdir>s
|
||||
*/
|
||||
|
||||
NAME3D = lib_3d.h std_3d.h vcs_3d.h
|
||||
|
||||
":lib:" : .MAKE .OPERATOR
|
||||
local L
|
||||
L := $(<:/-l//)
|
||||
eval
|
||||
_BLD_$(L) == 1
|
||||
end
|
||||
:: $(L)_3d.h
|
||||
NAME3D += $(L)_3d.h
|
||||
L := ../../$(VARIANTID:?../)lib/lib$(L)
|
||||
.SOURCE.c : $(L:X=. $(>))
|
||||
.SOURCE.features/% : $(L)
|
||||
|
||||
-last :lib: comp dir hash misc path port string tm
|
||||
|
||||
-lcs :lib:
|
||||
|
||||
-ldll :lib:
|
||||
|
||||
terminal FEATURE/eaccess FEATURE/hack
|
||||
|
||||
3d :TEST: 3d.tst
|
||||
$(BINDIR)/3d $(SHELL) $(REGRESS) $(REGRESSFLAGS) $(*)
|
||||
|
||||
:: sys.tab
|
||||
|
||||
else
|
||||
|
||||
:NOTHING:
|
||||
|
||||
end
|
1326
src/cmd/3d/Mamfile
1326
src/cmd/3d/Mamfile
File diff suppressed because it is too large
Load diff
|
@ -1,106 +0,0 @@
|
|||
.H 1 3d
|
||||
.B 3d
|
||||
is the historical name for
|
||||
.IB n DFS ,
|
||||
the multiple dimension file system.
|
||||
It is implemented as a shared library that is preloaded
|
||||
before any other shared library using the recently documented
|
||||
.RI ( ahem )
|
||||
.B LD_PRELOAD
|
||||
or
|
||||
.B _RLD_LIST
|
||||
feature of the runtime linker.
|
||||
.B 3d
|
||||
intercepts pathname system calls (and other calls if tracing is
|
||||
turned on) and provides a logical namespace on top of the underlying
|
||||
physical file system.
|
||||
The shared library implementation currently works
|
||||
only on
|
||||
.IR bsd.i386 ,
|
||||
.IR linux.i386 ,
|
||||
.IR osf.alpha ,
|
||||
.IR sun4 ,
|
||||
.IR sol.* ,
|
||||
and
|
||||
.IR sgi.* .
|
||||
.P
|
||||
.B 3d
|
||||
works in conjunction with
|
||||
.B ksh88
|
||||
or
|
||||
.BR ksh93 .
|
||||
The
|
||||
.B 3d
|
||||
command with no arguments enters a
|
||||
.B 3d
|
||||
shell.
|
||||
The
|
||||
.B vpath
|
||||
builtin controls the logical
|
||||
filesystem view:
|
||||
.EX
|
||||
vpath dir_1 dir_2
|
||||
.EE
|
||||
mounts the directory hierarchy
|
||||
.I dir_1
|
||||
on top of
|
||||
.IR dir_2 .
|
||||
Files under
|
||||
.I dir_1
|
||||
overlay files under
|
||||
.IR dir_2 .
|
||||
Files under
|
||||
.I dir_2
|
||||
are readonly;
|
||||
any files under
|
||||
.I dir_2
|
||||
that are modified are first copied to the
|
||||
corresponding place in
|
||||
.IR dir_1 .
|
||||
.I vpaths
|
||||
may be chained:
|
||||
.EX
|
||||
vpath dir_2 dir_3
|
||||
.EE
|
||||
.I vpaths
|
||||
are per-process; every process may have a different view.
|
||||
.I vpaths
|
||||
are a handy way to separate source and generated files.
|
||||
Typical
|
||||
.B advsoft
|
||||
users set up
|
||||
.B 3d
|
||||
at login or
|
||||
.B xterm
|
||||
time:
|
||||
.EX
|
||||
export HOSTTYPE=$(package)
|
||||
vpath $HOME/arch/$HOSTTYPE $HOME
|
||||
.EE
|
||||
with source files in
|
||||
.LR $HOME/src/(cmd|lib)/* .
|
||||
.B nmake
|
||||
is run in
|
||||
.L $HOME/arch/$HOSTTYPE/src/(cmd|lib)/*
|
||||
and generated files (objects and executables) are dropped in the top hierarchy.
|
||||
.P
|
||||
.B 2d
|
||||
can prefix any command to disable
|
||||
.B 3d
|
||||
for that command:
|
||||
.EX
|
||||
2d ls *.c
|
||||
.EE
|
||||
.P
|
||||
.B 3d
|
||||
also provides tracing, monitoring and call intercept services.
|
||||
.B vpm
|
||||
uses monitoring to graph the process and io hierarchy.
|
||||
The
|
||||
.I cs
|
||||
name server uses pathname call intercepts to translate network
|
||||
pathnames.
|
||||
Try this for any host:
|
||||
.EX
|
||||
cat /dev/tcp/hostname/inet.daytime
|
||||
.EE
|
|
@ -1,25 +0,0 @@
|
|||
vpath - /#option/debug=level
|
||||
|
||||
set debug trace level
|
||||
|
||||
vpath - /#option/trace[=pid]
|
||||
|
||||
turn on truss style tracing with option pid prefix
|
||||
|
||||
vpath /dev/tcp/share/cat/#/home/gsf/tmp/call.out \
|
||||
/#fs/proc/global/monitor/call=fork,exec,exit
|
||||
|
||||
monitor fork,exec,exit by sending messages to the cat server
|
||||
|
||||
vpath /tmp/io.out \
|
||||
/#fs/io/global/monitor/call=open,close,write
|
||||
|
||||
monitor open,close,write by appending messages /tmp/io.out
|
||||
|
||||
vpath /home/gsf/tmp/rpl.out /#fs/rpl/monitor
|
||||
|
||||
create a per-tree monitor to rpl.out
|
||||
|
||||
vpath . /#rpl /tmp /#rpl
|
||||
|
||||
all calls on files in . and /tmp trees monitored to rpl.out
|
|
@ -1,152 +0,0 @@
|
|||
12-06-25 change strcpy() within buffer to strcopy()
|
||||
12-06-22 sys.tab,utimensat3d.c: add utimensat()
|
||||
12-05-25 sys.tab: handle missing getdents64 on linux+gcc-4.4
|
||||
12-05-25 syscall3d.c: tweak _exit() logic (really?) to dumped core on recent solaris
|
||||
11-12-01 fix fcntl 3rd arg int vs void*
|
||||
10-06-01 sync with ast api 20100601
|
||||
10-04-10 mkdir3d.c: fix mkdir() intermediate dir logic
|
||||
10-01-19 3d.h: increase some path buffer sizes -- these need to be dynamic!
|
||||
09-05-15 dll_3d.h: handle dllopen => dlopen
|
||||
08-12-04 fs.c: change open(/dev/fd/NN,...) try open(2) first, then dup(2)
|
||||
08-06-20 ast_3d.h,ast.c: add libast/misc/setenviron.c
|
||||
07-03-26 Makefile: drop -L* from IFFEREFS -- handled by .IFFE.REF.
|
||||
07-03-21 lib_3d.h,error.c: handle error_info => *_error_data_
|
||||
06-12-04 3d.h: strmode() bsd conflict tweak
|
||||
06-11-23 finally get linux to pass regression tests
|
||||
06-11-21 fchdir3d: let chdir do the work if fd matches cached path
|
||||
06-09-28 3d.sh: used getconf LIBPATH|LIBPREFIX|LIBSUFFIX -- how novel
|
||||
06-09-26 3d.h,dir3d.c,dll3d.c: fix strtou*l*l maps for __int64 vs. long long
|
||||
06-09-18 strmatch.c,touch.c: add private obsolete api copies
|
||||
06-08-27 mkdir3d.c: foloow mkdir -p mode rules for missing intermediates
|
||||
05-02-01 3d.sh: IFS may be unset and { ash bsh } don't on startup -- wow
|
||||
05-01-01 sys.tab,utimets3d.c: add utimets() intercept
|
||||
04-12-15 pathreal.c: "..." should fail if no lower view -- doh
|
||||
04-10-01 features/syslib: _exit test now uses SIGKILL (openbsd abort() hangs)
|
||||
04-07-26 3d.sh: update runtime docs
|
||||
3d.1: drop in deference to the 3d.sh runtime docs
|
||||
04-07-20 3d.h: undef _BLD_DEBUG to avoid raw libast symbols
|
||||
04-07-19 fs.c,lib.c,open3d.c,vcs_3d.h: { O_RDONLY O_WRONLY O_RDWR } are values
|
||||
04-07-19 dir3d.c: rewinddir643d() must call seekdir643d() (not seekdir64())
|
||||
04-07-01 3d.tst: TMP => TWD to match regress(1)
|
||||
04-06-16 3d.tst: coordinate $TMP with regress(1)
|
||||
04-06-14 lib.c: fix fs3d() 2d return value
|
||||
04-06-11 3d.tst: fix test and error counts
|
||||
04-05-04 open3d.c: create missing lower level dirs for O_CREAT ... file paths
|
||||
03-08-15 mount3d.c: change 3d intercept test to handle NiL || ""
|
||||
03-06-11 ast.c: add _map_malloc checks for _ast_malloc => malloc
|
||||
03-06-05 pathreal.c: fix ancient multiple relative|.. symlink bug
|
||||
03-06-04 3d.sh: change `shift $OPTIND-1' to `set x "@"; shift $OPTIND'
|
||||
03-03-28 dir3d.c,rmdir3d.c,syscall3d.c: add D_FILENO and D_TYPE ifdefs
|
||||
03-03-25 dup3d.c: fix bug that cleared Dir_t pointer just after allocation
|
||||
03-03-07 ftruncate3d.c,lseek3d.c,truncate3d.c: check _typ_off64_t
|
||||
02-10-18 features/syscall.sh: handle pseudo files in cc -E line syncs
|
||||
02-07-17 syscall3d.c: clean up user level intercept code
|
||||
02-06-25 open3d.c: fix bug that created 0 mode file with only O_RDWR
|
||||
02-06-14 ast_3d.h,cs.c: move fmttime() macro override to cs.c
|
||||
02-06-06 dir3d.c: fix rewinddir() bug that did not decrement intercepted count
|
||||
02-04-01 Makefile,cs.c,cs_3d.h,ast_3d.h: _WIN32 tweaks
|
||||
01-11-26 pathreal.c: empty path is an error
|
||||
01-11-16 ftruncate3d.c,truncate3d.c: use lseek3d indirection via sysfunc()
|
||||
01-10-31 fchdir3d: add along with state.file[].dir to cache open dir paths
|
||||
dir3d.c: add recursive call intercepts
|
||||
error.c: add recursive call intercepts
|
||||
pathreal.c: add buffer size check
|
||||
features/syscall.sh: add bsd syscall __RENAME() checks
|
||||
syscall3d.c: check _lib_syscall before using it!
|
||||
01-10-30 features/syscall.sh,syscall3d.c: handle -ldl calls back into 3d
|
||||
01-09-20 3d.sh: drop extra } in USAGE that emitted -} for --?
|
||||
01-07-17 Makefile: don't link 3d dll against ast dll
|
||||
01-02-19 close3d: dup reserved fd's higher
|
||||
01-02-14 add :VARIANT: to build dll's for CC.DLL.VARIANTS
|
||||
01-01-01 dir_3d.h: real readdir must be struct dirent, not dirent64
|
||||
00-12-14 3d.sh: fix -c
|
||||
00-10-31 ast.c add pathtemp.c
|
||||
00-10-19 init.c: initialize _3d_2d
|
||||
00-07-17 fix fchown to call MSG_fchown (not MSG_fchown); fixes vim dump!
|
||||
00-02-14 3d command long options (finally)
|
||||
99-01-01 --- release 4.0 ---
|
||||
99-04-01 dll: sfsprintf => _3d_sfsprintf
|
||||
check for __*_nc (osf.alpha)
|
||||
99-02-14 pathreal: copy to state.path.name if not already there
|
||||
rewinddir3d: just call seekdir(p,0); fixes `top' core dump
|
||||
99-01-11 lseek3d,syscall3d: add sysfunc() for off_t!=long
|
||||
99-01-01 --- release 3.0 ---
|
||||
98-02-14 3d.sh: fix _RLD32_LIST => _RLDN32_LIST typo
|
||||
pathreal: fix (P_LSTAT|P_READLINK) under pwd bug that did phys on .
|
||||
features/syscall.sh: tighten up version __call header grep
|
||||
unlink: trap remove() too
|
||||
features/syscall.sh: favor strong (_ prefix) name for some arch's
|
||||
98-02-06 syscall3d: handle longjmp with cp->active
|
||||
98-01-23 features/syscall.sh: check for _xstat vs __xstat
|
||||
98-01-01 add readdir64 rewinddir64 seekdir64 telldir64
|
||||
97-10-11 fix lefty's virtual dir touch bug -- recursive doubling on stbuf
|
||||
97-07-17 CS_INTERFACE=2
|
||||
97-04-01 features/syscall.sh: fix __exit() test for new sgi
|
||||
96-12-25 handle stat64() implementations on top of _xstat()
|
||||
3d.tst must be run under 3d!
|
||||
_SCO_STAT_VER tweaks
|
||||
sgi _RLD_NEXT_PATHNAME fix for -32 -n32 -64 differentiation
|
||||
_*xstat() hacks around proto in *stat3d.c
|
||||
add constant casts for long shift counts
|
||||
fix pathnext() to report version instance level in state.path.level
|
||||
96-11-28 fix rename() to do physical stat on subject path!
|
||||
96-02-29 handle syscall loops caused by botched libs like solaris libsocket.so
|
||||
generalize name service interface to handle ifs+vcs
|
||||
catch acl,facl even if not on local sys
|
||||
fix features/syscall.sh bug that set $stdc incorrectly
|
||||
use alloca() in execve() if possible
|
||||
add 3d.tst and test makefile action
|
||||
fix a few important virtual dir / create / append bugs
|
||||
fix null dereference in open3d() for state.in_2d
|
||||
96-02-14 add NFS acl,facl
|
||||
96-02-08 fix 2d bug in link,rename,symlink that generated empty arg 1
|
||||
96-01-30 fix features/syscall.sh for compilers that ignore prototypes
|
||||
96-01-22 P_TOP only takes effect for files in virtual dir!
|
||||
95-11-24 optimize exec $shell to eval in 3d.sh
|
||||
95-11-11 don't fs3d_copy opaqued files
|
||||
95-10-11 fs3d_mkdir virtual dir fix
|
||||
fix 2d virtual dir test in pathreal()
|
||||
solaris _rename() != weak rename()
|
||||
solaris exit() doesn't call _exit()
|
||||
all static data in state
|
||||
test state.in_2d in link3d()
|
||||
fix opaque.sh that was broken sometime after 91
|
||||
linux LD_BIND_NOW not needed with ld.so-1.7.9
|
||||
95-07-17 handle irix-5.3 struct stat64 and off64_t
|
||||
dlsym(__exit) before dlsym(_exit)
|
||||
95-05-09 fix pathcanon() bug that incremented state.path.level too far on ...
|
||||
percolate inode metadata changes to the top level too (no more EROFS)
|
||||
add P_TOP to truncate() too!
|
||||
feature/syscall.sh does not generate #include, up to *3d.c
|
||||
spawnveg.c must come after spawnve.c in ast.c
|
||||
cspoll.c must come after cs*.c in cs.c
|
||||
fix 3d to work like $SHELL if no shared 3d lib found
|
||||
fix chdir .. symlink bug that set state.pwd to physical path
|
||||
add %n.n.nd to bvprintf
|
||||
ignore a few more non-initialization setcwd() errors
|
||||
95-01-19 fix undefined var ref for _VER_ hack calls in features/syscall.sh
|
||||
95-01-11 access W_OK succeeds if on lower view
|
||||
94-12-01 add /#fs/NAME/load to load shared lib fs
|
||||
add user system call trap() stack
|
||||
VPATH=*::* or VPATH=*:-:* to separate disjoint views
|
||||
change trap() to intercept()
|
||||
94-07-17 add /#fs/safe
|
||||
94-06-01 fix symlink() and link() bug that didn't instantiate virtual dir
|
||||
fix [f]statvfs() infinite loop for att hybrids
|
||||
94-05-11 merge with the real vcs
|
||||
add char*_3d_2d: if _3d_2d!=0&&getenv(_3d_2d)==0 then 2d
|
||||
trailing slash in pathreal() interpreted as slash dot (off/w test=010)
|
||||
93-05-28 add /#option/limit=n to limit view depth
|
||||
93-04-01 --- release 2.0 ---
|
||||
93-03-11 change /dev/3d/* to /#*
|
||||
remove anno and rpl specific hooks
|
||||
add name,monitor,active fs mounts
|
||||
92-04-01 --- release 1.1 ---
|
||||
92-02-11 change retained mounts to /dev/3d/dev
|
||||
92-01-11 add $SHELL and /bin/sh exec() checks to force 3d sh
|
||||
fix checklink() to concatenate relative links with original prefix
|
||||
91-11-11 --- release 1.0 ---
|
||||
add feature/syscall.sh to handle att s5r4, hp snake, sun 4.1
|
||||
change umask() 3d state toggle to mount(-,/dev/3d/option/{2d,3d})
|
||||
fix creat() virtual dir bug for umteenth time
|
||||
link() and rename() now migrate to top instead of EROFS
|
|
@ -1,40 +0,0 @@
|
|||
#
|
||||
# 2d [ - | + ] | [ cmd ... ]
|
||||
#
|
||||
# @(#)2d (AT&T Bell Laboratories) 06/22/93
|
||||
#
|
||||
# 2d start 2d shell
|
||||
# 2d - disable 2d [ enable 3d ]
|
||||
# 2d + enable 2d [ disable 3d ]
|
||||
# 2d cmd run cmd in 2d
|
||||
#
|
||||
|
||||
function _2d
|
||||
{
|
||||
option=$(vpath /#option/3d 2>/dev/null)
|
||||
case $option in
|
||||
?*) trap "set +o noglob; vpath \$option; export LD_PRELOAD='$LD_PRELOAD' _RLD_LIST='$_RLD_LIST' _RLDN32_LIST='$_RLDN32_LIST'" 0 INT QUIT
|
||||
vpath - /#option/2d
|
||||
;;
|
||||
esac
|
||||
set +o noglob
|
||||
if test -d .
|
||||
then case $1 in
|
||||
-|+) case $1 in
|
||||
+) option="- /#option/2d" ;;
|
||||
-) option="- /#option/3d" ;;
|
||||
esac
|
||||
return
|
||||
;;
|
||||
esac
|
||||
# this is close: ^A can't appear in $@
|
||||
typeset IFS=''
|
||||
unset __ LD_PRELOAD _RLD_LIST
|
||||
case $1 in
|
||||
[-+]*) $SHELL $@ ;;
|
||||
*) ${@-$SHELL} ;;
|
||||
esac
|
||||
else print -u2 . not found
|
||||
return 1
|
||||
fi
|
||||
}
|
|
@ -1,104 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
access3d(const char* path, int mode)
|
||||
{
|
||||
register char* sp;
|
||||
mode_t test;
|
||||
struct stat st;
|
||||
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_stat, 0, path, &st))
|
||||
{
|
||||
if (state.ret) return(-1);
|
||||
sp = 0;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, &st)))
|
||||
return(-1);
|
||||
|
||||
/*
|
||||
* handle some frequent cases separately
|
||||
*/
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case F_OK:
|
||||
return(0);
|
||||
case R_OK:
|
||||
if ((st.st_mode&(S_IRUSR|S_IRGRP|S_IROTH)) == (S_IRUSR|S_IRGRP|S_IROTH))
|
||||
return(0);
|
||||
break;
|
||||
case W_OK:
|
||||
if (state.path.level && (st.st_mode&(S_IWUSR|S_IWGRP|S_IWOTH)) && !ACCESS(sp, R_OK))
|
||||
return(0);
|
||||
break;
|
||||
case X_OK:
|
||||
if ((st.st_mode&(S_IXUSR|S_IXGRP|S_IXOTH)) == (S_IXUSR|S_IXGRP|S_IXOTH))
|
||||
return(0);
|
||||
break;
|
||||
}
|
||||
#if FS
|
||||
if (sp)
|
||||
#endif
|
||||
return(ACCESS(sp, mode));
|
||||
#if FS
|
||||
|
||||
/*
|
||||
* simulate access()
|
||||
*/
|
||||
|
||||
if (mode & (R_OK|W_OK|X_OK))
|
||||
{
|
||||
test = 0;
|
||||
if (st.st_uid == state.uid)
|
||||
{
|
||||
if (mode & R_OK) test |= S_IRUSR;
|
||||
if (mode & W_OK) test |= S_IWUSR;
|
||||
if (mode & X_OK) test |= S_IXUSR;
|
||||
}
|
||||
else if (st.st_gid == state.gid)
|
||||
{
|
||||
if (mode & R_OK) test |= S_IRGRP;
|
||||
if (mode & W_OK) test |= S_IWGRP;
|
||||
if (mode & X_OK) test |= S_IXGRP;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mode & R_OK) test |= S_IROTH;
|
||||
if (mode & W_OK) test |= S_IWOTH;
|
||||
if (mode & X_OK) test |= S_IXOTH;
|
||||
}
|
||||
if ((st.st_mode & test) != test)
|
||||
{
|
||||
errno = EACCES;
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
#endif
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if !defined(ACL3D) || !defined(SETACL)
|
||||
|
||||
#define aclent_t char
|
||||
#define SETACL 1
|
||||
|
||||
#endif
|
||||
|
||||
#define MSG_acl MSG_INIT(MSG_control, 051121, MSG_VAR_FILE)
|
||||
|
||||
int
|
||||
acl3d(const char* path, int cmd, int cnt, aclent_t* buf)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_acl, 0, path, cmd, cnt, buf))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, cmd == SETACL ? (state.safe ? (P_SAFE|P_TOP) : P_TOP) : 0, NiL)))
|
||||
return -1;
|
||||
r = ACL(sp, cmd, cnt, buf);
|
||||
#if FS
|
||||
if (r >= 0)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_acl, 0, state.path.name, cmd, cnt, buf);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_acl))
|
||||
fscall(mp, MSG_acl, 0, state.path.name, cmd, cnt, buf);
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
121
src/cmd/3d/ast.c
121
src/cmd/3d/ast.c
|
@ -1,121 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#define NoN(x)
|
||||
|
||||
#include "3d.h"
|
||||
#include "ast.h"
|
||||
|
||||
static char conf[] = "";
|
||||
|
||||
#define astconf(a,b,c) conf
|
||||
#define ctermid ___ctermid
|
||||
|
||||
#include "state.c"
|
||||
|
||||
#include "astintercept.c"
|
||||
#include "getenv.c"
|
||||
#include "setenviron.c"
|
||||
#include "getcwd.c"
|
||||
#include "getwd.c"
|
||||
#include "hashalloc.c"
|
||||
#include "hashfree.c"
|
||||
#include "hashlook.c"
|
||||
#include "hashscan.c"
|
||||
#include "hashsize.c"
|
||||
#include "hashwalk.c"
|
||||
#include "memset.c"
|
||||
|
||||
#if DEBUG
|
||||
#include "fmterror.c"
|
||||
#endif
|
||||
|
||||
#if FS
|
||||
#include "tvgettime.c"
|
||||
#include "eaccess.c"
|
||||
#include "pathcat.c"
|
||||
#include "pathtemp.c"
|
||||
#include "pathtmp.c"
|
||||
|
||||
char*
|
||||
pathbin(void)
|
||||
{
|
||||
char* p;
|
||||
|
||||
if (!(p = state.envpath) && !(p = getenv("PATH")))
|
||||
p = ":/bin:/usr/bin:/usr/ucb";
|
||||
return(p);
|
||||
}
|
||||
|
||||
#include "tokscan.c"
|
||||
#include "touch.c"
|
||||
|
||||
#endif
|
||||
|
||||
#include "strmatch.c"
|
||||
#include "sigcrit.c"
|
||||
#include "waitpid.c"
|
||||
|
||||
#undef _real_vfork
|
||||
|
||||
#define close CLOSE
|
||||
#define fcntl FCNTL
|
||||
#define read READ
|
||||
#define write WRITE
|
||||
|
||||
#include "pathshell.c"
|
||||
|
||||
/*
|
||||
* 3d doesn't handle spawnve() yet
|
||||
* we need spawnveg3d()
|
||||
*/
|
||||
|
||||
#if _lib_fork || _lib_vfork
|
||||
#undef _lib_spawnve
|
||||
#endif
|
||||
|
||||
#include "spawnveg.c" /* follows spawnve.c because of #undef's */
|
||||
|
||||
#include "gross.c"
|
||||
|
||||
#if _map_malloc
|
||||
|
||||
#undef calloc
|
||||
#undef free
|
||||
#undef malloc
|
||||
#undef realloc
|
||||
#undef strdup
|
||||
|
||||
extern void* calloc(size_t, size_t);
|
||||
extern void free(void*);
|
||||
extern void* malloc(size_t);
|
||||
extern void* realloc(void*, size_t);
|
||||
extern char* strdup(const char*);
|
||||
|
||||
extern void* _ast_calloc(size_t n, size_t m) { return calloc(n, m); }
|
||||
extern void _ast_free(void* p) { free(p); }
|
||||
extern void* _ast_malloc(size_t n) { return malloc(n); }
|
||||
extern void* _ast_realloc(void* p, size_t n) { return realloc(p, n); }
|
||||
extern char* _ast_strdup(const char* s) { return strdup(s); }
|
||||
|
||||
#endif
|
|
@ -1,61 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* libast 3d symbol mappings to minimize pollution
|
||||
*/
|
||||
|
||||
#ifndef _NAME3D_AST_H
|
||||
#define _NAME3D_AST_H
|
||||
|
||||
#define _ast_state _3d_ast_state
|
||||
#define _ast_getenv _3d_ast_getenv
|
||||
#define _ast_info _3d_ast_info
|
||||
#define _ast_setenviron _3d_ast_setenviron
|
||||
#define _hash_info_ _3d_hash_info
|
||||
#define astintercept _3d_astintercept
|
||||
#define fmterror _3d_fmterror
|
||||
#define fmttime _3d_fmttime
|
||||
#define hashalloc _3d_hashalloc
|
||||
#define hashdone _3d_hashdone
|
||||
#define hashfree _3d_hashfree
|
||||
#define hashlook _3d_hashlook
|
||||
#define hashnext _3d_hashnext
|
||||
#define hashscan _3d_hashscan
|
||||
#define hashsize _3d_hashsize
|
||||
#define hashwalk _3d_hashwalk
|
||||
#define pathbin _3d_pathbin
|
||||
#define pathcheck _3d_pathcheck
|
||||
#define pathshell _3d_pathshell
|
||||
#define pathtemp _3d_pathtemp
|
||||
#define strmatch _3d_strmatch
|
||||
#define strsubmatch _3d_strsubmatch
|
||||
#define tokscan _3d_tokscan
|
||||
#define touch _3d_touch
|
||||
|
||||
#include <ast_lib.h>
|
||||
|
||||
#undef _lib_fmterror
|
||||
|
||||
extern char* _3d_ast_getenv(const char*);
|
||||
|
||||
#endif
|
391
src/cmd/3d/bio.c
391
src/cmd/3d/bio.c
|
@ -1,391 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d buffer io
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
/*
|
||||
* stripped down printf -- only { %c %[l[l]][dopux] %s }
|
||||
*/
|
||||
|
||||
ssize_t
|
||||
bvprintf(char** buf, char* end, register const char* format, va_list ap)
|
||||
{
|
||||
register int c;
|
||||
register char* p;
|
||||
register char* e;
|
||||
int w;
|
||||
int l;
|
||||
int f;
|
||||
int g;
|
||||
int r;
|
||||
long n;
|
||||
unsigned long u;
|
||||
ssize_t z;
|
||||
#if _typ_int64_t
|
||||
int64_t q;
|
||||
uint64_t v;
|
||||
#endif
|
||||
char* s;
|
||||
char* b;
|
||||
char* x;
|
||||
char num[32];
|
||||
|
||||
static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ@_";
|
||||
|
||||
if (buf)
|
||||
{
|
||||
p = *buf;
|
||||
e = end;
|
||||
}
|
||||
else e = (p = end) + SHRT_MAX;
|
||||
for (;;)
|
||||
{
|
||||
switch (c = *format++)
|
||||
{
|
||||
case 0:
|
||||
goto done;
|
||||
case '%':
|
||||
if (*format == '-')
|
||||
{
|
||||
format++;
|
||||
l = 1;
|
||||
}
|
||||
else l = 0;
|
||||
if (*format == '0')
|
||||
{
|
||||
format++;
|
||||
f = l ? ' ' : '0';
|
||||
}
|
||||
else f = ' ';
|
||||
if ((c = *format) == '*')
|
||||
{
|
||||
format++;
|
||||
w = va_arg(ap, int);
|
||||
}
|
||||
else
|
||||
{
|
||||
w = 0;
|
||||
while (c >= '0' && c <= '9')
|
||||
{
|
||||
w = w * 10 + c - '0';
|
||||
c = *++format;
|
||||
}
|
||||
}
|
||||
r = 0;
|
||||
if (c == '.')
|
||||
{
|
||||
if ((c = *++format) == '*')
|
||||
{
|
||||
format++;
|
||||
va_arg(ap, int);
|
||||
}
|
||||
else while (c >= '0' && c <= '9') c = *++format;
|
||||
if (c == '.')
|
||||
{
|
||||
if ((c = *++format) == '*')
|
||||
{
|
||||
format++;
|
||||
r = va_arg(ap, int);
|
||||
}
|
||||
else while (c >= '0' && c <= '9')
|
||||
{
|
||||
r = r * 10 + c - '0';
|
||||
c = *++format;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((c = *format++) != 'l')
|
||||
n = 0;
|
||||
else if ((c = *format++) != 'l')
|
||||
n = 1;
|
||||
else
|
||||
{
|
||||
n = 2;
|
||||
c = *format++;
|
||||
}
|
||||
g = 0;
|
||||
b = num;
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 'c':
|
||||
*b++ = va_arg(ap, int);
|
||||
break;
|
||||
case 'd':
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
n = va_arg(ap, int);
|
||||
break;
|
||||
default:
|
||||
#if _typ_int64_t
|
||||
q = va_arg(ap, int64_t);
|
||||
if (q < 0)
|
||||
{
|
||||
g = '-';
|
||||
q = -q;
|
||||
}
|
||||
v = q;
|
||||
goto dec_8;
|
||||
case 1:
|
||||
#endif
|
||||
n = va_arg(ap, long);
|
||||
break;
|
||||
}
|
||||
if (n < 0)
|
||||
{
|
||||
g = '-';
|
||||
n = -n;
|
||||
}
|
||||
u = n;
|
||||
goto dec;
|
||||
case 'o':
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
u = va_arg(ap, unsigned int);
|
||||
break;
|
||||
default:
|
||||
#if _typ_int64_t
|
||||
v = va_arg(ap, uint64_t);
|
||||
goto oct_8;
|
||||
case 1:
|
||||
#endif
|
||||
u = va_arg(ap, unsigned long);
|
||||
break;
|
||||
}
|
||||
do *b++ = (u & 07) + '0'; while (u >>= 3);
|
||||
break;
|
||||
case 's':
|
||||
s = va_arg(ap, char*);
|
||||
if (!s) s = "(null)";
|
||||
if (w)
|
||||
{
|
||||
n = w - strlen(s);
|
||||
if (l)
|
||||
{
|
||||
while (w-- > 0)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
if (!(*p = *s++)) break;
|
||||
p++;
|
||||
}
|
||||
while (n-- > 0)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = f;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
while (n-- > 0)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = f;
|
||||
}
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
if (!(*p = *s++)) break;
|
||||
p++;
|
||||
}
|
||||
continue;
|
||||
case 'u':
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
u = va_arg(ap, unsigned int);
|
||||
break;
|
||||
default:
|
||||
#if _typ_int64_t
|
||||
v = va_arg(ap, uint64_t);
|
||||
goto dec_8;
|
||||
case 1:
|
||||
#endif
|
||||
u = va_arg(ap, unsigned long);
|
||||
break;
|
||||
}
|
||||
dec:
|
||||
if (r <= 0 || r >= sizeof(digits)) r = 10;
|
||||
do *b++ = digits[u % r]; while (u /= r);
|
||||
break;
|
||||
case 'p':
|
||||
if (x = va_arg(ap, char*))
|
||||
{
|
||||
g = 'x';
|
||||
w = 10;
|
||||
f = '0';
|
||||
l = 0;
|
||||
}
|
||||
#if _typ_int64_t
|
||||
if (sizeof(char*) == sizeof(int64_t))
|
||||
{
|
||||
v = (uint64_t)x;
|
||||
goto hex_8;
|
||||
}
|
||||
#endif
|
||||
u = (unsigned long)x;
|
||||
goto hex;
|
||||
case 'x':
|
||||
switch (n)
|
||||
{
|
||||
case 0:
|
||||
u = va_arg(ap, unsigned int);
|
||||
break;
|
||||
default:
|
||||
#if _typ_int64_t
|
||||
v = va_arg(ap, uint64_t);
|
||||
goto hex_8;
|
||||
case 1:
|
||||
#endif
|
||||
u = va_arg(ap, unsigned long);
|
||||
break;
|
||||
}
|
||||
hex:
|
||||
do *b++ = ((n = (u & 0xf)) >= 0xa) ? n - 0xa + 'a' : n + '0'; while (u >>= 4);
|
||||
break;
|
||||
default:
|
||||
if (p >= e) goto done;
|
||||
*p++ = c;
|
||||
continue;
|
||||
#if _typ_int64_t
|
||||
dec_8:
|
||||
if (r <= 0 || r >= sizeof(digits)) r = 10;
|
||||
do *b++ = digits[v % r]; while (v /= r);
|
||||
break;
|
||||
hex_8:
|
||||
do *b++ = ((n = (v & 0xf)) >= 0xa) ? n - 0xa + 'a' : n + '0'; while (v >>= 4);
|
||||
break;
|
||||
oct_8:
|
||||
do *b++ = (v & 07) + '0'; while (v >>= 3);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
if (w)
|
||||
{
|
||||
if (g == 'x') w -= 2;
|
||||
else if (g) w -= 1;
|
||||
n = w - (b - num);
|
||||
if (!l)
|
||||
{
|
||||
if (g && f != ' ')
|
||||
{
|
||||
if (g == 'x')
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = '0';
|
||||
if (p >= e) goto done;
|
||||
*p++ = 'x';
|
||||
}
|
||||
else if (p >= e) goto done;
|
||||
else *p++ = g;
|
||||
g = 0;
|
||||
}
|
||||
while (n-- > 0)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (g == 'x')
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = '0';
|
||||
if (p >= e) goto done;
|
||||
*p++ = 'x';
|
||||
}
|
||||
else if (g)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = g;
|
||||
}
|
||||
while (b > num)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = *--b;
|
||||
}
|
||||
if (w && l) while (n-- > 0)
|
||||
{
|
||||
if (p >= e) goto done;
|
||||
*p++ = f;
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (p >= e) goto done;
|
||||
*p++ = c;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
done:
|
||||
if (p < e) *p = 0;
|
||||
if (buf)
|
||||
{
|
||||
z = p - *buf;
|
||||
*buf = p;
|
||||
}
|
||||
else z = p - end;
|
||||
return(z);
|
||||
}
|
||||
|
||||
int
|
||||
bprintf(char** buf, char* end, const char* format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
ssize_t n;
|
||||
|
||||
va_start(ap, format);
|
||||
n = bvprintf(buf, end, format, ap);
|
||||
va_end(ap);
|
||||
return(n);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
sfsprintf(char* buffer, size_t size, const char* format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char** buf;
|
||||
char* end;
|
||||
int n;
|
||||
|
||||
va_start(ap, format);
|
||||
if (size)
|
||||
{
|
||||
buf = &buffer;
|
||||
end = buffer + size;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf = 0;
|
||||
end = buffer;
|
||||
}
|
||||
n = bvprintf(buf, end, format, ap);
|
||||
va_end(ap);
|
||||
return(n);
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef brk3d
|
||||
|
||||
int
|
||||
brk3d(void* p)
|
||||
{
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
int r;
|
||||
|
||||
initialize();
|
||||
if (!(r = BRK(p)))
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_break))
|
||||
fscall(mp, MSG_break, 0, p);
|
||||
return(r);
|
||||
#else
|
||||
return(BRK(p));
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(brk)
|
||||
|
||||
#endif
|
|
@ -1,82 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
chdir3d(const char* path)
|
||||
{
|
||||
register char* sp;
|
||||
char buf[2 * PATH_MAX + 1];
|
||||
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_stat, 0, path, &state.path.st))
|
||||
{
|
||||
if (state.ret)
|
||||
return -1;
|
||||
if (!S_ISDIR(state.path.st.st_mode))
|
||||
{
|
||||
errno = ENOTDIR;
|
||||
return -1;
|
||||
}
|
||||
state.level = 1;
|
||||
}
|
||||
else
|
||||
#else
|
||||
initialize();
|
||||
#endif
|
||||
{
|
||||
if (state.level > 0 && state.pwd && !CHDIR(state.pwd))
|
||||
state.level = 0;
|
||||
if (!(sp = pathreal(path, P_SAFE, NiL)))
|
||||
return -1;
|
||||
if (CHDIR(sp))
|
||||
return -1;
|
||||
}
|
||||
if (state.pwd)
|
||||
{
|
||||
/*
|
||||
* save absolute path in state.pwd
|
||||
*/
|
||||
|
||||
if (*path != '/')
|
||||
{
|
||||
strcpy(buf, state.pwd);
|
||||
sp = buf + state.pwdsize;
|
||||
*sp++ = '/';
|
||||
}
|
||||
else
|
||||
sp = buf;
|
||||
strcpy(sp, path);
|
||||
#if 0
|
||||
state.path.level = 0;
|
||||
#endif
|
||||
if ((sp = pathcanon(buf, sizeof(buf), 0)) && *(sp - 1) == '.' && *(sp - 2) == '/')
|
||||
*(sp -= 2) = 0;
|
||||
state.pwdsize = strcopy(state.pwd, buf) - state.pwd;
|
||||
memcpy(state.envpwd + sizeof(var_pwd) - 1, state.pwd, state.pwdsize);
|
||||
state.level = state.path.level;
|
||||
message((-1, "chdir: %s [%d]", state.pwd, state.level));
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide chmod
|
||||
#else
|
||||
#define chmod ______chmod
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
#define _LS_H 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide chmod
|
||||
#else
|
||||
#undef chmod
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
int
|
||||
chmod3d(const char* path, mode_t mode)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_chmod, 0, path, mode))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, state.safe ? (P_SAFE|P_TOP) : P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = CHMOD(sp, mode);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_chmod, 0, state.path.name, mode);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_chmod))
|
||||
fscall(mp, MSG_chmod, 0, state.path.name, mode);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef chown3d
|
||||
|
||||
int
|
||||
chown3d(const char* path, uid_t uid, gid_t gid)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_chown, 0, path, uid, gid))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_SAFE|P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = CHOWN(sp, uid, gid);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_chown, 0, path, uid, gid);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_chown))
|
||||
fscall(mp, MSG_chown, 0, path, uid, gid);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(chown)
|
||||
|
||||
#endif
|
|
@ -1,82 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
close3d(int fd)
|
||||
{
|
||||
initialize();
|
||||
if (fd >= 0 && fd < elementsof(state.file))
|
||||
{
|
||||
register int nfd;
|
||||
register short* rp;
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
#endif
|
||||
|
||||
#if defined(fchdir3d)
|
||||
if (state.file[fd].dir)
|
||||
{
|
||||
free(state.file[fd].dir);
|
||||
state.file[fd].dir = 0;
|
||||
}
|
||||
#endif
|
||||
if (rp = state.file[fd].reserved)
|
||||
{
|
||||
if ((nfd = FCNTL(fd, F_DUPFD, fd + 1)) < 0)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
*rp = nfd;
|
||||
state.file[nfd].reserved = rp;
|
||||
state.file[nfd].flags = FILE_LOCK;
|
||||
state.file[fd].reserved = 0;
|
||||
CLOSE(fd);
|
||||
}
|
||||
#if FS
|
||||
if ((mp = state.file[fd].mount) && fssys(mp, MSG_close))
|
||||
{
|
||||
if (FSTAT(fd, &state.path.st))
|
||||
state.path.st.st_mtime = 0;
|
||||
fscall(mp, MSG_close, 0, fd, state.path.st.st_mtime);
|
||||
}
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_close))
|
||||
{
|
||||
if ((state.file[fd].flags & FILE_OPEN) ? FSTAT(fd, &state.path.st) : fileinit(fd, NiL, NiL, 0))
|
||||
state.path.st.st_mtime = 0;
|
||||
fscall(mp, MSG_close, 0, fd, state.path.st.st_mtime);
|
||||
}
|
||||
if (state.file[fd].flags)
|
||||
{
|
||||
state.file[fd].flags = 0;
|
||||
state.file[fd].mount = 0;
|
||||
if (state.cache == fd)
|
||||
while (state.cache > 1 && !state.file[--state.cache].flags);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return(CLOSE(fd));
|
||||
}
|
|
@ -1,110 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if _hdr_utime
|
||||
#include <utime.h>
|
||||
#else
|
||||
struct utimbuf
|
||||
{
|
||||
time_t actime;
|
||||
time_t modtime;
|
||||
};
|
||||
#endif
|
||||
|
||||
#define COPYBUF 8096
|
||||
|
||||
#if __sun__ || sun
|
||||
|
||||
#if _lib_mmap
|
||||
|
||||
#define COPYMAP (32*COPYBUF)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* copy rfd to wfd
|
||||
* return 0 if success, otherwise -1.
|
||||
*/
|
||||
|
||||
int
|
||||
fs3d_copy(int rfd, int wfd, struct stat* st)
|
||||
{
|
||||
register ssize_t n;
|
||||
ssize_t filesize;
|
||||
struct stat stbuf;
|
||||
struct utimbuf ut;
|
||||
char buf[COPYBUF];
|
||||
|
||||
#ifdef COPYMAP
|
||||
off_t offset;
|
||||
size_t munmapsize;
|
||||
size_t mapsize;
|
||||
char* mapbuf;
|
||||
#endif
|
||||
|
||||
if (!st && FSTAT(rfd, st = &stbuf)) return -1;
|
||||
if (!S_ISREG(st->st_mode)) return 0;
|
||||
if ((filesize = st->st_size) <= 0)
|
||||
filesize = 1;
|
||||
#ifdef COPYMAP
|
||||
mapsize = (filesize < COPYMAP) ? filesize : COPYMAP;
|
||||
if ((filesize > COPYBUF) && ((mapbuf = mmap((caddr_t)0, mapsize, PROT_READ, MAP_SHARED, rfd, 0)) != ((caddr_t)-1)))
|
||||
{
|
||||
offset = 0;
|
||||
munmapsize = mapsize;
|
||||
for (;;)
|
||||
{
|
||||
if (write(wfd, mapbuf, mapsize) != mapsize)
|
||||
{
|
||||
munmap(mapbuf, munmapsize);
|
||||
return -1;
|
||||
}
|
||||
filesize -= mapsize;
|
||||
if (filesize <= 0) break;
|
||||
offset += mapsize;
|
||||
if (filesize < mapsize) mapsize = filesize;
|
||||
if (mmap(mapbuf, mapsize, PROT_READ, MAP_SHARED|MAP_FIXED, rfd, offset) == (caddr_t)-1)
|
||||
{
|
||||
munmap(mapbuf, munmapsize);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
munmap(mapbuf, munmapsize);
|
||||
}
|
||||
#endif
|
||||
if (filesize > 0)
|
||||
{
|
||||
while ((n = read(rfd, buf, COPYBUF)) > 0)
|
||||
if (write(wfd, buf, n) != n)
|
||||
return -1;
|
||||
if (n < 0 || lseek(wfd, (off_t)0, 0)) return -1;
|
||||
}
|
||||
ut.actime = st->st_atime;
|
||||
ut.modtime = st->st_mtime;
|
||||
UTIME(state.path.name, &ut);
|
||||
return 0;
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
creat3d(const char* path, mode_t mode)
|
||||
{
|
||||
return(open(path, O_WRONLY|O_CREAT|O_TRUNC, mode));
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#define msgreserve(p) reserve(p)
|
||||
|
||||
#define gethostname ______gethostname
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef gethostname
|
||||
#undef FSYNC
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#define CS_LIB_LOCAL 1
|
||||
|
||||
#define _3d_fmttime(a,b) "[NOW]"
|
||||
|
||||
#if FS
|
||||
|
||||
#undef NoN
|
||||
#define NoN(x)
|
||||
|
||||
#include "csdata.c"
|
||||
#undef csaddr
|
||||
#define csaddr(p,x) 0
|
||||
#include "csauth.c"
|
||||
#include "csbind.c"
|
||||
#include "cslocal.c"
|
||||
#include "csname.c"
|
||||
#include "csntoa.c"
|
||||
#include "csread.c"
|
||||
#include "csrecv.c"
|
||||
#include "cssend.c"
|
||||
#include "csvar.c"
|
||||
#include "cswrite.c"
|
||||
|
||||
#include "msgbuf.c"
|
||||
#include "msgread.c"
|
||||
#include "msguser.c"
|
||||
|
||||
#endif
|
||||
|
||||
#include "cspeek.c"
|
||||
#include "cspipe.c"
|
||||
|
||||
#if FS
|
||||
#include "cspoll.c" /* follows cs*.c because of #undef's */
|
||||
#endif
|
||||
|
||||
#include "msggetmask.c"
|
||||
#include "msgindex.c"
|
||||
#include "msginfo.c"
|
||||
#include "msgname.c"
|
||||
#include "msgsetmask.c"
|
|
@ -1,97 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* libcs 3d symbol mappings to minimize pollution
|
||||
*/
|
||||
|
||||
#ifndef _NAME3D_CS_H
|
||||
#define _NAME3D_CS_H
|
||||
|
||||
#define CS_INTERFACE 2
|
||||
|
||||
#define _cs_info_ _3d_cs_info_
|
||||
#define csauth _3d_csauth
|
||||
#define csbind _3d_csbind
|
||||
#define cschallenge _3d_cschallenge
|
||||
#define cslocal _3d_cslocal
|
||||
#define csname _3d_csname
|
||||
#define csntoa _3d_csntoa
|
||||
#define cspeek _3d_cspeek
|
||||
#define cspipe _3d_cspipe
|
||||
#define cspoll _3d_cspoll
|
||||
#define csread _3d_csread
|
||||
#define csrecv _3d_csrecv
|
||||
#define cssend _3d_cssend
|
||||
#define csvar _3d_csvar
|
||||
#define cswrite _3d_cswrite
|
||||
|
||||
#define _cs_addr _3d_cs_addr
|
||||
#define _cs_attr _3d_cs_attr
|
||||
#define _cs_auth _3d_cs_auth
|
||||
#define _cs_bind _3d_cs_bind
|
||||
#define _cs_challenge _3d_cs_challenge
|
||||
#define _cs_clone _3d_cs_clone
|
||||
#define _cs_daemon _3d_cs_daemon
|
||||
#define _cs_fd _3d_cs_fd
|
||||
#define _cs_from _3d_cs_from
|
||||
#define _cs_full _3d_cs_full
|
||||
#define _cs_info _3d_cs_info
|
||||
#define _cs_local _3d_cs_local
|
||||
#define _cs_name _3d_cs_name
|
||||
#define _cs_note _3d_cs_note
|
||||
#define _cs_ntoa _3d_cs_ntoa
|
||||
#define _cs_open _3d_cs_open
|
||||
#define _cs_path _3d_cs_path
|
||||
#define _cs_peek _3d_cs_peek
|
||||
#define _cs_ping _3d_cs_ping
|
||||
#define _cs_pipe _3d_cs_pipe
|
||||
#define _cs_poll _3d_cs_poll
|
||||
#define _cs_port _3d_cs_port
|
||||
#define _cs_read _3d_cs_read
|
||||
#define _cs_recv _3d_cs_recv
|
||||
#define _cs_send _3d_cs_send
|
||||
#define _cs_serve _3d_cs_serve
|
||||
#define _cs_stat _3d_cs_stat
|
||||
#define _cs_timeout _3d_cs_timeout
|
||||
#define _cs_to _3d_cs_to
|
||||
#define _cs_var _3d_cs_var
|
||||
#define _cs_wakeup _3d_cs_wakeup
|
||||
#define _cs_write _3d_cs_write
|
||||
|
||||
#define _msg_info_ _3d_msg_info
|
||||
#define msgcall _3d_msgcall
|
||||
#define msggetmask _3d_msggetmask
|
||||
#define msggetu _3d_msggetu
|
||||
#define msggetz _3d_msggetz
|
||||
#define msgindex _3d_msgindex
|
||||
#define msgname _3d_msgname
|
||||
#define msgputu _3d_msgputu
|
||||
#define msgputz _3d_msgputz
|
||||
#define msgread _3d_msgread
|
||||
#define msgreturn _3d_msgreturn
|
||||
#define msgsetmask _3d_msgsetmask
|
||||
#define msgvcall _3d_msgvcall
|
||||
#define msgvreturn _3d_msgvreturn
|
||||
|
||||
#endif
|
|
@ -1,528 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d directory(3)
|
||||
*
|
||||
* NOTE: there are 3 limitations to this implementation
|
||||
*
|
||||
* (1) opendir() allocates one file descriptor for each directory
|
||||
* view and these remain open until closedir()
|
||||
*
|
||||
* (2) telldir() offsets are encoded with the directory view level
|
||||
* and TELLDIR() offset, and the directory view level takes
|
||||
* TABBITS bits, so TELLDIR() offsets are limited to (32-TABBITS)
|
||||
* bits, but that would be one big physical directory
|
||||
*
|
||||
* (3) if dirent.d_type supported then directory stat.st_nlink is
|
||||
* inflated to foil viewpath subdirectory counting that would
|
||||
* skip lower view subdirs not reflected in the top level st_nlink
|
||||
*/
|
||||
|
||||
#define _def_map_ast 1
|
||||
#define _std_strtol 1
|
||||
|
||||
#define getdirentries ______getdirentries
|
||||
#define sbrk ______sbrk
|
||||
#define strmode ______strmode
|
||||
|
||||
#include <ast_std.h>
|
||||
|
||||
#undef getdirentries
|
||||
#undef sbrk
|
||||
#undef strmode
|
||||
|
||||
#include "dir_3d.h"
|
||||
|
||||
#if !_dir_ok
|
||||
#undef dirent
|
||||
#define dirent DIRdirent
|
||||
#endif
|
||||
|
||||
#undef strtol
|
||||
#undef strtoul
|
||||
#undef strtoll
|
||||
#undef strtoull
|
||||
|
||||
static int intercepted;
|
||||
|
||||
DIR*
|
||||
opendir3d(const char* apath)
|
||||
{
|
||||
register char* path;
|
||||
register DIR* dirp = 0;
|
||||
register int n;
|
||||
int oerrno;
|
||||
long visits = 0;
|
||||
struct stat st;
|
||||
|
||||
if (dirp = (DIR*)state.freedirp)
|
||||
state.freedirp = 0;
|
||||
else if (!(dirp = newof(0, DIR, 1, 0)))
|
||||
return 0;
|
||||
intercepted++;
|
||||
dirp->fd = -1;
|
||||
dirp->viewp = dirp->view;
|
||||
n = state.in_2d;
|
||||
if (path = pathreal(apath, P_SLASH, NiL))
|
||||
state.in_2d = 2;
|
||||
else
|
||||
path = (char*)apath;
|
||||
dirp->viewp->dirp = OPENDIR(path);
|
||||
state.in_2d = n;
|
||||
if (!dirp->viewp->dirp)
|
||||
{
|
||||
state.freedirp = (void*)dirp;
|
||||
intercepted = 0;
|
||||
return 0;
|
||||
}
|
||||
dirp->boundary = state.boundary;
|
||||
if (state.in_2d)
|
||||
{
|
||||
dirp->overlay = 0;
|
||||
(dirp->viewp++)->opaque = 0;
|
||||
dirp->viewp->dirp = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
oerrno = errno;
|
||||
n = strlen(path);
|
||||
path[n] = '/';
|
||||
strcpy(path + n + 1, state.opaque);
|
||||
dirp->viewp->level = state.path.level;
|
||||
state.in_2d++;
|
||||
(dirp->viewp++)->opaque = LSTAT(path, &st) ? 0 : st.st_ino;
|
||||
state.in_2d--;
|
||||
path[n] = 0;
|
||||
while (pathnext(state.path.name, NiL, &visits))
|
||||
{
|
||||
state.in_2d = 2;
|
||||
dirp->viewp->dirp = OPENDIR(state.path.name);
|
||||
state.in_2d = 0;
|
||||
if (dirp->viewp->dirp)
|
||||
{
|
||||
n = strlen(state.path.name);
|
||||
state.path.name[n] = '/';
|
||||
strcpy(state.path.name + n + 1, state.opaque);
|
||||
dirp->viewp->level = state.path.level;
|
||||
(dirp->viewp++)->opaque = LSTAT(state.path.name, &st) ? 0 : st.st_ino;
|
||||
state.path.name[n] = 0;
|
||||
}
|
||||
}
|
||||
errno = oerrno;
|
||||
(dirp->viewp--)->dirp = 0;
|
||||
if (dirp->viewp <= dirp->view)
|
||||
dirp->overlay = 0;
|
||||
else if (!(dirp->overlay = hashalloc(NiL, HASH_set, HASH_ALLOCATE, 0)))
|
||||
{
|
||||
closedir(dirp);
|
||||
intercepted = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
dirp->viewp = dirp->view;
|
||||
CHEATDIR(dirp);
|
||||
intercepted = 0;
|
||||
return dirp;
|
||||
}
|
||||
|
||||
int
|
||||
closedir3d(register DIR* dirp)
|
||||
{
|
||||
if (dirp)
|
||||
{
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
return CLOSEDIR(dirp);
|
||||
}
|
||||
for (dirp->viewp = dirp->view; dirp->viewp->dirp; dirp->viewp++)
|
||||
CLOSEDIR(dirp->viewp->dirp);
|
||||
if (dirp->overlay)
|
||||
hashfree(dirp->overlay);
|
||||
if (!state.freedirp)
|
||||
state.freedirp = (void*)dirp;
|
||||
else
|
||||
free((char*)dirp);
|
||||
intercepted--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct dirent*
|
||||
readdir3d(register DIR* dirp)
|
||||
{
|
||||
register struct DIRdirent* dp;
|
||||
register Dir_physical_t* covered;
|
||||
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
return READDIR(dirp);
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
while (!(dp = (struct DIRdirent*)READDIR(dirp->viewp->dirp)))
|
||||
{
|
||||
if (!(++dirp->viewp)->dirp)
|
||||
{
|
||||
intercepted--;
|
||||
return 0;
|
||||
}
|
||||
CHEATDIR(dirp);
|
||||
}
|
||||
#ifdef D_FILENO
|
||||
if (!state.in_2d)
|
||||
{
|
||||
register char* s = dp->d_name;
|
||||
|
||||
/*
|
||||
* skip opaque and hidden entries
|
||||
*/
|
||||
|
||||
if (*s++ == '.' && *s++ == '.' && *s++ == '.')
|
||||
{
|
||||
/*
|
||||
* the following for old opaque
|
||||
*/
|
||||
|
||||
if (!*s && !dirp->viewp->opaque)
|
||||
dirp->viewp->opaque = D_FILENO(dp);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NOTE: this (slimey) method assumes READDIR() returns . first
|
||||
*/
|
||||
|
||||
if (dirp->overlay && (!dirp->boundary || dp->d_name[0] != '.' || dp->d_name[1]))
|
||||
{
|
||||
if ((covered = (Dir_physical_t*)hashget(dirp->overlay, dp->d_name)) && covered < dirp->viewp)
|
||||
continue;
|
||||
if ((dirp->viewp + 1)->dirp)
|
||||
hashput(dirp->overlay, 0, (char*)dirp->viewp);
|
||||
}
|
||||
#ifdef D_FILENO
|
||||
if (D_FILENO(dp) == dirp->viewp->opaque)
|
||||
continue;
|
||||
#endif
|
||||
intercepted--;
|
||||
return (struct dirent*)dp;
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
#undef seekdir
|
||||
|
||||
#define OFFBITS (CHAR_BIT*sizeof(long)-TABBITS)
|
||||
#define SETPOS(l,o) ((((long)(l))<<OFFBITS)|GETOFF(o))
|
||||
#define GETOFF(p) ((p)&((((long)1)<<OFFBITS)-1))
|
||||
#define GETLEV(p) (((p)>>OFFBITS)&((((long)1)<<TABBITS)-1))
|
||||
|
||||
void
|
||||
seekdir3d(register DIR* dirp, long pos)
|
||||
{
|
||||
register int n;
|
||||
int lev;
|
||||
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
SEEKDIR(dirp, pos);
|
||||
return;
|
||||
}
|
||||
if (pos)
|
||||
{
|
||||
lev = GETLEV(pos);
|
||||
pos = GETOFF(pos);
|
||||
for (n = 0; dirp->view[n].dirp; n++)
|
||||
if (lev == dirp->view[n].level)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
n = 0;
|
||||
hashfree(dirp->overlay);
|
||||
dirp->overlay = hashalloc(NiL, HASH_set, HASH_ALLOCATE, 0);
|
||||
}
|
||||
if (dirp->view[n].dirp)
|
||||
{
|
||||
SEEKDIR(dirp->view[n].dirp, pos);
|
||||
dirp->viewp = &dirp->view[n];
|
||||
CHEATDIR(dirp);
|
||||
while (dirp->view[++n].dirp)
|
||||
SEEKDIR(dirp->view[n].dirp, 0L);
|
||||
}
|
||||
intercepted--;
|
||||
}
|
||||
|
||||
#undef telldir
|
||||
|
||||
long
|
||||
telldir3d(DIR* dirp)
|
||||
{
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
return TELLDIR(dirp);
|
||||
}
|
||||
return SETPOS(dirp->viewp->level, TELLDIR(dirp->viewp->dirp));
|
||||
}
|
||||
|
||||
#undef rewinddir
|
||||
|
||||
void
|
||||
rewinddir3d(register DIR* dirp)
|
||||
{
|
||||
seekdir(dirp, 0L);
|
||||
}
|
||||
|
||||
#if !_nosys_readdir64
|
||||
|
||||
struct dirent64*
|
||||
readdir643d(register DIR* dirp)
|
||||
{
|
||||
register struct dirent64* dp;
|
||||
register Dir_physical_t* covered;
|
||||
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
return READDIR64(dirp);
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
while (!(dp = READDIR64(dirp->viewp->dirp)))
|
||||
{
|
||||
if (!(++dirp->viewp)->dirp)
|
||||
{
|
||||
intercepted--;
|
||||
return 0;
|
||||
}
|
||||
CHEATDIR(dirp);
|
||||
}
|
||||
#ifdef D_FILENO
|
||||
if (!state.in_2d)
|
||||
{
|
||||
register char* s = dp->d_name;
|
||||
|
||||
/*
|
||||
* skip opaque and hidden entries
|
||||
*/
|
||||
|
||||
if (*s++ == '.' && *s++ == '.' && *s++ == '.')
|
||||
{
|
||||
/*
|
||||
* the following for old opaque
|
||||
*/
|
||||
|
||||
if (!*s && !dirp->viewp->opaque)
|
||||
dirp->viewp->opaque = D_FILENO(dp);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NOTE: this (slimey) method assumes READDIR() returns . first
|
||||
*/
|
||||
|
||||
if (dirp->overlay && (!dirp->boundary || dp->d_name[0] != '.' || dp->d_name[1]))
|
||||
{
|
||||
if ((covered = (Dir_physical_t*)hashget(dirp->overlay, dp->d_name)) && covered < dirp->viewp)
|
||||
continue;
|
||||
if ((dirp->viewp + 1)->dirp)
|
||||
hashput(dirp->overlay, 0, (char*)dirp->viewp);
|
||||
}
|
||||
#ifdef D_FILENO
|
||||
if (D_FILENO(dp) == dirp->viewp->opaque)
|
||||
continue;
|
||||
#endif
|
||||
intercepted--;
|
||||
return dp;
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
#undef seekdir
|
||||
|
||||
#define OFFBITS64 (CHAR_BIT*sizeof(off64_t)-TABBITS)
|
||||
#define SETPOS64(l,o) ((((off64_t)(l))<<OFFBITS)|GETOFF(o))
|
||||
#define GETOFF64(p) ((p)&((((off64_t)1)<<OFFBITS)-1))
|
||||
#define GETLEV64(p) (((p)>>OFFBITS)&((((off64_t)1)<<TABBITS)-1))
|
||||
|
||||
void
|
||||
seekdir643d(register DIR* dirp, off64_t pos)
|
||||
{
|
||||
register int n;
|
||||
int lev;
|
||||
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
SEEKDIR64(dirp, pos);
|
||||
return;
|
||||
}
|
||||
if (pos)
|
||||
{
|
||||
lev = GETLEV(pos);
|
||||
pos = GETOFF(pos);
|
||||
for (n = 0; dirp->view[n].dirp; n++)
|
||||
if (lev == dirp->view[n].level)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
n = 0;
|
||||
if (dirp->overlay)
|
||||
{
|
||||
hashfree(dirp->overlay);
|
||||
dirp->overlay = hashalloc(NiL, HASH_set, HASH_ALLOCATE, 0);
|
||||
}
|
||||
}
|
||||
if (dirp->view[n].dirp)
|
||||
{
|
||||
SEEKDIR64(dirp->view[n].dirp, pos);
|
||||
dirp->viewp = &dirp->view[n];
|
||||
CHEATDIR(dirp);
|
||||
while (dirp->view[++n].dirp)
|
||||
SEEKDIR64(dirp->view[n].dirp, (off64_t)0);
|
||||
}
|
||||
intercepted--;
|
||||
}
|
||||
|
||||
#undef telldir
|
||||
|
||||
off64_t
|
||||
telldir643d(DIR* dirp)
|
||||
{
|
||||
if (intercepted)
|
||||
return TELLDIR64(dirp);
|
||||
return SETPOS(dirp->viewp->level, TELLDIR64(dirp->viewp->dirp));
|
||||
}
|
||||
|
||||
#undef rewinddir
|
||||
|
||||
void
|
||||
rewinddir643d(register DIR* dirp)
|
||||
{
|
||||
rewinddir(dirp);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if !_mangle_syscall && (!_lib_opendir || !_hdr_dirent)
|
||||
|
||||
#include "dirlib.h"
|
||||
|
||||
#undef _dir_ok
|
||||
|
||||
#define DIR DIRDIR
|
||||
#undef DIRDIR
|
||||
#define opendir OPENDIR
|
||||
#if defined(SYS3D_opendir)
|
||||
#undef OPENDIR
|
||||
#endif
|
||||
#define readdir READDIR
|
||||
#if defined(SYS3D_readdir)
|
||||
#undef READDIR
|
||||
#endif
|
||||
#define seekdir SEEKDIR
|
||||
#if defined(SYS3D_seekdir)
|
||||
#undef SEEKDIR
|
||||
#endif
|
||||
#define telldir TELLDIR
|
||||
#if defined(SYS3D_telldir)
|
||||
#undef TELLDIR
|
||||
#endif
|
||||
#define closedir CLOSEDIR
|
||||
#if defined(SYS3D_closedir)
|
||||
#undef CLOSEDIR
|
||||
#endif
|
||||
|
||||
#define id sys_id
|
||||
#define freedirp sys_freedirp
|
||||
|
||||
#ifndef DIRBLKSIZ
|
||||
#ifdef DIRBLK
|
||||
#define DIRBLKSIZ DIRBLK
|
||||
#else
|
||||
#ifdef DIRBUF
|
||||
#define DIRBLKSIZ DIRBUF
|
||||
#else
|
||||
#define DIRBLKSIZ 8192
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "getdents.c"
|
||||
#include "opendir.c"
|
||||
#include "readdir.c"
|
||||
#include "telldir.c"
|
||||
#include "seekdir.c"
|
||||
|
||||
#if !_nosys_readdir64
|
||||
|
||||
#undef dirent
|
||||
#define dirent dirent64
|
||||
#undef getdents
|
||||
#define getdents getdents64
|
||||
#define DIR DIRDIR
|
||||
#undef DIRDIR
|
||||
#undef readdir
|
||||
#define readdir READDIR64
|
||||
#if defined(SYS3D_readdir64)
|
||||
#undef READDIR64
|
||||
#endif
|
||||
|
||||
#if !_nosys_seekdir64
|
||||
#undef seekdir
|
||||
#define seekdir SEEKDIR64
|
||||
#if defined(SYS3D_seekdir64)
|
||||
#undef SEEKDIR64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !_nosys_telldir64
|
||||
#undef telldir
|
||||
#define telldir TELLDIR64
|
||||
#if defined(SYS3D_telldir64)
|
||||
#undef TELLDIR64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "readdir.c"
|
||||
|
||||
#if !_nosys_telldir64
|
||||
#include "telldir.c"
|
||||
#endif
|
||||
|
||||
#if !_nosys_seekdir64
|
||||
#include "seekdir.c"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,224 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* AT&T Research
|
||||
*
|
||||
* directory stream access library private definitions
|
||||
* handles 3d file system
|
||||
*/
|
||||
|
||||
#ifndef _DIR3D_H
|
||||
#define _DIR3D_H
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if !_mem_DIR
|
||||
#undef _lib_opendir
|
||||
#endif
|
||||
|
||||
#define DIRENT_ILLEGAL_ACCESS 1
|
||||
#define DIR DIRDIR
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide opendir _opendir __opendir
|
||||
__STDPP__directive pragma pp:hide readdir _readdir __readdir readdir64 _readdir64 __readdir64
|
||||
__STDPP__directive pragma pp:hide rewinddir _rewinddir __rewinddir rewinddir64 _rewinddir64 __rewinddir64
|
||||
__STDPP__directive pragma pp:hide seekdir _seekdir __seekdir seekdir64 _seekdir64 __seekdir64
|
||||
__STDPP__directive pragma pp:hide telldir _telldir __telldir telldir64 _telldir64 __telldir64
|
||||
__STDPP__directive pragma pp:hide closedir _closedir __closedir
|
||||
__STDPP__directive pragma pp:hide _getdents __getdents getdents64 _getdents64 __getdents64 getdirentries
|
||||
#else
|
||||
#define opendir DIRopendir
|
||||
#define _opendir _DIRopendir
|
||||
#define __opendir __DIRopendir
|
||||
#define readdir DIRreaddir
|
||||
#define _readdir _DIRreaddir
|
||||
#define __readdir __DIRreaddir
|
||||
#define readdir64 DIRreaddir64
|
||||
#define _readdir64 _DIRreaddir64
|
||||
#define __readdir64 __DIRreaddir64
|
||||
#if _lib_rewinddir
|
||||
#define rewinddir DIRrewinddir
|
||||
#define _rewinddir _DIRrewinddir
|
||||
#define __rewinddir __DIRrewinddir
|
||||
#define rewinddir64 DIRrewinddir64
|
||||
#define _rewinddir64 _DIRrewinddir64
|
||||
#define __rewinddir64 __DIRrewinddir64
|
||||
#endif
|
||||
#define seekdir DIRseekdir
|
||||
#define _seekdir _DIRseekdir
|
||||
#define __seekdir __DIRseekdir
|
||||
#define seekdir64 DIRseekdir64
|
||||
#define _seekdir64 _DIRseekdir64
|
||||
#define __seekdir64 __DIRseekdir64
|
||||
#if _lib_telldir
|
||||
#define telldir DIRtelldir
|
||||
#define _telldir _DIRtelldir
|
||||
#define __telldir __DIRtelldir
|
||||
#define telldir64 DIRtelldir64
|
||||
#define _telldir64 _DIRtelldir64
|
||||
#define __telldir64 __DIRtelldir64
|
||||
#endif
|
||||
#define closedir DIRclosedir
|
||||
#define _closedir _DIRclosedir
|
||||
#define __closedir __DIRclosedir
|
||||
#define _getdents _DIRgetdents
|
||||
#define __getdents __DIRgetdents
|
||||
#define getdents64 DIRgetdents64
|
||||
#define _getdents64 _DIRgetdents64
|
||||
#define __getdents64 __DIRgetdents64
|
||||
#define getdirentries DIRgetdirentries
|
||||
#endif
|
||||
|
||||
#define _BLD_ast 1
|
||||
#include <ast_dir.h>
|
||||
#undef _BLD_ast
|
||||
|
||||
#if _lib_readdir64 && _typ_struct_dirent64
|
||||
#undef dirent
|
||||
#undef DIRdirent
|
||||
#define DIRdirent dirent
|
||||
#endif
|
||||
|
||||
#include <hash.h>
|
||||
|
||||
#if !defined(SYS3D_opendir)
|
||||
extern DIR* OPENDIR(const char*);
|
||||
#endif
|
||||
#if !defined(SYS3D_readdir)
|
||||
extern struct dirent* READDIR(DIR*);
|
||||
#endif
|
||||
#if !defined(SYS3D_seekdir)
|
||||
extern void SEEKDIR(DIR*, long);
|
||||
#endif
|
||||
#if !defined(SYS3D_telldir)
|
||||
extern long TELLDIR(DIR*);
|
||||
#endif
|
||||
#if !defined(SYS3D_rewinddir)
|
||||
extern void REWINDDIR(DIR*);
|
||||
#endif
|
||||
#if !defined(SYS3D_closedir)
|
||||
extern void CLOSEDIR(DIR*);
|
||||
#endif
|
||||
|
||||
#undef DIR
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide opendir _opendir __opendir
|
||||
__STDPP__directive pragma pp:nohide readdir _readdir __readdir readdir64 _readdir64 __readdir64
|
||||
__STDPP__directive pragma pp:nohide rewinddir _rewinddir __rewinddir rewinddir64 _rewinddir64 __rewinddir64
|
||||
__STDPP__directive pragma pp:nohide seekdir _seekdir __seekdir seekdir64 _seekdir64 __seekdir64
|
||||
__STDPP__directive pragma pp:nohide telldir _telldir __telldir telldir64 _telldir64 __telldir64
|
||||
__STDPP__directive pragma pp:nohide closedir _closedir __closedir
|
||||
__STDPP__directive pragma pp:nohide _getdents __getdents getdents64 _getdents64 __getdents64 getdirentries
|
||||
#else
|
||||
#undef opendir
|
||||
#undef _opendir
|
||||
#undef __opendir
|
||||
#undef readdir
|
||||
#undef _readdir
|
||||
#undef __readdir
|
||||
#undef readdir64
|
||||
#undef _readdir64
|
||||
#undef __readdir64
|
||||
#ifndef REWINDDIR
|
||||
#if _lib_rewinddir
|
||||
#undef rewinddir
|
||||
#undef _rewinddir
|
||||
#undef __rewinddir
|
||||
#undef rewinddir64
|
||||
#undef _rewinddir64
|
||||
#undef __rewinddir64
|
||||
#else
|
||||
#define REWINDDIR(p) rewinddir(p)
|
||||
#define REWINDDIR64(p) rewinddir64(p)
|
||||
#endif
|
||||
#endif
|
||||
#undef seekdir
|
||||
#undef _seekdir
|
||||
#undef __seekdir
|
||||
#undef seekdir64
|
||||
#undef _seekdir64
|
||||
#undef __seekdir64
|
||||
#ifndef TELLDIR
|
||||
#if _lib_telldir
|
||||
#undef telldir
|
||||
#undef _telldir
|
||||
#undef __telldir
|
||||
#undef telldir64
|
||||
#undef _telldir64
|
||||
#undef __telldir64
|
||||
#else
|
||||
#define TELLDIR64(p) telldir64(p)
|
||||
#endif
|
||||
#endif
|
||||
#undef closedir
|
||||
#undef _closedir
|
||||
#undef __closedir
|
||||
#undef _getdents
|
||||
#undef __getdents
|
||||
#undef getdents64
|
||||
#undef _getdents64
|
||||
#undef __getdents64
|
||||
#undef getdirentries
|
||||
#endif
|
||||
|
||||
#if _mem_DIR
|
||||
#define CHEATDIR(p) ((p)->dir = *(p)->viewp->dirp)
|
||||
#else
|
||||
#define CHEATDIR(p)
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DIRDIR* dirp; /* system stream pointer */
|
||||
ino_t opaque; /* opaque inode number */
|
||||
int level; /* view level */
|
||||
} Dir_physical_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int fd; /* placeholder for dirfd() */
|
||||
#if _mem_DIR
|
||||
DIRDIR dir; /* in case user checks *DIRDIR */
|
||||
#endif
|
||||
Dir_physical_t* viewp; /* current directory in view */
|
||||
Dir_physical_t view[TABSIZE]; /* dirp's in view */
|
||||
Hash_table_t* overlay; /* directory overlay hash */
|
||||
int boundary; /* return . at each view level */
|
||||
} DIR; /* directory stream descriptor */
|
||||
|
||||
extern int closedir(DIR*);
|
||||
extern DIR* opendir(const char*);
|
||||
#if _HUH_2008_11_21
|
||||
extern struct dirent* readdir(DIR*);
|
||||
#endif
|
||||
#if _lib_rewinddir && !defined(rewinddir)
|
||||
extern void rewinddir(DIR*);
|
||||
#endif
|
||||
extern void seekdir(DIR*, long);
|
||||
#if _lib_telldir && !defined(telldir)
|
||||
extern long telldir(DIR*);
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -1,46 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#define _def_map_ast 1
|
||||
#define _std_strtol 1
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE 1
|
||||
#endif
|
||||
#ifndef __EXTENSIONS__
|
||||
#define __EXTENSIONS__ 1
|
||||
#endif
|
||||
|
||||
#define strmode ______strmode
|
||||
|
||||
#include <ast_std.h>
|
||||
|
||||
#undef strmode
|
||||
|
||||
#include "dll_3d.h"
|
||||
|
||||
#undef strtol
|
||||
#undef strtoul
|
||||
#undef strtoll
|
||||
#undef strtoull
|
||||
|
||||
#include "dllnext.c"
|
||||
#include "dlfcn.c"
|
|
@ -1,36 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "lib_3d.h"
|
||||
|
||||
#include <dlldefs.h>
|
||||
|
||||
#define dllopen dlopen
|
||||
|
||||
#ifdef _DLL_RLD_SYM_TYPE
|
||||
#define _dll_next _3d_dllnext
|
||||
extern void* _dll_next(int, _DLL_RLD_SYM_TYPE*);
|
||||
#else
|
||||
#define dllnext _3d_dllnext
|
||||
extern void* dllnext(int);
|
||||
#endif
|
|
@ -1,45 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef dup23d
|
||||
|
||||
int
|
||||
dup23d(int fd, register int r)
|
||||
{
|
||||
initialize();
|
||||
if (r >= 0 && r < elementsof(state.file) && state.file[r].reserved) close(r);
|
||||
r = DUP2(fd, r);
|
||||
#if FS
|
||||
if (r >= 0 && r < elementsof(state.file))
|
||||
fs3d_dup(fd, r);
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(dup2)
|
||||
|
||||
#endif
|
|
@ -1,91 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if FS
|
||||
|
||||
int
|
||||
fs3d_dup(int ofd, int nfd)
|
||||
{
|
||||
register Mount_t* mp;
|
||||
|
||||
if (nfd >= 0 && ofd >= 0 && ofd < elementsof(state.file))
|
||||
{
|
||||
if (state.cache)
|
||||
{
|
||||
if (!(state.file[ofd].flags & FILE_OPEN))
|
||||
fileinit(ofd, NiL, NiL, 0);
|
||||
state.file[nfd] = state.file[ofd];
|
||||
state.file[nfd].flags &= ~FILE_CLOEXEC;
|
||||
state.file[nfd].reserved = 0;
|
||||
if (nfd > state.cache)
|
||||
state.cache = nfd;
|
||||
if (nfd > state.open)
|
||||
state.open = nfd;
|
||||
if (mp = state.file[nfd].mount)
|
||||
fscall(mp, MSG_dup, nfd, ofd);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_dup))
|
||||
fscall(mp, MSG_dup, nfd, ofd);
|
||||
}
|
||||
#if defined(fchdir3d)
|
||||
if (state.file[nfd].dir)
|
||||
{
|
||||
free(state.file[nfd].dir);
|
||||
state.file[nfd].dir = 0;
|
||||
}
|
||||
if (state.file[ofd].dir && (state.file[nfd].dir = newof(0, Dir_t, 1, strlen(state.file[ofd].dir->path))))
|
||||
{
|
||||
strcpy(state.file[nfd].dir->path, state.file[ofd].dir->path);
|
||||
state.file[nfd].dir->dev = state.file[ofd].dir->dev;
|
||||
state.file[nfd].dir->ino = state.file[ofd].dir->ino;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef dup3d
|
||||
|
||||
int
|
||||
dup3d(int fd)
|
||||
{
|
||||
register int r;
|
||||
|
||||
initialize();
|
||||
r = DUP(fd);
|
||||
#if FS
|
||||
if (r >= 0 && r < elementsof(state.file))
|
||||
fs3d_dup(fd, r);
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(dup)
|
||||
|
||||
#endif
|
|
@ -1,248 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* Glenn Fowler
|
||||
* AT&T Research
|
||||
*
|
||||
* error and message formatter
|
||||
*
|
||||
* level is the error level
|
||||
* level >= error_info.core!=0 dumps core
|
||||
* level >= ERROR_FATAL calls error_info.exit
|
||||
* level < 0 is for debug tracing
|
||||
*
|
||||
* NOTE: non-sfio version just for 3d
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if DEBUG
|
||||
|
||||
static ssize_t
|
||||
fs3d_write(int fd, const void* buf, size_t n)
|
||||
{
|
||||
return(WRITE(fd, buf, n));
|
||||
}
|
||||
|
||||
#undef error_info
|
||||
#define error_info _error_info_
|
||||
|
||||
Error_info_t _error_info_ = { 2, exit, fs3d_write };
|
||||
Error_info_t* _error_infop_ = &_error_info_;
|
||||
Error_info_t* _error_data_ = &_error_info_;
|
||||
|
||||
/*
|
||||
* print a name, converting unprintable chars
|
||||
*/
|
||||
|
||||
static void
|
||||
print(char** buf, char* end, register char* name, char* delim)
|
||||
{
|
||||
register char* s = *buf;
|
||||
register char* e = end;
|
||||
register int c;
|
||||
|
||||
while (c = *name++)
|
||||
{
|
||||
if (c & 0200)
|
||||
{
|
||||
c &= 0177;
|
||||
if (s >= e) break;
|
||||
*s++ = '?';
|
||||
}
|
||||
if (c < ' ')
|
||||
{
|
||||
c += 'A' - 1;
|
||||
if (s >= e) break;
|
||||
*s++ = '^';
|
||||
}
|
||||
if (s >= e) break;
|
||||
*s++ = c;
|
||||
}
|
||||
while (*delim)
|
||||
{
|
||||
if (s >= e) break;
|
||||
*s++ = *delim++;
|
||||
}
|
||||
*buf = s;
|
||||
}
|
||||
|
||||
void
|
||||
errorv(const char* lib, int level, va_list ap)
|
||||
{
|
||||
register int n;
|
||||
int fd;
|
||||
int flags;
|
||||
char* b;
|
||||
char* e;
|
||||
char* format;
|
||||
char buf[4096];
|
||||
|
||||
int line;
|
||||
char* file;
|
||||
|
||||
static int intercepted;
|
||||
|
||||
if (intercepted++)
|
||||
{
|
||||
intercepted--;
|
||||
return;
|
||||
}
|
||||
if (level > 0)
|
||||
{
|
||||
flags = level & ~ERROR_LEVEL;
|
||||
level &= ERROR_LEVEL;
|
||||
}
|
||||
else flags = 0;
|
||||
if ((fd = fsfd(&state.fs[FS_option])) <= 0 || level < error_info.trace || lib && (error_info.clear & ERROR_LIBRARY) || level < 0 && error_info.mask && !(error_info.mask & (1<<(-level - 1))))
|
||||
{
|
||||
if (level >= ERROR_FATAL) (*error_info.exit)(level - 1);
|
||||
intercepted--;
|
||||
return;
|
||||
}
|
||||
if (error_info.trace < 0) flags |= ERROR_LIBRARY|ERROR_SYSTEM;
|
||||
flags |= error_info.set;
|
||||
flags &= ~error_info.clear;
|
||||
if (!lib) flags &= ~ERROR_LIBRARY;
|
||||
e = (b = buf) + elementsof(buf) - 1;
|
||||
file = error_info.id;
|
||||
if (flags & ERROR_USAGE)
|
||||
{
|
||||
bprintf(&b, e, (flags & ERROR_NOID) ? " " : "Usage: ");
|
||||
if (file) print(&b, e, file, " ");
|
||||
}
|
||||
else if (level && !(flags & ERROR_NOID))
|
||||
{
|
||||
if (file) print(&b, e, file, (flags & ERROR_LIBRARY) ? " " : ": ");
|
||||
if (flags & ERROR_LIBRARY)
|
||||
bprintf(&b, e, "[%s library]: ", lib);
|
||||
}
|
||||
if (level > 0 && error_info.line > 0)
|
||||
{
|
||||
if (error_info.file && *error_info.file)
|
||||
bprintf(&b, e, "\"%s\", ", error_info.file);
|
||||
bprintf(&b, e, "line %d: ", error_info.line);
|
||||
}
|
||||
switch (level)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case ERROR_WARNING:
|
||||
error_info.warnings++;
|
||||
bprintf(&b, e, "warning: ");
|
||||
break;
|
||||
case ERROR_PANIC:
|
||||
error_info.errors++;
|
||||
bprintf(&b, e, "panic: ");
|
||||
break;
|
||||
default:
|
||||
if (level < 0)
|
||||
{
|
||||
if (error_info.trace < -1) bprintf(&b, e, "debug%d:%s", level, level > -10 ? " " : "");
|
||||
else bprintf(&b, e, "debug: ");
|
||||
for (n = 0; n < error_info.indent; n++)
|
||||
{
|
||||
*b++ = ' ';
|
||||
*b++ = ' ';
|
||||
}
|
||||
}
|
||||
else error_info.errors++;
|
||||
break;
|
||||
}
|
||||
if (flags & ERROR_OUTPUT) fd = va_arg(ap, int);
|
||||
if (flags & ERROR_SOURCE)
|
||||
{
|
||||
/*
|
||||
* source ([version], file, line) message
|
||||
*/
|
||||
|
||||
file = va_arg(ap, char*);
|
||||
line = va_arg(ap, int);
|
||||
if (error_info.version) bprintf(&b, e, "(%s: %s, line %d) ", error_info.version, file, line);
|
||||
else bprintf(&b, e, "(%s, line %d) ", file, line);
|
||||
}
|
||||
format = va_arg(ap, char*);
|
||||
bvprintf(&b, e, format, ap);
|
||||
if (!(flags & ERROR_PROMPT))
|
||||
{
|
||||
if ((flags & ERROR_SYSTEM) && errno && errno != error_info.last_errno)
|
||||
{
|
||||
n = state.in_2d;
|
||||
state.in_2d = 1;
|
||||
bprintf(&b, e, " [%s]", fmterror(errno));
|
||||
state.in_2d = n;
|
||||
if (error_info.set & ERROR_SYSTEM) errno = 0;
|
||||
error_info.last_errno = (level >= 0) ? 0 : errno;
|
||||
}
|
||||
*b++ = '\n';
|
||||
}
|
||||
*b = 0;
|
||||
if (error_info.write) (*error_info.write)(fd, buf, b - buf);
|
||||
if (level >= error_info.core && error_info.core)
|
||||
{
|
||||
signal(SIGQUIT, SIG_DFL);
|
||||
kill(getpid(), SIGQUIT);
|
||||
pause();
|
||||
}
|
||||
if (level >= ERROR_FATAL) (*error_info.exit)(level - ERROR_FATAL + 1);
|
||||
intercepted--;
|
||||
}
|
||||
|
||||
void
|
||||
error(int level, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, level);
|
||||
errorv(NiL, level, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
int
|
||||
errormsg(const char* dictionary, int level, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, level);
|
||||
errorv(dictionary, level, ap);
|
||||
va_end(ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
errorf(void* handle, void* discipline, int level, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, level);
|
||||
errorv(discipline ? *((char**)handle) : (char*)handle, (discipline || level < 0) ? level : (level | ERROR_LIBRARY), ap);
|
||||
va_end(ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(error)
|
||||
|
||||
#endif
|
|
@ -1,30 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
execv(const char* path, char* const argv[])
|
||||
{
|
||||
return(execve(path, argv, environ));
|
||||
}
|
|
@ -1,150 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if _hdr_alloca
|
||||
|
||||
#include <alloca.h>
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
fix(void)
|
||||
{
|
||||
if (state.brk.beg)
|
||||
{
|
||||
ssize_t n;
|
||||
|
||||
if (state.brk.end && (n = state.brk.end - state.brk.beg) > 0)
|
||||
{
|
||||
memset(state.brk.beg, 0, n);
|
||||
if ((char*)sbrk(0) == state.brk.end)
|
||||
sbrk(-n);
|
||||
}
|
||||
state.brk.beg = state.brk.end = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
execve3d(const char* path, char* const* aargv, char* const* aarge)
|
||||
{
|
||||
char** argv = (char**)aargv;
|
||||
char** arge = (char**)aarge;
|
||||
register char* sp;
|
||||
register char* ep;
|
||||
register int size;
|
||||
register int argn = 0;
|
||||
int n;
|
||||
char* tp;
|
||||
char buf[PATH_MAX];
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (!(sp = pathreal(path, 0, NiL)))
|
||||
return(-1);
|
||||
if (state.safe && !state.path.level)
|
||||
{
|
||||
errno = EPERM;
|
||||
return(-1);
|
||||
}
|
||||
if (*sp == '/')
|
||||
{
|
||||
#if HUH920211 /* mh corrupts static state strings */
|
||||
if (streq(sp, state.binsh)) sp = state.shell;
|
||||
#else
|
||||
if (streq(sp, "/bin/sh")) sp = state.shell;
|
||||
#endif
|
||||
}
|
||||
else if (!state.in_2d && --sp > state.path.name) *--sp = '.';
|
||||
sp = strncpy(buf, sp, sizeof(buf));
|
||||
if (state.level)
|
||||
{
|
||||
/*
|
||||
* make sure dot is set correctly if not top level
|
||||
*/
|
||||
|
||||
pathreal(state.pwd, 0, NiL);
|
||||
}
|
||||
if (arge == state.env + 1) arge--;
|
||||
else
|
||||
{
|
||||
register char** op = arge;
|
||||
|
||||
/*
|
||||
* compute size of environment pointers
|
||||
*/
|
||||
|
||||
while (*op++) argn++;
|
||||
argn += 2;
|
||||
argn *= sizeof(char*);
|
||||
}
|
||||
size = mapdump(NiL, NiL, MAP_EXEC);
|
||||
n = size + argn + 10;
|
||||
n = roundof(n, 32);
|
||||
#if _hdr_alloca
|
||||
state.brk.beg = (char*)alloca(n);
|
||||
#else
|
||||
state.brk.beg = (char*)sbrk(n);
|
||||
state.brk.end = (char*)sbrk(0);
|
||||
#endif
|
||||
ep = state.brk.beg + argn + 10 - sizeof(var_3d) + 1;
|
||||
tp = strcopy(ep, var_3d);
|
||||
size = mapdump(NiL, tp, MAP_EXEC);
|
||||
if (!keep(tp, size, 1))
|
||||
reclaim();
|
||||
else
|
||||
{
|
||||
if (argn)
|
||||
{
|
||||
register char** op = arge;
|
||||
register char** np;
|
||||
|
||||
arge = (char**)state.brk.beg;
|
||||
np = arge + 1;
|
||||
while (*np++ = *op++);
|
||||
}
|
||||
arge[0] = ep;
|
||||
}
|
||||
#if FS
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
{
|
||||
if (fssys(mp, MSG_exec))
|
||||
fscall(mp, MSG_exec, 0, sp, argv, arge);
|
||||
if (fssys(mp, MSG_close))
|
||||
{
|
||||
register File_t* fp;
|
||||
|
||||
for (fp = state.file; fp <= state.file + state.open; fp++)
|
||||
if ((fp->flags & FILE_OPEN) && ((fp->flags & FILE_CLOEXEC) || (size = FCNTL(fp - state.file, F_GETFD, NiL)) >= 0 && (size & FD_CLOEXEC)) && !FSTAT(fp - state.file, &state.path.st))
|
||||
fscall(mp, MSG_close, 0, fp - state.file, state.path.st.st_mtime);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
EXECVE(sp, argv, arge);
|
||||
reclaim();
|
||||
return(-1);
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
void
|
||||
_exit3d(int code)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
PULL_IN_3D;
|
||||
|
||||
initialize();
|
||||
#if FS
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_exit))
|
||||
fscall(mp, MSG_exit, 0, code, state.pid);
|
||||
#endif
|
||||
EXIT(code);
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if !defined(ACL3D) || !defined(SETACL)
|
||||
|
||||
#define aclent_t char
|
||||
|
||||
#endif
|
||||
|
||||
#define MSG_facl MSG_INIT(MSG_control, 051131, MSG_VAR_FILE)
|
||||
|
||||
int
|
||||
facl3d(int fd, int cmd, int cnt, aclent_t* buf)
|
||||
{
|
||||
register int r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_facl, 0, fd, cmd, cnt, buf))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
r = FACL(fd, cmd, cnt, buf);
|
||||
#if FS
|
||||
if (r >= 0)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_facl, 0, fd, cmd, cnt, buf);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_facl))
|
||||
fscall(mp, MSG_facl, 0, fd, cmd, cnt, buf);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(fchdir3d)
|
||||
|
||||
int
|
||||
fchdir3d(int fd)
|
||||
{
|
||||
Dir_t* dp;
|
||||
struct stat st;
|
||||
|
||||
if (fd >= 0 && fd < elementsof(state.file) && (dp = state.file[fd].dir) && !FSTAT(fd, &st) && dp->dev == st.st_dev && dp->ino == st.st_ino)
|
||||
chdir(dp->path);
|
||||
else if (FCHDIR(fd))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoP(fchdir)
|
||||
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef fchmod3d
|
||||
|
||||
int
|
||||
fchmod3d(int fd, mode_t mode)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_fchmod, 0, fd, mode))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FCHMOD(fd, mode))
|
||||
return(-1);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fchmod, 0, fd, mode);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fchmod))
|
||||
fscall(mp, MSG_fchmod, 0, fd, mode);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fchmod)
|
||||
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef fchown3d
|
||||
|
||||
int
|
||||
fchown3d(int fd, uid_t uid, gid_t gid)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_fchown, 0, fd, uid, gid))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FCHOWN(fd, uid, gid))
|
||||
return -1;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fchown, 0, fd, uid, gid);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fchown))
|
||||
fscall(mp, MSG_fchown, 0, fd, uid, gid);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fchown)
|
||||
|
||||
#endif
|
|
@ -1,73 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef fcntl3d
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
int
|
||||
fcntl3d(int fd, int op, ...)
|
||||
{
|
||||
register int r;
|
||||
int n;
|
||||
void* arg;
|
||||
va_list ap;
|
||||
|
||||
initialize();
|
||||
va_start(ap, op);
|
||||
arg = va_arg(ap, void*);
|
||||
va_end(ap);
|
||||
n = (int)integralof(arg);
|
||||
if (op == F_DUPFD && state.file[n].reserved)
|
||||
close(n);
|
||||
r = FCNTL(fd, op, arg);
|
||||
#if FS
|
||||
if (r >= 0 && r < elementsof(state.file))
|
||||
switch (op)
|
||||
{
|
||||
case F_DUPFD:
|
||||
fs3d_dup(fd, r);
|
||||
break;
|
||||
case F_SETFD:
|
||||
if (state.cache)
|
||||
{
|
||||
if (!(n & FD_CLOEXEC))
|
||||
state.file[fd].flags &= ~FILE_CLOEXEC;
|
||||
else if (!(state.file[fd].flags & FILE_OPEN))
|
||||
fileinit(fd, NiL, NiL, 1);
|
||||
else
|
||||
state.file[fd].flags |= FILE_CLOEXEC;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fcntl)
|
||||
|
||||
#endif
|
|
@ -1,68 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if _stream_peek
|
||||
#include <ast_tty.h>
|
||||
#include <stropts.h>
|
||||
#endif
|
||||
|
||||
#if _socket_peek
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
int fds[2];
|
||||
static char msg[] = "test";
|
||||
#if _stream_peek
|
||||
struct strpeek pk;
|
||||
#endif
|
||||
|
||||
if (pipe(fds) || write(fds[1], msg, sizeof(msg)) != sizeof(msg))
|
||||
return(0);
|
||||
#if _stream_peek
|
||||
pk.flags = 0;
|
||||
pk.ctlbuf.maxlen = -1;
|
||||
pk.ctlbuf.len = 0;
|
||||
pk.ctlbuf.buf = 0;
|
||||
pk.databuf.maxlen = sizeof(msg);
|
||||
pk.databuf.buf = msg;
|
||||
pk.databuf.len = 0;
|
||||
if (ioctl(fds[0], I_PEEK, &pk) > 0 && pk.databuf.len == sizeof(msg))
|
||||
{
|
||||
printf("#undef _socket_peek\n");
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
#if _socket_peek
|
||||
if (recv(fds[0], msg, sizeof(msg), MSG_PEEK) == sizeof(msg))
|
||||
{
|
||||
printf("#undef _stream_peek\n");
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
return(0);
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,51 +0,0 @@
|
|||
typ off64_t sys/stat.h
|
||||
|
||||
hdr alloca
|
||||
|
||||
lib syscall syscall.h sys/syscall.h
|
||||
|
||||
mem stat.st_atim,stat.st_fstype sys/types.h sys/stat.h
|
||||
mem DIR dirent.h -DDIRENT_ILLEGAL_ACCESS
|
||||
|
||||
tst fdview execute{
|
||||
#include <fcntl.h>
|
||||
#define VIEW 15
|
||||
main()
|
||||
{
|
||||
int fd;
|
||||
int oflags;
|
||||
int nflags;
|
||||
int xflags;
|
||||
if ((fd = open(argv[0], 0)) < 0) return(1);
|
||||
if ((oflags = fcntl(fd, F_GETFL, 0)) < 0) return(1);
|
||||
nflags = (oflags & 0xffff) | (VIEW<<16);
|
||||
if (fcntl(fd, F_SETFL, nflags) < 0) return(1);
|
||||
if ((xflags = fcntl(fd, F_GETFL, 0)) < 0) return(1);
|
||||
if (xflags != nflags) return(1);
|
||||
return(0);
|
||||
}
|
||||
}end pass{
|
||||
echo "#define getfdview(f) ((fcntl(f,F_GETFL,0)>>16)&037)"
|
||||
echo "#define setfdview(f,v) (fcntl(f,F_SETFL,(fcntl(f,F_GETFL,0)&0xffff)|(((v)&037)<<16)))"
|
||||
}end fail{
|
||||
echo "/* hack alert -- this is the view of the last user open */"
|
||||
echo "#define getfdview(f) (state.path.open_level)"
|
||||
echo "#define setfdview(f,v)"
|
||||
}end
|
||||
|
||||
tst no_exit_exit note{ exit() bypasses _exit() }end exec{
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
#ifdef __STDC__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#if _STD_
|
||||
void _exit(int code) { kill(getpid(), SIGKILL); }
|
||||
#else
|
||||
void _exit(code) int code; { kill(getpid(), SIGKILL); }
|
||||
#endif
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}end
|
|
@ -1,135 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if FS
|
||||
|
||||
#include <cs.h>
|
||||
|
||||
/*
|
||||
* called in the child process by fork()
|
||||
*/
|
||||
|
||||
static void
|
||||
forked(pid_t pid)
|
||||
{
|
||||
register int fd;
|
||||
register Fs_t* fs;
|
||||
register Mount_t* mp;
|
||||
char* type;
|
||||
long addr;
|
||||
long port;
|
||||
long clone;
|
||||
int nfd;
|
||||
pid_t ppid;
|
||||
char* b;
|
||||
|
||||
reclaim();
|
||||
ppid = state.pid;
|
||||
state.pid = pid;
|
||||
state.channel.internal = 0;
|
||||
for (fs = state.fs; fs < state.fs + elementsof(state.fs); fs++)
|
||||
{
|
||||
if ((fs->flags & FS_FORK) && fs->set)
|
||||
(*fs->set)(fs, state.null, 0, "fork", 4);
|
||||
if ((fs->flags & (FS_ERROR|FS_ON|FS_OPEN|FS_UNIQUE)) == (FS_ON|FS_OPEN|FS_UNIQUE))
|
||||
fsdrop(fs, 0);
|
||||
}
|
||||
for (mp = state.mount; mp < state.mount + elementsof(state.mount); mp++)
|
||||
if (mp->fs)
|
||||
switch (mp->fs->flags & (FS_ACTIVE|FS_ERROR|FS_GLOBAL|FS_MONITOR|FS_NAME|FS_ON))
|
||||
{
|
||||
case FS_ACTIVE|FS_ON:
|
||||
if (!fscall(mp, MSG_INIT(MSG_fork, 01511, 0), ppid, state.path.name, sizeof(state.path.name)) && state.ret > 0)
|
||||
{
|
||||
type = b = state.path.name;
|
||||
while (*b && *b != ' ') b++;
|
||||
if (*b) *b++ = 0;
|
||||
if (streq(type, "fdp")) fd = csrecv(&cs, mp->fs->fd, NiL, &nfd, 1) == 1 ? nfd : -1;
|
||||
else
|
||||
{
|
||||
addr = strtol(b, &b, 0);
|
||||
port = strtol(b, &b, 0);
|
||||
clone = strtol(b, &b, 0);
|
||||
fd = csbind(&cs, type, addr, port, clone);
|
||||
}
|
||||
if (fd >= 0)
|
||||
{
|
||||
FCNTL(fd, F_DUPFD, mp->fs->fd);
|
||||
CLOSE(fd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case FS_ACTIVE|FS_GLOBAL|FS_MONITOR|FS_ON:
|
||||
case FS_GLOBAL|FS_MONITOR|FS_ON:
|
||||
case FS_ACTIVE|FS_MONITOR|FS_ON:
|
||||
case FS_MONITOR|FS_ON:
|
||||
if (fssys(mp, MSG_fork))
|
||||
fscall(mp, MSG_fork, ppid);
|
||||
break;
|
||||
}
|
||||
|
||||
if (state.cache)
|
||||
for (fd = 0; fd <= state.cache; fd++)
|
||||
if ((mp = state.file[fd].mount) && !(mp->fs->flags & FS_ACTIVE) && fssys(mp, MSG_dup))
|
||||
fscall(mp, MSG_dup, fd, fd);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef fork3d
|
||||
|
||||
pid_t
|
||||
fork3d(void)
|
||||
{
|
||||
pid_t pid;
|
||||
|
||||
initialize();
|
||||
if (!(pid = FORK()) || pid == state.pid || pid == getpid())
|
||||
{
|
||||
pid = 0;
|
||||
#if FS
|
||||
forked(getpid());
|
||||
#else
|
||||
state.pid = getpid();
|
||||
#endif
|
||||
}
|
||||
#if FS
|
||||
else
|
||||
{
|
||||
register Mount_t* mp;
|
||||
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fork))
|
||||
fscall(mp, MSG_fork, pid);
|
||||
}
|
||||
#endif
|
||||
return(pid);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fork)
|
||||
|
||||
#endif
|
|
@ -1,61 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef fpathconf3d
|
||||
|
||||
long
|
||||
fpathconf3d(int fd, int op)
|
||||
{
|
||||
long r;
|
||||
int oerrno;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_fpathconf, 0, fd, op))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
oerrno = errno;
|
||||
errno = 0;
|
||||
r = FPATHCONF(fd, op);
|
||||
if (!errno)
|
||||
{
|
||||
errno = oerrno;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fpathconf, 0, fd, op);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fpathconf))
|
||||
fscall(mp, MSG_fpathconf, 0, fd, op);
|
||||
#endif
|
||||
}
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fpathconf)
|
||||
|
||||
#endif
|
670
src/cmd/3d/fs.c
670
src/cmd/3d/fs.c
|
@ -1,670 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d mounted fs support
|
||||
*
|
||||
* NOTE: be vewwwy careful with errno
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if FS
|
||||
|
||||
#include <cs.h>
|
||||
|
||||
#define DEVFD "/dev/fd"
|
||||
#define MNTFD "path\n"
|
||||
#define MNTNAM "/dev/tcp/*"
|
||||
|
||||
/*
|
||||
* initialize mount channel and return fs fd for mp
|
||||
*/
|
||||
|
||||
int
|
||||
fschannel(register Mount_t* mp)
|
||||
{
|
||||
register Fs_t* fs;
|
||||
register int fd;
|
||||
|
||||
if (mp->channel == -1)
|
||||
return -1;
|
||||
fs = mp->fs;
|
||||
if (mp->channel && fs->fd)
|
||||
return fs->fd;
|
||||
if ((fd = fsfd(fs)) <= 0)
|
||||
return -1;
|
||||
if (mp->channel)
|
||||
return fs->fd;
|
||||
mp->channel = 1;
|
||||
mp->flags |= MOUNT_PRIMARY;
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* generate phony monitor open for fd inherited from parent
|
||||
*/
|
||||
|
||||
static void
|
||||
fsphony(register Mount_t* mp, register File_t* fp, int fd)
|
||||
{
|
||||
register ssize_t n;
|
||||
int nd;
|
||||
Mount_t* np;
|
||||
char buf[64];
|
||||
|
||||
state.kernel++;
|
||||
fp->flags |= FILE_LOCK;
|
||||
*buf = 0;
|
||||
if (!(np = getmount(MNTNAM, NiL)) || (nd = fsfd(np->fs)) < 0)
|
||||
sfsprintf(buf, sizeof(buf), "%s/%d", DEVFD, fd);
|
||||
else if (!(np->fs->flags & FS_LOCK) && WRITE(nd, MNTFD, sizeof(MNTFD) - 1) == sizeof(MNTFD) - 1)
|
||||
{
|
||||
np->fs->flags |= FS_LOCK;
|
||||
if (!cssend(&cs, nd, &fd, 1) && (n = READ(nd, buf, sizeof(buf))) > 1)
|
||||
buf[n - 1] = 0;
|
||||
np->fs->flags &= ~FS_LOCK;
|
||||
}
|
||||
state.kernel--;
|
||||
if (*buf)
|
||||
{
|
||||
fp->open |= (1<<(mp-state.mount));
|
||||
message((-3, "fs: phony: %s", buf));
|
||||
fscall(mp, MSG_open, fd, buf, fp->oflag, 0, 0);
|
||||
}
|
||||
fp->flags &= ~FILE_LOCK;
|
||||
}
|
||||
|
||||
/*
|
||||
* return real fd for up under mount mp to be accessed by call
|
||||
* return value stuck in tail portion of state.path.name
|
||||
*/
|
||||
|
||||
char*
|
||||
fsreal(register Mount_t* mp, long call, const char* up)
|
||||
{
|
||||
char dev[2 * PATH_MAX + 3];
|
||||
register char* s = dev;
|
||||
register Fs_t* fs = mp->fs;
|
||||
register int n;
|
||||
register int fd;
|
||||
int lz;
|
||||
int pz;
|
||||
|
||||
if (!(lz = mp->logicalsize))
|
||||
lz = strlen(mp->logical);
|
||||
if (!(pz = mp->physicalsize) && mp->physical)
|
||||
pz = strlen(mp->physical);
|
||||
n = sfsprintf(s, sizeof(dev) - 1, "%s %-*s %s%s%-*s pwd=%s%s%s", msgname(call), lz, mp->logical, up, pz ? " physical=" : "", pz, mp->physical ? mp->physical : "", state.pwd, mp->fs->attr, mp->attr);
|
||||
s[n] = 0;
|
||||
message((-2, "fs: %s: real: service=%-*s request=\"%s\"", fs->special, fs->servicesize, fs->service, s));
|
||||
s[n++] = '\n';
|
||||
if ((fd = fsfd(fs)) <= 0)
|
||||
return 0;
|
||||
s = state.path.name + PATH_MAX;
|
||||
if (write(fd, dev, n) != n || (n = csread(&cs, fd, s, PATH_MAX, CS_LINE)) <= 0)
|
||||
{
|
||||
fsdrop(fs, 0);
|
||||
return 0;
|
||||
}
|
||||
if (n <= 1)
|
||||
return 0;
|
||||
s[n - 1] = 0;
|
||||
if (s[0] >= 'A' && s[0] <= 'Z' && s[1] == ' ')
|
||||
{
|
||||
message((-2, "fs: %s: real: %s", fs->special, s + 2));
|
||||
return 0;
|
||||
}
|
||||
message((-2, "fs: %s: real: path=%s", fs->special, s));
|
||||
return s;
|
||||
}
|
||||
|
||||
/*
|
||||
* do fs call
|
||||
* -1 returned if not mounted
|
||||
* 0 returned if mounted with state.ret call return value
|
||||
* state.path.monitor set if monitor or name service mount
|
||||
*/
|
||||
|
||||
int
|
||||
fscall(register Mount_t* mp, long call, int ret, ...)
|
||||
{
|
||||
register Fs_t* fs;
|
||||
register int retry;
|
||||
register int tries;
|
||||
const char* up;
|
||||
const char* sp;
|
||||
int cd;
|
||||
int fd;
|
||||
int oerrno;
|
||||
int m;
|
||||
long n;
|
||||
File_t* fp;
|
||||
Handler_t handler;
|
||||
Msg_return_t* rp;
|
||||
Msg_return_t rv;
|
||||
void** xp;
|
||||
void* xv[2];
|
||||
int* ip;
|
||||
Msg_file_t iv[2];
|
||||
va_list ap;
|
||||
|
||||
oerrno = errno;
|
||||
initialize();
|
||||
state.ret = -1;
|
||||
if (state.in_2d)
|
||||
return -1;
|
||||
up = 0;
|
||||
/* proto workaround */
|
||||
va_start(ap, ret); va_end(ap);
|
||||
if (!mp)
|
||||
{
|
||||
state.path.monitor = 0;
|
||||
state.path.mount = 0;
|
||||
sp = 0;
|
||||
va_start(ap, ret);
|
||||
switch (MSG_ARG(call, 1))
|
||||
{
|
||||
case MSG_ARG_file:
|
||||
fd = va_arg(ap, int);
|
||||
if (fd < 0 || fd >= elementsof(state.file))
|
||||
goto nope;
|
||||
if (!state.kernel && (mp = state.global) && !((fp = &state.file[fd])->flags & FILE_LOCK)) do
|
||||
{
|
||||
if (fssys(mp, MSG_open) && ((fp->flags & FILE_OPEN) || !fileinit(fd, NiL, NiL, 0)))
|
||||
{
|
||||
fs = mp->fs;
|
||||
if ((!(fs->flags & FS_REGULAR) || (fp->flags & FILE_REGULAR)) && (!(fs->flags & FS_WRITE) || (fp->flags & FILE_WRITE)) && ((mp->flags & MOUNT_PRIMARY) || fd > 2) && !(fp->open & (1<<(mp-state.mount))))
|
||||
fsphony(mp, fp, fd);
|
||||
}
|
||||
} while (mp = mp->global);
|
||||
mp = fgetmount(fd);
|
||||
n = FS_ERROR|FS_INIT|FS_LOCK|FS_NAME|FS_ON;
|
||||
break;
|
||||
case MSG_ARG_string:
|
||||
sp = va_arg(ap, const char*);
|
||||
if (sp != state.path.name)
|
||||
sp = pathreal(sp, P_PATHONLY|P_ABSOLUTE, NiL);
|
||||
if (sp) mp = getmount(sp, &up);
|
||||
n = FS_ERROR|FS_INIT|FS_LOCK|FS_ON;
|
||||
break;
|
||||
}
|
||||
va_end(ap);
|
||||
if (!mp || ((fs = mp->fs)->flags & n) != FS_ON)
|
||||
goto nope;
|
||||
if (fs->flags & FS_MONITOR)
|
||||
{
|
||||
if (!state.kernel && (fs->call & MSG_MASK(call)))
|
||||
{
|
||||
if (sp && fs->match)
|
||||
{
|
||||
if (fs->matchsize)
|
||||
{
|
||||
cd = fs->match[fs->matchsize];
|
||||
fs->match[fs->matchsize] = 0;
|
||||
}
|
||||
if (strmatch(sp, fs->match))
|
||||
state.path.monitor = mp;
|
||||
if (fs->matchsize)
|
||||
fs->match[fs->matchsize] = cd;
|
||||
}
|
||||
else state.path.monitor = mp;
|
||||
}
|
||||
goto nope;
|
||||
}
|
||||
}
|
||||
else if (((fs = mp->fs)->flags & (FS_ERROR|FS_INIT|FS_LOCK|FS_ON)) != FS_ON)
|
||||
goto nope;
|
||||
if (!(fs->call & MSG_MASK(call)))
|
||||
goto nope;
|
||||
if (fs->flags & FS_MONITOR)
|
||||
{
|
||||
if (state.kernel)
|
||||
goto nope;
|
||||
if (MSG_ARG(call, 1) == MSG_ARG_file)
|
||||
{
|
||||
va_start(ap, ret);
|
||||
fd = va_arg(ap, int);
|
||||
va_end(ap);
|
||||
if (fd < 0 || fd >= elementsof(state.file))
|
||||
goto nope;
|
||||
fp = &state.file[fd];
|
||||
if (fp->flags & FILE_LOCK)
|
||||
goto nope;
|
||||
if (!(fp->flags & FILE_OPEN) && fileinit(fd, NiL, NiL, 0))
|
||||
goto nope;
|
||||
if ((fs->flags & FS_REGULAR) && !(fp->flags & FILE_REGULAR) || (fs->flags & FS_WRITE) && !(fp->flags & FILE_WRITE))
|
||||
goto nope;
|
||||
if (fssys(mp, MSG_open) && ((mp->flags & MOUNT_PRIMARY) || fd > 2) && !(fp->open & (1<<(mp-state.mount))))
|
||||
fsphony(mp, fp, fd);
|
||||
}
|
||||
else if (call == MSG_open)
|
||||
{
|
||||
if (fsmount(mp) < 0)
|
||||
goto nope;
|
||||
if (fs->flags & FS_WRITE)
|
||||
{
|
||||
va_start(ap, ret);
|
||||
va_arg(ap, const char*);
|
||||
n = va_arg(ap, int);
|
||||
va_end(ap);
|
||||
if ((n & O_ACCMODE) == O_RDONLY)
|
||||
goto nope;
|
||||
}
|
||||
}
|
||||
if (MSG_ARG(call, 0) == MSG_ARG_file)
|
||||
{
|
||||
fp = &state.file[ret];
|
||||
fp->open |= (1<<(mp-state.mount));
|
||||
rv.file = fp->id;
|
||||
}
|
||||
else rv.number = ret;
|
||||
rp = &rv;
|
||||
}
|
||||
else if (call == MSG_open)
|
||||
{
|
||||
int oflag;
|
||||
int mode;
|
||||
int level;
|
||||
|
||||
fs->flags |= FS_LOCK;
|
||||
va_start(ap, ret);
|
||||
sp = va_arg(ap, const char*);
|
||||
oflag = va_arg(ap, int);
|
||||
mode = va_arg(ap, int);
|
||||
level = va_arg(ap, int);
|
||||
va_end(ap);
|
||||
message((-3, "fs: %s: open: path=%s", fs->special, sp));
|
||||
if (fs == &state.fs[FS_fd])
|
||||
{
|
||||
const char* ep;
|
||||
|
||||
if ((fd = OPEN(sp, oflag, mode)) >= 0)
|
||||
{
|
||||
state.ret = fd;
|
||||
goto unlock;
|
||||
}
|
||||
fd = strtol(up, (char**)&ep, 0);
|
||||
if (*ep)
|
||||
{
|
||||
oerrno = ENOENT;
|
||||
goto unlock;
|
||||
}
|
||||
if ((n = FCNTL(fd, F_GETFL, 0)) < 0)
|
||||
{
|
||||
oerrno = errno;
|
||||
goto unlock;
|
||||
}
|
||||
n &= O_ACCMODE;
|
||||
oflag &= O_ACCMODE;
|
||||
if (n == O_RDONLY && oflag == O_WRONLY || n == O_WRONLY && oflag == O_RDONLY)
|
||||
{
|
||||
oerrno = EPERM;
|
||||
goto unlock;
|
||||
}
|
||||
if ((state.ret = FCNTL(fd, F_DUPFD, 0)) < 0)
|
||||
oerrno = errno;
|
||||
}
|
||||
else if ((sp = (const char*)fsreal(mp, MSG_open, up)) && (fd = fsfd(mp->fs)) > 0)
|
||||
{
|
||||
/*
|
||||
* /#<id>/[#]<path> for active fd's
|
||||
* /#<id>\n written back to initialize
|
||||
*/
|
||||
|
||||
if (sp[0] == '/' && sp[1] == '#')
|
||||
{
|
||||
up = sp;
|
||||
if (!(sp = strchr(sp + 2, '/')))
|
||||
{
|
||||
sp = up;
|
||||
up = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m = sp - up;
|
||||
if (sp[1] == '#')
|
||||
sp += 2;
|
||||
}
|
||||
}
|
||||
else up = 0;
|
||||
if (streq(sp, DEVFD))
|
||||
{
|
||||
cd = -1;
|
||||
while (csrecv(&cs, fd, NiL, &cd, 1) != 1 && errno == EINTR);
|
||||
fd = cd;
|
||||
}
|
||||
else if ((fd = fs3d_open(sp, oflag, mode)) == -1)
|
||||
oerrno = errno;
|
||||
if (fd >= 0 && up)
|
||||
{
|
||||
*((char*)up + m++) = '\n';
|
||||
if (write(fd, up, m) != m)
|
||||
fd = -1;
|
||||
else
|
||||
{
|
||||
if (fd > state.cache)
|
||||
state.cache = fd;
|
||||
fp = &state.file[fd];
|
||||
fp->open = ~0;
|
||||
fp->flags = FILE_OPEN;
|
||||
fp->mount = mp;
|
||||
}
|
||||
}
|
||||
state.ret = fd;
|
||||
}
|
||||
goto unlock;
|
||||
}
|
||||
else
|
||||
rp = 0;
|
||||
if (fs->flags & FS_NAME)
|
||||
{
|
||||
if (up && fs != &state.fs[FS_fd])
|
||||
{
|
||||
state.path.monitor = mp;
|
||||
state.path.mount = (char*)up;
|
||||
}
|
||||
goto nope;
|
||||
}
|
||||
if (MSG_MASK(call) & (MSG_MASK(MSG_close)|MSG_MASK(MSG_dup)))
|
||||
goto nope;
|
||||
message((-3, "fs: %s: %s: call", fs->special, msgname(call)));
|
||||
fs->flags |= FS_LOCK;
|
||||
if (fs->terse & MSG_MASK(call))
|
||||
{
|
||||
tries = MSG_ARG_CALL;
|
||||
for (;;)
|
||||
{
|
||||
tries += MSG_ARG_TYPE;
|
||||
switch ((call >> tries) & ((1 << MSG_ARG_TYPE) - 1))
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case MSG_ARG_output:
|
||||
if (!(fs->flags & FS_MONITOR)) break;
|
||||
/*FALLTHROUGH*/
|
||||
case MSG_ARG_input:
|
||||
case MSG_ARG_vector:
|
||||
call = (call & ~(((1 << MSG_ARG_TYPE) - 1) << tries)) | (MSG_ARG_number << tries);
|
||||
continue;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (fs->flags & FS_ACTIVE)
|
||||
{
|
||||
if (!(fs->flags & FS_MONITOR))
|
||||
call |= MSG_RETURN;
|
||||
else if (fs->ack & MSG_MASK(call))
|
||||
call |= (fs->flags & FS_INTERACTIVE) ? MSG_RETURN : MSG_ACK;
|
||||
retry = fs->retry;
|
||||
}
|
||||
else retry = 0;
|
||||
if ((fs->flags & FS_FLUSH) && (call |= MSG_FLUSH) || retry)
|
||||
handler = signal(SIGPIPE, SIG_IGN);
|
||||
tries = 1;
|
||||
for (;;)
|
||||
{
|
||||
if ((cd = fsmount(mp)) < 0)
|
||||
{
|
||||
message((-2, "fs: %s: %s: connect error on try %d", fs->special, msgname(call), tries));
|
||||
goto unlock;
|
||||
}
|
||||
va_start(ap, ret);
|
||||
xp = xv;
|
||||
switch (MSG_ARG(call, 1))
|
||||
{
|
||||
case MSG_ARG_file:
|
||||
fd = va_arg(ap, int);
|
||||
if (!(fs->flags & FS_MONITOR))
|
||||
cd = fd;
|
||||
*xp++ = (void*)&state.file[fd].id;
|
||||
break;
|
||||
case MSG_ARG_string:
|
||||
sp = va_arg(ap, const char*);
|
||||
if (MSG_VAR(call) == MSG_VAR_FILE)
|
||||
{
|
||||
if (!(fs->flags & FS_MONITOR))
|
||||
sp = up;
|
||||
else if (sp != state.path.name && !(sp = (const char*)pathreal(sp, P_PATHONLY|P_ABSOLUTE, NiL)))
|
||||
goto unlock;
|
||||
}
|
||||
*xp++ = (void*)sp;
|
||||
break;
|
||||
case MSG_ARG_output:
|
||||
if (call == MSG_pipe)
|
||||
{
|
||||
ip = va_arg(ap, int*);
|
||||
for (n = 0; n < 2; n++)
|
||||
{
|
||||
fp = &state.file[ip[n]];
|
||||
if (!(fp->flags & FILE_OPEN))
|
||||
fileinit(ip[n], NiL, NiL, 0);
|
||||
fp->open |= (1<<(mp-state.mount));
|
||||
iv[n] = fp->id;
|
||||
*xp++ = (void*)iv;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
xp = 0;
|
||||
break;
|
||||
}
|
||||
if (xp)
|
||||
{
|
||||
*xp = 0;
|
||||
xp = xv;
|
||||
}
|
||||
n = msgvcall(cd, MSG_CHANNEL(state.pid, mp->channel), call, rp, xp, ap);
|
||||
va_end(ap);
|
||||
if (n != -1)
|
||||
break;
|
||||
if (errno != EMSGIO)
|
||||
{
|
||||
if (!(fs->flags & FS_MONITOR))
|
||||
oerrno = errno;
|
||||
break;
|
||||
}
|
||||
message((-2, "fs: %s: %s: error on try %d", fs->special, msgname(call), tries));
|
||||
if (tries++ > retry)
|
||||
break;
|
||||
fsdrop(fs, 0);
|
||||
}
|
||||
if ((fs->flags & FS_FLUSH) || retry)
|
||||
signal(SIGPIPE, handler);
|
||||
if (fs->flags & FS_ACTIVE)
|
||||
{
|
||||
if ((state.ret = n) > 0 && (fs->flags & (FS_ACTIVE|FS_INTERACTIVE|FS_MONITOR)) == (FS_ACTIVE|FS_INTERACTIVE|FS_MONITOR) && (fs->ack & MSG_MASK(call)))
|
||||
{
|
||||
char buf[TABLE_MAX];
|
||||
|
||||
if ((n = READ(cd, buf, sizeof(buf))) > 1)
|
||||
{
|
||||
buf[n - 1] = 0;
|
||||
mapinit(buf, 0);
|
||||
}
|
||||
else message((-3, "fs: %s: %s: interactive ack failed", fs->special, msgname(call)));
|
||||
}
|
||||
}
|
||||
else if (!(fs->flags & FS_MONITOR))
|
||||
{
|
||||
oerrno = errno = ENODEV;
|
||||
message((-3, "fs: %s: %s: return: passive fs", fs->special, msgname(call)));
|
||||
}
|
||||
else if (fs->ack & MSG_MASK(call))
|
||||
{
|
||||
oerrno = errno = ENODEV;
|
||||
message((-3, "fs: %s: %s: ack: passive fs", fs->special, msgname(call)));
|
||||
}
|
||||
else state.ret = 0;
|
||||
unlock:
|
||||
fs->flags &= ~FS_LOCK;
|
||||
errno = oerrno;
|
||||
return 0;
|
||||
nope:
|
||||
errno = oerrno;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* initialize mounted fs and return device service fd
|
||||
*/
|
||||
|
||||
int
|
||||
fsinit(register Fs_t* fs, int fd)
|
||||
{
|
||||
int n;
|
||||
int oerrno;
|
||||
|
||||
if (fd < 0 && (fs->flags & (FS_BOUND|FS_ERROR|FS_INIT|FS_ON)) != (FS_BOUND|FS_ON) || state.kernel && (fs->flags & FS_GLOBAL))
|
||||
return -1;
|
||||
oerrno = errno;
|
||||
fs->flags |= FS_INIT;
|
||||
if ((fs->flags & (FS_ON|FS_OPEN)) != (FS_ON|FS_OPEN))
|
||||
{
|
||||
state.kernel++;
|
||||
if ((fs->fd = fd) < 0)
|
||||
{
|
||||
char* svc;
|
||||
char buf[PATH_MAX];
|
||||
|
||||
if (n = fs->servicesize)
|
||||
{
|
||||
if (n >= sizeof(buf)) n = sizeof(buf) - 1;
|
||||
svc = (char*)memcpy(buf, fs->service, n);
|
||||
svc[n] = 0;
|
||||
}
|
||||
else svc = fs->service;
|
||||
message((-3, "fs: %s: init#1: service=%s", fs->special, svc));
|
||||
#if FS
|
||||
fs->fd = cslocal(&cs, svc);
|
||||
message((-3, "fs: %s: init#2: service=%s cslocal=%d", fs->special, svc, fs->fd));
|
||||
if (fs->fd >= 0)
|
||||
{
|
||||
if (fs->flags & FS_RECEIVE)
|
||||
{
|
||||
n = csrecv(&cs, fs->fd, NiL, &fd, 1);
|
||||
CLOSE(fs->fd);
|
||||
fs->fd = n == 1 ? fd : -1;
|
||||
}
|
||||
}
|
||||
else if (errno == ENOENT)
|
||||
#endif
|
||||
fs->fd = fs3d_open(svc, O_CREAT|O_RDWR|O_APPEND, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
|
||||
}
|
||||
if (fs->fd < 0 || FSTAT(fs->fd, &fs->st))
|
||||
{
|
||||
fs->fd = -1;
|
||||
fs->flags |= FS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fs->flags & FS_CLOSE)
|
||||
FCNTL(fs->fd, F_SETFD, FD_CLOEXEC);
|
||||
if (S_ISREG(fs->st.st_mode))
|
||||
fs->flags &= ~FS_ACTIVE;
|
||||
fs->flags |= FS_ON|FS_OPEN;
|
||||
reserve(&fs->fd);
|
||||
if (fd < 0)
|
||||
message((-3, "fs: %s: init#3: service=%-*s fd=%d cache=%d", fs->special, fs->servicesize ? fs->servicesize : strlen(fs->service), fs->service, fs->fd, state.cache));
|
||||
}
|
||||
state.kernel--;
|
||||
}
|
||||
fs->flags &= ~FS_INIT;
|
||||
errno = oerrno;
|
||||
return fs->fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* drop internal 3d mount
|
||||
* if clear!=0 then path binding also cleared
|
||||
*/
|
||||
|
||||
void
|
||||
fsdrop(register Fs_t* fs, int clear)
|
||||
{
|
||||
int oerrno;
|
||||
|
||||
state.kernel++;
|
||||
oerrno = errno;
|
||||
message((-3, "fs: %s: drop:%s", fs->special, clear ? " clear" : state.null));
|
||||
if (fs->flags & FS_OPEN)
|
||||
{
|
||||
fs->flags &= ~FS_OPEN;
|
||||
cancel(&fs->fd);
|
||||
}
|
||||
fs->flags &= ~FS_ERROR;
|
||||
if (clear)
|
||||
{
|
||||
#if FS
|
||||
if (fs->flags & FS_FS)
|
||||
{
|
||||
register int n;
|
||||
register int m;
|
||||
register Mount_t* mp;
|
||||
|
||||
for (n = 0; n <= state.cache; n++)
|
||||
if ((mp = state.file[n].mount) && mp->fs == fs)
|
||||
state.file[n].mount = 0;
|
||||
for (n = m = 0; n < state.vmount.size; n++)
|
||||
{
|
||||
if (((Mount_t*)state.vmount.table[n].val)->fs != fs)
|
||||
{
|
||||
if (n != m)
|
||||
state.vmount.table[m] = state.vmount.table[n];
|
||||
m++;
|
||||
}
|
||||
else if (state.vmount.table[n].valsize & T_ALLOCATE)
|
||||
free(state.vmount.table[n].key);
|
||||
}
|
||||
state.vmount.size = m;
|
||||
for (n = 0; n < elementsof(state.mount); n++)
|
||||
if (state.mount[n].fs == fs)
|
||||
{
|
||||
state.mount[n].fs = 0;
|
||||
if (state.mount[n].physical && !state.mount[n].physicalsize)
|
||||
{
|
||||
free(state.mount[n].physical);
|
||||
state.mount[n].physical = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (fs->flags & FS_INTERNAL) fs->flags &= ~(FS_BOUND|FS_ON);
|
||||
else
|
||||
{
|
||||
fs->flags = 0;
|
||||
if (fs->service && !fs->servicesize)
|
||||
{
|
||||
free(fs->service);
|
||||
fs->service = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
errno = oerrno;
|
||||
state.kernel--;
|
||||
}
|
|
@ -1,134 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma noprototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide fstat
|
||||
#else
|
||||
#define fstat ______fstat
|
||||
#endif
|
||||
|
||||
#define _def_syscall_3d 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef _def_syscall_3d
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide fstat
|
||||
#else
|
||||
#undef fstat
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
/* the 3 arg _fxstat() disrupts our proto game -- every party needs one */
|
||||
#if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
|
||||
int fstat3d(int fd, struct stat* st)
|
||||
#else
|
||||
#if defined(_FSTAT)
|
||||
int _fstat(fd, st) int fd; struct stat* st; { return fstat(fd, st); }
|
||||
#endif
|
||||
int fstat(fd, st) int fd; struct stat* st;
|
||||
#endif
|
||||
{
|
||||
int oerrno;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!state.kernel)
|
||||
{
|
||||
if (!fscall(NiL, MSG_fstat, 0, fd, st))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
}
|
||||
#endif
|
||||
#ifdef _3D_STAT_VER
|
||||
if (FXSTAT(_3d_ver, fd, st))
|
||||
return -1;
|
||||
#else
|
||||
if (FSTAT(fd, st))
|
||||
return -1;
|
||||
#endif
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
if (state.kernel)
|
||||
return 0;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fstat, 0, fd, st);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fstat))
|
||||
fscall(mp, MSG_fstat, 0, fd, st);
|
||||
#endif
|
||||
oerrno = errno;
|
||||
#ifdef _3D_STAT64_VER
|
||||
if (_3d_ver == _3D_STAT64_VER)
|
||||
IVIEW(((struct stat64*)st), getfdview(fd));
|
||||
else
|
||||
#endif
|
||||
IVIEW(st, getfdview(fd));
|
||||
errno = oerrno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && defined(STAT643D) && !defined(_3D_STAT64_VER)
|
||||
|
||||
int
|
||||
fstat643d(int fd, struct stat64* st)
|
||||
{
|
||||
int oerrno;
|
||||
struct stat ss;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!state.kernel)
|
||||
{
|
||||
if (!fscall(NiL, MSG_fstat, 0, fd, &ss))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
}
|
||||
#endif
|
||||
if (FSTAT64(fd, st))
|
||||
return -1;
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
if (state.kernel)
|
||||
return 0;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fstat, 0, fd, st);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fstat))
|
||||
fscall(mp, MSG_fstat, 0, fd, st);
|
||||
#endif
|
||||
oerrno = errno;
|
||||
IVIEW(st, getfdview(fd));
|
||||
errno = oerrno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,176 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide fstatfs
|
||||
#else
|
||||
#define fstatfs ______fstatfs
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(fstatfs3d) && ( _sys_statfs || _sys_vfs || _sys_mount && _mem_f_files_statfs )
|
||||
|
||||
#include <cs_lib.h>
|
||||
|
||||
#if _sys_statfs
|
||||
#include <sys/statfs.h>
|
||||
#else
|
||||
#if _sys_vfs
|
||||
#include <sys/vfs.h>
|
||||
#define _vfs_statfs 1
|
||||
#else
|
||||
#if _sys_mount
|
||||
#if _lib_getmntinfo
|
||||
#include <sys/param.h> /* expect some macro redefinitions here */
|
||||
#endif
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide fstatfs
|
||||
#else
|
||||
#undef fstatfs
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
#if _vfs_statfs
|
||||
#define VFS (fs)
|
||||
#else
|
||||
#define VFS (&vfs)
|
||||
#endif
|
||||
|
||||
#if ARG3D_fstatfs == 4
|
||||
|
||||
int
|
||||
fstatfs3d(int fd, struct statfs* fs, int size, int type)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#if !_vfs_statfs
|
||||
struct statvfs vfs;
|
||||
#endif
|
||||
|
||||
if (!fscall(NiL, MSG_fstatfs, 0, fd, VFS, size, type))
|
||||
{
|
||||
#if !_vfs_statfs
|
||||
if (!state.ret)
|
||||
{
|
||||
memset(fs, 0, sizeof(*fs));
|
||||
fs->f_bsize = vfs.f_bsize;
|
||||
fs->f_blocks = vfs.f_blocks;
|
||||
fs->f_bfree = vfs.f_bfree;
|
||||
fs->f_files = vfs.f_files;
|
||||
fs->f_ffree = vfs.f_ffree;
|
||||
}
|
||||
#endif
|
||||
return state.ret;
|
||||
}
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FSTATFS(fd, fs, size, type))
|
||||
return -1;
|
||||
#if FS
|
||||
#if !_vfs_statfs
|
||||
if (mp || state.global)
|
||||
{
|
||||
memset(&vfs, 0, sizeof(vfs));
|
||||
vfs.f_bsize = fs->f_bsize;
|
||||
vfs.f_blocks = fs->f_blocks;
|
||||
vfs.f_bfree = fs->f_bfree;
|
||||
vfs.f_files = fs->f_files;
|
||||
vfs.f_ffree = fs->f_ffree;
|
||||
}
|
||||
#endif
|
||||
if (mp)
|
||||
fscall(mp, MSG_fstatfs, 0, fd, VFS, size, type);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fstatfs))
|
||||
fscall(mp, MSG_fstatfs, 0, fd, VFS, size, type);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
fstatfs3d(int fd, struct statfs* fs)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#if !_vfs_statfs
|
||||
struct statvfs vfs;
|
||||
#endif
|
||||
|
||||
if (!fscall(NiL, MSG_fstatfs, 0, fd, VFS))
|
||||
{
|
||||
#if !_vfs_statfs
|
||||
if (!state.ret)
|
||||
{
|
||||
memset(fs, 0, sizeof(*fs));
|
||||
fs->f_bsize = vfs.f_bsize;
|
||||
fs->f_blocks = vfs.f_blocks;
|
||||
fs->f_bfree = vfs.f_bfree;
|
||||
fs->f_files = vfs.f_files;
|
||||
fs->f_ffree = vfs.f_ffree;
|
||||
}
|
||||
#endif
|
||||
return state.ret;
|
||||
}
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FSTATFS(fd, fs))
|
||||
return -1;
|
||||
#if FS
|
||||
#if !_vfs_statfs
|
||||
if (mp || state.global)
|
||||
{
|
||||
memset(&vfs, 0, sizeof(vfs));
|
||||
vfs.f_bsize = fs->f_bsize;
|
||||
vfs.f_blocks = fs->f_blocks;
|
||||
vfs.f_bfree = fs->f_bfree;
|
||||
vfs.f_files = fs->f_files;
|
||||
vfs.f_ffree = fs->f_ffree;
|
||||
}
|
||||
#endif
|
||||
if (mp)
|
||||
fscall(mp, MSG_fstatfs, 0, fd, VFS);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fstatfs))
|
||||
fscall(mp, MSG_fstatfs, 0, fd, VFS);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
NoN(fstatfs)
|
||||
|
||||
#endif
|
|
@ -1,56 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(fstatvfs3d) && defined(_sys_statvfs)
|
||||
|
||||
#include <sys/statvfs.h>
|
||||
|
||||
int
|
||||
fstatvfs3d(int fd, struct statvfs* fs)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_fstatfs, 0, fd, fs))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FSTATVFS(fd, fs))
|
||||
return(-1);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fstatfs, 0, fd, fs);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fstatfs))
|
||||
fscall(mp, MSG_fstatfs, 0, fd, fs);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fstatvfs)
|
||||
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef fsync3d
|
||||
|
||||
int
|
||||
fsync3d(int fd)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_fsync, 0, fd))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FSYNC(fd))
|
||||
return(-1);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_fsync, 0, fd);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_fsync))
|
||||
fscall(mp, MSG_fsync, 0, fd);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(fsync)
|
||||
|
||||
#endif
|
|
@ -1,104 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef ftruncate3d
|
||||
|
||||
#if !_nosys_ftruncate64 && _typ_off64_t
|
||||
|
||||
#undef off_t
|
||||
#undef ftruncate
|
||||
|
||||
typedef int (*Real_f)(int, off64_t);
|
||||
|
||||
int
|
||||
ftruncate64(int fd, off64_t size)
|
||||
{
|
||||
static Real_f realf;
|
||||
int r;
|
||||
int n;
|
||||
int m;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_ftruncate, 0, fd, size))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!realf)
|
||||
realf = (Real_f)sysfunc(SYS3D_ftruncate64);
|
||||
for (m = state.trap.size - 1; m >= 0; m--)
|
||||
if (MSG_MASK(MSG_truncate) & state.trap.intercept[m].mask)
|
||||
break;
|
||||
if (m >= 0)
|
||||
{
|
||||
n = state.trap.size;
|
||||
state.trap.size = m;
|
||||
r = (*state.trap.intercept[m].call)(&state.trap.intercept[m], MSG_truncate, SYS3D_ftruncate64, (void*)fd, (void*)&size, NiL, NiL, NiL, NiL);
|
||||
state.trap.size = n;
|
||||
}
|
||||
else
|
||||
r = (*realf)(fd, size);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_ftruncate, 0, fd, size);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_ftruncate))
|
||||
fscall(mp, MSG_ftruncate, 0, fd, size);
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
ftruncate3d(int fd, off_t size)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_ftruncate, 0, fd, size))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (FTRUNCATE(fd, size))
|
||||
return -1;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_ftruncate, 0, fd, size);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_ftruncate))
|
||||
fscall(mp, MSG_ftruncate, 0, fd, size);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(ftruncate)
|
||||
|
||||
#endif
|
|
@ -1,90 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef getdents3d
|
||||
|
||||
ssize_t
|
||||
getdents3d(int fd, void* buf, size_t n)
|
||||
{
|
||||
ssize_t r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_getdents, 0, fd, buf, n))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if ((r = GETDENTS(fd, buf, n)) >= 0)
|
||||
{
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_getdents, r, fd, buf, n);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_getdents))
|
||||
fscall(mp, MSG_getdents, r, fd, buf, n);
|
||||
#endif
|
||||
}
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(getdents)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef getdents643d
|
||||
|
||||
ssize_t
|
||||
getdents643d(int fd, void* buf, size_t n)
|
||||
{
|
||||
ssize_t r;
|
||||
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_getdents, 0, fd, buf, n))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if ((r = GETDENTS64(fd, buf, n)) >= 0)
|
||||
{
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_getdents, r, fd, buf, n);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_getdents))
|
||||
fscall(mp, MSG_getdents, r, fd, buf, n);
|
||||
#endif
|
||||
}
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(getdents64)
|
||||
|
||||
#endif
|
1714
src/cmd/3d/init.c
1714
src/cmd/3d/init.c
File diff suppressed because it is too large
Load diff
|
@ -1,49 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef kill3d
|
||||
|
||||
int
|
||||
kill3d(pid_t pid, int sig)
|
||||
{
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
#endif
|
||||
if (KILL(pid, sig))
|
||||
return(-1);
|
||||
#if FS
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_kill))
|
||||
fscall(mp, MSG_kill, 0, pid, sig);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(kill)
|
||||
|
||||
#endif
|
515
src/cmd/3d/lib.c
515
src/cmd/3d/lib.c
|
@ -1,515 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d file system library implementation
|
||||
*
|
||||
* debug trace levels are controlled by /#option/debug
|
||||
* debug level n enables tracing for all levels less than or equal to n
|
||||
*
|
||||
* level trace
|
||||
* 0 no trace
|
||||
* 1 basic calls
|
||||
* 2 mounted fs
|
||||
* 3 fs control
|
||||
* 4 pathcanon
|
||||
* 5 pathreal
|
||||
* 6 pathnext
|
||||
* 7 *unused*
|
||||
* 8 *unused*
|
||||
* 9 *unused*
|
||||
* 10 getkey
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#include <cs.h>
|
||||
|
||||
/*
|
||||
* keep 3d tables from buf,siz in state.table.fd
|
||||
* if force!=0 then state.table.fd set to TABLE_FD
|
||||
* 0 returned if state.table.fd is ok
|
||||
*/
|
||||
|
||||
int
|
||||
keep(const char* buf, size_t siz, int force)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (force && state.in_2d || siz > sizeof(state.table.buf))
|
||||
{
|
||||
if (state.table.fd > 0)
|
||||
cancel(&state.table.fd);
|
||||
return(-1);
|
||||
}
|
||||
if (state.table.fd > 0)
|
||||
{
|
||||
char tmp[sizeof(state.table.buf)];
|
||||
|
||||
if (peek(state.table.fd, tmp, sizeof(tmp) - 1) == siz && !memcmp(tmp, buf, siz))
|
||||
return(0);
|
||||
cancel(&state.table.fd);
|
||||
}
|
||||
#if _stream_peek || _socket_peek
|
||||
{
|
||||
int fds[2];
|
||||
|
||||
state.in_2d++;
|
||||
#if _socket_peek
|
||||
n = cspipe(&cs, fds);
|
||||
#else
|
||||
n = pipe(fds);
|
||||
#endif
|
||||
state.in_2d--;
|
||||
if (!n && fds[1] == TABLE_FD)
|
||||
{
|
||||
#if _pipe_rw || _lib_socketpair
|
||||
fds[1] = fds[0];
|
||||
fds[0] = TABLE_FD;
|
||||
#else
|
||||
CLOSE(fds[0]);
|
||||
state.in_2d++;
|
||||
n = pipe(fds);
|
||||
state.in_2d--;
|
||||
CLOSE(TABLE_FD);
|
||||
#endif
|
||||
}
|
||||
if (!n)
|
||||
{
|
||||
if (fds[0] == TABLE_FD) state.table.fd = fds[0];
|
||||
else
|
||||
{
|
||||
if (force) CLOSE(TABLE_FD);
|
||||
state.table.fd = FCNTL(fds[0], F_DUPFD, TABLE_FD);
|
||||
CLOSE(fds[0]);
|
||||
}
|
||||
n = WRITE(fds[1], buf, siz) == siz;
|
||||
CLOSE(fds[1]);
|
||||
if (n)
|
||||
{
|
||||
state.table.size = siz;
|
||||
reserve(&state.table.fd);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
sfsprintf(state.path.name, sizeof(state.path.name), "/tmp/3D#%d", state.pid);
|
||||
if ((n = OPEN(state.path.name, O_CREAT, S_IRUSR|S_IRGRP|S_IROTH)) >= 0)
|
||||
{
|
||||
UNLINK(state.path.name);
|
||||
if (force) CLOSE(TABLE_FD);
|
||||
if (n == TABLE_FD) state.table.fd = TABLE_FD;
|
||||
else
|
||||
{
|
||||
state.table.fd = FCNTL(n, F_DUPFD, TABLE_FD);
|
||||
CLOSE(n);
|
||||
}
|
||||
if (WRITE(state.table.fd, buf, siz) == siz && !LSEEK(state.table.fd, 0L, 0))
|
||||
{
|
||||
state.table.size = siz;
|
||||
reserve(&state.table.fd);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (state.table.fd > 0)
|
||||
cancel(&state.table.fd);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* enable/disable/test 3d/anno state
|
||||
* allows state transitions without changing the tables
|
||||
*/
|
||||
|
||||
int
|
||||
fs3d(register int op)
|
||||
{
|
||||
register int po;
|
||||
register int n;
|
||||
|
||||
if ((n = FS3D_op(op)) == FS3D_OP_INIT || !state.pid)
|
||||
init(1, 0, 0);
|
||||
if (!state.in_2d)
|
||||
po = FS3D_ON;
|
||||
else if (state.limit != TABSIZE)
|
||||
po = FS3D_LIMIT(state.limit);
|
||||
else
|
||||
po = FS3D_OFF;
|
||||
switch (n)
|
||||
{
|
||||
case FS3D_OP_INIT:
|
||||
case FS3D_OP_TEST:
|
||||
break;
|
||||
case FS3D_OP_LIMIT:
|
||||
if ((n = FS3D_arg(op)) <= 0 || n > TABSIZE)
|
||||
n = TABSIZE;
|
||||
state.limit = n;
|
||||
state.in_2d = 0;
|
||||
break;
|
||||
case FS3D_OP_OFF:
|
||||
if (state.level > 0)
|
||||
po = -1;
|
||||
else
|
||||
{
|
||||
state.limit = TABSIZE;
|
||||
state.in_2d = 1;
|
||||
}
|
||||
break;
|
||||
case FS3D_OP_ON:
|
||||
state.limit = TABSIZE;
|
||||
state.in_2d = 0;
|
||||
break;
|
||||
default:
|
||||
po = -1;
|
||||
break;
|
||||
}
|
||||
message((-1, "fs3d(%d)=%d", op, po));
|
||||
return po;
|
||||
}
|
||||
|
||||
/*
|
||||
* for code that includes <fs3d.h>
|
||||
*/
|
||||
|
||||
int
|
||||
fs3d_mount(const char* source, char* target, int flags, void* data)
|
||||
{
|
||||
return mount(source, target, flags, data, 0, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* return 6 char lower case hash of key
|
||||
* end is end of key string
|
||||
* 0 returned at end of keys
|
||||
* state.key.value is set to key value
|
||||
* if `no<key>' then state.key.invert gets value and state.key.value=""
|
||||
* otherwise state.key.invert=0
|
||||
* state.key.next is set to next key if any
|
||||
*/
|
||||
|
||||
unsigned long
|
||||
getkey(register const char* key, register const char* end, int alt)
|
||||
{
|
||||
register const char* val;
|
||||
register unsigned long x = 0;
|
||||
register int invert;
|
||||
register int c;
|
||||
#if DEBUG
|
||||
const char* beg;
|
||||
#endif
|
||||
|
||||
if (key)
|
||||
{
|
||||
#if DEBUG
|
||||
beg = key;
|
||||
#endif
|
||||
if (key < end - 1 && *key == 'n' && *(key + 1) == 'o')
|
||||
{
|
||||
key += 2;
|
||||
invert = 1;
|
||||
}
|
||||
else invert = 0;
|
||||
if (key < end)
|
||||
{
|
||||
val = ((end - key) > HASHKEYMAX) ? key + HASHKEYMAX : end;
|
||||
while (key < end && (c = *key) != '=' && c != '/' && c != alt)
|
||||
{
|
||||
if (key < val)
|
||||
x = (c >= '0' && c <= '9') ? HASHKEYPART(x, HASHKEYN(c)) : HASHKEYPART(x, c);
|
||||
key++;
|
||||
}
|
||||
if (key < end && c == '=')
|
||||
key++;
|
||||
}
|
||||
if (key >= end || *key == '/' || *key == alt)
|
||||
{
|
||||
state.key.value = state.one;
|
||||
state.key.valsize = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
state.key.value = (char*)key;
|
||||
while (key < end && *key != '/' && *key != alt)
|
||||
key++;
|
||||
state.key.valsize = (char*)key - state.key.value;
|
||||
}
|
||||
while (key < end && (*key == '/' || *key == alt))
|
||||
key++;
|
||||
if (key < end && *key == '#' && *(key - 1) == '/')
|
||||
key++;
|
||||
if (invert)
|
||||
{
|
||||
state.key.invert = state.key.value;
|
||||
state.key.invertsize = state.key.valsize;
|
||||
state.key.value = state.null;
|
||||
state.key.valsize = 0;
|
||||
}
|
||||
else state.key.invert = 0;
|
||||
state.key.next = (key < end) ? (char*)key : (char*)0;
|
||||
message((-10, "getkey: key=%-*s hash=%x value=%-*s next=%-*s", end - beg, beg, x, state.key.valsize, state.key.value, state.key.next ? end - state.key.next : 6, state.key.next));
|
||||
}
|
||||
else state.key.next = 0;
|
||||
return(x);
|
||||
}
|
||||
|
||||
#if FS
|
||||
|
||||
/*
|
||||
* return mount pointer for path
|
||||
* under is set to the part of the path under the mount
|
||||
*/
|
||||
|
||||
Mount_t*
|
||||
getmount(register const char* path, const char** under)
|
||||
{
|
||||
register Map_t* map;
|
||||
int n;
|
||||
int oerrno;
|
||||
struct stat st;
|
||||
|
||||
if (!(map = search(&state.vmount, path, strlen(path), NiL, T_PREFIX)) || ((Mount_t*)map->val)->fs == state.fs)
|
||||
return(0);
|
||||
if (under)
|
||||
{
|
||||
if (*(path += map->keysize)) path++;
|
||||
else
|
||||
{
|
||||
oerrno = errno;
|
||||
n = !STAT(path - map->keysize, &st) && !S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode);
|
||||
errno = oerrno;
|
||||
if (n) return(0);
|
||||
else path = (const char*)state.dot;
|
||||
}
|
||||
*under = path;
|
||||
}
|
||||
return((Mount_t*)map->val);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
nosys(void)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* copy t into s, return a pointer to the end of s ('\0')
|
||||
*/
|
||||
|
||||
char*
|
||||
strcopy(register char* s, register const char* t)
|
||||
{
|
||||
if (!t) return(s);
|
||||
while (*s++ = *t++);
|
||||
return(--s);
|
||||
}
|
||||
|
||||
/*
|
||||
* return map for <key,keysize> in tab
|
||||
* if val!=0 then key=val inserted if not already entered
|
||||
* valsize==0 causes string val to be malloc'd on insertion
|
||||
* key is malloc'd on insertion if (valsize|T_ALLOCATE)
|
||||
* valsize==T_DELETE for deletion
|
||||
* valsize==T_PREFIX for longest path prefix search and val==visit_mask
|
||||
*/
|
||||
|
||||
Map_t*
|
||||
search(Table_t* tab, const char* key, int keysize, const char* val, int valsize)
|
||||
{
|
||||
register Map_t* lo;
|
||||
register Map_t* mid;
|
||||
register Map_t* hi;
|
||||
register const char* sp;
|
||||
register const char* se;
|
||||
register const char* tp;
|
||||
register const char* te;
|
||||
int n;
|
||||
Map_t* end;
|
||||
|
||||
se = key + keysize;
|
||||
lo = tab->table;
|
||||
end = lo + tab->size;
|
||||
if (valsize == T_PREFIX)
|
||||
{
|
||||
mid = 0;
|
||||
hi = end;
|
||||
while (lo < hi)
|
||||
{
|
||||
sp = key;
|
||||
tp = lo->key;
|
||||
te = tp + lo->keysize;
|
||||
message((-12, "T_PREFIX: %-*s: key=%-*s mid=%-*s", keysize, key, lo->keysize, lo->key, mid ? mid->keysize : 1, mid ? mid->key : "-"));
|
||||
for (;;)
|
||||
{
|
||||
if (tp >= te)
|
||||
{
|
||||
if ((sp >= se || *sp == '/') && (!val || !(*((long*)val) & (1 << (lo - tab->table)))))
|
||||
{
|
||||
mid = lo;
|
||||
if (sp >= se)
|
||||
goto prefix;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (sp >= se || (n = *((unsigned char*)sp++) - *((unsigned char*)tp++)) < 0)
|
||||
goto prefix;
|
||||
if (n > 0)
|
||||
{
|
||||
if (mid && mid->keysize >= (sp - key))
|
||||
goto prefix;
|
||||
break;
|
||||
}
|
||||
}
|
||||
lo++;
|
||||
}
|
||||
prefix:
|
||||
if (mid && val) *((long*)val) |= (1 << (mid - tab->table));
|
||||
return(mid);
|
||||
}
|
||||
if (end > lo)
|
||||
{
|
||||
hi = end - 1;
|
||||
while (lo <= hi)
|
||||
{
|
||||
mid = lo + (hi - lo) / 2;
|
||||
sp = key;
|
||||
tp = mid->key;
|
||||
te = tp + mid->keysize;
|
||||
for (;;)
|
||||
{
|
||||
if (tp >= te)
|
||||
{
|
||||
if (sp >= se)
|
||||
{
|
||||
if (valsize != T_DELETE)
|
||||
return(mid);
|
||||
if (mid->valsize & T_ALLOCATE)
|
||||
free(mid->key);
|
||||
#if FS
|
||||
if ((mid->valsize & T_SIZE) == T_MOUNT)
|
||||
((Mount_t*)mid->val)->fs = 0;
|
||||
else
|
||||
#endif
|
||||
if (!(mid->valsize & T_SIZE))
|
||||
free(mid->val);
|
||||
for (; mid < end; mid++)
|
||||
*mid = *(mid + 1);
|
||||
tab->size--;
|
||||
return(0);
|
||||
}
|
||||
lo = mid + 1;
|
||||
break;
|
||||
}
|
||||
if (sp >= se || (n = *((unsigned char*)sp++) - *((unsigned char*)tp++)) < 0)
|
||||
{
|
||||
hi = mid - 1;
|
||||
break;
|
||||
}
|
||||
if (n > 0)
|
||||
{
|
||||
lo = mid + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!val || valsize == T_DELETE || tab->size >= elementsof(tab->table))
|
||||
return(0);
|
||||
tab->size++;
|
||||
for (hi = end; hi > lo; hi--)
|
||||
*hi = *(hi - 1);
|
||||
lo->keysize = keysize;
|
||||
if (valsize & T_ALLOCATE) lo->key = strcpy(newof(0, char, keysize, 1), key);
|
||||
else lo->key = (char*)key;
|
||||
if ((lo->valsize = valsize) & T_SIZE) lo->val = (char*)val;
|
||||
else lo->val = strcpy(newof(0, char, strlen(val), 1), val);
|
||||
return(lo);
|
||||
}
|
||||
|
||||
/*
|
||||
* iterate fun over tab
|
||||
* terminates on first negative return from fun
|
||||
*/
|
||||
|
||||
int
|
||||
iterate(register Table_t* tab, int (*fun)(Map_t*, char*, int), register char* buf, int flags)
|
||||
{
|
||||
register Map_t* cp;
|
||||
register Map_t* ep;
|
||||
register int n;
|
||||
register int sum;
|
||||
|
||||
sum = 0;
|
||||
for (ep = (cp = tab->table) + tab->size; cp < ep; cp++)
|
||||
{
|
||||
if ((n = (*fun)(cp, buf, flags)) < 0)
|
||||
return(0);
|
||||
if (buf) buf += n;
|
||||
sum += n;
|
||||
}
|
||||
return(sum);
|
||||
}
|
||||
|
||||
#if FS
|
||||
|
||||
/*
|
||||
* initialize open file info
|
||||
*/
|
||||
|
||||
int
|
||||
fileinit(int fd, struct stat* st, Mount_t* mp, int force)
|
||||
{
|
||||
register File_t* f;
|
||||
int ffd;
|
||||
int ffl;
|
||||
struct stat sb;
|
||||
|
||||
f = state.file + fd;
|
||||
if (!force && (f->flags & FILE_ERROR) || !st && FSTAT(fd, st = &sb) || (ffd = FCNTL(fd, F_GETFD, NiL)) == -1 || (ffl = FCNTL(fd, F_GETFL, NiL)) == -1)
|
||||
{
|
||||
f->flags = FILE_ERROR;
|
||||
return -1;
|
||||
}
|
||||
f->oflag = ffl;
|
||||
f->open = 0;
|
||||
f->flags = FILE_OPEN;
|
||||
if (S_ISREG(st->st_mode))
|
||||
f->flags |= FILE_REGULAR;
|
||||
if (ffd & FD_CLOEXEC)
|
||||
f->flags |= FILE_CLOEXEC;
|
||||
if ((ffl & O_ACCMODE) != O_RDONLY)
|
||||
f->flags |= FILE_WRITE;
|
||||
f->id.fid[0] = st->st_ino;
|
||||
f->id.fid[1] = st->st_dev;
|
||||
if ((f->mount = mp) && fd > state.cache)
|
||||
state.cache = fd;
|
||||
if (fd > state.open)
|
||||
state.open = fd;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,90 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* 3d symbol mappings to minimize pollution
|
||||
*/
|
||||
|
||||
#ifndef _NAME3D_H
|
||||
#define _NAME3D_H
|
||||
|
||||
#include "ast_3d.h"
|
||||
#include "cs_3d.h"
|
||||
#include "dll_3d.h"
|
||||
#include "std_3d.h"
|
||||
|
||||
#define bprintf _3d_printf
|
||||
#define bvprintf _3d_vprintf
|
||||
#define calldump _3d_calldump
|
||||
#define callinit _3d_callinit
|
||||
#define checklink _3d_checklink
|
||||
#define control _3d_control
|
||||
#define error _3d_error
|
||||
#define _error_data_ _3d_error_data /*AHA*/
|
||||
#define _error_info_ _3d_error_info
|
||||
#define _error_infop_ _3d_error_infop
|
||||
#define errorf _3d_errorf
|
||||
#define errormsg _3d_errormsg
|
||||
#define errorv _3d_errorv
|
||||
#define fileinit _3d_fileinit
|
||||
#define fix _3d_fix
|
||||
#define forked _3d_forked
|
||||
#define fs3d_copy _3d_copy
|
||||
#define fs3d_dup _3d_dup
|
||||
#define fs3d_mkdir _3d_mkdir
|
||||
#define fs3d_open _3d_open
|
||||
#define fscall _3d_fscall
|
||||
#define fschannel _3d_fschannel
|
||||
#define fsdrop _3d_fsdrop
|
||||
#define fsinit _3d_fsinit
|
||||
#define fsreal _3d_fsreal
|
||||
#define getattr _3d_getattr
|
||||
#define getkey _3d_getkey
|
||||
#define getmount _3d_getmount
|
||||
#define init _3d_init
|
||||
#define instance _3d_instance
|
||||
#define intercept _3d_intercept
|
||||
#define iterate _3d_iterate
|
||||
#define keep _3d_keep
|
||||
#define mapdump _3d_mapdump
|
||||
#define mapget _3d_mapget
|
||||
#define mapinit _3d_mapinit
|
||||
#define mapset _3d_mapset
|
||||
#define nosys _3d_nosys
|
||||
#define pathreal _3d_pathreal
|
||||
#define peek _3d_peek
|
||||
#define search _3d_search
|
||||
#define setattr _3d_setattr
|
||||
#define state _3d_state
|
||||
#define strcopy _3d_strcopy
|
||||
#define stub _3d_stub
|
||||
#define syscall3d _3d_syscall
|
||||
#define sysfunc _3d_sysfunc
|
||||
|
||||
#include <ast.h>
|
||||
|
||||
#undef pathcanon
|
||||
#define pathcanon _3d_pathcanon
|
||||
#undef pathcat
|
||||
#define pathcat _3d_pathcat
|
||||
|
||||
#endif
|
|
@ -1,95 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d license via agent to license server
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if LICENSED
|
||||
|
||||
#define LICENSE_OPEN(s,m,l) licopen(s,m,l)
|
||||
#define LICENSE_CLOSE(f) close(f)
|
||||
|
||||
static int
|
||||
licopen(const char* svc, const char* msg, int len)
|
||||
{
|
||||
char* service;
|
||||
char* env;
|
||||
int n;
|
||||
int fd;
|
||||
int lic;
|
||||
char buf[64];
|
||||
|
||||
if (state.in_2d) return(-1);
|
||||
service = "/dev/fdp/local/nam/user";
|
||||
env = *environ;
|
||||
*environ = "_3D_DISABLE=1";
|
||||
if ((fd = cslocal(&cs, service)) < 0)
|
||||
{
|
||||
error(ERROR_SYSTEM|2, "%s: cannot connect to server", service);
|
||||
return(-1);
|
||||
}
|
||||
*environ = env;
|
||||
n = strlen(svc) + 1;
|
||||
if (cswrite(&cs, fd, svc, n) != n)
|
||||
{
|
||||
error(ERROR_SYSTEM|2, "%s: cannot write to server", service);
|
||||
close(fd);
|
||||
return(-1);
|
||||
}
|
||||
if (read(fd, buf, sizeof(buf)) <= 0)
|
||||
{
|
||||
error(ERROR_SYSTEM|2, "%s: cannot read from server", service);
|
||||
close(fd);
|
||||
return(-1);
|
||||
}
|
||||
if (csrecv(&cs, fd, NiL, &lic, 1) != 1)
|
||||
{
|
||||
error(ERROR_SYSTEM|2, "%s: cannot connect to %s", service, svc);
|
||||
close(fd);
|
||||
return(-1);
|
||||
}
|
||||
close(fd);
|
||||
if (cswrite(&cs, lic, msg, len) != len)
|
||||
{
|
||||
error(ERROR_SYSTEM|2, "%s: cannot write to service", svc);
|
||||
close(lic);
|
||||
return(-1);
|
||||
}
|
||||
fcntl(lic, F_SETFD, FD_CLOEXEC);
|
||||
state.in_2d = 0;
|
||||
return(lic);
|
||||
}
|
||||
|
||||
#define tokscan _3d_tokscan
|
||||
|
||||
#include "tokscan.c"
|
||||
#include "../license/service.c"
|
||||
|
||||
#else
|
||||
|
||||
NoN(license)
|
||||
|
||||
#endif
|
|
@ -1,99 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef link3d
|
||||
|
||||
int
|
||||
link3d(const char* path, const char* target)
|
||||
{
|
||||
register char* sp;
|
||||
register char* tp;
|
||||
register int r;
|
||||
char* t;
|
||||
int oerrno;
|
||||
char buf[PATH_MAX+1];
|
||||
#if FS
|
||||
char tmp[PATH_MAX+1];
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(LINK(path, target));
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_link, 0, path, target))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, state.safe ? (P_SAFE|P_TOP) : P_TOP, NiL)))
|
||||
return(-1);
|
||||
sp = strncpy(buf, sp, PATH_MAX);
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_SAFE, NiL)))
|
||||
return(-1);
|
||||
oerrno = errno;
|
||||
if ((r = LINK(sp, tp)) && errno == ENOENT && (t = strrchr(tp, '/')))
|
||||
{
|
||||
*t = 0;
|
||||
r = fs3d_mkdir(tp, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
*t = '/';
|
||||
if (!r)
|
||||
{
|
||||
errno = oerrno;
|
||||
r = LINK(sp, tp);
|
||||
}
|
||||
}
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp && !LSTAT(tp, &state.path.st))
|
||||
{
|
||||
if (tp != tmp)
|
||||
{
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
tp = strncpy(tmp, tp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_link, 0, sp, tp);
|
||||
}
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_link))
|
||||
{
|
||||
if (tp != tmp)
|
||||
{
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
tp = strncpy(tmp, tp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_link, 0, sp, tp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(link)
|
||||
|
||||
#endif
|
|
@ -1,134 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide lseek
|
||||
#else
|
||||
#define lseek ______lseek
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
#define _LS_H 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide lseek
|
||||
#else
|
||||
#undef lseek
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
#ifdef lseek3d
|
||||
|
||||
#if !_nosys_lseek64 && _typ_off64_t
|
||||
|
||||
typedef off64_t (*Seek64_f)(int, off64_t, int);
|
||||
|
||||
#undef off_t
|
||||
#undef lseek
|
||||
|
||||
off64_t
|
||||
lseek64(int fd, off64_t off, int op)
|
||||
{
|
||||
off64_t r;
|
||||
int n;
|
||||
int m;
|
||||
|
||||
static Seek64_f seekf;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_seek, 0, fd, off, op))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!seekf)
|
||||
seekf = (Seek64_f)sysfunc(SYS3D_lseek64);
|
||||
for (m = state.trap.size - 1; m >= 0; m--)
|
||||
if (MSG_MASK(MSG_seek) & state.trap.intercept[m].mask)
|
||||
break;
|
||||
if (m >= 0)
|
||||
{
|
||||
n = state.trap.size;
|
||||
state.trap.size = m;
|
||||
r = (*state.trap.intercept[m].call)(&state.trap.intercept[m], MSG_seek, SYS3D_lseek64, (void*)fd, (void*)&off, (void*)op, NiL, NiL, NiL) ? -1 : off;
|
||||
state.trap.size = n;
|
||||
}
|
||||
else
|
||||
r = (*seekf)(fd, off, op);
|
||||
#if FS
|
||||
if (r != (off64_t)(-1))
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_seek, r, fd, off, op);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_seek))
|
||||
fscall(mp, MSG_seek, r, fd, off, op);
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
typedef off_t (*Seek_f)(int, off_t, int);
|
||||
|
||||
off_t
|
||||
lseek3d(int fd, off_t off, int op)
|
||||
{
|
||||
off_t r;
|
||||
|
||||
static Seek_f seekf;
|
||||
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_seek, 0, fd, off, op))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (sizeof(off_t) > sizeof(long))
|
||||
{
|
||||
if (!seekf)
|
||||
seekf = (Seek_f)sysfunc(SYS3D_lseek);
|
||||
r = (*seekf)(fd, off, op);
|
||||
}
|
||||
else if ((r = LSEEK(fd, off, op)) == -1)
|
||||
return -1;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_seek, r, fd, off, op);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_seek))
|
||||
fscall(mp, MSG_seek, r, fd, off, op);
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(lseek)
|
||||
|
||||
#endif
|
|
@ -1,128 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma noprototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(lstat3d)
|
||||
|
||||
/* the 3 arg _lxstat() disrupts our proto game -- every party needs one */
|
||||
#if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
|
||||
int lstat3d(const char* path, struct stat* st)
|
||||
#else
|
||||
#if defined(_LSTAT)
|
||||
int _lstat(path, st) char* path; struct stat* st; { return lstat(path, st); }
|
||||
#endif
|
||||
int lstat(path, st) char* path; struct stat* st;
|
||||
#endif
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
#ifdef _3D_STAT_VER
|
||||
struct stat* so;
|
||||
struct stat sc;
|
||||
#endif
|
||||
|
||||
#ifdef _3D_STAT_VER
|
||||
if (_3d_ver != _3D_STAT_VER)
|
||||
{
|
||||
so = st;
|
||||
st = ≻
|
||||
}
|
||||
#endif
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_lstat, 0, path, st))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_LSTAT, st)))
|
||||
return -1;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_lstat, 0, state.path.name, st);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_lstat))
|
||||
fscall(mp, MSG_lstat, 0, state.path.name, st);
|
||||
#endif
|
||||
#ifdef _3D_STAT_VER
|
||||
if (st == &sc)
|
||||
{
|
||||
st = so;
|
||||
if (LXSTAT(_3d_ver, sp, st))
|
||||
return -1;
|
||||
#ifdef _3D_STAT64_VER
|
||||
if (_3d_ver == _3D_STAT64_VER)
|
||||
IVIEW(((struct stat64*)st), state.path.level);
|
||||
else
|
||||
#endif
|
||||
IVIEW(st, state.path.level);
|
||||
}
|
||||
#endif
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && defined(STAT643D) && !defined(_3D_STAT64_VER)
|
||||
|
||||
int
|
||||
lstat643d(const char* path, struct stat64* st)
|
||||
{
|
||||
register char* sp;
|
||||
struct stat ss;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_lstat, 0, path, &ss))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_LSTAT, &ss)))
|
||||
return -1;
|
||||
if (LSTAT64(sp, st))
|
||||
return -1;
|
||||
IVIEW(st, state.path.level);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_lstat, 0, state.path.name, &ss);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_lstat))
|
||||
fscall(mp, MSG_lstat, 0, state.path.name, &ss);
|
||||
#endif
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
NoN(lstat)
|
||||
|
||||
#endif
|
670
src/cmd/3d/map.c
670
src/cmd/3d/map.c
|
@ -1,670 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d mount map support
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
/*
|
||||
* visit a mapping and compute its size or copy mapping
|
||||
*/
|
||||
|
||||
int
|
||||
mapget(Map_t* map, char* buf, int flags)
|
||||
{
|
||||
register char* p;
|
||||
register int z;
|
||||
register char* v;
|
||||
register int n;
|
||||
#if FS
|
||||
Mount_t* mp = 0;
|
||||
#endif
|
||||
|
||||
NoP(flags);
|
||||
if (!(n = map->keysize))
|
||||
n = strlen(map->key);
|
||||
switch (z = map->valsize & T_SIZE)
|
||||
{
|
||||
#if FS
|
||||
case T_MOUNT:
|
||||
mp = (Mount_t*)map->val;
|
||||
if (state.visit.fs && state.visit.fs != mp->fs)
|
||||
return 0;
|
||||
v = mp->fs->special;
|
||||
z = mp->fs->specialsize;
|
||||
break;
|
||||
#endif
|
||||
case 0:
|
||||
z = strlen(map->val);
|
||||
/*FALLTHROUGH*/
|
||||
default:
|
||||
v = map->val;
|
||||
break;
|
||||
}
|
||||
if (p = buf)
|
||||
{
|
||||
strncpy(p, map->key, n);
|
||||
p += n;
|
||||
*p++ = ' ';
|
||||
if (
|
||||
#if FS
|
||||
mp ||
|
||||
#endif
|
||||
state.visit.prefix)
|
||||
{
|
||||
*p++ = '/';
|
||||
*p++ = '#';
|
||||
#if FS
|
||||
if (!mp)
|
||||
#endif
|
||||
{
|
||||
p = strcopy(p, state.visit.prefix);
|
||||
*p++ = '/';
|
||||
if (*v == '/')
|
||||
*p++ = '#';
|
||||
}
|
||||
}
|
||||
strncpy(p, v, z);
|
||||
p += z;
|
||||
#if FS
|
||||
if (mp)
|
||||
{
|
||||
if (mp->channel)
|
||||
p += sfsprintf(p, 0, "/channel=%d", MSG_CHANNEL_SYS(mp->channel));
|
||||
p += getattr(mp->attr, p);
|
||||
if (mp->physical)
|
||||
p += sfsprintf(p, 0, "%-*s", mp->physicalsize ? mp->physicalsize : strlen(mp->physical), mp->physical);
|
||||
}
|
||||
#endif
|
||||
*p++ = ' ';
|
||||
n = p - buf;
|
||||
}
|
||||
else
|
||||
n += z + state.visit.prelen
|
||||
#if FS
|
||||
+ (mp ? ((mp->channel ? 16 : 0) + (mp->physical ? (mp->physicalsize ? mp->physicalsize : strlen(mp->physical)) : 0) + getattr(mp->attr, NiL)) : 0)
|
||||
#endif
|
||||
+ 6;
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* dump table mappings into buf
|
||||
* the mapping size is returned
|
||||
* if tab==0 then all 3d mappings are processed
|
||||
* if buf==0 then the size is just computed
|
||||
*/
|
||||
|
||||
int
|
||||
mapdump(Table_t* tab, char* buf, int flags)
|
||||
{
|
||||
register Fs_t* fs;
|
||||
register int n;
|
||||
register int sum = 0;
|
||||
register char* p = buf;
|
||||
|
||||
if (flags & (MAP_EXEC|MAP_INIT))
|
||||
{
|
||||
if (state.kernel)
|
||||
{
|
||||
if (p)
|
||||
*p = 0;
|
||||
return 1;
|
||||
}
|
||||
if (p)
|
||||
{
|
||||
n = sfsprintf(p, 0, "%s", TABLE_PREFIX);
|
||||
p += n;
|
||||
}
|
||||
else
|
||||
n = sizeof(TABLE_PREFIX) - 1;
|
||||
sum += n;
|
||||
}
|
||||
if (!tab)
|
||||
{
|
||||
for (fs = state.fs; fs < state.fs + elementsof(state.fs); fs++)
|
||||
if (fs->get)
|
||||
{
|
||||
n = (*fs->get)(fs, p, NiL, flags);
|
||||
if (p)
|
||||
p += n;
|
||||
sum += n;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
n = iterate(tab, mapget, p, flags);
|
||||
if (p)
|
||||
p += n;
|
||||
sum += n;
|
||||
}
|
||||
if (p)
|
||||
{
|
||||
if (p > buf)
|
||||
{
|
||||
if (!(flags & MAP_INIT))
|
||||
p--;
|
||||
else if ((p - buf) == (sizeof(TABLE_PREFIX) - 1))
|
||||
p = buf;
|
||||
else
|
||||
*(p - 1) = '\n';
|
||||
}
|
||||
*p = 0;
|
||||
sum = p - buf;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
#if LICENSED
|
||||
|
||||
/*
|
||||
* check fs license
|
||||
*/
|
||||
|
||||
static int
|
||||
licensed(register Fs_t* fs)
|
||||
{
|
||||
if ((fs->flags & (FS_INTERNAL|FS_LICENSED)) == FS_INTERNAL)
|
||||
{
|
||||
if (!(fs->flags & FS_VALIDATED))
|
||||
{
|
||||
fs->flags |= FS_VALIDATED;
|
||||
if (!*state.license)
|
||||
{
|
||||
Pathcheck_t pc;
|
||||
|
||||
if (pathcheck(PATHCHECK, error_info.id, &pc))
|
||||
*state.license = LICENSE_NONE;
|
||||
else if (!pc.feature)
|
||||
*state.license = LICENSE_ALL;
|
||||
else
|
||||
sfsprintf(state.license, sizeof(state.license), "%c%s%c", LICENSE_SEP, pc.feature, LICENSE_SEP);
|
||||
message((-2, "license: feature=%s", state.license));
|
||||
}
|
||||
if (*state.license == LICENSE_ALL)
|
||||
fs->flags |= FS_LICENSED;
|
||||
else
|
||||
{
|
||||
char buf[sizeof(fs->special) + 4];
|
||||
|
||||
sfsprintf(buf, sizeof(buf), "*%c%s%c*", LICENSE_SEP, fs->special, LICENSE_SEP);
|
||||
message((-1, "mount: license=%s pattern=%s", state.license, buf));
|
||||
if (strmatch(state.license, buf))
|
||||
fs->flags |= FS_LICENSED;
|
||||
}
|
||||
if (!(fs->flags & FS_LICENSED))
|
||||
error(2, "%s service not licensed", fs->special);
|
||||
}
|
||||
if (!(fs->flags & FS_LICENSED))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define licensed(p) (1)
|
||||
|
||||
#endif
|
||||
|
||||
#if FS
|
||||
|
||||
/*
|
||||
* copy attributes into table buf
|
||||
*/
|
||||
|
||||
int
|
||||
getattr(const char* attr, char* buf)
|
||||
{
|
||||
register char* a = (char*)attr;
|
||||
register char* b = buf;
|
||||
register int c;
|
||||
|
||||
if (b)
|
||||
{
|
||||
while (c = *b++ = *a++)
|
||||
if (c == ' ')
|
||||
*(b - 1) = '/';
|
||||
return b - buf - 1;
|
||||
}
|
||||
return strlen(a);
|
||||
}
|
||||
|
||||
/*
|
||||
* add/delete attributes
|
||||
* attributes stored as
|
||||
*
|
||||
* (<space>name=value)*
|
||||
*/
|
||||
|
||||
const char*
|
||||
setattr(char* attr, const char* op, register const char* oe)
|
||||
{
|
||||
register const char* s;
|
||||
register const char* v;
|
||||
register char* a;
|
||||
register char* x;
|
||||
register int n;
|
||||
int k;
|
||||
int m;
|
||||
|
||||
if (s = op)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
if (s >= oe || *s == '/')
|
||||
return op;
|
||||
if (*s++ == '=')
|
||||
{
|
||||
v = s - 1;
|
||||
n = v - op;
|
||||
while (s < oe && *s != '/')
|
||||
s++;
|
||||
k = s - v - 1;
|
||||
m = s - op;
|
||||
a = attr;
|
||||
while (*a)
|
||||
{
|
||||
a++;
|
||||
if (strneq(op, a, n) && a[n] == '=')
|
||||
{
|
||||
if (!k || strncmp(op, a, m) || a[m] && a[m] != ' ')
|
||||
{
|
||||
if (!(x = strchr(a, ' ')))
|
||||
{
|
||||
if (a > attr)
|
||||
a--;
|
||||
*a = 0;
|
||||
}
|
||||
else
|
||||
while (*a++ = *++x);
|
||||
}
|
||||
else
|
||||
k = 0;
|
||||
break;
|
||||
}
|
||||
if (!(a = strchr(a, ' ')))
|
||||
break;
|
||||
}
|
||||
if (k && ((k = strlen(attr)) + m) < (ATTR_MAX - 1))
|
||||
{
|
||||
a = attr + k;
|
||||
*a++ = ' ';
|
||||
strncpy(a, op, m);
|
||||
a[m] = 0;
|
||||
}
|
||||
if (s++ >= oe)
|
||||
return 0;
|
||||
op = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
return op;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* handle `arg /#<op>'
|
||||
*/
|
||||
|
||||
static int
|
||||
special(register const char* op, int opsize, const char* arg, int argsize)
|
||||
{
|
||||
register const char* oe;
|
||||
register Fs_t* fs;
|
||||
const char* ov;
|
||||
const char* org;
|
||||
Map_t* map;
|
||||
int arglen;
|
||||
unsigned long x;
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (!(arglen = argsize))
|
||||
arglen = strlen(arg);
|
||||
oe = op + (opsize ? opsize : strlen(op));
|
||||
if (!(x = getkey(op, oe, 0)))
|
||||
{
|
||||
if (arglen)
|
||||
{
|
||||
errno = ENODEV;
|
||||
return -1;
|
||||
}
|
||||
for (fs = state.fs; fs < state.fs + elementsof(state.fs); fs++)
|
||||
if (fs->set)
|
||||
(*fs->set)(fs, state.null, 0, state.null, 0);
|
||||
return 0;
|
||||
}
|
||||
if (state.key.invert)
|
||||
{
|
||||
errno = ENODEV;
|
||||
return -1;
|
||||
}
|
||||
org = arg;
|
||||
if (!argsize && *arg)
|
||||
{
|
||||
if (!pathreal(arg, P_PATHONLY|P_ABSOLUTE|P_NOSLASH, NiL))
|
||||
return -1;
|
||||
arg = (const char*)state.path.name;
|
||||
}
|
||||
ov = (char*)state.key.next;
|
||||
for (fs = state.fs; fs < state.fs + elementsof(state.fs); fs++)
|
||||
if (!x || x == fs->key)
|
||||
{
|
||||
if (!licensed(fs))
|
||||
return 0;
|
||||
#if FS
|
||||
if (fs->flags & FS_FS)
|
||||
{
|
||||
if (map = search(&state.vmount, arg, arglen, NiL, op < oe ? 0 : T_DELETE))
|
||||
{
|
||||
mp = (Mount_t*)map->val;
|
||||
if (mp->fs != fs)
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
message((-2, "mount: old fs=%s map=%-*s arg=%-*s op=%-*s", fs->special, map->keysize, map->key, arglen, arg, ov ? (oe - ov) : 6, ov));
|
||||
if (setattr(mp->attr, ov, oe))
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (op < oe)
|
||||
{
|
||||
if (arglen)
|
||||
{
|
||||
for (mp = state.mount;; mp++)
|
||||
{
|
||||
if (mp >= state.mount + elementsof(state.mount))
|
||||
return -1;
|
||||
if (!mp->fs)
|
||||
break;
|
||||
}
|
||||
if (map = search(&state.vmount, arg, arglen, (char*)mp, argsize ? T_MOUNT : (T_MOUNT|T_ALLOCATE)))
|
||||
{
|
||||
message((-2, "mount: new fs=%s map=%-*s arg=%-*s op=%-*s", fs->special, map->keysize, map->key, arglen, arg, ov ? (oe - ov) : 6, ov));
|
||||
fs->flags |= FS_REFERENCED;
|
||||
if (!(fs->flags & FS_NAME) && !state.cache)
|
||||
state.cache = 1;
|
||||
mp->fs = fs;
|
||||
mp->logical = map->key;
|
||||
mp->logicalsize = map->keysize;
|
||||
if (ov)
|
||||
{
|
||||
if ((oe - ov) > 8 && strneq(ov, "channel=", 8))
|
||||
{
|
||||
mp->channel = strtol(ov + 8, (char**)&ov, 0);
|
||||
if (++ov >= oe)
|
||||
ov = 0;
|
||||
}
|
||||
if (ov = setattr(mp->attr, ov, oe))
|
||||
{
|
||||
if (opsize)
|
||||
{
|
||||
mp->physical = (char*)ov - 1;
|
||||
mp->physicalsize = oe - mp->physical;
|
||||
}
|
||||
else
|
||||
{
|
||||
mp->physical = strcpy(newof(0, char, strlen(ov), 2), ov - 1);
|
||||
mp->physicalsize = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (setattr(fs->attr, ov, oe))
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (fs->set)
|
||||
{
|
||||
if (ov)
|
||||
{
|
||||
if ((*fs->set)(fs, (fs->flags & FS_RAW) ? org : arg, argsize, ov, oe - ov))
|
||||
return -1;
|
||||
}
|
||||
else if (arglen)
|
||||
{
|
||||
if ((*fs->set)(fs, (fs->flags & FS_RAW) ? org : arg, argsize, state.null, 0))
|
||||
return -1;
|
||||
}
|
||||
else if ((*fs->set)(fs, state.null, 0, state.null, 0))
|
||||
return -1;
|
||||
}
|
||||
if (op < oe)
|
||||
break;
|
||||
}
|
||||
if (op < oe && fs >= state.fs + elementsof(state.fs))
|
||||
{
|
||||
errno = ENODEV;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* set a single 3d table mapping
|
||||
* size==0 for volatile args
|
||||
* from="-" maps to from=""
|
||||
* to="-" maps to to=""
|
||||
*/
|
||||
|
||||
int
|
||||
mapset(Table_t* tab, const char* from, int fromsize, register const char* to, int tosize)
|
||||
{
|
||||
register Map_t* old;
|
||||
register int n;
|
||||
int x;
|
||||
char buf[PATH_MAX + 1];
|
||||
|
||||
if (state.safe && !(state.test & 0100))
|
||||
{
|
||||
errno = EPERM;
|
||||
return -1;
|
||||
}
|
||||
if (!fromsize && (!from || !from[0] || from[0] == '-' && !from[1]) || fromsize == 1 && from[0] == '-')
|
||||
{
|
||||
from = state.null;
|
||||
fromsize = 0;
|
||||
}
|
||||
if (!tosize && (!to || !to[0] || to[0] == '-' && !to[1]) || tosize == 1 && to[0] == '-')
|
||||
{
|
||||
to = state.null;
|
||||
tosize = 0;
|
||||
}
|
||||
message((-2, "mount: %-*s %-*s", from == state.null ? 1 : fromsize ? fromsize : strlen(from), from == state.null ? "-" : from, to == state.null ? 1 : tosize ? tosize : strlen(to), to == state.null ? "-" : to));
|
||||
if ((!tosize || tosize >= 2) && to[0] == '/' && to[1] == '#')
|
||||
{
|
||||
to += 2;
|
||||
if (tosize)
|
||||
tosize -= 2;
|
||||
return special(to, tosize, from, fromsize);
|
||||
}
|
||||
if (!*from)
|
||||
{
|
||||
if (!*to)
|
||||
while (tab->table->key)
|
||||
search(tab, tab->table->key, tab->table->keysize, NiL, T_DELETE);
|
||||
return 0;
|
||||
}
|
||||
if (fromsize)
|
||||
{
|
||||
if (tosize || !to[0])
|
||||
{
|
||||
/*
|
||||
* no malloc during initialization
|
||||
* so we have to believe from and to here
|
||||
*/
|
||||
|
||||
return search(tab, from, fromsize, to, tosize) ? 0 : -1;
|
||||
}
|
||||
n = *(from + fromsize);
|
||||
*((char*)from + fromsize) = 0;
|
||||
}
|
||||
if (!licensed(&state.fs[tab == &state.vpath ? FS_view : tab == &state.vmap ? FS_map : FS_safe]))
|
||||
return 0;
|
||||
if (x = tab != &state.vintercept)
|
||||
{
|
||||
if (!pathreal(from, P_PATHONLY|P_ABSOLUTE|P_NOSLASH, NiL))
|
||||
return -1;
|
||||
if (fromsize)
|
||||
{
|
||||
*((char*)from + fromsize) = n;
|
||||
fromsize = 0;
|
||||
}
|
||||
from = (const char*)state.path.name;
|
||||
}
|
||||
if (!fromsize)
|
||||
fromsize = strlen(from);
|
||||
old = search(tab, from, fromsize, NiL, *to ? 0 : T_DELETE);
|
||||
if (!*to)
|
||||
{
|
||||
search(&state.vmount, from, fromsize, NiL, T_DELETE);
|
||||
return 0;
|
||||
}
|
||||
if (tab == &state.vmap)
|
||||
{
|
||||
if (old)
|
||||
{
|
||||
if (!(old->valsize & T_SIZE))
|
||||
free(old->val);
|
||||
if ((old->valsize = tosize) & T_SIZE)
|
||||
old->val = (char*)to;
|
||||
else
|
||||
old->val = strcpy(newof(0, char, strlen(to), 1), to);
|
||||
}
|
||||
else
|
||||
search(tab, from, fromsize, to, tosize|T_ALLOCATE);
|
||||
}
|
||||
else if (old)
|
||||
{
|
||||
/*
|
||||
* ok if previous mapping matched
|
||||
*/
|
||||
|
||||
if (x && !(to = pathreal(to, P_PATHONLY|P_ABSOLUTE|P_NOSLASH, NiL)))
|
||||
return -1;
|
||||
if ((n = T_VALSIZE(old)) == (tosize ? tosize : strlen(to)) && strneq(old->val, to, n))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* already have different mapping
|
||||
*/
|
||||
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(buf, from, PATH_MAX);
|
||||
buf[PATH_MAX] = 0;
|
||||
if (x)
|
||||
{
|
||||
if (!pathreal(to, P_PATHONLY|P_ABSOLUTE|P_NOSLASH, NiL))
|
||||
return -1;
|
||||
to = (const char*)state.path.name;
|
||||
}
|
||||
if (tab == &state.vsafe || !streq(buf, to))
|
||||
search(tab, buf, fromsize, to, T_ALLOCATE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize mappings from space separated pairs in buf
|
||||
* if readonly!=0 then buf must not be changed after this call
|
||||
*/
|
||||
|
||||
int
|
||||
mapinit(const char* buf, int readonly)
|
||||
{
|
||||
register char* bp = (char*)buf;
|
||||
register char* from;
|
||||
register char* to;
|
||||
int fromsize;
|
||||
int tosize;
|
||||
|
||||
#if DEBUG_TABLE
|
||||
if (!error_info.trace)
|
||||
error_info.trace = -3;
|
||||
message((-1, "TABLE `%s'", bp));
|
||||
#endif
|
||||
if (strneq(bp, TABLE_PREFIX, sizeof(TABLE_PREFIX) - 1))
|
||||
bp += sizeof(TABLE_PREFIX) - 1;
|
||||
#if DEBUG_TABLE
|
||||
if (bp != buf)
|
||||
message((-1, "TABLE `%s'", bp));
|
||||
#endif
|
||||
if (!readonly)
|
||||
fromsize = tosize = 0;
|
||||
while (*bp)
|
||||
{
|
||||
for (from = bp; *bp && *bp != ' '; bp++);
|
||||
if (readonly)
|
||||
{
|
||||
fromsize = bp - from;
|
||||
if (*bp)
|
||||
bp++;
|
||||
}
|
||||
else if (*bp)
|
||||
*bp++ = 0;
|
||||
for (to = bp; *bp && *bp != ' ' && *bp != '\n'; bp++);
|
||||
if (readonly)
|
||||
tosize = bp - to;
|
||||
else if (*bp)
|
||||
*bp++ = 0;
|
||||
#if DEBUG_TABLE
|
||||
if (mapset(&state.vpath, from, fromsize, to, tosize))
|
||||
{
|
||||
if (readonly)
|
||||
message((-1, "TABLE %-*s -> %-*s FAILED", fromsize, from, tosize, to));
|
||||
else
|
||||
message((-1, "TABLE %s -> %s FAILED", from, to));
|
||||
return -1;
|
||||
}
|
||||
if (state.table.version != TABLE_VERSION)
|
||||
{
|
||||
message((-1, "TABLE state.table.version=%d != TABLE_VERSION=%d", state.table.version, TABLE_VERSION));
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
if (mapset(&state.vpath, from, fromsize, to, tosize) || state.table.version != TABLE_VERSION)
|
||||
return -1;
|
||||
#endif
|
||||
if (*bp)
|
||||
bp++;
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -1,179 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide mkdir
|
||||
#else
|
||||
#define mkdir ______mkdir
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
#define _LS_H 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide mkdir
|
||||
#else
|
||||
#undef mkdir
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
/*
|
||||
* mkdir() will always create a directory on the highest layer
|
||||
* mkdir() will create intermediate directories if they virtually exist
|
||||
* mkdir() will do a chdir() if a virtual dot directory is created
|
||||
*/
|
||||
|
||||
int
|
||||
mkdir3d(const char* path, mode_t mode)
|
||||
{
|
||||
register char* sp;
|
||||
register char* cp;
|
||||
register int r;
|
||||
char buf[PATH_MAX + 1];
|
||||
char tmp[PATH_MAX + 1];
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.real)
|
||||
{
|
||||
#if FS
|
||||
mp = 0;
|
||||
#endif
|
||||
sp = (char*)path;
|
||||
}
|
||||
#if FS
|
||||
else if (!fscall(NiL, MSG_mkdir, 0, path, mode))
|
||||
return(state.ret);
|
||||
#endif
|
||||
else
|
||||
{
|
||||
#if FS
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_PATHONLY|P_NOOPAQUE, NiL)))
|
||||
return(-1);
|
||||
}
|
||||
if (state.path.level || state.level && (sp == state.pwd || streq(sp, state.pwd)) || (r = MKDIR(sp, mode)) && errno == ENOENT)
|
||||
{
|
||||
/*
|
||||
* copy canonicalized pathname into buf
|
||||
*/
|
||||
|
||||
if (*sp != '/')
|
||||
sp = state.path.name;
|
||||
for (cp = buf; *cp = *sp++; cp++);
|
||||
if (!state.real)
|
||||
{
|
||||
/*
|
||||
* create intermediate dirs if they exist in lower view
|
||||
*/
|
||||
|
||||
char* a;
|
||||
char* b;
|
||||
Path_t save;
|
||||
int oerrno;
|
||||
|
||||
a = tmp;
|
||||
b = buf;
|
||||
while (*a++ = *b++);
|
||||
if (b = strrchr(tmp, '/'))
|
||||
*b = 0;
|
||||
oerrno = errno;
|
||||
save = state.path;
|
||||
for (;;)
|
||||
if (!pathnext(tmp, NiL, NiL) || ACCESS(tmp, F_OK))
|
||||
{
|
||||
state.path = save;
|
||||
errno = oerrno;
|
||||
return -1;
|
||||
}
|
||||
state.path = save;
|
||||
errno = oerrno;
|
||||
}
|
||||
|
||||
/*
|
||||
* ok to create intermediate dirs
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
while (*--cp != '/');
|
||||
if (cp <= buf) return(-1);
|
||||
*cp = 0;
|
||||
r = !pathreal(buf, 0, NiL) || !streq(buf, state.path.name);
|
||||
*cp = '/';
|
||||
} while (r);
|
||||
*cp = '/';
|
||||
do
|
||||
{
|
||||
r = *++cp;
|
||||
if (r == 0 || r == '/')
|
||||
{
|
||||
*cp = 0;
|
||||
sp = pathreal(buf, P_PATHONLY, NiL);
|
||||
*cp = r;
|
||||
if (!sp) return(-1);
|
||||
if (sp == state.dot) sp = state.pwd;
|
||||
if (r = MKDIR(sp, r ? (mode|S_IWUSR|S_IXUSR) : mode)) return(r);
|
||||
#if FS
|
||||
if (fsmonitored(state.path.name) && !LSTAT(state.path.name, &state.path.st))
|
||||
fscall(state.path.monitor, MSG_mkdir, 0, state.path.name, state.path.st.st_mode);
|
||||
#endif
|
||||
if (sp == state.pwd || streq(sp, state.pwd))
|
||||
{
|
||||
state.level = 0;
|
||||
CHDIR(state.pwd);
|
||||
}
|
||||
}
|
||||
} while (*cp);
|
||||
}
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp) fscall(mp, MSG_mkdir, 0, path, mode);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_mkdir))
|
||||
fscall(mp, MSG_mkdir, 0, path, mode);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
/*
|
||||
* 3d internal mkdir to skip pathreal(path, ...)
|
||||
*/
|
||||
|
||||
int
|
||||
fs3d_mkdir(const char* path, mode_t mode)
|
||||
{
|
||||
int r;
|
||||
|
||||
state.real++;
|
||||
r = mkdir(path, mode);
|
||||
state.real--;
|
||||
return(r);
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide mknod
|
||||
#else
|
||||
#define mknod ______mknod
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
#define _LS_H 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide mknod
|
||||
#else
|
||||
#undef mknod
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
#ifdef mknod3d
|
||||
|
||||
int
|
||||
mknod3d(const char* path, mode_t mode, dev_t dev)
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_mknod, 0, path, mode, dev))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_PATHONLY, NiL)) || MKNOD(sp, mode, dev))
|
||||
return(-1);
|
||||
#if FS
|
||||
if (mp && !STAT(sp, &state.path.st))
|
||||
fscall(mp, MSG_mknod, 0, path, state.path.st.st_mode, dev);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_mknod))
|
||||
fscall(mp, MSG_mknod, 0, path, mode, dev);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(mknod)
|
||||
|
||||
#endif
|
|
@ -1,147 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
mount3d(const char* aspc, char* path, int mode, void* a4, void* a5, void* a6)
|
||||
{
|
||||
char* spc = (char*)aspc;
|
||||
register Fs_t* fs;
|
||||
register char* sp;
|
||||
register int r;
|
||||
Table_t* tab;
|
||||
int size = 0;
|
||||
int oerrno;
|
||||
unsigned long x;
|
||||
|
||||
if ((!spc || !*spc) && (!path || !*path) && !mode) return(0);
|
||||
if (mode & FS3D_ALL)
|
||||
{
|
||||
initialize();
|
||||
switch (mode & FS3D_ALL)
|
||||
{
|
||||
case FS3D_VERSION:
|
||||
tab = &state.vmap;
|
||||
break;
|
||||
case FS3D_VIEW:
|
||||
tab = &state.vpath;
|
||||
break;
|
||||
default:
|
||||
tab = 0;
|
||||
break;
|
||||
}
|
||||
if (mode & FS3D_GET)
|
||||
{
|
||||
size = FS3D_SIZEOF(mode);
|
||||
if ((sp = spc) && (!*sp || *sp == '-' && !*(sp + 1) || *sp == '/' && *(sp + 1) == '#'))
|
||||
{
|
||||
r = -1;
|
||||
oerrno = errno;
|
||||
errno = 0;
|
||||
if (*sp && *sp++ == '/') sp++;
|
||||
if (!*sp)
|
||||
{
|
||||
if ((r = mapdump(NiL, NiL, 0)) >= 0 && r < size)
|
||||
{
|
||||
mapdump(NiL, path, 0);
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
x = getkey(sp, sp + strlen(sp), 0);
|
||||
for (fs = state.fs; fs < state.fs + elementsof(state.fs); fs++)
|
||||
if (x == fs->key)
|
||||
{
|
||||
if (fs->get && (r = (*fs->get)(fs, NiL, sp = state.key.next, 0)) >= 0 && r < size)
|
||||
{
|
||||
if ((r = (*fs->get)(fs, path, sp, 0)) > 0 && path[r - 1] == ' ') r--;
|
||||
path[r] = 0;
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (r >= 0) errno = oerrno;
|
||||
else if (!errno) errno = ENODEV;
|
||||
}
|
||||
else if (!spc)
|
||||
{
|
||||
if ((r = mapdump(tab, NiL, 0)) >= 0 && r < size)
|
||||
{
|
||||
mapdump(tab, path, 0);
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
else if (tab == &state.vmap)
|
||||
{
|
||||
register Map_t* map;
|
||||
|
||||
if (!(pathreal(spc, P_PATHONLY|P_ABSOLUTE|P_NOSLASH, NiL)))
|
||||
r = -1;
|
||||
else if (!(map = search(tab, state.path.name, strlen(state.path.name), NiL, 0)))
|
||||
{
|
||||
if ((r = 0) < size)
|
||||
path[r] = 0;
|
||||
}
|
||||
else if ((r = T_VALSIZE(map)) < size)
|
||||
{
|
||||
strncpy(path, map->val, r);
|
||||
path[r] = 0;
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
else if (!pathreal(spc, P_LSTAT, NiL)) r = -1;
|
||||
#if 1
|
||||
else
|
||||
{
|
||||
r = strlen(state.path.name);
|
||||
if (r > 1)
|
||||
{
|
||||
if (state.path.name[r - 1] == '.' && state.path.name[r - 2] == '/')
|
||||
{
|
||||
if (!(r -= 2))
|
||||
r = 1;
|
||||
state.path.name[r] = 0;
|
||||
}
|
||||
}
|
||||
if (++r <= size)
|
||||
{
|
||||
strcpy(path, state.path.name);
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
else if ((r = strlen(state.path.name)) < size)
|
||||
{
|
||||
strcpy(path, state.path.name);
|
||||
r = 0;
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
else if (tab && spc) return(mapset(tab, path, 0, spc, 0));
|
||||
}
|
||||
return(MOUNT(spc, path ? pathreal(path, 0, NiL) : (char*)0, mode, a4, a5, a6));
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
########################################################################
|
||||
# #
|
||||
# This software is part of the ast package #
|
||||
# Copyright (c) 1989-2011 AT&T Intellectual Property #
|
||||
# and is licensed under the #
|
||||
# Eclipse Public License, Version 1.0 #
|
||||
# by AT&T Intellectual Property #
|
||||
# #
|
||||
# A copy of the License is available at #
|
||||
# http://www.eclipse.org/org/documents/epl-v10.html #
|
||||
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
||||
# #
|
||||
# Information and Software Systems Research #
|
||||
# AT&T Research #
|
||||
# Florham Park NJ #
|
||||
# #
|
||||
# Glenn Fowler <gsf@research.att.com> #
|
||||
# David Korn <dgk@research.att.com> #
|
||||
# Eduardo Krell <ekrell@adexus.cl> #
|
||||
# #
|
||||
########################################################################
|
||||
:
|
||||
# opaque file ...
|
||||
# handles old (pre-92) and new style opaque
|
||||
# @(#)opaque (AT&T Bell Laboratories) 10/11/95
|
||||
|
||||
function err_exit
|
||||
{
|
||||
print -u2 "$command: $@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
function usage
|
||||
{
|
||||
print -u2 "Usage: $command file ..."
|
||||
exit 2
|
||||
}
|
||||
|
||||
command=${0##*/}
|
||||
case $1 in
|
||||
--) shift
|
||||
break
|
||||
;;
|
||||
""|-\?) usage
|
||||
;;
|
||||
-*) print -u2 -- "$1: invalid option"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
|
||||
# the rest is in 2d
|
||||
|
||||
2d + 2>/dev/null || { { : > xxx && rm xxx && 2d + ;} || exit 1 ;}
|
||||
n=$(umask)
|
||||
|
||||
for i
|
||||
do if [[ -f $i ]]
|
||||
then [[ $i -ef .../... ]] || print -u2 "$command: $i: file exists"
|
||||
else case $i in
|
||||
*/*) dir=${i%/*} file=${i##*/} ;;
|
||||
*) dir=. file=$i ;;
|
||||
esac
|
||||
[[ $dir -ef . ]] || cd "$dir" || err_exit "$dir: cd failed"
|
||||
if [[ ! -f .../... ]]
|
||||
then if [[ ! -d ... ]]
|
||||
then if mkdir ...
|
||||
then chgrp 3d ... 2>/dev/null && chmod g+s ...
|
||||
umask 777
|
||||
> .../... || err_exit "$i: cannot opaque"
|
||||
umask ${n#8#}
|
||||
elif [[ ! -f ... ]]
|
||||
then err_exit "...: cannot mkdir"
|
||||
elif [[ -r ... || -w ... || -x ... || -s ... ]]
|
||||
then err_exit "...: obsolescent opaque must be 0 mode file"
|
||||
else mkdir ...3d || err_exit "...3d: cannot mkdir"
|
||||
if mv ... ...3d
|
||||
then if mv ...3d ...
|
||||
then :
|
||||
else rmdir ...
|
||||
mv ...3d ...
|
||||
err_exit "...: cannot rename obsolescent opaque"
|
||||
fi
|
||||
else rmdir ...3d
|
||||
err_exit "...: cannot rename obsolescent opaque"
|
||||
fi
|
||||
chgrp 3d ... 2>/dev/null && chmod g+s ...
|
||||
fi
|
||||
else umask 777
|
||||
> .../... || err_exit "$i: cannot opaque"
|
||||
umask ${n#8#}
|
||||
fi
|
||||
fi
|
||||
ln .../... "$file"
|
||||
[[ $dir -ef . ]] || cd ~- || err_exit "$OLDPWD: cannot restore directory"
|
||||
fi
|
||||
done
|
|
@ -1,358 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
/*
|
||||
* this does the actual open, creating versions as required
|
||||
*/
|
||||
|
||||
static int
|
||||
vcreate(register const char* path, int flags, int mode)
|
||||
{
|
||||
register char* cp;
|
||||
register char* ep;
|
||||
int dirlen;
|
||||
int namlen;
|
||||
int fd;
|
||||
int r;
|
||||
char buf[PATH_MAX+1];
|
||||
|
||||
if (!state.vmap.size || !(flags & O_CREAT))
|
||||
return OPEN(path, flags, mode);
|
||||
ep = cp = (char*)path + strlen(path);
|
||||
if (!instance(state.path.name, cp, &state.path.st, 1))
|
||||
return OPEN(path, flags, mode);
|
||||
while (cp > (char*)path && *--cp != '/');
|
||||
if (*cp == '/') cp++;
|
||||
namlen = ep - cp;
|
||||
|
||||
/*
|
||||
* construct pathname for version instance name text into buf
|
||||
*/
|
||||
|
||||
memcpy(buf, path, dirlen = cp - path);
|
||||
memcpy(buf + dirlen, state.opaque, 4);
|
||||
*ep = '/';
|
||||
strcpy(buf + dirlen + 4, cp);
|
||||
if ((fd = OPEN(buf, flags, mode)) >= 0)
|
||||
return fd;
|
||||
if (errno != ENOTDIR && errno != ENOENT)
|
||||
return -1;
|
||||
buf[dirlen + namlen + 4] = 0;
|
||||
if (MKDIR(buf, VERMODE))
|
||||
{
|
||||
buf[dirlen + 3] = 0;
|
||||
if (MKDIR(buf, VERMODE))
|
||||
{
|
||||
if (errno != EEXIST)
|
||||
return -1;
|
||||
if (LSTAT(buf, &state.path.st))
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* check for old style opaque, can be removed soon
|
||||
*/
|
||||
|
||||
if (S_ISREG(state.path.st.st_mode) && !(state.path.st.st_mode & S_IPERM))
|
||||
{
|
||||
char savebuf[8];
|
||||
|
||||
memcpy(savebuf, cp, sizeof(savebuf));
|
||||
strcpy(cp, "....");
|
||||
if (RENAME(buf, path))
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
if (MKDIR(buf, VERMODE))
|
||||
return -1;
|
||||
buf[dirlen + 3] = '.';
|
||||
buf[dirlen + 4] = 0;
|
||||
strcpy(cp, state.opaque);
|
||||
if (RENAME(buf, path))
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
memcpy(cp, savebuf, 8);
|
||||
buf[dirlen + 3] = 0;
|
||||
buf[dirlen + 4] = *cp;
|
||||
}
|
||||
else
|
||||
{
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
buf[dirlen + 3] = '/';
|
||||
if (MKDIR(buf, VERMODE))
|
||||
return -1;
|
||||
}
|
||||
buf[dirlen + namlen + 4] = '/';
|
||||
|
||||
/*
|
||||
* now create the file
|
||||
*/
|
||||
|
||||
if ((fd = OPEN(buf, flags, mode)) < 0)
|
||||
return -1;
|
||||
strcpy(buf + dirlen + namlen + 5, state.vdefault);
|
||||
*ep = 0;
|
||||
r = RENAME(path, buf);
|
||||
if (SYMLINK(buf + dirlen, path))
|
||||
return fd;
|
||||
if (r)
|
||||
{
|
||||
strcpy(buf + dirlen + namlen + 5, ep + 1);
|
||||
LINK(buf, path);
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int
|
||||
open3d(const char* path, int oflag, ...)
|
||||
{
|
||||
register char* sp = 0;
|
||||
register int r;
|
||||
int fd = -1;
|
||||
int level;
|
||||
int synthesize;
|
||||
mode_t mode;
|
||||
struct stat st;
|
||||
va_list ap;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
va_start(ap, oflag);
|
||||
mode = (oflag & O_CREAT) ? va_arg(ap, int) : 0;
|
||||
va_end(ap);
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_open, 0, path, oflag, mode, 0))
|
||||
{
|
||||
message((-1, "DEBUG: fs open fd=%d", state.ret));
|
||||
return state.ret;
|
||||
}
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (state.in_2d)
|
||||
{
|
||||
if ((r = OPEN((!path || *path) ? path : state.dot, oflag, mode)) < 0 || !state.call.monitor || state.in_2d == 1 || FSTAT(r, &st))
|
||||
return r;
|
||||
goto done;
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
if (!(sp = pathreal(path, (oflag & O_CREAT) ? P_NOOPAQUE : 0, &st)))
|
||||
{
|
||||
if (oflag & O_CREAT)
|
||||
{
|
||||
Path_t save;
|
||||
|
||||
save = state.path;
|
||||
state.real++;
|
||||
sp = pathreal(path, P_PATHONLY|P_DOTDOT, NiL);
|
||||
state.real--;
|
||||
if (!sp)
|
||||
{
|
||||
state.path = save;
|
||||
errno = EROFS;
|
||||
return -1;
|
||||
}
|
||||
if (state.path.level && LSTAT(sp, &st))
|
||||
{
|
||||
if (LSTAT(state.dot, &st) || fs3d_mkdir(sp, st.st_mode & S_IPERM))
|
||||
{
|
||||
state.path = save;
|
||||
return -1;
|
||||
}
|
||||
state.path = save;
|
||||
continue;
|
||||
}
|
||||
state.path = save;
|
||||
sp = 0;
|
||||
}
|
||||
st.st_mode = 0;
|
||||
}
|
||||
else if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode))
|
||||
{
|
||||
r = OPEN(path, oflag, mode);
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
}
|
||||
level = state.path.level;
|
||||
synthesize = state.path.synthesize;
|
||||
#if VCS && defined(VCS_OPEN)
|
||||
VCS_OPEN(path, oflag, mode, &state.path.st);
|
||||
#endif
|
||||
if ((oflag & O_CREAT) && (!sp || level || (oflag & O_EXCL)) || (sp || level) && ((oflag & O_TRUNC) || (oflag & O_ACCMODE) != O_RDONLY))
|
||||
{
|
||||
if (sp)
|
||||
{
|
||||
if ((oflag & O_ACCMODE) != O_RDONLY)
|
||||
{
|
||||
if (!level)
|
||||
{
|
||||
r = OPEN(sp, oflag, mode);
|
||||
goto done;
|
||||
}
|
||||
if (!(oflag & O_TRUNC) && (fd = OPEN(sp, O_RDONLY, 0)) < 0)
|
||||
return -1;
|
||||
}
|
||||
mode = ((S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)|(st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)));
|
||||
}
|
||||
if (!(sp = pathreal(path, (oflag & O_CREAT) ? (P_PATHONLY|P_SAFE) : 0, NiL)))
|
||||
{
|
||||
if (fd >= 0)
|
||||
CLOSE(fd);
|
||||
return -1;
|
||||
}
|
||||
if (synthesize)
|
||||
fs3d_mkdir(state.pwd, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
}
|
||||
else if (!sp)
|
||||
{
|
||||
r = -1;
|
||||
goto done;
|
||||
}
|
||||
r = vcreate(sp, ((oflag & O_ACCMODE) == O_RDWR) ? (oflag|O_CREAT) : oflag, mode);
|
||||
if (r < 0 && errno == ENOENT && ((oflag & (O_CREAT|O_TRUNC)) || (oflag & O_ACCMODE) != O_RDONLY))
|
||||
{
|
||||
if (!(sp = pathreal(path, P_PATHONLY|P_NOOPAQUE, NiL)))
|
||||
r = -1;
|
||||
else if (state.level <= 0 || *sp == '/')
|
||||
r = vcreate(sp, O_CREAT|oflag, mode);
|
||||
else errno = ENOENT;
|
||||
if (r < 0 && errno == ENOENT && (sp = pathreal(path, P_DOTDOT, NiL)) && state.path.level)
|
||||
{
|
||||
if (sp = pathreal(path, P_DOTDOT|P_PATHONLY|P_NOOPAQUE, NiL))
|
||||
r = fs3d_mkdir(sp, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
if (!r)
|
||||
{
|
||||
/*
|
||||
* try again
|
||||
*/
|
||||
|
||||
if (!(sp = pathreal(path, P_PATHONLY|P_SAFE, NiL)))
|
||||
r = -1;
|
||||
else r = vcreate(sp, O_CREAT|oflag, mode);
|
||||
}
|
||||
else errno = ENOENT;
|
||||
}
|
||||
}
|
||||
if (r > 0)
|
||||
{
|
||||
if (level && fd >= 0)
|
||||
{
|
||||
if (fs3d_copy(fd, r, NiL))
|
||||
{
|
||||
CLOSE(r);
|
||||
CLOSE(fd);
|
||||
return -1;
|
||||
}
|
||||
state.path.level = 0;
|
||||
}
|
||||
state.path.open_level = state.path.level;
|
||||
setfdview(r, state.path.open_level);
|
||||
}
|
||||
if (fd >= 0)
|
||||
CLOSE(fd);
|
||||
done:
|
||||
#if FS || defined(fchdir3d)
|
||||
if (r >= 0)
|
||||
{
|
||||
#if defined(fchdir3d)
|
||||
if (S_ISDIR(st.st_mode) && r < elementsof(state.file))
|
||||
{
|
||||
Dir_t* dp;
|
||||
|
||||
if (state.file[r].dir)
|
||||
{
|
||||
free(state.file[r].dir);
|
||||
state.file[r].dir = 0;
|
||||
}
|
||||
if (dp = newof(0, Dir_t, 1, strlen(sp)))
|
||||
{
|
||||
strcpy(dp->path, sp);
|
||||
dp->dev = st.st_dev;
|
||||
dp->ino = st.st_ino;
|
||||
state.file[r].dir = dp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if FS
|
||||
level = state.path.level;
|
||||
if (state.cache)
|
||||
{
|
||||
if (!st.st_mode)
|
||||
FSTAT(r, &st);
|
||||
fileinit(r, &st, mp, 1);
|
||||
}
|
||||
if (mp)
|
||||
fscall(mp, MSG_open, r, state.path.name, oflag, st.st_mode, level);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_open))
|
||||
fscall(mp, MSG_open, r, state.path.name, oflag, st.st_mode, level);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* use this open() within 3d
|
||||
* to save and restore the path state
|
||||
*/
|
||||
|
||||
int
|
||||
fs3d_open(const char* path, int oflag, mode_t mode)
|
||||
{
|
||||
int fd;
|
||||
Path_t save;
|
||||
|
||||
save = state.path;
|
||||
fd = open(path, oflag, mode);
|
||||
state.path = save;
|
||||
return fd;
|
||||
}
|
||||
|
||||
#if !_nosys_open64
|
||||
|
||||
int
|
||||
open643d(const char* path, int oflag, ...)
|
||||
{
|
||||
mode_t mode;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, oflag);
|
||||
mode = (oflag & O_CREAT) ? va_arg(ap, int) : 0;
|
||||
va_end(ap);
|
||||
#if defined(O_LARGEFILE)
|
||||
oflag |= O_LARGEFILE;
|
||||
#endif
|
||||
return open(path, oflag, mode);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,156 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* pathcanon - generate canonical pathname from given pathname
|
||||
*
|
||||
* this routine works with both relative and absolute paths
|
||||
* relative paths can contain any number of leading ../
|
||||
* a pointer to the trailing '\0' is returned, 0 on error
|
||||
* the operator ... is also applied by this routine
|
||||
* phys is for libast compatibility and is currently ignored
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
char*
|
||||
pathcanon(char* path, size_t size, int phys)
|
||||
{
|
||||
register char* sp;
|
||||
register char* dp = path;
|
||||
register int c = '/';
|
||||
register char* begin = dp;
|
||||
int add_dot = 0;
|
||||
long visits = 0;
|
||||
|
||||
message((-6, "patcanon: ++ %s%s", path, phys ? " [PHYSICAL]" : ""));
|
||||
if (!size) size = strlen(dp) + 1;
|
||||
#if PRESERVE_LEADING_SLASH_SLASH
|
||||
if (*dp == '/' && *(dp + 1) == '/')
|
||||
path = ++dp;
|
||||
#endif
|
||||
if (*dp != '/') dp--;
|
||||
sp = dp;
|
||||
for (;;)
|
||||
{
|
||||
sp++;
|
||||
if (c == '/')
|
||||
{
|
||||
/*
|
||||
* eliminate redundant /
|
||||
*/
|
||||
|
||||
if (*sp == '/')
|
||||
continue;
|
||||
if (*sp == '.')
|
||||
{
|
||||
if ((c = *++sp) == '/')
|
||||
{
|
||||
/*
|
||||
* ./
|
||||
*/
|
||||
|
||||
add_dot++;
|
||||
continue;
|
||||
}
|
||||
if (!c)
|
||||
{
|
||||
/*
|
||||
* .
|
||||
*/
|
||||
|
||||
add_dot++;
|
||||
break;
|
||||
}
|
||||
if (c == '.')
|
||||
{
|
||||
if (!(c = *++sp) || c == '/')
|
||||
{
|
||||
/*
|
||||
* ..
|
||||
*/
|
||||
|
||||
if (dp < begin)
|
||||
begin += 3;
|
||||
else
|
||||
{
|
||||
if (dp > begin)
|
||||
while (*--dp != '/')
|
||||
if (dp < begin)
|
||||
break;
|
||||
if (!c)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (c == '.' && !state.in_2d)
|
||||
{
|
||||
if (!(c = *++sp) || c == '/')
|
||||
{
|
||||
/*
|
||||
* ...
|
||||
*/
|
||||
|
||||
*dp = 0;
|
||||
phys = state.path.level;
|
||||
if (!(dp = pathnext(path, sp, &visits)))
|
||||
{
|
||||
message((-6, "patcanon: -- %s", NiL));
|
||||
return(0);
|
||||
}
|
||||
if (!state.real)
|
||||
state.path.level = phys;
|
||||
if (!(*(sp = dp) = c))
|
||||
{
|
||||
dp--;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
*++dp = '.';
|
||||
}
|
||||
*++dp = '.';
|
||||
}
|
||||
*++dp = '.';
|
||||
}
|
||||
}
|
||||
add_dot = 0;
|
||||
if (!(c = *sp))
|
||||
break;
|
||||
*++dp = c;
|
||||
}
|
||||
|
||||
/*
|
||||
* preserve trailing /.
|
||||
*/
|
||||
|
||||
if (add_dot)
|
||||
{
|
||||
if (*dp != '/')
|
||||
*++dp = '/';
|
||||
*++dp = '.';
|
||||
}
|
||||
*++dp = 0;
|
||||
message((-6, "patcanon: -- %s", path));
|
||||
return(dp);
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef pathconf3d
|
||||
|
||||
long
|
||||
pathconf3d(const char* path, int op)
|
||||
{
|
||||
register char* sp;
|
||||
long r;
|
||||
int oerrno;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_pathconf, 0, path, op))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, NiL)))
|
||||
return(-1);
|
||||
oerrno = errno;
|
||||
errno = 0;
|
||||
r = PATHCONF(sp, op);
|
||||
if (!errno)
|
||||
{
|
||||
errno = oerrno;
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_pathconf, 0, sp, op);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_pathconf))
|
||||
fscall(mp, MSG_pathconf, 0, sp, op);
|
||||
#endif
|
||||
}
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(pathconf)
|
||||
|
||||
#endif
|
|
@ -1,203 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
/*
|
||||
* get next view for path sp
|
||||
*/
|
||||
|
||||
char*
|
||||
pathnext(char* sp, char* extra, long* visits)
|
||||
{
|
||||
register char* ep = sp + strlen(sp);
|
||||
register char* cp;
|
||||
register char* tmp;
|
||||
register int shift;
|
||||
Map_t* vpath;
|
||||
int vpathlen;
|
||||
|
||||
message((-4, "pathnext: ++ %s%s%s [0x%08x]", sp, extra ? " + " : state.null, extra ? extra : state.null, visits ? *visits : 0L));
|
||||
|
||||
/*
|
||||
* check for next layer and previous visit
|
||||
*/
|
||||
|
||||
if (state.path.level + 1 >= state.limit)
|
||||
{
|
||||
message((-4, "pathnext: -- %s [limit=%d]", NiL, state.limit));
|
||||
return 0;
|
||||
}
|
||||
ep = sp + (shift = strlen(sp));
|
||||
if (!(vpath = search(state.path.table ? state.path.table : &state.vpath, sp, shift, (const char*)visits, T_PREFIX)))
|
||||
{
|
||||
message((-4, "pathnext: -- %s [0x%08x]", NiL, visits ? *visits : 0L));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* we found a viewpath entry
|
||||
* check if stuff after extra needs to be shifted
|
||||
*/
|
||||
|
||||
vpathlen = T_VALSIZE(vpath);
|
||||
cp = sp + vpath->keysize;
|
||||
shift = vpathlen - (cp - sp);
|
||||
if (shift < 0)
|
||||
{
|
||||
/*
|
||||
* shift left
|
||||
*/
|
||||
|
||||
if (cp < ep)
|
||||
strcopy(sp + vpathlen + 1, cp + 1);
|
||||
}
|
||||
else if (shift > 0)
|
||||
{
|
||||
/*
|
||||
* shift right extra
|
||||
*/
|
||||
|
||||
if (extra)
|
||||
{
|
||||
for (tmp = extra + strlen(extra); tmp >= extra; tmp--)
|
||||
tmp[shift] = *tmp;
|
||||
extra += shift;
|
||||
}
|
||||
|
||||
/*
|
||||
* shift right cp
|
||||
*/
|
||||
|
||||
if (cp < ep)
|
||||
{
|
||||
for (tmp = ep; tmp > cp; tmp--)
|
||||
tmp[shift] = *tmp;
|
||||
strcopy(sp + vpathlen + 1, cp + shift + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* insert vpath
|
||||
*/
|
||||
|
||||
strncpy(sp, vpath->val, vpathlen);
|
||||
sp[vpathlen] = cp < ep ? '/' : 0;
|
||||
cp = sp;
|
||||
if (extra)
|
||||
strcpy(sp = ep + shift, extra);
|
||||
state.path.level++;
|
||||
message((-4, "pathnext: -- %s [level=%d visits=0x%08x]", cp, state.path.level, visits ? *visits : 0L));
|
||||
return sp;
|
||||
}
|
||||
|
||||
/*
|
||||
* search for the instance name for path sp
|
||||
* and place in instname
|
||||
* 0 returned when instances exhausted
|
||||
* if create is non-zero, use name before the first slash as instance
|
||||
* name, and do not check existence.
|
||||
*/
|
||||
|
||||
int
|
||||
instance(register char* sp, char* instname, struct stat* st, int create)
|
||||
{
|
||||
register char* cp;
|
||||
register char* mp;
|
||||
register char* mapnext;
|
||||
register int size;
|
||||
int maps;
|
||||
char* mapend;
|
||||
Map_t* map;
|
||||
|
||||
cp = instname++;
|
||||
mapnext = mapend = 0;
|
||||
maps = 0;
|
||||
if (state.vmap.size)
|
||||
{
|
||||
while (*--cp != '/');
|
||||
if (!create) cp -= 4;
|
||||
}
|
||||
else cp = sp;
|
||||
for (;;)
|
||||
{
|
||||
if ((mp = mapnext) >= mapend)
|
||||
{
|
||||
/*
|
||||
* look for next vmap
|
||||
*/
|
||||
|
||||
while (cp > sp)
|
||||
{
|
||||
map = search(&state.vmap, sp, cp - sp, NiL, 0);
|
||||
if (cp > sp + 1)
|
||||
{
|
||||
while (*--cp != '/');
|
||||
while (cp > sp && cp[-1] == '/') cp--;
|
||||
if (cp == sp) cp++;
|
||||
}
|
||||
else cp = sp;
|
||||
if (map && (!create || *map->val != '/'))
|
||||
goto match;
|
||||
}
|
||||
if (!create)
|
||||
{
|
||||
strcpy(instname, state.vdefault);
|
||||
maps++;
|
||||
if (!LSTAT(sp, st))
|
||||
goto found;
|
||||
}
|
||||
return 0;
|
||||
match:
|
||||
mp = map->val;
|
||||
size = T_VALSIZE(map);
|
||||
mapend = mp + size;
|
||||
if (create)
|
||||
{
|
||||
while (mp < mapend && *mp!='/') mp++;
|
||||
if ((size = mp - map->val) <= 0)
|
||||
return 0;
|
||||
memcpy(instname, map->val, size);
|
||||
instname[size] = 0;
|
||||
maps++;
|
||||
goto found;
|
||||
}
|
||||
if (*mp == '/') mp++;
|
||||
}
|
||||
for (mapnext = mp; mapnext < mapend; mapnext++)
|
||||
if (*mapnext == '/')
|
||||
break;
|
||||
if ((size = mapnext - mp) <= 0) continue;
|
||||
memcpy(instname, mp, size = mapnext - mp);
|
||||
instname[size] = 0;
|
||||
while (mapnext < mapend && *mapnext == '/') mapnext++;
|
||||
maps++;
|
||||
if (!LSTAT(sp, st))
|
||||
goto found;
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
found:
|
||||
if (maps > 1)
|
||||
state.path.level |= INSTANCE;
|
||||
return 1;
|
||||
}
|
|
@ -1,654 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifndef MAXSYMLINKS
|
||||
#define MAXSYMLINKS 20
|
||||
#endif
|
||||
|
||||
/*
|
||||
* if <sp> is a hard link to state.opaque in the same directory then the file
|
||||
* is opaque and the errno should be ENOENT
|
||||
*/
|
||||
|
||||
static int
|
||||
checkopaque(register char* path, struct stat* st)
|
||||
{
|
||||
register char* basesp;
|
||||
int oerrno = errno;
|
||||
struct stat statb;
|
||||
char savebuf[sizeof(state.opaque)];
|
||||
register int r = 0;
|
||||
|
||||
if (st->st_nlink <= 1)
|
||||
return 0;
|
||||
if (st->st_mode & (S_IRWXU|S_IRWXG|S_IRWXO))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* change the basename to state.opaque
|
||||
*/
|
||||
|
||||
if (basesp = strrchr(path, '/'))
|
||||
basesp++;
|
||||
else
|
||||
basesp = path;
|
||||
memcpy(savebuf, basesp, sizeof(state.opaque));
|
||||
strcpy(basesp, state.opaque);
|
||||
if (LSTAT(path, &statb))
|
||||
{
|
||||
/*
|
||||
* for backward compatability
|
||||
*/
|
||||
|
||||
basesp[3] = 0;
|
||||
if (LSTAT(path, &statb))
|
||||
goto not_opaque;
|
||||
}
|
||||
if (statb.st_ino == st->st_ino && statb.st_dev == st->st_dev)
|
||||
{
|
||||
errno = ENOENT;
|
||||
r = statb.st_ino;
|
||||
}
|
||||
else
|
||||
errno = oerrno;
|
||||
not_opaque:
|
||||
memcpy(basesp, savebuf, sizeof(state.opaque));
|
||||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* return real path name for path
|
||||
*/
|
||||
|
||||
#if DEBUG
|
||||
|
||||
static char* _pathreal(const char*, int, struct stat*);
|
||||
|
||||
char*
|
||||
pathreal(const char* apath, register int type, struct stat* st)
|
||||
{
|
||||
char* path = (char*)apath;
|
||||
|
||||
initialize();
|
||||
message((-5, "pathreal: ++ %s type=|%s%s%s%s%s%s%s%s%s%s%s", path
|
||||
, (type & P_ABSOLUTE) ? "ABSOLUTE|" : state.null
|
||||
, (type & P_DOTDOT) ? "DOTDOT|" : state.null
|
||||
, (type & P_LSTAT) ? "LSTAT|" : state.null
|
||||
, st ? "MYSTAT|" : state.null
|
||||
, (type & P_NOOPAQUE) ? "NOOPAQUE|" : state.null
|
||||
, (type & P_NOSLASH) ? "NOSLASH|" : state.null
|
||||
, (type & P_PATHONLY) ? "PATHONLY|" : state.null
|
||||
, (type & P_READLINK) ? "READLINK|" : state.null
|
||||
, (type & P_SAFE) ? "SAFE|" : state.null
|
||||
, (type & P_SLASH) ? "SLASH|" : state.null
|
||||
, (type & P_TOP) ? "TOP|" : state.null
|
||||
));
|
||||
path = _pathreal(path, type, st);
|
||||
message((-5, "pathreal: -- %s level=%d links=%d", path, state.path.level, state.path.nlinks));
|
||||
return path;
|
||||
}
|
||||
|
||||
#undef initialize
|
||||
#define initialize()
|
||||
#undef pathreal
|
||||
#define pathreal _pathreal
|
||||
static
|
||||
|
||||
#endif
|
||||
|
||||
char*
|
||||
pathreal(const char* apath, register int type, struct stat* st)
|
||||
{
|
||||
char* path = (char*)apath;
|
||||
register char* sp;
|
||||
register char* cp;
|
||||
register char* ip;
|
||||
Table_t* safe;
|
||||
int oerrno = errno;
|
||||
int opaqued = 0;
|
||||
int len;
|
||||
int vir;
|
||||
int safesize;
|
||||
int safe_dir;
|
||||
long visits;
|
||||
char buf[PATH_MAX + 1];
|
||||
|
||||
static struct stat stbuf;
|
||||
static struct stat tsbuf;
|
||||
|
||||
state.path.level = state.path.synthesize = state.path.nlinks = 0;
|
||||
if (!path)
|
||||
{
|
||||
errno = EFAULT;
|
||||
return 0;
|
||||
}
|
||||
initialize();
|
||||
if (state.in_2d)
|
||||
{
|
||||
if (!st || (!state.level || *path == '/') && !LSTAT(path, st))
|
||||
return path;
|
||||
if (state.level && streq(path, ".") && !CHDIR(state.pwd))
|
||||
{
|
||||
state.level = 0;
|
||||
return path;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#if FS
|
||||
if (mounted() && (sp = fsreal(state.path.monitor, MSG_stat, state.path.mount)))
|
||||
apath = (char*)(path = sp);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* handle null path, . and / separately
|
||||
*/
|
||||
|
||||
if (safe = state.safe ? &state.vsafe : (Table_t*)0)
|
||||
{
|
||||
type |= P_ABSOLUTE;
|
||||
if (!(safesize = state.safe->servicesize))
|
||||
safesize = strlen(state.safe->service);
|
||||
}
|
||||
else
|
||||
type &= ~P_SAFE;
|
||||
again:
|
||||
if (!*path)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
cp = sp = path;
|
||||
state.path.synthesize = state.path.linksize = 0;
|
||||
if (!st)
|
||||
st = &stbuf;
|
||||
|
||||
/*
|
||||
* check if virtual dir has been created by another process
|
||||
* only P_PATHONLY|P_TOP calls (usually create or modify link) and
|
||||
* references to "." are checked for performance
|
||||
*/
|
||||
|
||||
if (state.level > 0 && state.pwd && ((type & (P_PATHONLY|P_TOP)) && *sp != '/' || *sp == '.' && sp[1] == 0))
|
||||
{
|
||||
if (!CHDIR(state.pwd))
|
||||
state.level = 0;
|
||||
else if (!(type & (P_PATHONLY|P_TOP)))
|
||||
{
|
||||
len = 0;
|
||||
state.path.level += (state.path.synthesize = state.level);
|
||||
sp = strcpy(state.path.name, state.pwd);
|
||||
goto skip;
|
||||
}
|
||||
}
|
||||
if (!state.pwd || sp[1] == 0 && (*sp == '.' || *sp == '/' && !safe))
|
||||
{
|
||||
if (st != &stbuf && LSTAT(sp, st))
|
||||
return 0;
|
||||
if (*sp == '/' || !state.pwd && (type & P_PATHONLY))
|
||||
strncpy(state.path.name, sp, PATH_MAX);
|
||||
else if (!state.pwd)
|
||||
{
|
||||
/*
|
||||
* treat the current directory as if were empty
|
||||
*/
|
||||
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
strncpy(state.path.name, state.pwd, PATH_MAX);
|
||||
errno = oerrno;
|
||||
return state.path.name;
|
||||
}
|
||||
|
||||
/*
|
||||
* put absolute pathname into state.path
|
||||
*/
|
||||
|
||||
safe_dir = 0;
|
||||
if (*path != '/')
|
||||
{
|
||||
strcpy(state.path.name, state.pwd);
|
||||
sp = state.path.name + state.pwdsize;
|
||||
*sp++ = '/';
|
||||
if (safe && state.pwdsize >= safesize && !strncmp(state.pwd, state.safe->service, safesize) && (!state.pwd[safesize] || state.pwd[safesize] == '/'))
|
||||
safe_dir = safesize;
|
||||
}
|
||||
else
|
||||
sp = state.path.name;
|
||||
ip = state.path.name + elementsof(state.path.name);
|
||||
while (sp < ip && (*sp = *cp++))
|
||||
sp++;
|
||||
if (type & P_DOTDOT)
|
||||
strcpy(sp, "/..");
|
||||
sp = state.path.name;
|
||||
if (!(ip = pathcanon(sp + safe_dir, sizeof(state.path.name) - safe_dir, 0)))
|
||||
{
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
if (type & (P_DOTDOT|P_NOSLASH))
|
||||
{
|
||||
/*
|
||||
* remove trailing slashes
|
||||
*/
|
||||
|
||||
while (*--ip == '/');
|
||||
*++ip = 0;
|
||||
}
|
||||
else if ((type & P_SLASH) && *(ip - 1) != '/')
|
||||
*ip++ = '/';
|
||||
if (*(ip - 1) == '/' && ip - sp > 1)
|
||||
{
|
||||
/*
|
||||
* trailing slash is equivalent to trailing slash-dot
|
||||
* this forces the common-sense interpretation
|
||||
*/
|
||||
#if DEBUG
|
||||
if (!(state.test & 010))
|
||||
#endif
|
||||
*ip++ = '.';
|
||||
*ip = 0;
|
||||
}
|
||||
len = ip - sp;
|
||||
|
||||
/*
|
||||
* try to use relative path
|
||||
*/
|
||||
|
||||
if (!(type & (P_LSTAT|P_READLINK)))
|
||||
{
|
||||
for (ip = state.pwd; *ip && *ip == *sp++; ip++);
|
||||
if (*ip != 0 || *sp && *sp != '/' || state.level < 0)
|
||||
sp = state.path.name;
|
||||
else
|
||||
{
|
||||
state.path.level += (state.path.synthesize = state.level);
|
||||
if (state.level && !(type & P_PATHONLY) && st == &stbuf)
|
||||
{
|
||||
sp = state.path.name;
|
||||
len -= state.pwdsize;
|
||||
}
|
||||
else if (type & P_ABSOLUTE)
|
||||
sp = state.path.name;
|
||||
else if (*sp == '/')
|
||||
sp++;
|
||||
}
|
||||
if (*sp == 0)
|
||||
sp = state.dot;
|
||||
}
|
||||
skip:
|
||||
if ((type & P_NOOPAQUE) && !LSTAT(sp, st) && checkopaque(sp, st))
|
||||
{
|
||||
message((-1, "%s: remove opaque", sp));
|
||||
UNLINK(sp);
|
||||
opaqued = 1;
|
||||
}
|
||||
if (safe && *sp == '/')
|
||||
{
|
||||
state.path.table = safe;
|
||||
cp = pathnext(sp, NiL, NiL);
|
||||
state.path.table = safe = 0;
|
||||
if (cp)
|
||||
{
|
||||
state.path.level = 0;
|
||||
path = strcpy(buf, sp);
|
||||
message((-5, "pathreal: == safe map %s", path));
|
||||
type &= ~(P_DOTDOT|P_SAFE);
|
||||
goto again;
|
||||
}
|
||||
if (!*(sp + 1))
|
||||
{
|
||||
strncpy(sp, state.safe->service, safesize);
|
||||
sp[safesize] = 0;
|
||||
}
|
||||
else if (strncmp(sp, state.safe->service, safesize) || sp[safesize] && sp[safesize] != '/')
|
||||
{
|
||||
if (*path != '/' && safe_dir)
|
||||
{
|
||||
errno = EPERM;
|
||||
return 0;
|
||||
}
|
||||
if (sp[1])
|
||||
strcpy(buf, sp);
|
||||
else
|
||||
*buf = 0;
|
||||
len = sfsprintf(sp, sizeof(state.path.name), "%-*s%s", safesize, state.safe->service, buf);
|
||||
message((-5, "pathreal: == safe next %s", sp));
|
||||
if (!pathnext(sp, NiL, NiL))
|
||||
{
|
||||
errno = EPERM;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
type &= ~P_SAFE;
|
||||
}
|
||||
if ((type & P_SAFE) && state.path.level)
|
||||
{
|
||||
errno = EPERM;
|
||||
return 0;
|
||||
}
|
||||
if (type & P_PATHONLY)
|
||||
{
|
||||
errno = oerrno;
|
||||
return sp;
|
||||
}
|
||||
visits = 0;
|
||||
vir = 1;
|
||||
while (LSTAT(sp, st))
|
||||
{
|
||||
if (vir)
|
||||
{
|
||||
if (apath[0] == '.' && apath[1] == '.' && apath[2] == '.' && !apath[3])
|
||||
{
|
||||
if (state.level > 0)
|
||||
{
|
||||
message((-1, "pathreal: %s => %s", apath, sp));
|
||||
LSTAT(".", st);
|
||||
return sp;
|
||||
}
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
vir = 0;
|
||||
}
|
||||
if (errno == ENOTDIR)
|
||||
{
|
||||
/*
|
||||
* check for version instance
|
||||
*/
|
||||
|
||||
cp = ip = sp + strlen(sp);
|
||||
while (ip > sp && *--ip != '/');
|
||||
if (ip < sp)
|
||||
return 0;
|
||||
while (ip > sp && *--ip == '/');
|
||||
if (ip < sp)
|
||||
return 0;
|
||||
while (ip > sp && *--ip != '/');
|
||||
if (*ip == '/')
|
||||
ip++;
|
||||
while (cp >= ip)
|
||||
{
|
||||
cp[4] = *cp;
|
||||
cp--;
|
||||
}
|
||||
memcpy(ip, state.opaque, 4);
|
||||
if (!LSTAT(sp, st))
|
||||
break;
|
||||
errno = ENOTDIR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (errno != ENOENT || opaqued)
|
||||
return 0;
|
||||
#if FS
|
||||
/*
|
||||
* check user mount
|
||||
*/
|
||||
|
||||
if (visits)
|
||||
{
|
||||
Mount_t* mp;
|
||||
const char* up;
|
||||
|
||||
if ((mp = getmount(sp, &up)) && (mp->fs->flags & FS_NAME) && (sp = fsreal(mp, MSG_open, (char*)up)) && !LSTAT(sp, st))
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* search down the viewpath
|
||||
*/
|
||||
|
||||
if (type & P_SAFE)
|
||||
{
|
||||
errno = EPERM;
|
||||
return 0;
|
||||
}
|
||||
if (!pathnext(state.path.name, NiL, &visits))
|
||||
return 0;
|
||||
sp = state.path.name;
|
||||
if (!(type & P_ABSOLUTE))
|
||||
{
|
||||
/*
|
||||
* try to use relative path
|
||||
*/
|
||||
|
||||
for (ip = state.pwd; *ip && *ip == *sp++; ip++);
|
||||
if (*ip == 0 && *sp == '/')
|
||||
sp++;
|
||||
else
|
||||
sp = state.path.name;
|
||||
}
|
||||
if (*sp == 0)
|
||||
sp = state.dot;
|
||||
}
|
||||
if (st->st_nlink > 1 && checkopaque(sp, st))
|
||||
return 0;
|
||||
if ((type & P_TOP) && state.path.level)
|
||||
{
|
||||
int rfd;
|
||||
int wfd;
|
||||
|
||||
if ((rfd = OPEN(sp, O_RDONLY, 0)) < 0)
|
||||
sp = 0;
|
||||
else
|
||||
{
|
||||
tsbuf = *st;
|
||||
wfd = open(apath, O_WRONLY|O_CREAT|O_TRUNC|O_cloexec, st->st_mode & S_IPERM);
|
||||
*st = tsbuf;
|
||||
if (wfd < 0)
|
||||
sp = 0;
|
||||
else
|
||||
{
|
||||
if (fs3d_copy(rfd, wfd, st))
|
||||
sp = 0;
|
||||
CLOSE(wfd);
|
||||
}
|
||||
CLOSE(rfd);
|
||||
}
|
||||
if (!sp)
|
||||
{
|
||||
errno = EROFS;
|
||||
return 0;
|
||||
}
|
||||
if (st == &stbuf)
|
||||
st = 0;
|
||||
return pathreal(apath, P_PATHONLY, st);
|
||||
}
|
||||
IVIEW(st, state.path.level);
|
||||
if (state.path.synthesize)
|
||||
{
|
||||
if (state.path.level < state.level)
|
||||
{
|
||||
if (len)
|
||||
{
|
||||
ip = state.path.name + strlen(state.path.name) - len;
|
||||
len = *ip;
|
||||
*ip = 0;
|
||||
}
|
||||
if (!CHDIR(state.path.name))
|
||||
state.level = state.path.level;
|
||||
message((-1, "chdir=%s level=%d", state.path.name, state.level));
|
||||
*ip = len;
|
||||
}
|
||||
else if (S_ISDIR(st->st_mode))
|
||||
{
|
||||
int mask;
|
||||
static int uid = -1;
|
||||
static int gid;
|
||||
|
||||
umask(mask = umask(0));
|
||||
st->st_mode = (st->st_mode | (S_IRWXU|S_IRWXG|S_IRWXO)) & ~(mask & (S_IRWXU|S_IRWXG|S_IRWXO));
|
||||
if (uid == -1)
|
||||
{
|
||||
uid = geteuid();
|
||||
gid = getegid();
|
||||
}
|
||||
st->st_uid = uid;
|
||||
st->st_gid = gid;
|
||||
}
|
||||
}
|
||||
ip = sp;
|
||||
|
||||
/*
|
||||
* symbolic links handled specially
|
||||
* get filename from pathname
|
||||
*/
|
||||
|
||||
if (S_ISLNK(st->st_mode) && (len = checklink(sp, st, type)) > 1 && !(type & (P_LSTAT|P_READLINK)) && state.path.nlinks++ < MAXSYMLINKS)
|
||||
{
|
||||
path = strcpy(buf, state.path.name);
|
||||
message((-1, "pathreal: == again %s", path));
|
||||
if (*path != '/')
|
||||
state.path.level = 0;
|
||||
type &= ~(P_DOTDOT|P_SAFE);
|
||||
goto again;
|
||||
}
|
||||
#if VCS && defined(VCS_REAL)
|
||||
VCS_REAL(state.path.name, st);
|
||||
#endif
|
||||
errno = oerrno;
|
||||
return sp;
|
||||
}
|
||||
|
||||
/*
|
||||
* check whether sp points to a version object and find version instance
|
||||
* sp is canonicalized and points into state.path
|
||||
* when called from unlink, (type & P_PATHONLY) is set
|
||||
* -1 for non-existent link
|
||||
* length of path for a relative link that is not a version object
|
||||
* 0 otherwise
|
||||
* state.path.linkname and state.path.linksize are set for version object
|
||||
*/
|
||||
|
||||
int
|
||||
checklink(const char* asp, struct stat* st, int type)
|
||||
{
|
||||
register char* sp = (char*)asp;
|
||||
register char* ip;
|
||||
register int len;
|
||||
register int n;
|
||||
register char* bp;
|
||||
|
||||
char buf[PATH_MAX + 1];
|
||||
|
||||
if (sp < state.path.name || sp >= state.path.name + sizeof(state.path.name))
|
||||
{
|
||||
message((-1, "AHA#%d checklink bounds sp=%p state.path.name=%p sp=%s", __LINE__, sp, state.path.name, sp));
|
||||
sp = strncpy(state.path.name, sp, sizeof(state.path.name) - 1);
|
||||
}
|
||||
while (S_ISLNK(st->st_mode))
|
||||
{
|
||||
/*
|
||||
* go to the last component
|
||||
*/
|
||||
|
||||
if (ip = strrchr(sp, '/'))
|
||||
ip++;
|
||||
else
|
||||
ip = sp;
|
||||
strcpy(buf, ip);
|
||||
len = (state.path.name + sizeof(state.path.name) - 1) - ip;
|
||||
if ((len = READLINK(sp, ip, len)) < 0)
|
||||
{
|
||||
message((-1, "%s: cannot readlink", sp));
|
||||
return 0;
|
||||
}
|
||||
state.path.linkname = ip;
|
||||
state.path.linksize = len;
|
||||
|
||||
/*
|
||||
* check for relative link
|
||||
*/
|
||||
|
||||
if (*ip != '/')
|
||||
{
|
||||
ip[len] = 0;
|
||||
if (*ip == *state.opaque && !memcmp(ip, state.opaque, 4) && !memcmp(ip + 4, buf, n = strlen(buf)))
|
||||
{
|
||||
/*
|
||||
* version object
|
||||
*/
|
||||
|
||||
ip += n + 4;
|
||||
if (instance(state.path.name, ip, st, 0))
|
||||
{
|
||||
state.path.linksize = strlen(state.path.linkname);
|
||||
if (type & P_LSTAT)
|
||||
{
|
||||
st->st_size = state.path.linksize;
|
||||
st->st_mode &= S_IPERM;
|
||||
#ifdef S_IFLNK
|
||||
st->st_mode |= S_IFLNK;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if (!(type & (P_LSTAT|P_PATHONLY|P_READLINK)) && *ip == '.' && *(ip + 1) == '.' && (*(ip + 2) == '/' || *(ip + 2) == 0))
|
||||
{
|
||||
memcpy(buf, ip, len + 1);
|
||||
bp = state.path.name;
|
||||
while (ip > bp && *(ip - 1) == '/')
|
||||
ip--;
|
||||
for (;;)
|
||||
{
|
||||
*(sp = ip) = 0;
|
||||
while (ip > bp && *--ip != '/');
|
||||
while (ip > bp && *(ip - 1) == '/')
|
||||
ip--;
|
||||
if (*ip == '/')
|
||||
ip++;
|
||||
if ((n = READLINK(state.path.name, ip, PATH_MAX - (ip - state.path.name))) <= 0)
|
||||
{
|
||||
*sp++ = '/';
|
||||
state.path.linkname = (char*)memcpy(sp, buf, len + 1);
|
||||
return sp + len - state.path.name;
|
||||
}
|
||||
if (*ip == '/')
|
||||
ip = (char*)memcpy(bp = state.path.name, ip, n);
|
||||
else if (ip > bp)
|
||||
*(ip - 1) = '/';
|
||||
ip += n;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* restore last component
|
||||
*/
|
||||
|
||||
if (!(type & P_READLINK))
|
||||
strcpy(ip, buf);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#include <cs.h>
|
||||
|
||||
/*
|
||||
* peek siz chars from fd into buf
|
||||
* if not peekable but seekable then chars are peeked at offset 0
|
||||
*/
|
||||
|
||||
ssize_t
|
||||
peek(int fd, void* buf, size_t siz)
|
||||
{
|
||||
register int n;
|
||||
|
||||
n = cspeek(&cs, fd, buf, siz);
|
||||
if (n >= 0)
|
||||
return(n);
|
||||
cspeek(&cs, -1, NiL, 0);
|
||||
if (!FSTAT(fd, &state.path.st) && state.path.st.st_size <= siz)
|
||||
{
|
||||
while ((n = read(fd, buf, siz)) != state.path.st.st_size && lseek(fd, 0L, 1) > 0 && lseek(fd, 0L, 0) == 0);
|
||||
if (n == state.path.st.st_size || n > 0 && !state.path.st.st_size)
|
||||
return(n);
|
||||
}
|
||||
return(-1);
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef pipe3d
|
||||
|
||||
int
|
||||
pipe3d(int* fds)
|
||||
{
|
||||
int r;
|
||||
#if !_mangle_syscall
|
||||
int fd;
|
||||
#endif
|
||||
|
||||
initialize();
|
||||
#if !_mangle_syscall
|
||||
if (r = (state.fs[FS_option].flags & FS_ON) != 0) state.fs[FS_option].flags &= ~FS_ON;
|
||||
for (fd = 0; fd < OPEN_MAX; fd++)
|
||||
if ((fds[0] = DUP(fd)) >= 0)
|
||||
{
|
||||
fds[1] = DUP(fds[0]);
|
||||
CLOSE(fds[1]);
|
||||
CLOSE(fds[0]);
|
||||
break;
|
||||
}
|
||||
if (r) state.fs[FS_option].flags |= FS_ON;
|
||||
#endif
|
||||
r = PIPE(fds);
|
||||
#if FS
|
||||
if (!r && !state.in_2d)
|
||||
{
|
||||
Mount_t* mp;
|
||||
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_pipe))
|
||||
fscall(mp, MSG_pipe, 0, fds);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(pipe)
|
||||
|
||||
#endif
|
|
@ -1,73 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef read3d
|
||||
|
||||
ssize_t
|
||||
read3d(int fd, void* buf, size_t n)
|
||||
{
|
||||
register ssize_t r;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
off_t off;
|
||||
int pos = 0;
|
||||
|
||||
if (!fscall(NiL, MSG_read, 0, fd, buf, n))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
r = READ(fd, buf, n);
|
||||
#if FS
|
||||
if (r >= 0)
|
||||
{
|
||||
if (mp)
|
||||
{
|
||||
if (!pos)
|
||||
{
|
||||
pos = 1;
|
||||
off = LSEEK(fd, 0, SEEK_CUR) - r;
|
||||
}
|
||||
fscall(mp, r, MSG_read3d, fd, buf, n, off);
|
||||
}
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_read))
|
||||
{
|
||||
if (!pos)
|
||||
{
|
||||
pos = 1;
|
||||
off = LSEEK(fd, 0, SEEK_CUR) - r;
|
||||
}
|
||||
fscall(mp, MSG_read3d, r, fd, buf, n, off);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(read)
|
||||
|
||||
#endif
|
|
@ -1,68 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
ssize_t
|
||||
readlink3d(const char* path, char* buf, register size_t size)
|
||||
{
|
||||
size_t r;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(READLINK(path, buf, size));
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_readlink, 0, path, buf, size))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!pathreal(path, P_READLINK, NiL))
|
||||
return(-1);
|
||||
|
||||
/*
|
||||
* see if link text is already in memory
|
||||
*/
|
||||
|
||||
if (r = state.path.linksize)
|
||||
{
|
||||
if (r > state.path.linksize)
|
||||
r = state.path.linksize;
|
||||
memcpy(buf, state.path.linkname, r);
|
||||
#if FS
|
||||
if (mp) fscall(mp, MSG_readlink, r, path, buf, size);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_readlink))
|
||||
fscall(mp, MSG_readlink, r, path, buf, size);
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
/*
|
||||
* exists but not a symbolic link
|
||||
*/
|
||||
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
|
@ -1,85 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
rename3d(const char* path, const char* target)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
char* t;
|
||||
int oerrno;
|
||||
char buf[PATH_MAX+1];
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_rename, 0, path, target))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP|P_LSTAT, NiL)))
|
||||
return(-1);
|
||||
strncpy(buf, sp, PATH_MAX);
|
||||
if (!(sp = pathreal(target, P_PATHONLY|P_NOOPAQUE, NiL)))
|
||||
return(-1);
|
||||
oerrno = errno;
|
||||
if ((r = RENAME(buf, sp)) && errno == ENOENT && (t = strrchr(sp, '/')))
|
||||
{
|
||||
*t = 0;
|
||||
r = fs3d_mkdir(sp, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
*t = '/';
|
||||
if (!r)
|
||||
{
|
||||
errno = oerrno;
|
||||
r = RENAME(buf, sp);
|
||||
}
|
||||
}
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
{
|
||||
if (sp != buf)
|
||||
{
|
||||
if (!(sp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
sp = strncpy(buf, sp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_rename, 0, path, sp);
|
||||
}
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_rename))
|
||||
{
|
||||
if (sp != buf)
|
||||
{
|
||||
if (!(sp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
sp = strncpy(buf, sp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_rename, 0, path, sp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,133 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#include "dir_3d.h"
|
||||
|
||||
static int
|
||||
rmfiles(char* path, char* endpath, ino_t ino)
|
||||
{
|
||||
register DIRDIR* dp;
|
||||
register struct DIRdirent* ep;
|
||||
register char* s;
|
||||
register char* t;
|
||||
int pass = 0;
|
||||
|
||||
*endpath = 0;
|
||||
if (!(dp = OPENDIR(path))) return(0);
|
||||
*endpath++ = '/';
|
||||
for (;;)
|
||||
{
|
||||
if (!(ep = (struct DIRdirent*)READDIR(dp)))
|
||||
{
|
||||
if (pass++)
|
||||
{
|
||||
CLOSEDIR(dp);
|
||||
return(1);
|
||||
}
|
||||
SEEKDIR(dp, 0L);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef D_FILENO
|
||||
if (D_FILENO(ep) != ino)
|
||||
#else
|
||||
struct stat st;
|
||||
|
||||
strcpy(endpath, ep->d_name);
|
||||
if (STAT(path, &st)) break;
|
||||
if (st.st_ino != ino)
|
||||
#endif
|
||||
{
|
||||
s = state.opaque;
|
||||
t = ep->d_name;
|
||||
while (*s && *s++ == *t) t++;
|
||||
if (*s || *t) break;
|
||||
}
|
||||
else if (pass)
|
||||
{
|
||||
#ifdef D_FILENO
|
||||
strcpy(endpath, ep->d_name);
|
||||
#endif
|
||||
if (UNLINK(path)) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
CLOSEDIR(dp);
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
rmdir3d(const char* path)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
int pass = 0;
|
||||
struct stat st;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_rmdir, 0, path))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_PATHONLY, NiL)))
|
||||
return(-1);
|
||||
if (state.path.level)
|
||||
return(0);
|
||||
retry:
|
||||
r = RMDIR(sp);
|
||||
if (!r)
|
||||
{
|
||||
#if FS
|
||||
if (mp) fscall(mp, MSG_rmdir, 0, path);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_rmdir))
|
||||
fscall(mp, MSG_rmdir, 0, path);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
if (errno == ENOENT && pathreal(path, 0, NiL))
|
||||
return(0);
|
||||
if (errno == ENOTEMPTY && !pass++)
|
||||
{
|
||||
register char* slast = sp;
|
||||
|
||||
while (*slast) slast++;
|
||||
*slast = '/';
|
||||
strcpy(slast+1, state.opaque);
|
||||
if (!LSTAT(sp, &st))
|
||||
{
|
||||
if (rmfiles(sp, slast, st.st_ino))
|
||||
{
|
||||
*slast = 0;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
else errno = ENOTEMPTY;
|
||||
}
|
||||
}
|
||||
return(r);
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef sbrk3d
|
||||
|
||||
void*
|
||||
sbrk3d(ssize_t i)
|
||||
{
|
||||
#if FS
|
||||
register Mount_t* mp;
|
||||
void* p;
|
||||
|
||||
initialize();
|
||||
if ((p = SBRK(i)) != (void*)(-1))
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_break))
|
||||
fscall(mp, MSG_break, 0, p);
|
||||
return(p);
|
||||
#else
|
||||
return(SBRK(i));
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(sbrk)
|
||||
|
||||
#endif
|
|
@ -1,138 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma noprototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
/* the 3 arg _xstat() disrupts our proto game -- every party needs one */
|
||||
#if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
|
||||
int stat3d(const char* path, struct stat* st)
|
||||
#else
|
||||
#if defined(_STAT)
|
||||
int _stat(path, st) char* path; struct stat* st; { return stat(path, st); }
|
||||
#endif
|
||||
int stat(path, st) char* path; struct stat* st;
|
||||
#endif
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
#ifdef _3D_STAT_VER
|
||||
struct stat* so;
|
||||
struct stat sc;
|
||||
#endif
|
||||
|
||||
#ifdef _3D_STAT_VER
|
||||
if (_3d_ver != _3D_STAT_VER)
|
||||
{
|
||||
so = st;
|
||||
st = ≻
|
||||
}
|
||||
#endif
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_stat, 0, path, st))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, st)))
|
||||
return -1;
|
||||
if (S_ISLNK(st->st_mode))
|
||||
{
|
||||
#ifdef _3D_STAT_VER
|
||||
if (st == &sc)
|
||||
st = so;
|
||||
if (XSTAT(_3d_ver, sp, st))
|
||||
return -1;
|
||||
#ifdef _3D_STAT64_VER
|
||||
if (_3d_ver == _3D_STAT64_VER)
|
||||
IVIEW(((struct stat64*)st), state.path.level);
|
||||
else
|
||||
#endif
|
||||
#else
|
||||
if (STAT(sp, st))
|
||||
return -1;
|
||||
#endif
|
||||
IVIEW(st, state.path.level);
|
||||
}
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_stat, 0, state.path.name, st);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_stat))
|
||||
fscall(mp, MSG_stat, 0, state.path.name, st);
|
||||
#endif
|
||||
#ifdef _3D_STAT_VER
|
||||
if (st == &sc)
|
||||
{
|
||||
st = so;
|
||||
if (XSTAT(_3d_ver, sp, st))
|
||||
return -1;
|
||||
#ifdef _3D_STAT64_VER
|
||||
if (_3d_ver == _3D_STAT64_VER)
|
||||
IVIEW(((struct stat64*)st), state.path.level);
|
||||
else
|
||||
#endif
|
||||
IVIEW(st, state.path.level);
|
||||
}
|
||||
#endif
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(_LARGEFILE64_SOURCE) && defined(STAT643D) && !defined(_3D_STAT64_VER)
|
||||
|
||||
int
|
||||
stat643d(const char* path, struct stat64* st)
|
||||
{
|
||||
register char* sp;
|
||||
struct stat ss;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_stat, 0, path, &ss))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, &ss)))
|
||||
return -1;
|
||||
if (STAT64(sp, st))
|
||||
return -1;
|
||||
IVIEW(st, state.path.level);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_stat, 0, state.path.name, &ss);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_stat))
|
||||
fscall(mp, MSG_stat, 0, state.path.name, &ss);
|
||||
#endif
|
||||
#if _mem_d_type_dirent
|
||||
if (S_ISDIR(st->st_mode))
|
||||
st->st_nlink = _3D_LINK_MAX;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,182 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide statfs
|
||||
#else
|
||||
#define statfs ______statfs
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(statfs3d) && ( _sys_statfs || _sys_vfs || _sys_mount && _mem_f_files_statfs )
|
||||
|
||||
#include <cs_lib.h>
|
||||
|
||||
#if _sys_statfs
|
||||
#include <sys/statfs.h>
|
||||
#else
|
||||
#if _sys_vfs
|
||||
#include <sys/vfs.h>
|
||||
#define _vfs_statfs 1
|
||||
#else
|
||||
#if _sys_mount
|
||||
#if _lib_getmntinfo
|
||||
#include <sys/param.h> /* expect some macro redefinitions here */
|
||||
#endif
|
||||
#include <sys/mount.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide statfs
|
||||
#else
|
||||
#undef statfs
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
#if _vfs_statfs
|
||||
#define VFS (fs)
|
||||
#else
|
||||
#define VFS (&vfs)
|
||||
#endif
|
||||
|
||||
#if ARG3D_statfs == 4
|
||||
|
||||
int
|
||||
statfs3d(const char* path, struct statfs* fs, int size, int type)
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#if !_vfs_statfs
|
||||
struct statvfs vfs;
|
||||
#endif
|
||||
|
||||
if (!fscall(NiL, MSG_statfs, 0, path, VFS, size, type))
|
||||
{
|
||||
#if !_vfs_statfs
|
||||
if (!state.ret)
|
||||
{
|
||||
memset(fs, 0, sizeof(*fs));
|
||||
fs->f_bsize = vfs.f_bsize;
|
||||
fs->f_blocks = vfs.f_blocks;
|
||||
fs->f_bfree = vfs.f_bfree;
|
||||
fs->f_files = vfs.f_files;
|
||||
fs->f_ffree = vfs.f_ffree;
|
||||
}
|
||||
#endif
|
||||
return state.ret;
|
||||
}
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, NiL)))
|
||||
return -1;
|
||||
if (STATFS(sp, fs, size, type))
|
||||
return -1;
|
||||
#if FS
|
||||
#if !_vfs_statfs
|
||||
if (mp || state.global)
|
||||
{
|
||||
memset(&vfs, 0, sizeof(vfs));
|
||||
vfs.f_bsize = fs->f_bsize;
|
||||
vfs.f_blocks = fs->f_blocks;
|
||||
vfs.f_bfree = fs->f_bfree;
|
||||
vfs.f_files = fs->f_files;
|
||||
vfs.f_ffree = fs->f_ffree;
|
||||
}
|
||||
#endif
|
||||
if (mp)
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, VFS, size, type);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_statfs))
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, VFS, size, type);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
statfs3d(const char* path, struct statfs* fs)
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#if !_vfs_statfs
|
||||
struct statvfs vfs;
|
||||
#endif
|
||||
|
||||
if (!fscall(NiL, MSG_statfs, 0, path, VFS))
|
||||
{
|
||||
#if !_vfs_statfs
|
||||
if (!state.ret)
|
||||
{
|
||||
memset(fs, 0, sizeof(*fs));
|
||||
fs->f_bsize = vfs.f_bsize;
|
||||
fs->f_blocks = vfs.f_blocks;
|
||||
fs->f_bfree = vfs.f_bfree;
|
||||
fs->f_files = vfs.f_files;
|
||||
fs->f_ffree = vfs.f_ffree;
|
||||
}
|
||||
#endif
|
||||
return state.ret;
|
||||
}
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, NiL)))
|
||||
return -1;
|
||||
if (STATFS(sp, fs))
|
||||
return -1;
|
||||
#if FS
|
||||
#if !_vfs_statfs
|
||||
if (mp || state.global)
|
||||
{
|
||||
memset(&vfs, 0, sizeof(vfs));
|
||||
vfs.f_bsize = fs->f_bsize;
|
||||
vfs.f_blocks = fs->f_blocks;
|
||||
vfs.f_bfree = fs->f_bfree;
|
||||
vfs.f_files = fs->f_files;
|
||||
vfs.f_ffree = fs->f_ffree;
|
||||
}
|
||||
#endif
|
||||
if (mp)
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, VFS);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_statfs))
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, VFS);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
NoN(statfs)
|
||||
|
||||
#endif
|
|
@ -1,57 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if defined(statvfs3d) && defined(_sys_statvfs)
|
||||
|
||||
int
|
||||
statvfs3d(const char* path, struct statvfs* fs)
|
||||
{
|
||||
register char* sp;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_statfs, 0, path, fs))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, 0, NiL)))
|
||||
return(-1);
|
||||
if (STATVFS(sp, fs))
|
||||
return(-1);
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, fs);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_statfs))
|
||||
fscall(mp, MSG_statfs, 0, state.path.name, fs);
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(statvfs)
|
||||
|
||||
#endif
|
|
@ -1,34 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* std 3d symbol mappings
|
||||
*
|
||||
* NOTE: include once before std headers and once after
|
||||
* to make sure our slimey tricks win
|
||||
*/
|
||||
|
||||
#undef remove
|
||||
#define remove unlink
|
||||
|
||||
#undef sfsprintf
|
||||
#define sfsprintf _3d_sfsprintf
|
|
@ -1,810 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* NOTE: obsolete strmatch() for 3d private use
|
||||
* -last strmatch() based on <regex.h> for external use
|
||||
*/
|
||||
|
||||
/*
|
||||
* D. G. Korn
|
||||
* G. S. Fowler
|
||||
* AT&T Research
|
||||
*
|
||||
* match shell file patterns -- derived from Bourne and Korn shell gmatch()
|
||||
*
|
||||
* sh pattern egrep RE description
|
||||
* ---------- -------- -----------
|
||||
* * .* 0 or more chars
|
||||
* ? . any single char
|
||||
* [.] [.] char class
|
||||
* [!.] [^.] negated char class
|
||||
* [[:.:]] [[:.:]] ctype class
|
||||
* [[=.=]] [[=.=]] equivalence class
|
||||
* [[...]] [[...]] collation element
|
||||
* *(.) (.)* 0 or more of
|
||||
* +(.) (.)+ 1 or more of
|
||||
* ?(.) (.)? 0 or 1 of
|
||||
* (.) (.) 1 of
|
||||
* @(.) (.) 1 of
|
||||
* a|b a|b a or b
|
||||
* \# () subgroup back reference [1-9]
|
||||
* a&b a and b
|
||||
* !(.) none of
|
||||
*
|
||||
* \ used to escape metacharacters
|
||||
*
|
||||
* *, ?, (, |, &, ), [, \ must be \'d outside of [...]
|
||||
* only ] must be \'d inside [...]
|
||||
*
|
||||
* BUG: unbalanced ) terminates top level pattern
|
||||
*
|
||||
* BOTCH: collating element sort order and character class ranges apparently
|
||||
* do not have strcoll() in common so we resort to fnmatch(), calling
|
||||
* it up to COLL_MAX times to determine the matched collating
|
||||
* element size
|
||||
*/
|
||||
|
||||
#include <ast.h>
|
||||
#include <ctype.h>
|
||||
#include <hashkey.h>
|
||||
|
||||
#undef _lib_fnmatch /* 3d */
|
||||
#undef _lib_mbtowc /* 3d */
|
||||
|
||||
#define strgrpmatch _3d_strgrpmatch
|
||||
|
||||
#if _hdr_wchar && _lib_wctype && _lib_iswctype
|
||||
|
||||
#include <stdio.h> /* because <wchar.h> includes it and we generate it */
|
||||
#include <wchar.h>
|
||||
#if _hdr_wctype
|
||||
#include <wctype.h>
|
||||
#endif
|
||||
|
||||
#undef isalnum
|
||||
#define isalnum(x) iswalnum(x)
|
||||
#undef isalpha
|
||||
#define isalpha(x) iswalpha(x)
|
||||
#undef iscntrl
|
||||
#define iscntrl(x) iswcntrl(x)
|
||||
#undef isblank
|
||||
#define isblank(x) iswblank(x)
|
||||
#undef isdigit
|
||||
#define isdigit(x) iswdigit(x)
|
||||
#undef isgraph
|
||||
#define isgraph(x) iswgraph(x)
|
||||
#undef islower
|
||||
#define islower(x) iswlower(x)
|
||||
#undef isprint
|
||||
#define isprint(x) iswprint(x)
|
||||
#undef ispunct
|
||||
#define ispunct(x) iswpunct(x)
|
||||
#undef isspace
|
||||
#define isspace(x) iswspace(x)
|
||||
#undef isupper
|
||||
#define isupper(x) iswupper(x)
|
||||
#undef isxdigit
|
||||
#define isxdigit(x) iswxdigit(x)
|
||||
|
||||
#if !defined(iswblank) && !_lib_iswblank
|
||||
|
||||
static int
|
||||
iswblank(wint_t wc)
|
||||
{
|
||||
static int initialized;
|
||||
static wctype_t wt;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
initialized = 1;
|
||||
wt = wctype("blank");
|
||||
}
|
||||
return iswctype(wc, wt);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#undef _lib_wctype
|
||||
|
||||
#ifndef isblank
|
||||
#define isblank(x) ((x)==' '||(x)=='\t')
|
||||
#endif
|
||||
|
||||
#ifndef isgraph
|
||||
#define isgraph(x) (isprint(x)&&!isblank(x))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if _DEBUG_MATCH
|
||||
#include <error.h>
|
||||
#endif
|
||||
|
||||
#define MAXGROUP 10
|
||||
|
||||
typedef struct Group_s
|
||||
{
|
||||
char* beg[MAXGROUP];
|
||||
char* end[MAXGROUP];
|
||||
char* next_s;
|
||||
short groups;
|
||||
} Group_t;
|
||||
|
||||
typedef struct Match_s
|
||||
{
|
||||
Group_t current;
|
||||
Group_t best;
|
||||
char* last_s;
|
||||
char* next_p;
|
||||
} Match_t;
|
||||
|
||||
#if _lib_mbtowc && MB_LEN_MAX > 1
|
||||
#define mbgetchar(p) ((ast.locale.set&LC_SET_CTYPE)?((ast.tmp_int=mbtowc(&ast.tmp_wchar,p,MB_CUR_MAX))>=0?((p+=ast.tmp_int),ast.tmp_wchar):0):(*p++))
|
||||
#else
|
||||
#define mbgetchar(p) (*p++)
|
||||
#endif
|
||||
|
||||
#ifndef isxdigit
|
||||
#define isxdigit(c) ((c)>='0'&&(c)<='9'||(c)>='a'&&(c)<='f'||(c)>='A'&&(c)<='F')
|
||||
#endif
|
||||
|
||||
#define getsource(s,e) (((s)>=(e))?0:mbgetchar(s))
|
||||
|
||||
#define COLL_MAX 3
|
||||
|
||||
#if !_lib_strcoll
|
||||
#undef _lib_fnmatch
|
||||
#endif
|
||||
|
||||
#if _lib_fnmatch
|
||||
extern int fnmatch(const char*, const char*, int);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* gobble chars up to <sub> or ) keeping track of (...) and [...]
|
||||
* sub must be one of { '|', '&', 0 }
|
||||
* 0 returned if s runs out
|
||||
*/
|
||||
|
||||
static char*
|
||||
gobble(Match_t* mp, register char* s, register int sub, int* g, int clear)
|
||||
{
|
||||
register int p = 0;
|
||||
register char* b = 0;
|
||||
int c = 0;
|
||||
int n;
|
||||
|
||||
for (;;)
|
||||
switch (mbgetchar(s))
|
||||
{
|
||||
case '\\':
|
||||
if (mbgetchar(s))
|
||||
break;
|
||||
/*FALLTHROUGH*/
|
||||
case 0:
|
||||
return 0;
|
||||
case '[':
|
||||
if (!b)
|
||||
{
|
||||
if (*s == '!')
|
||||
mbgetchar(s);
|
||||
b = s;
|
||||
}
|
||||
else if (*s == '.' || *s == '=' || *s == ':')
|
||||
c = *s;
|
||||
break;
|
||||
case ']':
|
||||
if (b)
|
||||
{
|
||||
if (*(s - 2) == c)
|
||||
c = 0;
|
||||
else if (b != (s - 1))
|
||||
b = 0;
|
||||
}
|
||||
break;
|
||||
case '(':
|
||||
if (!b)
|
||||
{
|
||||
p++;
|
||||
n = (*g)++;
|
||||
if (clear)
|
||||
{
|
||||
if (!sub)
|
||||
n++;
|
||||
if (n < MAXGROUP)
|
||||
mp->current.beg[n] = mp->current.end[n] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ')':
|
||||
if (!b && p-- <= 0)
|
||||
return sub ? 0 : s;
|
||||
break;
|
||||
case '|':
|
||||
if (!b && !p && sub == '|')
|
||||
return s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int grpmatch(Match_t*, int, char*, register char*, char*, int);
|
||||
|
||||
#if _DEBUG_MATCH
|
||||
static long test;
|
||||
|
||||
#define return x) do{error_info.indent--;return(x;}while(0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* match a single pattern
|
||||
* e is the end (0) of the substring in s
|
||||
* r marks the start of a repeated subgroup pattern
|
||||
*/
|
||||
|
||||
static int
|
||||
onematch(Match_t* mp, int g, char* s, char* p, char* e, char* r, int flags)
|
||||
{
|
||||
register int pc;
|
||||
register int sc;
|
||||
register int n;
|
||||
register int icase;
|
||||
char* olds;
|
||||
char* oldp;
|
||||
|
||||
#if _DEBUG_MATCH
|
||||
error_info.indent++;
|
||||
error(-1, "onematch g=%d s=%-.*s p=%s r=%p flags=%o", g, e - s, s, p, r, flags);
|
||||
#endif
|
||||
icase = flags & STR_ICASE;
|
||||
do
|
||||
{
|
||||
olds = s;
|
||||
sc = getsource(s, e);
|
||||
if (icase && isupper(sc))
|
||||
sc = tolower(sc);
|
||||
oldp = p;
|
||||
switch (pc = mbgetchar(p))
|
||||
{
|
||||
case '(':
|
||||
case '*':
|
||||
case '?':
|
||||
case '+':
|
||||
case '@':
|
||||
case '!':
|
||||
if (pc == '(' || *p == '(')
|
||||
{
|
||||
char* subp;
|
||||
int oldg;
|
||||
|
||||
s = olds;
|
||||
subp = p + (pc != '(');
|
||||
oldg = g;
|
||||
n = ++g;
|
||||
if (g < MAXGROUP && (!r || g > mp->current.groups))
|
||||
mp->current.beg[g] = mp->current.end[g] = 0;
|
||||
if (!(p = gobble(mp, subp, 0, &g, !r)))
|
||||
return 0;
|
||||
if (pc == '*' || pc == '?' || pc == '+' && oldp == r)
|
||||
{
|
||||
if (onematch(mp, g, s, p, e, NiL, flags))
|
||||
return 1;
|
||||
if (!sc || !getsource(s, e))
|
||||
{
|
||||
mp->current.groups = oldg;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (pc == '*' || pc == '+')
|
||||
{
|
||||
p = oldp;
|
||||
sc = n - 1;
|
||||
}
|
||||
else
|
||||
sc = g;
|
||||
pc = (pc != '!');
|
||||
do
|
||||
{
|
||||
if (grpmatch(mp, n, olds, subp, s, flags) == pc)
|
||||
{
|
||||
if (n < MAXGROUP)
|
||||
{
|
||||
if (!mp->current.beg[n] || mp->current.beg[n] > olds)
|
||||
mp->current.beg[n] = olds;
|
||||
if (s > mp->current.end[n])
|
||||
mp->current.end[n] = s;
|
||||
#if _DEBUG_MATCH
|
||||
error(-4, "subgroup#%d n=%d beg=%p end=%p len=%d", __LINE__, n, mp->current.beg[n], mp->current.end[n], mp->current.end[n] - mp->current.beg[n]);
|
||||
#endif
|
||||
}
|
||||
if (onematch(mp, sc, s, p, e, oldp, flags))
|
||||
{
|
||||
if (p == oldp && n < MAXGROUP)
|
||||
{
|
||||
if (!mp->current.beg[n] || mp->current.beg[n] > olds)
|
||||
mp->current.beg[n] = olds;
|
||||
if (s > mp->current.end[n])
|
||||
mp->current.end[n] = s;
|
||||
#if _DEBUG_MATCH
|
||||
error(-4, "subgroup#%d n=%d beg=%p end=%p len=%d", __LINE__, n, mp->current.beg[n], mp->current.end[n], mp->current.end[n] - mp->current.beg[n]);
|
||||
#endif
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} while (s < e && mbgetchar(s));
|
||||
mp->current.groups = oldg;
|
||||
return 0;
|
||||
}
|
||||
else if (pc == '*')
|
||||
{
|
||||
/*
|
||||
* several stars are the same as one
|
||||
*/
|
||||
|
||||
while (*p == '*' && *(p + 1) != '(')
|
||||
p++;
|
||||
oldp = p;
|
||||
switch (pc = mbgetchar(p))
|
||||
{
|
||||
case '@':
|
||||
case '!':
|
||||
case '+':
|
||||
n = *p == '(';
|
||||
break;
|
||||
case '(':
|
||||
case '[':
|
||||
case '?':
|
||||
case '*':
|
||||
n = 1;
|
||||
break;
|
||||
case 0:
|
||||
case '|':
|
||||
case '&':
|
||||
case ')':
|
||||
mp->current.next_s = (flags & STR_MAXIMAL) ? e : olds;
|
||||
mp->next_p = oldp;
|
||||
mp->current.groups = g;
|
||||
if (!pc && (!mp->best.next_s || (flags & STR_MAXIMAL) && mp->current.next_s > mp->best.next_s || !(flags & STR_MAXIMAL) && mp->current.next_s < mp->best.next_s))
|
||||
{
|
||||
mp->best = mp->current;
|
||||
#if _DEBUG_MATCH
|
||||
error(-3, "best#%d groups=%d next=\"%s\"", __LINE__, mp->best.groups, mp->best.next_s);
|
||||
#endif
|
||||
}
|
||||
return 1;
|
||||
case '\\':
|
||||
if (!(pc = mbgetchar(p)))
|
||||
return 0;
|
||||
if (pc >= '0' && pc <= '9')
|
||||
{
|
||||
n = pc - '0';
|
||||
#if _DEBUG_MATCH
|
||||
error(-2, "backref#%d n=%d g=%d beg=%p end=%p len=%d", __LINE__, n, g, mp->current.beg[n], mp->current.end[n], mp->current.end[n] - mp->current.beg[n]);
|
||||
#endif
|
||||
if (n <= g && mp->current.beg[n])
|
||||
pc = *mp->current.beg[n];
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
default:
|
||||
if (icase && isupper(pc))
|
||||
pc = tolower(pc);
|
||||
n = 0;
|
||||
break;
|
||||
}
|
||||
p = oldp;
|
||||
for (;;)
|
||||
{
|
||||
if ((n || pc == sc) && onematch(mp, g, olds, p, e, NiL, flags))
|
||||
return 1;
|
||||
if (!sc)
|
||||
return 0;
|
||||
olds = s;
|
||||
sc = getsource(s, e);
|
||||
if ((flags & STR_ICASE) && isupper(sc))
|
||||
sc = tolower(sc);
|
||||
}
|
||||
}
|
||||
else if (pc != '?' && pc != sc)
|
||||
return 0;
|
||||
break;
|
||||
case 0:
|
||||
if (!(flags & STR_MAXIMAL))
|
||||
sc = 0;
|
||||
/*FALLTHROUGH*/
|
||||
case '|':
|
||||
case '&':
|
||||
case ')':
|
||||
if (!sc)
|
||||
{
|
||||
mp->current.next_s = olds;
|
||||
mp->next_p = oldp;
|
||||
mp->current.groups = g;
|
||||
}
|
||||
if (!pc && (!mp->best.next_s || (flags & STR_MAXIMAL) && olds > mp->best.next_s || !(flags & STR_MAXIMAL) && olds < mp->best.next_s))
|
||||
{
|
||||
mp->best = mp->current;
|
||||
mp->best.next_s = olds;
|
||||
mp->best.groups = g;
|
||||
#if _DEBUG_MATCH
|
||||
error(-3, "best#%d groups=%d next=\"%s\"", __LINE__, mp->best.groups, mp->best.next_s);
|
||||
#endif
|
||||
}
|
||||
return !sc;
|
||||
case '[':
|
||||
{
|
||||
/*UNDENT...*/
|
||||
|
||||
int invert;
|
||||
int x;
|
||||
int ok = 0;
|
||||
char* range;
|
||||
|
||||
if (!sc)
|
||||
return 0;
|
||||
#if _lib_fnmatch
|
||||
if (ast.locale.set & LC_SET_COLLATE)
|
||||
range = p - 1;
|
||||
else
|
||||
#endif
|
||||
range = 0;
|
||||
n = 0;
|
||||
if (invert = *p == '!')
|
||||
p++;
|
||||
for (;;)
|
||||
{
|
||||
oldp = p;
|
||||
if (!(pc = mbgetchar(p)))
|
||||
return 0;
|
||||
else if (pc == '[' && (*p == ':' || *p == '=' || *p == '.'))
|
||||
{
|
||||
x = 0;
|
||||
n = mbgetchar(p);
|
||||
oldp = p;
|
||||
for (;;)
|
||||
{
|
||||
if (!(pc = mbgetchar(p)))
|
||||
return 0;
|
||||
if (pc == n && *p == ']')
|
||||
break;
|
||||
x++;
|
||||
}
|
||||
mbgetchar(p);
|
||||
if (ok)
|
||||
/*NOP*/;
|
||||
else if (n == ':')
|
||||
{
|
||||
switch (HASHNKEY5(x, oldp[0], oldp[1], oldp[2], oldp[3], oldp[4]))
|
||||
{
|
||||
case HASHNKEY5(5,'a','l','n','u','m'):
|
||||
if (isalnum(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'a','l','p','h','a'):
|
||||
if (isalpha(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'b','l','a','n','k'):
|
||||
if (isblank(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'c','n','t','r','l'):
|
||||
if (iscntrl(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'d','i','g','i','t'):
|
||||
if (isdigit(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'g','r','a','p','h'):
|
||||
if (isgraph(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'l','o','w','e','r'):
|
||||
if (islower(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'p','r','i','n','t'):
|
||||
if (isprint(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'p','u','n','c','t'):
|
||||
if (ispunct(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'s','p','a','c','e'):
|
||||
if (isspace(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(5,'u','p','p','e','r'):
|
||||
if (icase ? islower(sc) : isupper(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
case HASHNKEY5(6,'x','d','i','g','i'):
|
||||
if (oldp[5] == 't' && isxdigit(sc))
|
||||
ok = 1;
|
||||
break;
|
||||
#if _lib_wctype
|
||||
default:
|
||||
{
|
||||
char cc[32];
|
||||
|
||||
if (x >= sizeof(cc))
|
||||
x = sizeof(cc) - 1;
|
||||
strncpy(cc, oldp, x);
|
||||
cc[x] = 0;
|
||||
if (iswctype(sc, wctype(cc)))
|
||||
ok = 1;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if _lib_fnmatch
|
||||
else if (ast.locale.set & LC_SET_COLLATE)
|
||||
ok = -1;
|
||||
#endif
|
||||
else if (range)
|
||||
goto getrange;
|
||||
else if (*p == '-' && *(p + 1) != ']')
|
||||
{
|
||||
mbgetchar(p);
|
||||
range = oldp;
|
||||
}
|
||||
else if (isalpha(*oldp) && isalpha(*olds) && tolower(*oldp) == tolower(*olds) || sc == mbgetchar(oldp))
|
||||
ok = 1;
|
||||
n = 1;
|
||||
}
|
||||
else if (pc == ']' && n)
|
||||
{
|
||||
#if _lib_fnmatch
|
||||
if (ok < 0)
|
||||
{
|
||||
char pat[2 * UCHAR_MAX];
|
||||
char str[COLL_MAX + 1];
|
||||
|
||||
if (p - range > sizeof(pat) - 2)
|
||||
return 0;
|
||||
memcpy(pat, range, p - range);
|
||||
pat[p - range] = '*';
|
||||
pat[p - range + 1] = 0;
|
||||
if (fnmatch(pat, olds, 0))
|
||||
return 0;
|
||||
pat[p - range] = 0;
|
||||
ok = 0;
|
||||
for (x = 0; x < sizeof(str) - 1 && olds[x]; x++)
|
||||
{
|
||||
str[x] = olds[x];
|
||||
str[x + 1] = 0;
|
||||
if (!fnmatch(pat, str, 0))
|
||||
ok = 1;
|
||||
else if (ok)
|
||||
break;
|
||||
}
|
||||
s = olds + x;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (ok != invert)
|
||||
break;
|
||||
return 0;
|
||||
}
|
||||
else if (pc == '\\' && (oldp = p, !(pc = mbgetchar(p))))
|
||||
return 0;
|
||||
else if (ok)
|
||||
/*NOP*/;
|
||||
#if _lib_fnmatch
|
||||
else if (range && !(ast.locale.set & LC_SET_COLLATE))
|
||||
#else
|
||||
else if (range)
|
||||
#endif
|
||||
{
|
||||
getrange:
|
||||
#if _lib_mbtowc
|
||||
if (ast.locale.set & LC_SET_CTYPE)
|
||||
{
|
||||
wchar_t sw;
|
||||
wchar_t bw;
|
||||
wchar_t ew;
|
||||
int sz;
|
||||
int bz;
|
||||
int ez;
|
||||
|
||||
sz = mbtowc(&sw, olds, MB_CUR_MAX);
|
||||
bz = mbtowc(&bw, range, MB_CUR_MAX);
|
||||
ez = mbtowc(&ew, oldp, MB_CUR_MAX);
|
||||
if (sw == bw || sw == ew)
|
||||
ok = 1;
|
||||
else if (sz > 1 || bz > 1 || ez > 1)
|
||||
{
|
||||
if (sz == bz && sz == ez && sw > bw && sw < ew)
|
||||
ok = 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
#endif
|
||||
if (icase && isupper(pc))
|
||||
pc = tolower(pc);
|
||||
x = mbgetchar(range);
|
||||
if (icase && isupper(x))
|
||||
x = tolower(x);
|
||||
if (sc == x || sc == pc || sc > x && sc < pc)
|
||||
ok = 1;
|
||||
if (*p == '-' && *(p + 1) != ']')
|
||||
{
|
||||
mbgetchar(p);
|
||||
range = oldp;
|
||||
}
|
||||
else
|
||||
range = 0;
|
||||
n = 1;
|
||||
}
|
||||
else if (*p == '-' && *(p + 1) != ']')
|
||||
{
|
||||
mbgetchar(p);
|
||||
#if _lib_fnmatch
|
||||
if (ast.locale.set & LC_SET_COLLATE) ok = -1;
|
||||
else
|
||||
#endif
|
||||
range = oldp;
|
||||
n = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (icase && isupper(pc))
|
||||
pc = tolower(pc);
|
||||
if (sc == pc)
|
||||
ok = 1;
|
||||
n = pc;
|
||||
}
|
||||
}
|
||||
|
||||
/*...INDENT*/
|
||||
}
|
||||
break;
|
||||
case '\\':
|
||||
if (!(pc = mbgetchar(p)))
|
||||
return 0;
|
||||
if (pc >= '0' && pc <= '9')
|
||||
{
|
||||
n = pc - '0';
|
||||
#if _DEBUG_MATCH
|
||||
error(-2, "backref#%d n=%d g=%d beg=%p end=%p len=%d", __LINE__, n, g, mp->current.beg[n], mp->current.end[n], mp->current.end[n] - mp->current.beg[n]);
|
||||
#endif
|
||||
if (n <= g && (oldp = mp->current.beg[n]))
|
||||
{
|
||||
while (oldp < mp->current.end[n])
|
||||
if (!*olds || *olds++ != *oldp++)
|
||||
return 0;
|
||||
s = olds;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
default:
|
||||
if (icase && isupper(pc))
|
||||
pc = tolower(pc);
|
||||
if (pc != sc)
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
} while (sc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* match any pattern in a group
|
||||
* | and & subgroups are parsed here
|
||||
*/
|
||||
|
||||
static int
|
||||
grpmatch(Match_t* mp, int g, char* s, register char* p, char* e, int flags)
|
||||
{
|
||||
register char* a;
|
||||
|
||||
#if _DEBUG_MATCH
|
||||
error_info.indent++;
|
||||
error(-1, "grpmatch g=%d s=%-.*s p=%s flags=%o", g, e - s, s, p, flags);
|
||||
#endif
|
||||
do
|
||||
{
|
||||
for (a = p; onematch(mp, g, s, a, e, NiL, flags); a++)
|
||||
if (*(a = mp->next_p) != '&')
|
||||
return 1;
|
||||
} while (p = gobble(mp, p, '|', &g, 1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if _DEBUG_MATCH
|
||||
#undef return
|
||||
#endif
|
||||
|
||||
/*
|
||||
* subgroup match
|
||||
* 0 returned if no match
|
||||
* otherwise number of subgroups matched returned
|
||||
* match group begin offsets are even elements of sub
|
||||
* match group end offsets are odd elements of sub
|
||||
* the matched string is from s+sub[0] up to but not
|
||||
* including s+sub[1]
|
||||
*/
|
||||
|
||||
static int
|
||||
strgrpmatch(const char* b, const char* p, ssize_t* sub, int n, int flags)
|
||||
{
|
||||
register int i;
|
||||
register char* s;
|
||||
char* e;
|
||||
Match_t match;
|
||||
|
||||
s = (char*)b;
|
||||
match.last_s = e = s + strlen(s);
|
||||
for (;;)
|
||||
{
|
||||
match.best.next_s = 0;
|
||||
match.current.groups = 0;
|
||||
if ((i = grpmatch(&match, 0, s, (char*)p, e, flags)) || match.best.next_s)
|
||||
{
|
||||
if (!i)
|
||||
match.current = match.best;
|
||||
match.current.groups++;
|
||||
match.current.end[0] = match.current.next_s;
|
||||
#if _DEBUG_MATCH
|
||||
error(-1, "match i=%d s=\"%s\" p=\"%s\" flags=%o groups=%d next=\"%s\"", i, s, p, flags, match.current.groups, match.current.next_s);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if ((flags & STR_LEFT) || s >= e)
|
||||
return 0;
|
||||
s++;
|
||||
}
|
||||
if ((flags & STR_RIGHT) && match.current.next_s != e)
|
||||
return 0;
|
||||
if (!sub)
|
||||
return 1;
|
||||
match.current.beg[0] = s;
|
||||
s = (char*)b;
|
||||
if (n > match.current.groups)
|
||||
n = match.current.groups;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
sub[i * 2] = match.current.end[i] ? match.current.beg[i] - s : 0;
|
||||
sub[i * 2 + 1] = match.current.end[i] ? match.current.end[i] - s : 0;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* compare the string s with the shell pattern p
|
||||
* returns 1 for match 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
strmatch(const char* s, const char* p)
|
||||
{
|
||||
return strgrpmatch(s, p, NiL, 0, STR_MAXIMAL|STR_LEFT|STR_RIGHT);
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
symlink3d(const char* path, const char* target)
|
||||
{
|
||||
register char* sp;
|
||||
register char* tp;
|
||||
register int r;
|
||||
char* t;
|
||||
int oerrno;
|
||||
char buf[PATH_MAX + 1];
|
||||
#if FS
|
||||
char tmp[PATH_MAX + 1];
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_symlink, 0, path, target))
|
||||
return(state.ret);
|
||||
#endif
|
||||
if (!state.safe) sp = (char*)path;
|
||||
else if (!(sp = pathreal(path, P_PATHONLY|P_SAFE, NiL))) return(-1);
|
||||
else sp = strncpy(buf, sp, PATH_MAX);
|
||||
#if FS
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE, NiL)))
|
||||
return(-1);
|
||||
oerrno = errno;
|
||||
if ((r = SYMLINK(sp, tp)) && errno == ENOENT && (t = strrchr(tp, '/')))
|
||||
{
|
||||
*t = 0;
|
||||
r = fs3d_mkdir(tp, S_IRWXU|S_IRWXG|S_IRWXO);
|
||||
*t = '/';
|
||||
if (!r)
|
||||
{
|
||||
errno = oerrno;
|
||||
r = SYMLINK(sp, tp);
|
||||
}
|
||||
}
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
{
|
||||
if (tp != tmp)
|
||||
{
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
tp = strncpy(tmp, tp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_symlink, 0, sp, tp);
|
||||
}
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_symlink))
|
||||
{
|
||||
if (tp != tmp)
|
||||
{
|
||||
if (!(tp = pathreal(target, P_PATHONLY|P_NOOPAQUE|P_ABSOLUTE, NiL)))
|
||||
return(r);
|
||||
tp = strncpy(tmp, tp, PATH_MAX);
|
||||
}
|
||||
fscall(mp, MSG_symlink, 0, sp, tp);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
#
|
||||
# 3d system call intercept
|
||||
#
|
||||
# name # class # return type # arg prototype[s] # att # [bsd] # op ...
|
||||
#
|
||||
# NOTE: tab is the field separator, space is the subfield separator
|
||||
#
|
||||
# if test 1 = "$REPLICATE" -o 1 = "$SYSCALL3D"
|
||||
# fi
|
||||
#
|
||||
_exit exit void int 1
|
||||
access nop int const char*, int 33
|
||||
acl control int const char*, int, int, aclent_t* 185 sys/acl.h
|
||||
#brk break int void* 17 0
|
||||
chdir nop int const char* 12
|
||||
chmod chmod int const char*, mode_t 15
|
||||
chown chown int const char*, uid_t, gid_t 16
|
||||
close close int int 6
|
||||
closedir nop int DIR*
|
||||
creat open int const char*, mode_t 8
|
||||
dup dup int int 41
|
||||
dup2 dup int int, int 90
|
||||
execve exec int const char*, char* const*, char* const* 59 59
|
||||
facl control int int, int, int, aclent_t* 200 sys/acl.h
|
||||
fchdir nop int int 147
|
||||
fchmod chmod int int, mode_t 124
|
||||
fchown chown int int, uid_t, gid_t 123
|
||||
fcntl dup int int, int, ... 92
|
||||
fork fork pid_t void 2
|
||||
fpathconf pathconf long int, int 187 114
|
||||
fstat stat int int, struct stat* 62 version sys/stat.h
|
||||
fstatfs statfs int int, struct statfs*, int, int 158 38 variant int, struct statfs* sys/statfs.h
|
||||
fstatvfs statfs int int, struct statvfs* 201 104
|
||||
fsync sync int int 95
|
||||
ftruncate truncate int int, off_t 130
|
||||
getdents getdents ssize_t int, void*, size_t 174
|
||||
kill kill int pid_t, int 37
|
||||
link link int const char*, const char* 9
|
||||
lseek seek off_t int, off_t, int 19
|
||||
lstat stat int const char*, struct stat* 48 88 alternate stat version sys/stat.h
|
||||
mkdir mkdir int const char*, mode_t 136 80
|
||||
mknod mknod int const char*, mode_t, dev_t 14 version sys/stat.h
|
||||
mount mount int const char*, char*, int, void*, void*, void* 167 21
|
||||
open open int const char*, int, ... 5
|
||||
opendir nop DIR* const char*
|
||||
pathconf pathconf long const char*, int 186 113
|
||||
pipe pipe bool int* 42
|
||||
read read ssize_t int, void*, size_t 3
|
||||
readdir nop struct dirent* DIR*
|
||||
readlink link ssize_t const char*, char*, size_t 58 90
|
||||
rename rename int const char*, const char* 128 134
|
||||
rewinddir nop void DIR*
|
||||
rmdir rmdir int const char* 137 79
|
||||
#sbrk break void* ssize_t 0 69
|
||||
seekdir nop void DIR*, long coupled rewinddir telldir
|
||||
stat stat int const char*, struct stat* 38 18 version sys/stat.h
|
||||
statfs statfs int const char*, struct statfs*, int, int 157 35 variant const char*, struct statfs* sys/statfs.h
|
||||
statvfs statfs int const char*, struct statvfs* 202 103
|
||||
symlink link int const char*, const char* 57 89
|
||||
telldir nop long DIR*
|
||||
truncate truncate int const char*, off_t 129 0
|
||||
unlink remove int const char* 10
|
||||
utime utime int const char*, const struct utimbuf* 30
|
||||
utimensat utime int int, const char*, const struct timespec*, int 236 0
|
||||
utimes utime int const char*, const struct timeval* 138 0
|
||||
utimets utime int const char*, const struct timespec* 235 0
|
||||
vfork fork pid_t void 66
|
||||
write write ssize_t int, const void*, size_t 4
|
||||
#
|
||||
# now, these guys put padding in struct stat in preparation for 64 bit
|
||||
# dev_t,ino_t,off_t, and then ignored it, but even worse, the padding
|
||||
# was kept in struct stat64
|
||||
#
|
||||
fstat64 stat int int, struct stat64* 255 version sys/stat.h
|
||||
ftruncate64 truncate int int, off64_t 255
|
||||
lseek64 seek off64_t int, off64_t, int 255
|
||||
lstat64 stat int const char*, struct stat64* 255 version sys/stat.h
|
||||
open64 open int const char*, int, ... 255
|
||||
stat64 stat int const char*, struct stat64* 255 version sys/stat.h
|
||||
truncate64 truncate int const char*, off64_t 255
|
||||
#
|
||||
# dir got into the act too
|
||||
#
|
||||
getdents64 getdents ssize_t int, void*, size_t 255
|
||||
readdir64 nop struct dirent64* DIR*
|
||||
rewinddir64 nop void DIR*
|
||||
seekdir64 nop void DIR*, off64_t coupled rewinddir64 telldir64
|
||||
telldir64 nop off64_t DIR*
|
|
@ -1,716 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* 3d system call trace
|
||||
*/
|
||||
|
||||
#define SYSTRACE3D 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if SYSTRACE3D
|
||||
|
||||
#define SYSCALL syscall3d
|
||||
|
||||
#include "dir_3d.h"
|
||||
|
||||
#ifndef D_FILENO
|
||||
#define D_FILENO(d) (1)
|
||||
#endif
|
||||
#ifndef D_TYPE
|
||||
#define D_TYPE(d) (0)
|
||||
#endif
|
||||
|
||||
#define C_EXIT (MSG_MASK(MSG_exit))
|
||||
#define C_IO (MSG_MASK(MSG_read)|MSG_MASK(MSG_write))
|
||||
#define C_ZERO (MSG_MASK(MSG_pipe))
|
||||
|
||||
typedef union
|
||||
{
|
||||
void* pointer;
|
||||
int number;
|
||||
char* string;
|
||||
char** vector;
|
||||
} ARG;
|
||||
|
||||
static void* dll;
|
||||
|
||||
#if _lib_strerror
|
||||
|
||||
#undef strerror /* otherwise it's _ast_strerror */
|
||||
|
||||
#else
|
||||
|
||||
extern int sys_nerr;
|
||||
extern char* sys_errlist[];
|
||||
|
||||
char*
|
||||
strerror(int err)
|
||||
{
|
||||
static char msg[28];
|
||||
|
||||
if (err > 0 && err <= sys_nerr)
|
||||
return sys_errlist[err];
|
||||
sfsprintf(msg, sizeof(msg), "Error %d", err);
|
||||
return msg;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define MAXBUF 128
|
||||
#define MAXLIN 79
|
||||
#define MAXOUT 2048
|
||||
|
||||
static void
|
||||
buffer(char** buf, char* end, register char* s, int n)
|
||||
{
|
||||
register char* b;
|
||||
register char* be;
|
||||
register char* se;
|
||||
register int c;
|
||||
|
||||
if (n < 0)
|
||||
bprintf(buf, end, " %p", s);
|
||||
else
|
||||
{
|
||||
b = *buf;
|
||||
be = end;
|
||||
if (be - b > MAXBUF)
|
||||
be = b + MAXBUF;
|
||||
be -= 5;
|
||||
be = be;
|
||||
se = s + n;
|
||||
if (b < be - 1)
|
||||
{
|
||||
*b++ = ' ';
|
||||
*b++ = '"';
|
||||
while (b < be && s < se)
|
||||
{
|
||||
if ((c = *((unsigned char*)s++)) < 040)
|
||||
{
|
||||
*b++ = '\\';
|
||||
switch (c)
|
||||
{
|
||||
case '\007':
|
||||
c = 'a';
|
||||
break;
|
||||
case '\b':
|
||||
c = 'b';
|
||||
break;
|
||||
case '\f':
|
||||
c = 'f';
|
||||
break;
|
||||
case '\n':
|
||||
c = 'n';
|
||||
break;
|
||||
case '\r':
|
||||
c = 'r';
|
||||
break;
|
||||
case '\t':
|
||||
c = 't';
|
||||
break;
|
||||
case '\013':
|
||||
c = 'v';
|
||||
break;
|
||||
case '\033':
|
||||
c = 'E';
|
||||
break;
|
||||
default:
|
||||
if (b < be - 3)
|
||||
{
|
||||
if (n = s < se && c >= '0' && c <= '9')
|
||||
*b++ = '0';
|
||||
if (n || ((c >> 3) & 07))
|
||||
*b++ = '0' + ((c >> 3) & 07);
|
||||
*b++ = '0' + (c & 07);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (b < be)
|
||||
*b++ = c;
|
||||
}
|
||||
else if (c < 0177)
|
||||
*b++ = c;
|
||||
else if (c == 0177)
|
||||
{
|
||||
*b++ = '^';
|
||||
if (b >= be)
|
||||
break;
|
||||
*b++ = '?';
|
||||
}
|
||||
else if (b < be - 4)
|
||||
{
|
||||
*b++ = '\\';
|
||||
*b++ = '0' + ((c >> 6) & 03);
|
||||
*b++ = '0' + ((c >> 3) & 07);
|
||||
*b++ = '0' + (c & 07);
|
||||
}
|
||||
}
|
||||
if ((b >= be || s < se) && (be - *buf) >= 4)
|
||||
{
|
||||
b -= 4;
|
||||
*b++ = '"';
|
||||
*b++ = '.';
|
||||
*b++ = '.';
|
||||
*b++ = '.';
|
||||
}
|
||||
else if (b < be)
|
||||
*b++ = '"';
|
||||
}
|
||||
*buf = b;
|
||||
}
|
||||
}
|
||||
|
||||
#if __gnu_linux__
|
||||
#undef _no_exit_exit
|
||||
#endif
|
||||
|
||||
#if _lib_syscall && _sys_syscall
|
||||
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#ifdef SYS_exit
|
||||
|
||||
static void
|
||||
sys_exit(int code)
|
||||
{
|
||||
syscall(SYS_exit, code);
|
||||
}
|
||||
|
||||
#define SYS_EXIT sys_exit
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* initialize the 3d syscall table
|
||||
*/
|
||||
|
||||
void
|
||||
callinit(void)
|
||||
{
|
||||
register Systrace_t* cp;
|
||||
|
||||
#if defined(__sgi) && defined(_ABIO32)
|
||||
sys_trace[0].name = "_exit";
|
||||
#endif
|
||||
#if sun && !_sun && _lib_on_exit
|
||||
sys_trace[0].name = "__exit";
|
||||
#endif
|
||||
if (dll = dllnext(RTLD_LAZY))
|
||||
{
|
||||
for (cp = sys_trace; cp < &sys_trace[elementsof(sys_trace)]; cp++)
|
||||
if (!(cp->func = (Sysfunc_t)dlsym(dll, cp->name)) && (*cp->name != '_' || !(cp->func = (Sysfunc_t)dlsym(dll, cp->name + 1)) || !*cp->name++))
|
||||
cp->func = (Sysfunc_t)nosys;
|
||||
#if !defined(SYS_EXIT) && _no_exit_exit
|
||||
state.libexit = (Exitfunc_t)dlsym(dll, "exit");
|
||||
#endif
|
||||
}
|
||||
#ifdef SYS_EXIT
|
||||
sys_trace[0].func = (Sysfunc_t)sys_exit;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* dump the 3d syscall table
|
||||
*/
|
||||
|
||||
void
|
||||
calldump(char** b, char* e)
|
||||
{
|
||||
register Systrace_t* cp;
|
||||
register int m;
|
||||
|
||||
bprintf(b, e, "\nsystem calls total=%d nosys=%p exit=%p\n\n", elementsof(sys_trace), nosys,
|
||||
#if _no_exit_exit
|
||||
state.libexit
|
||||
#else
|
||||
(Sysfunc_t)0
|
||||
#endif
|
||||
);
|
||||
for (cp = sys_trace; cp < &sys_trace[elementsof(sys_trace)]; cp++)
|
||||
{
|
||||
bprintf(b, e, " %03d%s %03d %12s", cp - sys_trace, (cp - sys_trace) == cp->index ? " " : "*", cp->call, cp->name);
|
||||
for (m = state.trap.size - 1; m >= 0; m--)
|
||||
if (MSG_MASK(cp->call) & state.trap.intercept[m].mask)
|
||||
bprintf(b, e, " %p[%d]", state.trap.intercept[m].call, m);
|
||||
bprintf(b, e, " %p\n", cp->func);
|
||||
}
|
||||
}
|
||||
|
||||
#if _no_exit_exit
|
||||
static int
|
||||
oksys(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
exit(int code)
|
||||
{
|
||||
if (state.libexit)
|
||||
sys_trace[SYS3D_exit].func = (Sysfunc_t)oksys;
|
||||
_exit(code);
|
||||
if (state.libexit)
|
||||
{
|
||||
(*state.libexit)(code);
|
||||
state.libexit = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Sysfunc_t
|
||||
sysfunc(int call)
|
||||
{
|
||||
initialize();
|
||||
return sys_trace[call].func;
|
||||
}
|
||||
|
||||
#if !_var_syscall
|
||||
long
|
||||
syscall3d(int call, void* a1, void* a2, void* a3, void* a4, void* a5, void* a6)
|
||||
{
|
||||
#if 0 /* to convince proto */
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
long
|
||||
syscall3d(int call, ...)
|
||||
{
|
||||
#endif
|
||||
register int n;
|
||||
register long r;
|
||||
register Systrace_t* cp;
|
||||
register ARG* ap;
|
||||
register int ac;
|
||||
int a;
|
||||
int m;
|
||||
int on;
|
||||
char* b;
|
||||
char* e;
|
||||
char* t;
|
||||
char** p;
|
||||
int* ip;
|
||||
ARG arg[7];
|
||||
char buf[MAXOUT];
|
||||
Sysfunc_t func;
|
||||
#if _var_syscall
|
||||
va_list vp;
|
||||
#endif
|
||||
|
||||
initialize();
|
||||
#if _var_syscall
|
||||
va_start(vp, call);
|
||||
#endif
|
||||
cp = sys_trace + call;
|
||||
#if _var_syscall
|
||||
n = cp->args;
|
||||
for (r = 1; r <= elementsof(arg); r++)
|
||||
arg[r].pointer = (r <= n) ? va_arg(vp, void*) : (void*)0;
|
||||
va_end(vp);
|
||||
#else
|
||||
switch (cp->args)
|
||||
{
|
||||
case 6: arg[6].pointer = a6;
|
||||
case 5: arg[5].pointer = a5;
|
||||
case 4: arg[4].pointer = a4;
|
||||
case 3: arg[3].pointer = a3;
|
||||
case 2: arg[2].pointer = a2;
|
||||
case 1: arg[1].pointer = a1;
|
||||
}
|
||||
#endif
|
||||
if (state.kernel || state.trace.pid <= 1 || (on = fsfd(&state.fs[FS_option])) <= 0 || !(state.test & 0100) && !(MSG_MASK(cp->call) & (state.trace.call & ~MSG_MASK(error_info.trace ? 0 : MSG_nop))))
|
||||
on = 0;
|
||||
else
|
||||
{
|
||||
state.kernel++;
|
||||
if (!state.trace.count)
|
||||
{
|
||||
e = (b = buf) + elementsof(buf) - 1;
|
||||
if (state.trace.pid > 2)
|
||||
bprintf(&b, e, "[%d] ", state.trace.pid);
|
||||
bprintf(&b, e, "%s (", cp->name);
|
||||
a = A_INPUT;
|
||||
if (call == SYS3D_write)
|
||||
{
|
||||
if ((m = arg[1].number) == on)
|
||||
a = 0;
|
||||
else if (m == 1 || m == 2)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
n = errno;
|
||||
if (!fstat(m, &st) && st.st_ino == state.fs[FS_option].st.st_ino && st.st_dev == state.fs[FS_option].st.st_dev)
|
||||
a = 0;
|
||||
errno = n;
|
||||
}
|
||||
}
|
||||
if ((state.test & 020) && call == SYS3D_close) bprintf(&b, e, "%s%s%s", state.file[arg[1].number].reserved ? " [RESERVED]" : "", arg[1].number == TABLE_FD ? " [TABLE]" : "", arg[1].number == state.table.fd ? " [table]" : "");
|
||||
for (ac = 1; ac <= cp->args && (n = cp->type[ac]) >= a; ac++)
|
||||
{
|
||||
ap = &arg[ac];
|
||||
switch (n)
|
||||
{
|
||||
case A_INPUT:
|
||||
if (a)
|
||||
{
|
||||
buffer(&b, e, ap->string, arg[ac + 1].number);
|
||||
break;
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
case A_OUTPUT:
|
||||
case A_POINTER:
|
||||
bprintf(&b, e, " %p", ap->number);
|
||||
break;
|
||||
case A_MODE:
|
||||
bprintf(&b, e, " 0%o", ap->number);
|
||||
break;
|
||||
case A_STRING:
|
||||
if (t = ap->string)
|
||||
buffer(&b, e, t, strlen(t));
|
||||
else
|
||||
bprintf(&b, e, " (null)");
|
||||
break;
|
||||
case A_VECTOR:
|
||||
bprintf(&b, e, " [");
|
||||
for (p = ap->vector; *p && p < ap->vector + 8; p++)
|
||||
buffer(&b, e, *p, strlen(*p));
|
||||
if (*p)
|
||||
bprintf(&b, e, "...");
|
||||
bprintf(&b, e, " ]");
|
||||
break;
|
||||
default:
|
||||
bprintf(&b, e, " %d", ap->number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!a)
|
||||
*b++ = '\n';
|
||||
else if (MSG_MASK(cp->call) & C_EXIT)
|
||||
{
|
||||
bprintf(&b, e, " ) = ?\n");
|
||||
state.kernel++;
|
||||
}
|
||||
n = errno;
|
||||
write(on, buf, b - buf);
|
||||
errno = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MSG_MASK(cp->call) & C_EXIT)
|
||||
{
|
||||
e = (b = buf) + elementsof(buf) - 1;
|
||||
*b++ = '\n';
|
||||
if (state.trace.pid > 2)
|
||||
bprintf(&b, e, " [%d] %s\n", state.trace.pid, state.cmd);
|
||||
for (n = 0; n < elementsof(sys_trace); n++)
|
||||
if (sys_trace[n].count)
|
||||
{
|
||||
if (MSG_MASK(sys_trace[n].call) & C_IO)
|
||||
{
|
||||
bprintf(&b, e, " %5d %-10s", sys_trace[n].count, sys_trace[n].name);
|
||||
if (sys_trace[n].megs)
|
||||
bprintf(&b, e, "%5lu.%dm", sys_trace[n].megs, (sys_trace[n].units * 10) >> 20);
|
||||
else
|
||||
bprintf(&b, e, "%5lu.%dk", sys_trace[n].units >> 10, ((sys_trace[n].units & ((1<<10)-1)) * 10) >> 10);
|
||||
}
|
||||
else
|
||||
bprintf(&b, e, " %5d %s", sys_trace[n].count, sys_trace[n].name);
|
||||
if (b < e)
|
||||
*b++ = '\n';
|
||||
}
|
||||
*b++ = '\n';
|
||||
n = errno;
|
||||
write(on, buf, b - buf);
|
||||
errno = n;
|
||||
state.kernel++;
|
||||
}
|
||||
cp->count++;
|
||||
}
|
||||
}
|
||||
for (m = state.trap.size - 1; m >= 0; m--)
|
||||
if (MSG_MASK(cp->call) & state.trap.intercept[m].mask)
|
||||
break;
|
||||
if (m >= 0)
|
||||
{
|
||||
n = state.trap.size;
|
||||
state.trap.size = m;
|
||||
r = (*state.trap.intercept[m].call)(&state.trap.intercept[m], cp->call, call, arg[1].pointer, arg[2].pointer, arg[3].pointer, arg[4].pointer, arg[5].pointer, arg[6].pointer);
|
||||
state.trap.size = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if _dynamic_syscall || _static_syscall
|
||||
#if _dynamic_syscall
|
||||
if (dll && cp->func)
|
||||
#else
|
||||
if (dll && cp->func && cp->index < 0)
|
||||
#endif
|
||||
{
|
||||
switch (cp->active++)
|
||||
{
|
||||
case 0:
|
||||
func = cp->func;
|
||||
break;
|
||||
case 1:
|
||||
if (!(func = cp->last))
|
||||
{
|
||||
if (!(cp->last = (Sysfunc_t)dlsym(dll, cp->name)) && (*cp->name != '_' || !(cp->last = (Sysfunc_t)dlsym(dll, cp->name + 1)) || !*cp->name++))
|
||||
cp->last = (Sysfunc_t)nosys;
|
||||
func = cp->last;
|
||||
if (func == cp->func)
|
||||
{
|
||||
/*
|
||||
* longjmp gets you here
|
||||
*/
|
||||
|
||||
cp->active = 3;
|
||||
}
|
||||
else if (cp->func != (Sysfunc_t)nosys && func == (Sysfunc_t)nosys)
|
||||
{
|
||||
cp->active = 10;
|
||||
e = (b = buf) + elementsof(buf) - 1;
|
||||
bprintf(&b, e, "3d: %s: system call loop -- cannot determine the real system call\n", cp->name);
|
||||
write(2, buf, b - buf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
cp->active = 3;
|
||||
func = cp->func;
|
||||
break;
|
||||
default:
|
||||
cp->active = 10;
|
||||
func = (Sysfunc_t)nosys;
|
||||
break;
|
||||
}
|
||||
r = (*func)(arg[1].pointer, arg[2].pointer, arg[3].pointer, arg[4].pointer, arg[5].pointer, arg[6].pointer);
|
||||
cp->active--;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#if _lib_syscall
|
||||
if (cp->index >= 0)
|
||||
r = syscall(cp->index, arg[1].pointer, arg[2].pointer, arg[3].pointer, arg[4].pointer, arg[5].pointer, arg[6].pointer);
|
||||
else if (cp->nov >= 0)
|
||||
r = syscall(cp->nov, arg[2].pointer, arg[3].pointer, arg[4].pointer, arg[5].pointer, arg[6].pointer, 0);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#ifndef ENOSYS
|
||||
#define ENOSYS EINVAL
|
||||
#endif
|
||||
errno = ENOSYS;
|
||||
r = -1;
|
||||
}
|
||||
}
|
||||
#if !_mangle_syscall
|
||||
if (r > 0 && (MSG_MASK(cp->call) & C_ZERO))
|
||||
r = 0;
|
||||
#endif
|
||||
if (on && state.kernel <= 1)
|
||||
{
|
||||
if (!state.trace.count)
|
||||
{
|
||||
if ((m = MAXLIN - (b - buf)) < 0)
|
||||
m = 0;
|
||||
b = buf;
|
||||
for (; ac <= cp->args; ac++)
|
||||
{
|
||||
ap = &arg[ac];
|
||||
switch (n = cp->type[ac])
|
||||
{
|
||||
case A_OUTPUT:
|
||||
switch (call)
|
||||
{
|
||||
case SYS3D_fstat:
|
||||
#ifdef SYS3D_lstat
|
||||
case SYS3D_lstat:
|
||||
#endif
|
||||
case SYS3D_stat:
|
||||
if (!r)
|
||||
{
|
||||
/*UNDENT...*/
|
||||
#ifdef _3D_STAT_VER
|
||||
switch (arg[1].number)
|
||||
{
|
||||
case _3D_STAT_VER:
|
||||
#endif
|
||||
{
|
||||
struct stat* sp = (struct stat*)ap->pointer;
|
||||
bprintf(&b, e, " [ dev=%d ino=%d view=%d mode=0%o nlink=%d uid=%d gid=%d size=%u atime=%u mtime=%u ctime=%u ]", sp->st_dev, sp->st_ino, iview(sp), sp->st_mode, sp->st_nlink, sp->st_uid, sp->st_gid, sp->st_size, sp->st_atime, sp->st_mtime, sp->st_ctime);
|
||||
continue;
|
||||
}
|
||||
#ifdef _3D_STAT_VER
|
||||
#ifdef _3D_STAT64_VER
|
||||
case _3D_STAT64_VER:
|
||||
{
|
||||
struct stat64* sp = (struct stat64*)ap->pointer;
|
||||
bprintf(&b, e, " [ dev=%d ino=%lld view=%d mode=0%o nlink=%d uid=%d gid=%d size=%llu atime=%u mtime=%u ctime=%u ]", sp->st_dev, sp->st_ino, iview(sp), sp->st_mode, sp->st_nlink, sp->st_uid, sp->st_gid, sp->st_size, sp->st_atime, sp->st_mtime, sp->st_ctime);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
#ifdef SYS3D_getdents
|
||||
case SYS3D_getdents:
|
||||
if (r > 0)
|
||||
{
|
||||
struct DIRdirent* dp = (struct DIRdirent*)ap->pointer;
|
||||
struct DIRdirent* de = (struct DIRdirent*)((char*)dp + r);
|
||||
|
||||
bprintf(&b, e, " [");
|
||||
while (dp < de)
|
||||
{
|
||||
#ifdef DIRdirent
|
||||
bprintf(&b, e, " %lu \"%s\"", D_FILENO(dp), dp->d_name);
|
||||
#else
|
||||
bprintf(&b, e, " %02d %lu \"%s\"", D_TYPE(dp), D_FILENO(dp), dp->d_name);
|
||||
#endif
|
||||
dp = (struct DIRdirent*)((char*)dp + dp->d_reclen);
|
||||
}
|
||||
bprintf(&b, e, " ]");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case SYS3D_pipe:
|
||||
if (!r)
|
||||
{
|
||||
ip = (int*)ap->pointer;
|
||||
bprintf(&b, e, " [ %d %d ]", ip[0], ip[1]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
case A_INPUT:
|
||||
if (n == A_OUTPUT && cp->type[n = 0] == A_SIZE || ac < (elementsof(cp->type) - 1) && cp->type[n = ac + 1] == A_SIZE)
|
||||
{
|
||||
buffer(&b, e, ap->string, n ? arg[n].number : r);
|
||||
break;
|
||||
}
|
||||
goto pointer;
|
||||
case A_MODE:
|
||||
bprintf(&b, e, " 0%o", ap->number);
|
||||
break;
|
||||
case A_POINTER:
|
||||
pointer:
|
||||
bprintf(&b, e, " %p", ap->pointer);
|
||||
break;
|
||||
case A_STRING:
|
||||
if (r == -1)
|
||||
goto pointer;
|
||||
buffer(&b, e, ap->string, strlen(ap->string));
|
||||
break;
|
||||
default:
|
||||
bprintf(&b, e, " %d", ap->number);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if DEBUG_dirent
|
||||
switch (call)
|
||||
{
|
||||
#ifdef SYS3D_readdir
|
||||
#undef DIRdirent
|
||||
case SYS3D_readdir:
|
||||
if (r && (state.test & 0100))
|
||||
{
|
||||
struct DIRdirent* dp = (struct DIRdirent*)pointerof(r);
|
||||
|
||||
bprintf(&b, e, " ) = [ %02d %lu \"%s\" ]", D_TYPE(dp), D_FILENO(dp), dp->d_name);
|
||||
break;
|
||||
}
|
||||
goto number;
|
||||
#endif
|
||||
#ifdef SYS3D_readdir64
|
||||
case SYS3D_readdir64:
|
||||
if (r && (state.test & 0100))
|
||||
{
|
||||
struct dirent64* dp = (struct dirent64*)pointerof(r);
|
||||
|
||||
bprintf(&b, e, " ) = [ %02d %llu \"%s\" ]", D_TYPE(dp), D_FILENO(dp), dp->d_name);
|
||||
break;
|
||||
}
|
||||
goto number;
|
||||
#endif
|
||||
default:
|
||||
number:
|
||||
bprintf(&b, e, "%s) = %d", a ? " " : "\t", r);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
bprintf(&b, e, "%s) = %d", a ? " " : "\t", r);
|
||||
#endif
|
||||
if (r == -1)
|
||||
bprintf(&b, e, " [%s]", strerror(errno));
|
||||
n = errno;
|
||||
t = buf;
|
||||
while ((b - t) >= m)
|
||||
{
|
||||
char* w;
|
||||
char* x;
|
||||
char* z;
|
||||
int c1;
|
||||
int c2;
|
||||
|
||||
x = w = t + m;
|
||||
z = t + m / 2;
|
||||
while (x > z && *x != ' ') x--;
|
||||
if (x <= z)
|
||||
x = w;
|
||||
c1 = *x;
|
||||
*x++ = '\n';
|
||||
c2 = *x;
|
||||
*x++ = '\t';
|
||||
write(on, t, x - t);
|
||||
*--x = c2;
|
||||
if ((*--x = c1) == ' ')
|
||||
x++;
|
||||
t = x;
|
||||
m = MAXLIN - 8;
|
||||
}
|
||||
*b++ = '\n';
|
||||
write(on, t, b - t);
|
||||
errno = n;
|
||||
}
|
||||
else if (r >= 0 && (MSG_MASK(cp->call) & C_IO) && (cp->units += r) >= (1<<20))
|
||||
{
|
||||
cp->megs += cp->units >> 20;
|
||||
cp->units &= ((1<<20)-1);
|
||||
}
|
||||
state.kernel--;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(syscall)
|
||||
|
||||
#endif
|
|
@ -1,47 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* any 3d library function `declaring' PULL_IN_3D will pull in all of 3d
|
||||
* exit seems to be the best candidate
|
||||
*
|
||||
* guess where bsd4.4 puts the lseek prototype
|
||||
*/
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide lseek
|
||||
#else
|
||||
#define lseek ______lseek
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide lseek
|
||||
#else
|
||||
#undef lseek
|
||||
#endif
|
||||
|
||||
#define SYSENT3D 1
|
||||
|
||||
#include "FEATURE/syscall"
|
|
@ -1,194 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* NOTE: obsolete touch() for 3d private use
|
||||
* -last touch() handles subsecond times
|
||||
* via tvtouch()
|
||||
*/
|
||||
|
||||
/*
|
||||
* Glenn Fowler
|
||||
* AT&T Research
|
||||
*
|
||||
* touch file access and modify times of file
|
||||
* if force>0 then file will be created if it doesn't exist
|
||||
* if force<0 then times are taken verbatim
|
||||
* times have one second granularity
|
||||
*
|
||||
* (time_t)(-1) retain old time
|
||||
* 0 use current time
|
||||
*/
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide utime
|
||||
#else
|
||||
#define utime ______utime
|
||||
#endif
|
||||
|
||||
#include <ast.h>
|
||||
#include <ls.h>
|
||||
#include <times.h>
|
||||
#include <error.h>
|
||||
|
||||
#if _hdr_utime && _lib_utime
|
||||
#include <utime.h>
|
||||
#endif
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide utime
|
||||
#else
|
||||
#undef utime
|
||||
#endif
|
||||
|
||||
#if _lib_utime
|
||||
#if _hdr_utime
|
||||
extern int utime(const char*, const struct utimbuf*);
|
||||
#else
|
||||
extern int utime(const char*, const time_t*);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int
|
||||
touch(const char* file, time_t atime, time_t mtime, int force)
|
||||
{
|
||||
int n;
|
||||
int fd;
|
||||
int oerrno = errno;
|
||||
int mode;
|
||||
#if _lib_utime
|
||||
time_t now;
|
||||
struct stat st;
|
||||
#if _hdr_utime
|
||||
struct utimbuf ut;
|
||||
#else
|
||||
time_t ut[2];
|
||||
#endif
|
||||
|
||||
if (force >= 0)
|
||||
{
|
||||
if (atime == (time_t)(-1) || mtime == (time_t)(-1))
|
||||
{
|
||||
if (stat(file, &st)) st.st_atime = st.st_mtime = 0;
|
||||
if (atime == (time_t)(-1)) atime = st.st_atime;
|
||||
if (mtime == (time_t)(-1)) mtime = st.st_mtime;
|
||||
}
|
||||
if (!atime || !mtime)
|
||||
#if _hdr_utime && _lib_utime_now
|
||||
if (atime || mtime)
|
||||
#endif
|
||||
{
|
||||
time(&now);
|
||||
if (!atime) atime = now;
|
||||
if (!mtime) mtime = now;
|
||||
}
|
||||
}
|
||||
#if _hdr_utime
|
||||
ut.actime = atime;
|
||||
ut.modtime = mtime;
|
||||
#if _lib_utime_now
|
||||
n = utime(file, (force < 0 || atime || mtime) ? &ut : (struct utimbuf*)0);
|
||||
#else
|
||||
n = utime(file, &ut);
|
||||
#endif
|
||||
#else
|
||||
ut[0] = atime;
|
||||
ut[1] = mtime;
|
||||
n = utime(file, ut);
|
||||
#endif
|
||||
if (n)
|
||||
#else
|
||||
if (mtime)
|
||||
{
|
||||
/*
|
||||
* NOTE: the emulation allows atime to change
|
||||
* for mtime only requests
|
||||
*/
|
||||
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
||||
#endif
|
||||
{
|
||||
#if _lib_utime
|
||||
if (errno == ENOENT || errno == EPERM)
|
||||
#else
|
||||
|
||||
if (access(file, F_OK))
|
||||
#endif
|
||||
{
|
||||
if (!force) return(-1);
|
||||
umask(mode = umask(0));
|
||||
mode = (~mode) & (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
|
||||
if ((fd = open(file, O_WRONLY|O_CREAT|O_TRUNC|O_cloexec, mode)) < 0) return(-1);
|
||||
close(fd);
|
||||
errno = oerrno;
|
||||
#if _lib_utime
|
||||
#if _hdr_utime
|
||||
#if _lib_utime_now
|
||||
return((force < 0 || atime || mtime) ? utime(file, &ut) : 0);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
#else
|
||||
return((atime != now || mtime != now) ? utime(file, ut) : 0);
|
||||
#endif
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
#if !_hdr_utime || !_lib_utime
|
||||
#if _lib_utime
|
||||
if (atime == now && mtime == now && (fd = open(file, O_RDWR|O_cloexec)) >= 0)
|
||||
#else
|
||||
if ((fd = open(file, O_RDWR|O_cloexec)) >= 0)
|
||||
#endif
|
||||
{
|
||||
char c;
|
||||
|
||||
if (read(fd, &c, 1) == 1)
|
||||
{
|
||||
if (lseek(fd, 0L, 0) == 0L && write(fd, &c, 1) == 1)
|
||||
{
|
||||
errno = oerrno;
|
||||
n = 0;
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
close(fd);
|
||||
umask(mode = umask(0));
|
||||
mode = (~mode) & (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
|
||||
if ((fd = open(file, O_WRONLY|O_CREAT|O_TRUNC|O_cloexec, mode)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
errno = oerrno;
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return(n);
|
||||
}
|
|
@ -1,113 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#ifdef truncate3d
|
||||
|
||||
#if !_nosys_truncate64 && _typ_off64_t
|
||||
|
||||
#undef off_t
|
||||
#undef ftruncate
|
||||
|
||||
typedef int (*Real_f)(const char*, off64_t);
|
||||
|
||||
int
|
||||
truncate643d(const char* path, off64_t size)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
int n;
|
||||
int m;
|
||||
static Real_f realf;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_truncate, 0, path, size))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return -1;
|
||||
if (!realf)
|
||||
realf = (Real_f)sysfunc(SYS3D_truncate64);
|
||||
for (m = state.trap.size - 1; m >= 0; m--)
|
||||
if (MSG_MASK(MSG_truncate) & state.trap.intercept[m].mask)
|
||||
break;
|
||||
if (m >= 0)
|
||||
{
|
||||
n = state.trap.size;
|
||||
state.trap.size = m;
|
||||
r = (*state.trap.intercept[m].call)(&state.trap.intercept[m], MSG_truncate, SYS3D_truncate64, (void*)sp, (void*)&size, NiL, NiL, NiL, NiL);
|
||||
state.trap.size = n;
|
||||
}
|
||||
else
|
||||
r = (*realf)(sp, size);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_truncate, 0, path, size);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_truncate))
|
||||
fscall(NiL, MSG_truncate, 0, path, size);
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
truncate3d(const char* path, off_t size)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_truncate, 0, path, size))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return -1;
|
||||
r = TRUNCATE(sp, size);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(NiL, MSG_truncate, 0, path, size);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_truncate))
|
||||
fscall(NiL, MSG_truncate, 0, path, size);
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
NoN(truncate)
|
||||
|
||||
#endif
|
|
@ -1,77 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
int
|
||||
unlink3d(register const char* path)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
|
||||
if (!fscall(NiL, MSG_remove, 0, path))
|
||||
return state.ret;
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_PATHONLY|P_SAFE, NiL)))
|
||||
return -1;
|
||||
if (state.path.level)
|
||||
return 0;
|
||||
if (!(r = LSTAT(sp, &state.path.st)))
|
||||
{
|
||||
if (S_ISLNK(state.path.st.st_mode) && !checklink(sp, &state.path.st, P_PATHONLY|P_LSTAT) && state.path.linksize > 0)
|
||||
{
|
||||
/*
|
||||
* remove instance if not default
|
||||
*/
|
||||
|
||||
r = strlen(sp) - (sizeof(state.vdefault) - 1);
|
||||
if (r > 3 && streq(sp + r, state.vdefault))
|
||||
return 0;
|
||||
}
|
||||
r = UNLINK(sp);
|
||||
}
|
||||
if (!r)
|
||||
{
|
||||
#if FS
|
||||
if (mp)
|
||||
fscall(mp, MSG_remove, 0, path);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_remove))
|
||||
fscall(mp, MSG_remove, 0, path);
|
||||
#endif
|
||||
}
|
||||
else if (errno == ENOENT && pathreal(path, 0, NiL))
|
||||
r = 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
#undef remove
|
||||
|
||||
int
|
||||
remove(const char* path)
|
||||
{
|
||||
return unlink(path);
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:hide utime
|
||||
#else
|
||||
#define utime ______utime
|
||||
#endif
|
||||
#define _def_syscall_3d 1
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if _hdr_utime
|
||||
#include <utime.h>
|
||||
#else
|
||||
struct utimbuf
|
||||
{
|
||||
time_t actime;
|
||||
time_t modtime;
|
||||
};
|
||||
#endif
|
||||
|
||||
#undef _def_syscall_3d
|
||||
#if defined(__STDPP__directive) && defined(__STDPP__hide)
|
||||
__STDPP__directive pragma pp:nohide utime
|
||||
#else
|
||||
#undef utime
|
||||
#endif
|
||||
|
||||
#include "FEATURE/syscall"
|
||||
|
||||
#define atimeof(p) ((p)->actime)
|
||||
#define mtimeof(p) ((p)->modtime)
|
||||
|
||||
int
|
||||
utime3d(const char* path, const struct utimbuf* tms)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
time_t atime;
|
||||
time_t mtime;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(UTIME(path, tms));
|
||||
if (tms)
|
||||
{
|
||||
atime = atimeof(tms);
|
||||
mtime = mtimeof(tms);
|
||||
}
|
||||
else atime = mtime = time((time_t*)0);
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_utime, 0, path, atime, mtime))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = UTIME(sp, tms);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_utime))
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if _nosys_utimensat
|
||||
|
||||
NoN(utimensat)
|
||||
|
||||
#else
|
||||
|
||||
#define atimeof(p) (((p)+0)->tv_sec)
|
||||
#define mtimeof(p) (((p)+1)->tv_sec)
|
||||
|
||||
int
|
||||
utimensat3d(int dir, const char* path, const struct timespec* tms, int flags)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
time_t atime;
|
||||
time_t mtime;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(UTIMETS(path, tms));
|
||||
if (tms)
|
||||
{
|
||||
atime = atimeof(tms);
|
||||
mtime = mtimeof(tms);
|
||||
}
|
||||
else atime = mtime = time((time_t*)0);
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_utime, 0, path, atime, mtime))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (dir != AT_FDCWD && *path != '/')
|
||||
sp = (char*)path;
|
||||
else if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = UTIMENSAT(dir, sp, tms, flags);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_utime))
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,67 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#define atimeof(p) (((p)+0)->tv_sec)
|
||||
#define mtimeof(p) (((p)+1)->tv_sec)
|
||||
|
||||
int
|
||||
utimes3d(const char* path, const struct timeval* tms)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
time_t atime;
|
||||
time_t mtime;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(UTIMES(path, tms));
|
||||
if (tms)
|
||||
{
|
||||
atime = atimeof(tms);
|
||||
mtime = mtimeof(tms);
|
||||
}
|
||||
else atime = mtime = time((time_t*)0);
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_utime, 0, path, atime, mtime))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = UTIMES(sp, tms);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_utime))
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if _nosys_utimets
|
||||
|
||||
NoN(utimets)
|
||||
|
||||
#else
|
||||
|
||||
#define atimeof(p) (((p)+0)->tv_sec)
|
||||
#define mtimeof(p) (((p)+1)->tv_sec)
|
||||
|
||||
int
|
||||
utimets3d(const char* path, const struct timespec* tms)
|
||||
{
|
||||
register char* sp;
|
||||
register int r;
|
||||
time_t atime;
|
||||
time_t mtime;
|
||||
#if FS
|
||||
Mount_t* mp;
|
||||
#endif
|
||||
|
||||
if (state.in_2d)
|
||||
return(UTIMETS(path, tms));
|
||||
if (tms)
|
||||
{
|
||||
atime = atimeof(tms);
|
||||
mtime = mtimeof(tms);
|
||||
}
|
||||
else atime = mtime = time((time_t*)0);
|
||||
#if FS
|
||||
if (!fscall(NiL, MSG_utime, 0, path, atime, mtime))
|
||||
return(state.ret);
|
||||
mp = monitored();
|
||||
#endif
|
||||
if (!(sp = pathreal(path, P_TOP, NiL)))
|
||||
return(-1);
|
||||
r = UTIMETS(sp, tms);
|
||||
#if FS
|
||||
if (!r)
|
||||
{
|
||||
if (mp)
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
for (mp = state.global; mp; mp = mp->global)
|
||||
if (fssys(mp, MSG_utime))
|
||||
fscall(mp, MSG_utime, 0, path, atime, mtime);
|
||||
}
|
||||
#endif
|
||||
return(r);
|
||||
}
|
||||
|
||||
#endif
|
501
src/cmd/3d/vcs.c
501
src/cmd/3d/vcs.c
|
@ -1,501 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2012 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* Herman Rao
|
||||
* AT&T Research
|
||||
* 3d version control system interface
|
||||
*/
|
||||
|
||||
#include "3d.h"
|
||||
|
||||
#if VCS
|
||||
|
||||
#define MAXVID 256
|
||||
|
||||
#define MAGIC_STRING "\026\003\023\006"
|
||||
#define MAGIC_LEN 4
|
||||
|
||||
#define DELTA (1 << 0)
|
||||
#define COMPRESS (1 << 1)
|
||||
#define CPIO (1 << 2)
|
||||
|
||||
typedef struct /* unique id for a sfile in WAN */
|
||||
{
|
||||
unsigned long host;
|
||||
dev_t dev;
|
||||
ino_t ino;
|
||||
} Rno_t;
|
||||
|
||||
/*
|
||||
* structure of sfile
|
||||
*
|
||||
* attr tags_region delta_region log_region
|
||||
* __________________________________________________________
|
||||
* | |T|T|T|T| ......|D |D |..... |T|D |T|D |
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char magic[4];
|
||||
int type; /* type of file, i.e., DELTA */
|
||||
int version; /* RSCS version number */
|
||||
Rno_t rno; /* rnode */
|
||||
int tag_reg; /* tags region */
|
||||
int del_reg; /* delta region */
|
||||
int log_reg; /* log region */
|
||||
int basetag; /* base tag */
|
||||
int base; /* base delta */
|
||||
int basesize; /* base delta size */
|
||||
} Attr_t;
|
||||
|
||||
#define LOG (1<<0)
|
||||
#define HASH (1<<1)
|
||||
#define VCSLINK (1<<2)
|
||||
#define VOBJ (1<<3)
|
||||
#define BASE (1<<4)
|
||||
#define MARKER (1<<5)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int length; /* length of tag */
|
||||
int type; /* type of data */
|
||||
int del; /* addr of data */
|
||||
int dsize; /* size of data */
|
||||
struct stat stat; /* stat info */
|
||||
int domain; /* domain of the creator */
|
||||
char version[MAXVID]; /* version id */
|
||||
} Tag_t;
|
||||
|
||||
#define ISBASE(tp) (((tp)->type) & BASE)
|
||||
#define ISROOT(me) (me == (uid_t)(0))
|
||||
#define R_ISLINK(tp) (((tp)->type) & VCSLINK)
|
||||
#define R_ISMARKER(tp) (((tp)->type) & MARKER)
|
||||
|
||||
#define CHRLINK '>'
|
||||
#define CHRMARKER '<'
|
||||
#define MAXLINKS 10
|
||||
|
||||
/*
|
||||
* used by lookup_tag()
|
||||
*/
|
||||
|
||||
#define L_LOG (1<<0)
|
||||
#define L_HASH (1<<1)
|
||||
#define G_LINK (1<<2)
|
||||
|
||||
typedef struct Rdirent
|
||||
{
|
||||
Tag_t* tag;
|
||||
int oldaddr; /* for reconf used */
|
||||
char* link; /* used by the link */
|
||||
struct Rdirent* next;
|
||||
} Rdirent_t;
|
||||
|
||||
#define ISRSCS(ap) (!strncmp(ap->magic, MAGIC_STRING, MAGIC_LEN))
|
||||
#define KEYEQ(t,v,r) (streq(t->version, v) && (!r || t->domain == r))
|
||||
|
||||
/*
|
||||
* list of error codes
|
||||
*/
|
||||
|
||||
#define ERRARG 1
|
||||
#define NOVFILE 2
|
||||
#define NOTRSCS 3
|
||||
#define NOVERSION 4
|
||||
#define NOBASE 5
|
||||
#define ERRSTRUCT 6
|
||||
#define ERRBASE 7
|
||||
#define ERRDELTA 8
|
||||
#define NOMEM 9
|
||||
#define ERRUPDATE 10
|
||||
#define ERRACCESS 11
|
||||
#define ERRWRITE 12
|
||||
#define NOENTIES 13
|
||||
|
||||
#define DEFAULT "default"
|
||||
#define LATEST "latest"
|
||||
|
||||
#define VCS_RDIR "VCS"
|
||||
#define VCS_MDIR "..."
|
||||
#define VCS_MDIRLEN (sizeof(VCS_MDIR)-1)
|
||||
|
||||
int
|
||||
vcs_checkout(const char* path, struct stat* st)
|
||||
{
|
||||
char* b;
|
||||
char* e;
|
||||
int fd;
|
||||
int n;
|
||||
char buf[3 * PATH_MAX];
|
||||
int synfd;
|
||||
char synpath[PATH_MAX];
|
||||
|
||||
NoP(st);
|
||||
message((-2, "vcs: checkout: %s", path));
|
||||
if ((fd = fsfd(state.vcs.fs)) < 0)
|
||||
{
|
||||
message((-2, "vcs: connect error"));
|
||||
return(-1);
|
||||
}
|
||||
e = (b = buf) + elementsof(buf) - 1;
|
||||
bprintf(&b, e, "out %s %s %s\n", state.path.vcs.rfile, state.path.vcs.version, state.path.vcs.rfile);
|
||||
n = b - buf;
|
||||
message((-2, "vsc: sendout msg %s", buf));
|
||||
cancel(&state.vcs.fd);
|
||||
if (WRITE(fd, buf, n) != n)
|
||||
{
|
||||
message((-2, "vcs: checkout: can't send the message %s", buf));
|
||||
return(-1);
|
||||
}
|
||||
e = (b = synpath) + elementsof(synpath) - 1;
|
||||
bprintf(&b, e, "%s__%d", state.path.vcs.rfile, state.pid);
|
||||
if ((synfd = OPEN(synpath, O_CREAT | O_WRONLY, 0666)) < 0)
|
||||
return(-1);
|
||||
CLOSE(synfd);
|
||||
if ((n = READ(fd, buf, sizeof(buf) - 1)) > 0)
|
||||
{
|
||||
buf[n - 1] = 0;
|
||||
message((-2, "vcs: checkout return msg %s", buf));
|
||||
UNLINK(synpath);
|
||||
return(0);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* path: prefix/.../file_name/version_name
|
||||
* rfile: prefix/.../file_name/default
|
||||
* version: version_name
|
||||
*/
|
||||
|
||||
static int
|
||||
vcs_map(const char* path, char* rfile, char* version)
|
||||
{
|
||||
register const char* s;
|
||||
const char* p[3];
|
||||
int i;
|
||||
|
||||
for (s = path; *s; s++);
|
||||
for (i = 0; s != path && i < 3; s--)
|
||||
if (*s == '/')
|
||||
p[i++] = s + 1;
|
||||
s++;
|
||||
if (i < 3 || s == path || !strneq(p[2], VCS_MDIR, VCS_MDIRLEN))
|
||||
return(-1);
|
||||
strcpy(version, p[0]);
|
||||
strcpy(rfile, path);
|
||||
message((-2, "vcs: map path=%s rfile=%s version=%s", path, rfile, version));
|
||||
return(0);
|
||||
}
|
||||
|
||||
static Rdirent_t*
|
||||
add_entry(Rdirent_t* head, Tag_t* tp)
|
||||
{
|
||||
register Rdirent_t* ndp;
|
||||
register Rdirent_t* dp;
|
||||
register Rdirent_t** prev_posn;
|
||||
int result;
|
||||
Tag_t* ntp;
|
||||
char* link = 0;
|
||||
int marker;
|
||||
|
||||
|
||||
if (R_ISLINK(tp) && (link = strrchr(tp->version, CHRLINK)))
|
||||
*link++ = 0;
|
||||
marker = R_ISMARKER(tp) ? 1 : 0;
|
||||
dp = head;
|
||||
prev_posn = &head;
|
||||
while (dp)
|
||||
{
|
||||
/*
|
||||
* no marker as this point
|
||||
*/
|
||||
|
||||
#if 0
|
||||
if (!marker && R_ISMARKER(dp->tag))
|
||||
{
|
||||
if ((dp->tag->stat.st_ctime < tp->stat.st_ctime) && markermatch(dp->tag->version, tp->version))
|
||||
{
|
||||
*prev_posn = dp->next;
|
||||
ndp = dp->next;
|
||||
free(dp->tag);
|
||||
free(dp);
|
||||
dp = ndp;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if ((result = strcmp(dp->tag->version, tp->version)) == 0)
|
||||
{
|
||||
/*
|
||||
* check if the minor key (domain) is the same
|
||||
*/
|
||||
|
||||
if (dp->tag->domain == tp->domain)
|
||||
{
|
||||
if (dp->tag->stat.st_ctime > tp->stat.st_ctime)
|
||||
return(head);
|
||||
ntp = newof(0, Tag_t, 0, tp->length);
|
||||
memcpy((char*)ntp, (char*)tp, tp->length);
|
||||
free(dp->tag);
|
||||
dp->tag = ntp;
|
||||
if (R_ISLINK(tp) && link)
|
||||
dp->link = strdup(link);
|
||||
return(head);
|
||||
}
|
||||
}
|
||||
else if (result > 0)
|
||||
{
|
||||
ndp = newof(0, Rdirent_t, 1, 0);
|
||||
ntp = newof(0, Tag_t, 0, tp->length);
|
||||
memcpy((char*)ntp, (char*)tp, tp->length);
|
||||
ndp->tag = ntp;
|
||||
ndp->next = dp;
|
||||
if (R_ISLINK(tp) && link)
|
||||
ndp->link = strdup(link);
|
||||
*prev_posn = ndp;
|
||||
return(head);
|
||||
}
|
||||
prev_posn = &(dp->next);
|
||||
dp = dp->next;
|
||||
}
|
||||
ndp = newof(0, Rdirent_t, 1, 0);
|
||||
ntp = newof(0, Tag_t, 0, tp->length);
|
||||
memcpy((char*)ntp, (char*)tp, tp->length);
|
||||
ndp->tag = ntp;
|
||||
ndp->next = 0;
|
||||
if (R_ISLINK(tp) && link)
|
||||
ndp->link = strdup(link);
|
||||
*prev_posn = ndp;
|
||||
return(head);
|
||||
}
|
||||
|
||||
static Tag_t*
|
||||
get_tag(int f, register Tag_t* tp)
|
||||
{
|
||||
register char* s;
|
||||
int len;
|
||||
|
||||
s = (char *)tp + sizeof(int);
|
||||
memset((char *)tp, 0, sizeof(Tag_t));
|
||||
if (!READ(f, (char *)&(tp->length), sizeof(int)) || (len = tp->length - sizeof(int)) && READ(f, (char *)s, len) != len)
|
||||
return(0);
|
||||
if (tp->type & LOG)
|
||||
{
|
||||
tp->del = lseek(f, 0, SEEK_CUR);
|
||||
lseek(f, tp->dsize, SEEK_CUR);
|
||||
}
|
||||
return(tp);
|
||||
}
|
||||
|
||||
static Rdirent_t*
|
||||
rs_dir(register int fd, register Attr_t* ap)
|
||||
{
|
||||
Tag_t tag;
|
||||
register Tag_t* tp;
|
||||
Rdirent_t* head;
|
||||
register Rdirent_t* dp;
|
||||
register Rdirent_t* ndp;
|
||||
register Rdirent_t** prev_posn;
|
||||
|
||||
state.vcs.now = time(NiL);
|
||||
|
||||
tp = &tag;
|
||||
head = 0;
|
||||
lseek(fd, ap->log_reg, SEEK_SET);
|
||||
while(get_tag(fd, tp))
|
||||
head = add_entry(head, tp);
|
||||
|
||||
lseek(fd, ap->tag_reg, SEEK_SET);
|
||||
while((lseek(fd, 0, SEEK_CUR)<ap->del_reg) && get_tag(fd, tp))
|
||||
head = add_entry(head, tp);
|
||||
|
||||
/*
|
||||
* remove expired marker
|
||||
*/
|
||||
|
||||
dp = head;
|
||||
prev_posn = &head;
|
||||
while (dp)
|
||||
{
|
||||
if (R_ISMARKER(dp->tag) && dp->tag->stat.st_mtime < state.vcs.now)
|
||||
{
|
||||
*prev_posn = dp->next;
|
||||
ndp = dp->next;
|
||||
free(dp->tag);
|
||||
free(dp);
|
||||
dp = ndp;
|
||||
}
|
||||
else
|
||||
{
|
||||
prev_posn = &(dp->next);
|
||||
dp = dp->next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return(head);
|
||||
}
|
||||
|
||||
static Tag_t*
|
||||
locate(register Rdirent_t* rdir, register char* version, int level)
|
||||
{
|
||||
|
||||
register Rdirent_t* rd;
|
||||
register time_t mtime;
|
||||
register Rdirent_t* p;
|
||||
|
||||
if (level > MAXLINKS)
|
||||
return(0);
|
||||
|
||||
if (streq(version, DEFAULT) || streq(version, LATEST))
|
||||
{
|
||||
for (rd = rdir, mtime = 0L; rd; rd = rd->next)
|
||||
{
|
||||
if (rd->tag->stat.st_mtime > mtime)
|
||||
{
|
||||
p = rd;
|
||||
mtime = rd->tag->stat.st_mtime;
|
||||
}
|
||||
}
|
||||
if (mtime)
|
||||
return(p->tag);
|
||||
}
|
||||
|
||||
rd = rdir;
|
||||
for (rd = rdir; rd; rd = rd->next)
|
||||
{
|
||||
if (streq(rd->tag->version, version))
|
||||
{
|
||||
if (R_ISLINK(rd->tag))
|
||||
return(locate(rdir, rd->link, level +1));
|
||||
return(rd->tag);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static void
|
||||
free_dir(register Rdirent_t* rdir)
|
||||
{
|
||||
Rdirent_t* rnext;
|
||||
|
||||
while(rdir)
|
||||
{
|
||||
rnext = rdir->next;
|
||||
free(rdir->tag);
|
||||
if (rdir->link)
|
||||
free(rdir->link);
|
||||
free(rdir);
|
||||
rdir = rnext;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* return 0 if found it;
|
||||
* -1 if error
|
||||
* 1 if not found.
|
||||
*/
|
||||
|
||||
static int
|
||||
vcs_stat(int fd, char* version, struct stat* st, off_t size)
|
||||
{
|
||||
static Attr_t* ap = 0;
|
||||
static Attr_t apbuf;
|
||||
static Rdirent_t* rdir = 0;
|
||||
register Tag_t* tag;
|
||||
|
||||
NoP(size);
|
||||
if (fd != state.vcs.fd || !ap)
|
||||
{
|
||||
ap = &apbuf;
|
||||
if (READ(fd, (char *)ap, sizeof(Attr_t)) != sizeof(Attr_t))
|
||||
return(-1);
|
||||
if (!rdir)
|
||||
free_dir(rdir);
|
||||
if (!(rdir = rs_dir(fd, ap)))
|
||||
return(1);
|
||||
}
|
||||
if (tag = locate(rdir, version, 0))
|
||||
{
|
||||
*st = tag->stat;
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
vcs_real(const char* path, struct stat* st)
|
||||
{
|
||||
int n;
|
||||
int fd;
|
||||
|
||||
message((-2, "vcs: path=%s", path));
|
||||
if (st->st_nlink <= 1 || vcs_map(path, state.path.vcs.rfile, state.path.vcs.version))
|
||||
return(-1);
|
||||
|
||||
message((-2, "vcs: real path=%s rfile=%s version=%s", path, state.path.vcs.rfile, state.path.vcs.version));
|
||||
|
||||
if (state.vcs.fd && state.vcs.dev == st->st_dev && state.vcs.ino == st->st_ino)
|
||||
fd = state.vcs.fd;
|
||||
else if ((fd = OPEN(path, O_RDONLY, 0)) < 0)
|
||||
return(-1);
|
||||
if (n = vcs_stat(fd, state.path.vcs.version, st, st->st_size))
|
||||
{
|
||||
if (fd != state.vcs.fd) CLOSE(fd);
|
||||
else if (n == -1) cancel(&state.vcs.fd);
|
||||
return(-1);
|
||||
}
|
||||
if (fd != state.vcs.fd)
|
||||
{
|
||||
cancel(&state.vcs.fd);
|
||||
state.vcs.fd = fd;
|
||||
reserve(&state.vcs.fd);
|
||||
state.vcs.dev = st->st_dev;
|
||||
state.vcs.ino = st->st_ino;
|
||||
FCNTL(fd, F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
vcs_set(Fs_t* fs, const char* arg, int argsize, const char* op, int opsize)
|
||||
{
|
||||
NoP(arg);
|
||||
NoP(argsize);
|
||||
NoP(op);
|
||||
NoP(opsize);
|
||||
state.vcs.fs = fs;
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
NoN(vcs)
|
||||
|
||||
#endif
|
|
@ -1,78 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
/*
|
||||
* 3D interface to version control system
|
||||
*
|
||||
* Herman Rao
|
||||
* AT&T Research
|
||||
*/
|
||||
|
||||
#ifndef _VCS3D_H
|
||||
#define _VCS3D_H
|
||||
|
||||
#define vcs_checkout _3d_vcs_checkout
|
||||
#define vcs_real _3d_vcs_real
|
||||
#define vcs_set _3d_vcs_set
|
||||
|
||||
#define VCS_STATE \
|
||||
struct \
|
||||
{ \
|
||||
dev_t dev; \
|
||||
ino_t ino; \
|
||||
Fs_t* fs; \
|
||||
short fd; \
|
||||
time_t now; \
|
||||
} vcs
|
||||
|
||||
#define VCS_PATH_STATE \
|
||||
struct \
|
||||
{ \
|
||||
char rfile[PATH_MAX]; \
|
||||
char version[PATH_MAX]; \
|
||||
} vcs
|
||||
|
||||
#define VCS_FS \
|
||||
FSINIT("vcs", 0, vcs_set, FS_CLOSE, HASHKEY3('v','c','s'))
|
||||
|
||||
#define VCS_OPEN(p,f,m,s) \
|
||||
do \
|
||||
{ \
|
||||
if (!(f & O_CREAT) && (f & O_ACCMODE != O_WRONLY) && state.vcs.fd)\
|
||||
{ \
|
||||
if (vcs_checkout(p, s) < 0) \
|
||||
{ \
|
||||
errno = ENOENT; \
|
||||
return(-1); \
|
||||
} \
|
||||
p = state.path.name; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define VCS_REAL(p,s) \
|
||||
(fson(state.vcs.fs) ? vcs_real(p,s) : 0)
|
||||
|
||||
extern int vcs_checkout(const char*, struct stat*);
|
||||
extern int vcs_real(const char*, struct stat*);
|
||||
extern int vcs_set(Fs_t*, const char*, int, const char*, int);
|
||||
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
########################################################################
|
||||
# #
|
||||
# This software is part of the ast package #
|
||||
# Copyright (c) 1989-2011 AT&T Intellectual Property #
|
||||
# and is licensed under the #
|
||||
# Eclipse Public License, Version 1.0 #
|
||||
# by AT&T Intellectual Property #
|
||||
# #
|
||||
# A copy of the License is available at #
|
||||
# http://www.eclipse.org/org/documents/epl-v10.html #
|
||||
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
||||
# #
|
||||
# Information and Software Systems Research #
|
||||
# AT&T Research #
|
||||
# Florham Park NJ #
|
||||
# #
|
||||
# Glenn Fowler <gsf@research.att.com> #
|
||||
# David Korn <dgk@research.att.com> #
|
||||
# Eduardo Krell <ekrell@adexus.cl> #
|
||||
# #
|
||||
########################################################################
|
||||
: vex skip expand command ...
|
||||
# vpath expand args matching pattern
|
||||
# @(#)vex (AT&T Bell Laboratories) 04/01/93
|
||||
case $# in
|
||||
[012]) print -u2 "Usage: $0 skip expand command ..."; exit 1 ;;
|
||||
esac
|
||||
skip=$1
|
||||
shift
|
||||
expand=$1
|
||||
shift
|
||||
command=$1
|
||||
shift
|
||||
integer argc=0 noexpand=0
|
||||
for arg
|
||||
do if ((noexpand))
|
||||
then noexpand=0
|
||||
else case $arg in
|
||||
-[$skip])
|
||||
noexpand=1
|
||||
;;
|
||||
-*) ;;
|
||||
$expand)
|
||||
x=$(vpath "$arg" 2>/dev/null)
|
||||
case $x in
|
||||
?*) arg=${x#$PWD/} ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
argv[argc]=$arg
|
||||
((argc+=1))
|
||||
done
|
||||
"$command" "${argv[@]}"
|
|
@ -1,52 +0,0 @@
|
|||
/***********************************************************************
|
||||
* *
|
||||
* This software is part of the ast package *
|
||||
* Copyright (c) 1989-2011 AT&T Intellectual Property *
|
||||
* and is licensed under the *
|
||||
* Eclipse Public License, Version 1.0 *
|
||||
* by AT&T Intellectual Property *
|
||||
* *
|
||||
* A copy of the License is available at *
|
||||
* http://www.eclipse.org/org/documents/epl-v10.html *
|
||||
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
||||
* *
|
||||
* Information and Software Systems Research *
|
||||
* AT&T Research *
|
||||
* Florham Park NJ *
|
||||
* *
|
||||
* Glenn Fowler <gsf@research.att.com> *
|
||||
* David Korn <dgk@research.att.com> *
|
||||
* Eduardo Krell <ekrell@adexus.cl> *
|
||||
* *
|
||||
***********************************************************************/
|
||||
#pragma prototyped
|
||||
|
||||
/*
|
||||
* vfork == fork
|
||||
* cross your fingers
|
||||
* csh loses
|
||||
*/
|
||||
|
||||
#include <ast_lib.h>
|
||||
|
||||
#if _lib_vfork && 0
|
||||
|
||||
extern int fork(void);
|
||||
|
||||
int
|
||||
_vfork(void)
|
||||
{
|
||||
return(fork());
|
||||
}
|
||||
|
||||
int
|
||||
vfork(void)
|
||||
{
|
||||
return(fork());
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int _STUB_vfork;
|
||||
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue