mirror of
https://github.com/GnoConsortium/gno.git
synced 2025-04-28 00:57:41 +00:00
modified to fit into GNO base build
This commit is contained in:
parent
24b9cda931
commit
b9c3d5d27d
12
bin/rmdir/Makefile
Normal file
12
bin/rmdir/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
#
|
||||
# $Id: Makefile,v 1.1 1997/10/30 02:33:48 gdr Exp $
|
||||
#
|
||||
|
||||
PROG = rmdir
|
||||
|
||||
# Add -D__STACK_CHECK__ to CFLAGS to get stack usage information
|
||||
CFLAGS += -I/src/gno/lib/libcontrib
|
||||
LDFLAGS += -l/src/gno/lib/libcontrib/libcontrib
|
||||
STACK = 768
|
||||
|
||||
.INCLUDE: /src/gno/prog.mk
|
@ -1,23 +0,0 @@
|
||||
# Makefile for rmdir(1) and rmdir(3) v1.0
|
||||
#
|
||||
# Devin Reade, <gdr@myrias.ab.ca> November 1994.
|
||||
#
|
||||
# Define:
|
||||
# SHELL_COMD if you want to compile the shell command version.
|
||||
# In this case, do a 'make rmdir'. If you want just
|
||||
# the rmdir(3) library routine, don't define
|
||||
# SHELL_COMD and do a 'make rmdir.o'
|
||||
#
|
||||
# CHECK_STACK if you want to determine stack usage. If you select
|
||||
# This option, you must also specify the stack library,
|
||||
# nominally -l/usr/lib/stack.
|
||||
|
||||
CFLAGS = -w -O -DSHELL_COMD -v -s768
|
||||
LDFLAGS = -v
|
||||
|
||||
all: rmdir
|
||||
|
||||
install:
|
||||
cp -f rmdir /bin
|
||||
cp -f rmdir.1 /usr/man/man1
|
||||
cp -f rmdir.2 /usr/man/man2
|
@ -1,11 +1,17 @@
|
||||
.TH RMDIR 1 "Commands and Applications" "28 November 1994" "Version 1.0"
|
||||
.\"
|
||||
.\" Devin Reade, 1994
|
||||
.\"
|
||||
.\" $Id: rmdir.1,v 1.2 1997/10/30 02:33:49 gdr Exp $
|
||||
.\"
|
||||
.TH RMDIR 1 "17 October 1997" GNO "Commands and Applications"
|
||||
.SH NAME
|
||||
rmdir \- remove (delete) a directory
|
||||
.SH SYNOPSIS
|
||||
.BR rmdir
|
||||
[
|
||||
.IR dir " ..."
|
||||
.BR -p
|
||||
]
|
||||
.IR dir " ..."
|
||||
.SH DESCRIPTION
|
||||
.BR rmdir
|
||||
will delete all the listed directories.
|
||||
@ -15,17 +21,32 @@ will print an error and skip the file if
|
||||
is not a directory, is non-empty, or if the user does not
|
||||
have permission to delete it.
|
||||
.LP
|
||||
This program contains material from the ORCA/C run\-time libraries,
|
||||
Copyright 1987\-1994 Byte Works Inc. Used with permission.
|
||||
.SH "EXIT STATUS"
|
||||
If the
|
||||
.BR -p
|
||||
flag is given, then
|
||||
.BR rmdir
|
||||
will have an exit status of zero on success, -1 on failure.
|
||||
will attempt to recursively delete all empty directories in the pathname
|
||||
.IR dir ,
|
||||
not including the volume name (if given).
|
||||
.SH BUGS
|
||||
It is possible to delete the current directory of
|
||||
.B rmdir
|
||||
or another process.
|
||||
.SH VERSION
|
||||
This manual page documents
|
||||
.BR rmdir
|
||||
version 1.1.
|
||||
.SH STANDARDS
|
||||
The
|
||||
.BR rmdir
|
||||
utility corresponds to POSIX 1003.2.
|
||||
.SH AUTHOR
|
||||
Devin Reade, <gdr@myrias.ab.ca>
|
||||
.LP
|
||||
This program contains material from the ORCA/C run\-time libraries,
|
||||
Copyright 1987\-1997 Byte Works Inc. Used with permission.
|
||||
.SH "SEE ALSO"
|
||||
.BR cp (1),
|
||||
.BR rm (1).
|
||||
.BR rm (1),
|
||||
.BR rmdir (1),
|
||||
.BR rmdir (2).
|
||||
|
@ -1,32 +0,0 @@
|
||||
.TH RMDIR 2 "System Calls" "28 November 1994" "Version 1.0"
|
||||
.SH NAME
|
||||
rmdir \- remove (delete) a directory
|
||||
.SH SYNOPSIS
|
||||
int \fBrmdir\fR (const char *\fIpath\fR);
|
||||
.SH DESCRIPTION
|
||||
.BR rmdir
|
||||
will remove the directory named by
|
||||
.I path
|
||||
if the directory is empty, if it is not a mount point, and if the calling
|
||||
process has write permission in the parent directory. The directory is
|
||||
considered empty when it contains only
|
||||
.B .
|
||||
and
|
||||
.B ..
|
||||
entries.
|
||||
.SH "RETURN VALUE"
|
||||
0 if successful, -1 and sets
|
||||
.B errno
|
||||
otherwise.
|
||||
.SH BUGS
|
||||
Since
|
||||
.BR rmdir
|
||||
is not yet implemented as a system call but as a library call, it is
|
||||
possible to delete a directory which is being used by a process, including
|
||||
that of
|
||||
.BR rmdir .
|
||||
.SH AUTHOR
|
||||
Devin Reade, <gdr@myrias.ab.ca>
|
||||
.SH "SEE ALSO"
|
||||
.BR mkdir (2),
|
||||
.BR unlink (2).
|
@ -1,99 +1,136 @@
|
||||
/*
|
||||
* rmdir - remove directory
|
||||
*
|
||||
* A quick and dirty utility for Gno. This will delete all empty
|
||||
* directories given as arguments. It will skip non-directory files
|
||||
* directories that aren't empty.
|
||||
* ChangeLog:
|
||||
* v1.1 - incorporated into GNO base distribution
|
||||
* - added -p flag for POSIX conformance
|
||||
* - moved rmdir(2) implementation to libc
|
||||
* v1.0 - initial revision
|
||||
*
|
||||
* If you don't compile with #define SHELL_COMD, then you just get the
|
||||
* rmdir(2) system call.
|
||||
*
|
||||
* Version 1.0 by Devin Reade <gdr@myrias.ab.ca>
|
||||
* Version 1.1 by Devin Reade <gdr@myrias.ab.ca>
|
||||
*/
|
||||
|
||||
#include <gsos.h>
|
||||
#include <orca.h>
|
||||
#include <types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <gno/gno.h>
|
||||
|
||||
#define DIRECTORY 0x0F
|
||||
#include "contrib.h"
|
||||
|
||||
extern GSString255Ptr __C2GSMALLOC(char *);
|
||||
extern int _mapErr(int);
|
||||
extern char *strerror(int errnum);
|
||||
extern void begin_stack_check(void);
|
||||
extern int end_stack_check(void);
|
||||
|
||||
typedef struct DestroyRecGS {
|
||||
Word pCount;
|
||||
GSString255Ptr pathname;
|
||||
} DestroyRecGS, *DestroyRecPtrGS;
|
||||
|
||||
int rmdir (const char *path) {
|
||||
DestroyRecGS drec;
|
||||
FileInfoRecGS frec;
|
||||
int result;
|
||||
|
||||
/* make a GSString copy of path */
|
||||
frec.pCount=3;
|
||||
if ((frec.pathname = __C2GSMALLOC(path)) == NULL) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check to ensure that it's a directory */
|
||||
GetFileInfoGS(&frec);
|
||||
if ((result = toolerror())!=0) {
|
||||
errno = _mapErr(result);
|
||||
free(frec.pathname);
|
||||
return -1;
|
||||
}
|
||||
if (frec.fileType != DIRECTORY) {
|
||||
errno = ENOTDIR;
|
||||
free(frec.pathname);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* it's a directory; try to delete it */
|
||||
drec.pCount=1;
|
||||
drec.pathname = frec.pathname;
|
||||
DestroyGS(&drec);
|
||||
if ((result = toolerror())!=0) {
|
||||
errno = _mapErr(result);
|
||||
free(frec.pathname);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* it's been deleted. Clean up and return */
|
||||
free(frec.pathname);
|
||||
return 0;
|
||||
#ifdef __STACK_CHECK__
|
||||
static void
|
||||
printStack (void) {
|
||||
fprintf(stderr, "stack usage: %d bytes\n", _endStackCheck());
|
||||
}
|
||||
|
||||
#ifdef SHELL_COMD
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int i, result;
|
||||
|
||||
#ifdef CHECK_STACK
|
||||
begin_stack_check();
|
||||
#endif
|
||||
|
||||
result = 0;
|
||||
for (i=1; i<argc; i++) { /* loop over all filenames */
|
||||
|
||||
if (rmdir(argv[i])!=0) {
|
||||
fprintf(stderr,"%s: %s: %s. File skipped.\n",argv[0],argv[i],
|
||||
strerror(errno));
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CHECK_STACK
|
||||
fprintf(stderr,"stack usage: %d bytes\n",end_stack_check());
|
||||
#endif
|
||||
|
||||
return result;
|
||||
static void
|
||||
usage (void) {
|
||||
fprintf(stderr, "usage: rmdir [-p] directory ...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#endif /* SHELL_COMD */
|
||||
const char *nodup = "couldn't duplicate %s";
|
||||
|
||||
int
|
||||
main(int argc, char **argv) {
|
||||
int c, result, pflag;
|
||||
char delim, *path, *root, *p, *q;
|
||||
|
||||
#ifdef __STACK_CHECK__
|
||||
_beginStackCheck();
|
||||
atexit(printStack);
|
||||
#endif
|
||||
|
||||
pflag = 0;
|
||||
while ((c = getopt (argc, argv, "p")) != EOF) {
|
||||
switch (c) {
|
||||
case 'p':
|
||||
pflag = 1;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
if ((argc - optind) == 0) {
|
||||
usage();
|
||||
}
|
||||
result = 0;
|
||||
|
||||
/* loop over all filenames */
|
||||
for (; optind<argc; optind++) {
|
||||
|
||||
path = argv[optind];
|
||||
|
||||
if (pflag == 0) {
|
||||
/*
|
||||
* Just do the last directory component, and
|
||||
* skip the mess below
|
||||
*/
|
||||
if (rmdir(path)!=0) {
|
||||
warn("%s skipped", path);
|
||||
result++;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/* get the full pathname */
|
||||
if ((path = LC_ExpandPath (path)) == NULL) {
|
||||
warn("couldn't expand %s", argv[optind]);
|
||||
continue;
|
||||
}
|
||||
if ((q = strdup(path)) == NULL) {
|
||||
err(1, nodup, path);
|
||||
}
|
||||
path = q;
|
||||
|
||||
/* what is the volume component? */
|
||||
q = (*path == ':') ? path+1 : path;
|
||||
q = strchr(q, ':');
|
||||
if (q != NULL) {
|
||||
*q = '\0';
|
||||
}
|
||||
|
||||
if (*path == ':') {
|
||||
if ((root = strdup(path)) == NULL) {
|
||||
err(1, nodup, path);
|
||||
}
|
||||
} else {
|
||||
root = NULL;
|
||||
}
|
||||
if (q != NULL) {
|
||||
*q = ':';
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
if (*path == '\0') {
|
||||
/* deleted all the directories */
|
||||
break;
|
||||
}
|
||||
if ((root != NULL) && !strcmp(root, path)) {
|
||||
/* don't try to delete the volume */
|
||||
break;
|
||||
}
|
||||
if (rmdir(path)!=0) {
|
||||
warn("%s skipped", path);
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
p = path + strlen(path) - 1;
|
||||
while (p >= path) {
|
||||
if (*p == ':') {
|
||||
*p = '\0';
|
||||
break;
|
||||
} else {
|
||||
*p-- = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
18
bin/rmdir/rmdir.rez
Normal file
18
bin/rmdir/rmdir.rez
Normal file
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* $Id: rmdir.rez,v 1.1 1997/10/30 02:33:49 gdr Exp $
|
||||
*/
|
||||
|
||||
#include "Types.Rez"
|
||||
|
||||
resource rVersion (0x1, purgeable3, nocrossbank) {
|
||||
|
||||
{ 1, 1, 0, /* version 1.1.0 */
|
||||
release, /* development|alpha|beta|final|release */
|
||||
0 /* non-final release number */
|
||||
},
|
||||
verUS,
|
||||
"rmdir",
|
||||
"remove (empty) directory\n"
|
||||
"Devin Reade <gdr@eddore.myrias.com>\n"
|
||||
"Canada"
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user