Changeset View
Changeset View
Standalone View
Standalone View
contrib/mg/dir.c
- This file was added.
/* $OpenBSD: dir.c,v 1.31 2019/06/28 13:35:02 deraadt Exp $ */ | |||||
/* This file is in the public domain. */ | |||||
/* | |||||
* Name: MG 2a | |||||
* Directory management functions | |||||
* Created: Ron Flax (ron@vsedev.vse.com) | |||||
* Modified for MG 2a by Mic Kaczmarczik 03-Aug-1987 | |||||
*/ | |||||
#include <sys/queue.h> | |||||
#include <sys/stat.h> | |||||
#include <signal.h> | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <unistd.h> | |||||
#include "def.h" | |||||
static char mgcwd[NFILEN]; | |||||
/* | |||||
* Initialize anything the directory management routines need. | |||||
*/ | |||||
void | |||||
dirinit(void) | |||||
{ | |||||
mgcwd[0] = '\0'; | |||||
if (getcwd(mgcwd, sizeof(mgcwd)) == NULL) | |||||
ewprintf("Can't get current directory!"); | |||||
if (mgcwd[0] != '\0' && !(mgcwd[0] == '/' && mgcwd[1] == '\0')) | |||||
(void)strlcat(mgcwd, "/", sizeof(mgcwd)); | |||||
} | |||||
/* | |||||
* Change current working directory. | |||||
*/ | |||||
/* ARGSUSED */ | |||||
int | |||||
changedir(int f, int n) | |||||
{ | |||||
char bufc[NFILEN], *bufp; | |||||
(void)strlcpy(bufc, mgcwd, sizeof(bufc)); | |||||
if ((bufp = eread("Change default directory: ", bufc, NFILEN, | |||||
EFDEF | EFNEW | EFCR | EFFILE)) == NULL) | |||||
return (ABORT); | |||||
else if (bufp[0] == '\0') | |||||
return (FALSE); | |||||
/* Append trailing slash */ | |||||
if (chdir(bufc) == -1) { | |||||
dobeep(); | |||||
ewprintf("Can't change dir to %s", bufc); | |||||
return (FALSE); | |||||
} | |||||
if ((bufp = getcwd(mgcwd, sizeof(mgcwd))) == NULL) { | |||||
if (bufc[0] == '/') | |||||
(void)strlcpy(mgcwd, bufc, sizeof(mgcwd)); | |||||
else | |||||
(void)strlcat(mgcwd, bufc, sizeof(mgcwd)); | |||||
} | |||||
if (mgcwd[strlen(mgcwd) - 1] != '/') | |||||
(void)strlcat(mgcwd, "/", sizeof(mgcwd)); | |||||
ewprintf("Current directory is now %s", mgcwd); | |||||
return (TRUE); | |||||
} | |||||
/* | |||||
* Show current directory. | |||||
*/ | |||||
/* ARGSUSED */ | |||||
int | |||||
showcwdir(int f, int n) | |||||
{ | |||||
ewprintf("Current directory: %s", mgcwd); | |||||
return (TRUE); | |||||
} | |||||
int | |||||
getcwdir(char *buf, size_t len) | |||||
{ | |||||
if (strlcpy(buf, mgcwd, len) >= len) | |||||
return (FALSE); | |||||
return (TRUE); | |||||
} | |||||
/* Create the directory and it's parents. */ | |||||
/* ARGSUSED */ | |||||
int | |||||
makedir(int f, int n) | |||||
{ | |||||
return (ask_makedir()); | |||||
} | |||||
int | |||||
ask_makedir(void) | |||||
{ | |||||
char bufc[NFILEN]; | |||||
char *path; | |||||
if (getbufcwd(bufc, sizeof(bufc)) != TRUE) | |||||
return (ABORT); | |||||
if ((path = eread("Make directory: ", bufc, NFILEN, | |||||
EFDEF | EFNEW | EFCR | EFFILE)) == NULL) | |||||
return (ABORT); | |||||
else if (path[0] == '\0') | |||||
return (FALSE); | |||||
return (do_makedir(path)); | |||||
} | |||||
int | |||||
do_makedir(char *path) | |||||
{ | |||||
struct stat sb; | |||||
int finished, ishere; | |||||
mode_t dir_mode, f_mode, oumask; | |||||
char *slash; | |||||
if ((path = adjustname(path, TRUE)) == NULL) | |||||
return (FALSE); | |||||
/* Remove trailing slashes */ | |||||
slash = strrchr(path, '\0'); | |||||
while (--slash > path && *slash == '/') | |||||
*slash = '\0'; | |||||
slash = path; | |||||
oumask = umask(0); | |||||
f_mode = 0777 & ~oumask; | |||||
dir_mode = f_mode | S_IWUSR | S_IXUSR; | |||||
for (;;) { | |||||
slash += strspn(slash, "/"); | |||||
slash += strcspn(slash, "/"); | |||||
finished = (*slash == '\0'); | |||||
*slash = '\0'; | |||||
ishere = !stat(path, &sb); | |||||
if (finished && ishere) { | |||||
dobeep(); | |||||
ewprintf("Cannot create directory %s: file exists", | |||||
path); | |||||
return(FALSE); | |||||
} else if (!finished && ishere && S_ISDIR(sb.st_mode)) { | |||||
*slash = '/'; | |||||
continue; | |||||
} | |||||
if (mkdir(path, finished ? f_mode : dir_mode) == 0) { | |||||
if (f_mode > 0777 && chmod(path, f_mode) == -1) { | |||||
umask(oumask); | |||||
return (ABORT); | |||||
} | |||||
} else { | |||||
if (!ishere || !S_ISDIR(sb.st_mode)) { | |||||
if (!ishere) { | |||||
dobeep(); | |||||
ewprintf("Creating directory: " | |||||
"permission denied, %s", path); | |||||
} else | |||||
eerase(); | |||||
umask(oumask); | |||||
return (FALSE); | |||||
} | |||||
} | |||||
if (finished) | |||||
break; | |||||
*slash = '/'; | |||||
} | |||||
eerase(); | |||||
umask(oumask); | |||||
return (TRUE); | |||||
} |