|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1988 Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)touch.c 4.8 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: /* ! 31: * Attempt to set the modify date of a file to the current date. If the ! 32: * file exists, read and write its first character. If the file doesn't ! 33: * exist, create it, unless -c option prevents it. If the file is read-only, ! 34: * -f forces chmod'ing and touch'ing. ! 35: */ ! 36: #include <sys/types.h> ! 37: #include <sys/file.h> ! 38: #include <sys/stat.h> ! 39: #include <stdio.h> ! 40: ! 41: static int dontcreate; /* set if -c option */ ! 42: static int force; /* set if -f option */ ! 43: ! 44: main(argc, argv) ! 45: int argc; ! 46: char **argv; ! 47: { ! 48: extern int optind; ! 49: int ch, retval; ! 50: ! 51: dontcreate = force = retval = 0; ! 52: while ((ch = getopt(argc, argv, "cf")) != EOF) ! 53: switch((char)ch) { ! 54: case 'c': ! 55: dontcreate = 1; ! 56: break; ! 57: case 'f': ! 58: force = 1; ! 59: break; ! 60: case '?': ! 61: default: ! 62: usage(); ! 63: } ! 64: if (!*(argv += optind)) ! 65: usage(); ! 66: do { ! 67: retval |= touch(*argv); ! 68: } while (*++argv); ! 69: exit(retval); ! 70: } ! 71: ! 72: touch(filename) ! 73: char *filename; ! 74: { ! 75: struct stat statbuffer; ! 76: ! 77: if (stat(filename, &statbuffer) == -1) { ! 78: if (!dontcreate) ! 79: return(readwrite(filename, 0L)); ! 80: fprintf(stderr, "touch: %s: does not exist\n", filename); ! 81: return(1); ! 82: } ! 83: if ((statbuffer.st_mode & S_IFMT) != S_IFREG) { ! 84: fprintf(stderr, "touch: %s: can only touch regular files\n", ! 85: filename); ! 86: return(1); ! 87: } ! 88: if (!access(filename, R_OK | W_OK)) ! 89: return(readwrite(filename,statbuffer.st_size)); ! 90: if (force) { ! 91: int retval; ! 92: ! 93: if (chmod(filename, 0666)) { ! 94: fprintf(stderr, "touch: %s: couldn't chmod: ", ! 95: filename); ! 96: perror((char *)NULL); ! 97: return(1); ! 98: } ! 99: retval = readwrite(filename, statbuffer.st_size); ! 100: if (chmod(filename, statbuffer.st_mode)) { ! 101: fprintf(stderr, "touch: %s: couldn't chmod back: ", ! 102: filename); ! 103: perror((char *)NULL); ! 104: return(1); ! 105: } ! 106: return(retval); ! 107: } ! 108: fprintf(stderr, "touch: %s: cannot touch\n", filename); ! 109: return(1); ! 110: } ! 111: ! 112: readwrite(filename, size) ! 113: char *filename; ! 114: off_t size; ! 115: { ! 116: int filedescriptor; ! 117: char first; ! 118: off_t lseek(); ! 119: ! 120: if (size) { ! 121: filedescriptor = open(filename, O_RDWR, 0); ! 122: if (filedescriptor == -1) { ! 123: error: fprintf(stderr, "touch: %s: ", filename); ! 124: perror((char *)NULL); ! 125: return(1); ! 126: } ! 127: if (read(filedescriptor, &first, 1) != 1) ! 128: goto error; ! 129: if (lseek(filedescriptor, 0L, 0) == -1) ! 130: goto error; ! 131: if (write(filedescriptor, &first, 1) != 1) ! 132: goto error; ! 133: } else { ! 134: filedescriptor = creat(filename, 0666); ! 135: if (filedescriptor == -1) ! 136: goto error; ! 137: } ! 138: if (close(filedescriptor) == -1) ! 139: goto error; ! 140: return(0); ! 141: } ! 142: ! 143: usage() ! 144: { ! 145: fprintf(stderr, "usage: touch [-cf] file ...\n"); ! 146: exit(1); ! 147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.