1 #ifndef LINT 2 static char *sccsid = "@(#)touch.c 4.2 (Berkeley) 82/06/09"; 3 #endif not LINT 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/stat.h> 15 16 int dontcreate; /* set if -c option */ 17 int force; /* set if -f option */ 18 19 char *whoami = "touch"; 20 21 main(argc,argv) 22 int argc; 23 char **argv; 24 { 25 char *argp; 26 27 dontcreate = 0; 28 force = 0; 29 for (argv++; **argv == '-'; argv++) { 30 for (argp = &(*argv)[1]; *argp; argp++) { 31 switch (*argp) { 32 case 'c': 33 dontcreate = 1; 34 break; 35 case 'f': 36 force = 1; 37 break; 38 default: 39 fprintf(stderr, "%s: bad option -%c\n", 40 whoami, *argp); 41 exit(1); 42 } 43 } 44 } 45 for (/*void*/; *argv; argv++) { 46 touch(*argv); 47 } 48 } 49 50 touch(filename) 51 char *filename; 52 { 53 struct stat statbuffer; 54 55 if (stat(filename,&statbuffer) == -1) { 56 if (!dontcreate) { 57 readwrite(filename,0); 58 } else { 59 fprintf(stderr, "%s: %s: does not exist\n", 60 whoami, filename); 61 } 62 return; 63 } 64 if ((statbuffer.st_mode & S_IFMT) != S_IFREG) { 65 fprintf(stderr, "%s: %s: can only touch regular files\n", 66 whoami, filename); 67 return; 68 } 69 if (!access(filename,4|2)) { 70 readwrite(filename,statbuffer.st_size); 71 return; 72 } 73 if (force) { 74 if (chmod(filename,0666)) { 75 fprintf(stderr, "%s: %s: couldn't chmod: ", 76 whoami, filename); 77 perror(""); 78 return; 79 } 80 readwrite(filename,statbuffer.st_size); 81 if (chmod(filename,statbuffer.st_mode)) { 82 fprintf(stderr, "%s: %s: couldn't chmod back: ", 83 whoami, filename); 84 perror(""); 85 return; 86 } 87 } else { 88 fprintf(stderr, "%s: %s: cannot touch\n", whoami, filename); 89 } 90 } 91 92 readwrite(filename,size) 93 char *filename; 94 int size; 95 { 96 int filedescriptor; 97 char first; 98 99 if (size) { 100 filedescriptor = open(filename,2); 101 if (filedescriptor == -1) { 102 error: 103 fprintf(stderr, "%s: %s: ", whoami, filename); 104 perror(""); 105 return; 106 } 107 if (read(filedescriptor, &first, 1) != 1) { 108 goto error; 109 } 110 if (lseek(filedescriptor,0l,0) == -1) { 111 goto error; 112 } 113 if (write(filedescriptor, &first, 1) != 1) { 114 goto error; 115 } 116 } else { 117 filedescriptor = creat(filename,0666); 118 if (filedescriptor == -1) { 119 goto error; 120 } 121 } 122 if (close(filedescriptor) == -1) { 123 goto error; 124 } 125 } 126