320 lines
5.3 KiB
C
320 lines
5.3 KiB
C
/*
|
|
* Copyright (c) 2004-2005 vlad902 <vlad902 [at] gmail.com>
|
|
* Copyright (c) 2007 H D Moore <hdm [at] metasploit.com>
|
|
* This file is part of the Metasploit Framework.
|
|
* $Revision$
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/param.h>
|
|
#include <sys/stat.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <dirent.h>
|
|
#include <pwd.h>
|
|
#include <grp.h>
|
|
#include <sys/fcntl.h>
|
|
|
|
#include "cmd.h"
|
|
|
|
|
|
void ls_dofile(struct stat, char *);
|
|
|
|
void cmd_ls(int argc, char * argv[])
|
|
{
|
|
char * path = ".";
|
|
DIR * dirp;
|
|
struct dirent * dp;
|
|
struct stat sb;
|
|
|
|
if(argc > 1)
|
|
path = argv[1];
|
|
|
|
if(stat(path, &sb) == -1)
|
|
{
|
|
perror("stat");
|
|
return;
|
|
}
|
|
|
|
if(!S_ISDIR(sb.st_mode))
|
|
{
|
|
ls_dofile(sb, path);
|
|
}
|
|
else
|
|
{
|
|
if((dirp = opendir(path)) == NULL)
|
|
{
|
|
perror("opendir");
|
|
return;
|
|
}
|
|
|
|
while((dp = readdir(dirp)) != NULL)
|
|
{
|
|
char buf[MAXPATHLEN+1];
|
|
|
|
if(strlen(path) + strlen(dp->d_name) + 1 > MAXPATHLEN)
|
|
continue;
|
|
snprintf(buf, MAXPATHLEN, "%s/%s", path, dp->d_name);
|
|
if(stat(buf, &sb) == -1)
|
|
continue;
|
|
|
|
ls_dofile(sb, dp->d_name);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ls_dofile(struct stat sb, char * file_name)
|
|
{
|
|
char perm[11] = "----------";
|
|
|
|
if(sb.st_mode & 0400) perm[1] = 'r';
|
|
if(sb.st_mode & 0200) perm[2] = 'w';
|
|
if(sb.st_mode & 0100) perm[3] = 'x';
|
|
if(sb.st_mode & 0040) perm[4] = 'r';
|
|
if(sb.st_mode & 0020) perm[5] = 'w';
|
|
if(sb.st_mode & 0010) perm[6] = 'x';
|
|
if(sb.st_mode & 0004) perm[7] = 'r';
|
|
if(sb.st_mode & 0002) perm[8] = 'w';
|
|
if(sb.st_mode & 0001) perm[9] = 'x';
|
|
if(sb.st_mode & S_ISVTX)
|
|
{
|
|
if(sb.st_mode & 0001)
|
|
perm[9] = 't';
|
|
else
|
|
perm[9] = 'T';
|
|
}
|
|
if(sb.st_mode & S_ISGID)
|
|
{
|
|
if(sb.st_mode & 0010)
|
|
perm[6] = 'S';
|
|
else
|
|
perm[6] = 's';
|
|
}
|
|
if(sb.st_mode & S_ISUID)
|
|
{
|
|
if(sb.st_mode & 0100)
|
|
perm[3] = 'S';
|
|
else
|
|
perm[3] = 's';
|
|
}
|
|
if(S_ISBLK(sb.st_mode)) perm[0] = 'b';
|
|
if(S_ISCHR(sb.st_mode)) perm[0] = 'c';
|
|
if(S_ISDIR(sb.st_mode)) perm[0] = 'd';
|
|
if(S_ISLNK(sb.st_mode)) perm[0] = 'l'; /* XXX: works? */
|
|
if(S_ISFIFO(sb.st_mode)) perm[0] = 'p';
|
|
if(S_ISSOCK(sb.st_mode)) perm[0] = 's';
|
|
|
|
printf("%s %3i %s %s %6i %s %s\n", perm, (int)sb.st_nlink, \
|
|
get_uid_str(sb.st_uid), get_gid_str(sb.st_gid), \
|
|
(int)sb.st_size, get_time_str("%b %d %H:%M"), file_name);
|
|
}
|
|
|
|
void cmd_getcwd(int argc, char * argv[])
|
|
{
|
|
/* This should be big enough to accomodate all cases. */
|
|
char buf[MAXPATHLEN + 1];
|
|
|
|
if(getcwd(buf, sizeof(buf)) == NULL)
|
|
perror("getcwd");
|
|
else
|
|
printf("%s\n", buf);
|
|
}
|
|
|
|
void cmd_setcwd(int argc, char * argv[])
|
|
{
|
|
if(argc < 2)
|
|
cmd_getcwd(argc, argv);
|
|
else
|
|
if(chdir(argv[1]))
|
|
perror("chdir");
|
|
}
|
|
|
|
|
|
void cmd_chmod(int argc, char * argv[])
|
|
{
|
|
int perm;
|
|
|
|
errno = 0;
|
|
perm = (int)strtol(argv[1], (char **)NULL, 8);
|
|
if(errno)
|
|
{
|
|
perror("strtol");
|
|
return;
|
|
}
|
|
|
|
if(chmod(argv[2], perm) == -1)
|
|
perror("chmod");
|
|
}
|
|
|
|
void cmd_chown(int argc, char * argv[])
|
|
{
|
|
struct passwd * pwd;
|
|
int uid;
|
|
|
|
errno = 0;
|
|
uid = (int)strtol(argv[1], (char **)NULL, 10);
|
|
if(errno)
|
|
{
|
|
if((pwd = getpwnam(argv[1])) == NULL)
|
|
{
|
|
perror("getpwnam");
|
|
return;
|
|
}
|
|
|
|
uid = pwd->pw_uid;
|
|
}
|
|
|
|
if(chown(argv[2], uid, -1) == -1)
|
|
perror("chown");
|
|
}
|
|
|
|
void cmd_chgrp(int argc, char * argv[])
|
|
{
|
|
struct group * grp;
|
|
int gid;
|
|
|
|
errno = 0;
|
|
gid = (int)strtol(argv[1], (char **)NULL, 10);
|
|
if(errno)
|
|
{
|
|
if((grp = getgrnam(argv[1])) == NULL)
|
|
{
|
|
perror("getgrnam");
|
|
return;
|
|
}
|
|
|
|
gid = grp->gr_gid;
|
|
}
|
|
|
|
if(chown(argv[2], -1, gid) == -1)
|
|
perror("chown");
|
|
}
|
|
|
|
void cmd_chdir(int argc, char * argv[])
|
|
{
|
|
if(chdir(argv[1]) == -1)
|
|
perror("chdir");
|
|
}
|
|
|
|
void cmd_mkdir(int argc, char * argv[])
|
|
{
|
|
int perm = 0755;
|
|
|
|
if(argc > 2)
|
|
{
|
|
errno = 0;
|
|
perm = (int)strtol(argv[2], (char **)NULL, 8);
|
|
if(errno)
|
|
{
|
|
perror("strtol");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(mkdir(argv[1], perm) == -1)
|
|
perror("mkdir");
|
|
}
|
|
|
|
void cmd_rmdir(int argc, char * argv[])
|
|
{
|
|
if(rmdir(argv[1]) == -1)
|
|
perror("rmdir");
|
|
}
|
|
|
|
void cmd_rename(int argc, char * argv[])
|
|
{
|
|
if(rename(argv[1], argv[2]) == -1)
|
|
perror("rename");
|
|
}
|
|
|
|
void cmd_unlink(int argc, char * argv[])
|
|
{
|
|
if(unlink(argv[1]) == -1)
|
|
perror("unlink");
|
|
}
|
|
|
|
void cmd_chroot(int argc, char * argv[])
|
|
{
|
|
if(chroot(argv[1]) == -1)
|
|
perror("chroot");
|
|
}
|
|
|
|
void cmd_link(int argc, char * argv[])
|
|
{
|
|
if(link(argv[1], argv[2]) == -1)
|
|
perror("link");
|
|
}
|
|
|
|
void cmd_symlink(int argc, char * argv[])
|
|
{
|
|
if(symlink(argv[1], argv[2]) == -1)
|
|
perror("symlink");
|
|
}
|
|
|
|
void cmd_cp(int argc, char * argv[])
|
|
{
|
|
int src, dst, len;
|
|
char buff[4096];
|
|
struct stat s;
|
|
char *path, *p, *t;
|
|
|
|
path = strdup(argv[2]);
|
|
|
|
src = open(argv[1], O_RDONLY);
|
|
if(src == -1) {
|
|
free(path);
|
|
perror("open(src)");
|
|
}
|
|
|
|
dst = open(path, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
|
|
if (dst == -1) {
|
|
|
|
if(errno == EISDIR) {
|
|
t = strrchr(argv[1], '/');
|
|
if (t != NULL) {
|
|
t++;
|
|
} else {
|
|
t = argv[1];
|
|
}
|
|
|
|
p = malloc(strlen(path) + strlen(t) + 2);
|
|
sprintf(p, "%s/%s", path, t);
|
|
free(path);
|
|
path = p;
|
|
|
|
dst = open(path, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
|
|
if ( dst == -1 ) {
|
|
close(src);
|
|
free(path);
|
|
perror("open(dst)");
|
|
}
|
|
|
|
} else {
|
|
close(src);
|
|
free(path);
|
|
perror("open(dst)");
|
|
}
|
|
}
|
|
|
|
stat(argv[1], &s);
|
|
|
|
while(1)
|
|
{
|
|
len = read(src, buff, sizeof(buff));
|
|
if (len == -1) break;
|
|
if (len == 0) break;
|
|
|
|
write(dst, buff, len);
|
|
if (len < sizeof(buff)) break;
|
|
}
|
|
close(src);
|
|
close(dst);
|
|
|
|
chmod(path, s.st_mode);
|
|
free(path);
|
|
}
|