From 34ba1ef91d9da733c4c28dec6724746a8a3a365d Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Wed, 10 Jan 1979 15:01:22 -0500 Subject: [PATCH] Research V7 development Work on file usr/src/cmd/cat.c Work on file usr/src/cmd/chgrp.c Work on file usr/src/cmd/chmod.c Work on file usr/src/cmd/chown.c Work on file usr/src/cmd/clri.c Co-Authored-By: Dennis Ritchie Synthesized-from: v7 --- usr/src/cmd/cat.c | 63 ++++++++++++++++ usr/src/cmd/chgrp.c | 53 +++++++++++++ usr/src/cmd/chmod.c | 177 ++++++++++++++++++++++++++++++++++++++++++++ usr/src/cmd/chown.c | 55 ++++++++++++++ usr/src/cmd/clri.c | 79 ++++++++++++++++++++ 5 files changed, 427 insertions(+) create mode 100644 usr/src/cmd/cat.c create mode 100644 usr/src/cmd/chgrp.c create mode 100644 usr/src/cmd/chmod.c create mode 100644 usr/src/cmd/chown.c create mode 100644 usr/src/cmd/clri.c diff --git a/usr/src/cmd/cat.c b/usr/src/cmd/cat.c new file mode 100644 index 0000000000..e0f4ef6263 --- /dev/null +++ b/usr/src/cmd/cat.c @@ -0,0 +1,63 @@ +/* + * Concatenate files. + */ + +#include +#include +#include + +char stdbuf[BUFSIZ]; + +main(argc, argv) +char **argv; +{ + int fflg = 0; + register FILE *fi; + register c; + int dev, ino = -1; + struct stat statb; + + setbuf(stdout, stdbuf); + for( ; argc>1 && argv[1][0]=='-'; argc--,argv++) { + switch(argv[1][1]) { + case 0: + break; + case 'u': + setbuf(stdout, (char *)NULL); + continue; + } + break; + } + fstat(fileno(stdout), &statb); + statb.st_mode &= S_IFMT; + if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) { + dev = statb.st_dev; + ino = statb.st_ino; + } + if (argc < 2) { + argc = 2; + fflg++; + } + while (--argc > 0) { + if (fflg || (*++argv)[0]=='-' && (*argv)[1]=='\0') + fi = stdin; + else { + if ((fi = fopen(*argv, "r")) == NULL) { + fprintf(stderr, "cat: can't open %s\n", *argv); + continue; + } + } + fstat(fileno(fi), &statb); + if (statb.st_dev==dev && statb.st_ino==ino) { + fprintf(stderr, "cat: input %s is output\n", + fflg?"-": *argv); + fclose(fi); + continue; + } + while ((c = getc(fi)) != EOF) + putchar(c); + if (fi!=stdin) + fclose(fi); + } + return(0); +} diff --git a/usr/src/cmd/chgrp.c b/usr/src/cmd/chgrp.c new file mode 100644 index 0000000000..13b23ff6ef --- /dev/null +++ b/usr/src/cmd/chgrp.c @@ -0,0 +1,53 @@ +/* + * chgrp gid file ... + */ + +#include +#include +#include +#include +#include + +struct group *gr,*getgrnam(); +struct stat stbuf; +int gid; +int status; + +main(argc, argv) +char *argv[]; +{ + register c; + + if(argc < 3) { + printf("usage: chgrp gid file ...\n"); + exit(4); + } + if(isnumber(argv[1])) { + gid = atoi(argv[1]); + } else { + if((gr=getgrnam(argv[1])) == NULL) { + printf("unknown group: %s\n",argv[1]); + exit(4); + } + gid = gr->gr_gid; + } + for(c=2; c +#include +#include + +#define USER 05700 /* user's bits */ +#define GROUP 02070 /* group's bits */ +#define OTHER 00007 /* other's bits */ +#define ALL 01777 /* all (note absence of setuid, etc) */ + +#define READ 00444 /* read permit */ +#define WRITE 00222 /* write permit */ +#define EXEC 00111 /* exec permit */ +#define SETID 06000 /* set[ug]id */ +#define STICKY 01000 /* sticky bit */ + +char *ms; +int um; +struct stat st; + +main(argc,argv) +char **argv; +{ + register i; + register char *p; + int status = 0; + + if (argc < 3) { + fprintf(stderr, "Usage: chmod [ugoa][+-=][rwxstugo] file ...\n"); + exit(255); + } + ms = argv[1]; + um = umask(0); + newmode(0); + for (i = 2; i < argc; i++) { + p = argv[i]; + if (stat(p, &st) < 0) { + fprintf(stderr, "chmod: can't access %s\n", p); + ++status; + continue; + } + ms = argv[1]; + if (chmod(p, newmode(st.st_mode)) < 0) { + fprintf(stderr, "chmod: can't change %s\n", p); + ++status; + continue; + } + } + exit(status); +} + +newmode(nm) +unsigned nm; +{ + register o, m, b; + + m = abs(); + if (!*ms) + return(m); + do { + m = who(); + while (o = what()) { + b = where(nm); + switch (o) { + case '+': + nm |= b & m; + break; + case '-': + nm &= ~(b & m); + break; + case '=': + nm &= ~m; + nm |= b & m; + break; + } + } + } while (*ms++ == ','); + if (*--ms) { + fprintf(stderr, "chmod: invalid mode\n"); + exit(255); + } + return(nm); +} + +abs() +{ + register c, i; + + i = 0; + while ((c = *ms++) >= '0' && c <= '7') + i = (i << 3) + (c - '0'); + ms--; + return(i); +} + +who() +{ + register m; + + m = 0; + for (;;) switch (*ms++) { + case 'u': + m |= USER; + continue; + case 'g': + m |= GROUP; + continue; + case 'o': + m |= OTHER; + continue; + case 'a': + m |= ALL; + continue; + default: + ms--; + if (m == 0) + m = ALL & ~um; + return m; + } +} + +what() +{ + switch (*ms) { + case '+': + case '-': + case '=': + return *ms++; + } + return(0); +} + +where(om) +register om; +{ + register m; + + m = 0; + switch (*ms) { + case 'u': + m = (om & USER) >> 6; + goto dup; + case 'g': + m = (om & GROUP) >> 3; + goto dup; + case 'o': + m = (om & OTHER); + dup: + m &= (READ|WRITE|EXEC); + m |= (m << 3) | (m << 6); + ++ms; + return m; + } + for (;;) switch (*ms++) { + case 'r': + m |= READ; + continue; + case 'w': + m |= WRITE; + continue; + case 'x': + m |= EXEC; + continue; + case 's': + m |= SETID; + continue; + case 't': + m |= STICKY; + continue; + default: + ms--; + return m; + } +} diff --git a/usr/src/cmd/chown.c b/usr/src/cmd/chown.c new file mode 100644 index 0000000000..edfa00e69b --- /dev/null +++ b/usr/src/cmd/chown.c @@ -0,0 +1,55 @@ +/* + * chown uid file ... + */ + +#include +#include +#include +#include +#include + +struct passwd *pwd,*getpwnam(); +struct stat stbuf; +int uid; +int status; + +main(argc, argv) +char *argv[]; +{ + register c; + + if(argc < 3) { + printf("usage: chown uid file ...\n"); + exit(4); + } + if(isnumber(argv[1])) { + uid = atoi(argv[1]); + goto cho; + } + if((pwd=getpwnam(argv[1])) == NULL) { + printf("unknown user id: %s\n",argv[1]); + exit(4); + } + uid = pwd->pw_uid; + +cho: + for(c=2; c +#include +#define ISIZE (sizeof(struct dinode)) +#define BSIZE 512 +#define NI (BSIZE/ISIZE) +struct ino +{ + char junk[ISIZE]; +}; +struct ino buf[NI]; +int status; + +main(argc, argv) +char *argv[]; +{ + register i, f; + unsigned n; + int j, k; + long off; + + if(argc < 3) { + printf("usage: clri filsys inumber ...\n"); + exit(4); + } + f = open(argv[1], 2); + if(f < 0) { + printf("cannot open %s\n", argv[1]); + exit(4); + } + for(i=2; i '9') + return(0); + return(1); +} -- 2.20.1