|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)touch.c 4.6 (Berkeley) 9/14/87"; ! 3: #endif ! 4: ! 5: /* ! 6: * attempt to set the modify date of a file to the current date. ! 7: * if the file exists, read and write its first character. ! 8: * if the file doesn't exist, create it, unless -c option prevents it. ! 9: * if the file is read-only, -f forces chmod'ing and touch'ing. ! 10: */ ! 11: ! 12: #include <stdio.h> ! 13: #include <sys/types.h> ! 14: #include <sys/file.h> ! 15: #include <sys/stat.h> ! 16: ! 17: int dontcreate; /* set if -c option */ ! 18: int force; /* set if -f option */ ! 19: ! 20: main(argc, argv) ! 21: int argc; ! 22: char **argv; ! 23: { ! 24: extern int optind; ! 25: int ch, retval; ! 26: ! 27: dontcreate = force = retval = 0; ! 28: while ((ch = getopt(argc, argv, "cf")) != EOF) ! 29: switch((char)ch) { ! 30: case 'c': ! 31: dontcreate = 1; ! 32: break; ! 33: case 'f': ! 34: force = 1; ! 35: break; ! 36: case '?': ! 37: default: ! 38: usage(); ! 39: } ! 40: if (!*(argv += optind)) ! 41: usage(); ! 42: do { ! 43: retval |= touch(*argv); ! 44: } while (*++argv); ! 45: exit(retval); ! 46: } ! 47: ! 48: touch(filename) ! 49: char *filename; ! 50: { ! 51: struct stat statbuffer; ! 52: ! 53: if (stat(filename, &statbuffer) == -1) { ! 54: if (!dontcreate) ! 55: return(readwrite(filename, 0L)); ! 56: fprintf(stderr, "touch: %s: does not exist\n", filename); ! 57: return(1); ! 58: } ! 59: if ((statbuffer.st_mode & S_IFMT) != S_IFREG) { ! 60: fprintf(stderr, "touch: %s: can only touch regular files\n", ! 61: filename); ! 62: return(1); ! 63: } ! 64: if (!access(filename, R_OK | W_OK)) ! 65: return(readwrite(filename,statbuffer.st_size)); ! 66: if (force) { ! 67: int retval; ! 68: ! 69: if (chmod(filename,0666)) { ! 70: fprintf(stderr, "touch: %s: couldn't chmod: ", filename); ! 71: perror((char *)NULL); ! 72: return(1); ! 73: } ! 74: retval = readwrite(filename,statbuffer.st_size); ! 75: if (chmod(filename,statbuffer.st_mode)) { ! 76: fprintf(stderr, "touch: %s: couldn't chmod back: ", ! 77: filename); ! 78: perror((char *)NULL); ! 79: return(1); ! 80: } ! 81: return(retval); ! 82: } ! 83: fprintf(stderr, "touch: %s: cannot touch\n", filename); ! 84: return(1); ! 85: } ! 86: ! 87: readwrite(filename, size) ! 88: char *filename; ! 89: off_t size; ! 90: { ! 91: int filedescriptor; ! 92: char first; ! 93: off_t lseek(); ! 94: ! 95: if (size) { ! 96: filedescriptor = open(filename, O_RDWR, 0); ! 97: if (filedescriptor == -1) { ! 98: error: fprintf(stderr, "touch: %s: ", filename); ! 99: perror((char *)NULL); ! 100: return(1); ! 101: } ! 102: if (read(filedescriptor, &first, 1) != 1) ! 103: goto error; ! 104: if (lseek(filedescriptor, 0L, 0) == -1) ! 105: goto error; ! 106: if (write(filedescriptor, &first, 1) != 1) ! 107: goto error; ! 108: } else { ! 109: filedescriptor = creat(filename, 0666); ! 110: if (filedescriptor == -1) ! 111: goto error; ! 112: } ! 113: if (close(filedescriptor) == -1) ! 114: goto error; ! 115: return(0); ! 116: } ! 117: ! 118: usage() ! 119: { ! 120: fputs("usage: touch [-cf] file ...\n", stderr); ! 121: exit(1); ! 122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.