touch.c

00001 /* Copyright (c) 2008, Tim Post <tinkertim@gmail.com>
00002  * All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *
00007  * Redistributions of source code must retain the above copyright notice, this
00008  * list of conditions and the following disclaimer.
00009  *
00010  * Redistributions in binary form must reproduce the above copyright notice,
00011  * this list of conditions and the following disclaimer in the documentation
00012  * and/or other materials provided with the distribution.
00013  *
00014  * Neither the name of the original program's authors nor the names of its
00015  * contributors may be used to endorse or promote products derived from this
00016  * software without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00022  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028  * POSSIBILITY OF SUCH DAMAGE.
00029  */
00030 
00031 /* TODO: Options that people would expect, such as not creating the file if
00032  * it doesn't exist, specifying the access time, etc */
00033 
00034 #include <stdio.h>
00035 #include <stdlib.h>
00036 #include <unistd.h>
00037 #include <fcntl.h>
00038 #include <dirent.h>
00039 #include <sys/types.h>
00040 #include <str.h>
00041 
00042 #include "config.h"
00043 #include "errors.h"
00044 #include "util.h"
00045 #include "entry.h"
00046 #include "touch.h"
00047 #include "cmds.h"
00048 
00049 static const char *cmdname = "touch";
00050 
00051 /* Dispays help for touch in various levels */
00052 void help_cmd_touch(unsigned int level)
00053 {
00054         if (level == HELP_SHORT) {
00055                 printf("`%s' updates access times for files\n", cmdname);
00056         } else {
00057                 help_cmd_touch(HELP_SHORT);
00058                 printf("  `%s' <file>, if the file does not exist it will be "
00059                                 "created\n", cmdname);
00060         }
00061 
00062         return;
00063 }
00064 
00065 /* Main entry point for touch, accepts an array of arguments */
00066 int cmd_touch(char **argv)
00067 {
00068         unsigned int argc, i = 0, ret = 0;
00069         int fd;
00070         char *buff = NULL;
00071 
00072         DIR *dirp;
00073 
00074         argc = cli_count_args(argv);
00075 
00076         if (argc == 1) {
00077                 printf("%s - incorrect number of arguments. Try `help %s extended'\n",
00078                         cmdname, cmdname);
00079                 return CMD_FAILURE;
00080         }
00081 
00082         for (i = 1; i < argc; i ++) {
00083                 buff = str_dup(argv[i]);
00084                 dirp = opendir(buff);
00085                 if (dirp) {
00086                         cli_error(CL_ENOTSUP, "%s is a directory", buff);
00087                         closedir(dirp);
00088                         ret ++;
00089                         continue;
00090                 }
00091 
00092                 fd = open(buff, O_RDWR | O_CREAT);
00093                 if (fd < 0) {
00094                         cli_error(CL_EFAIL, "Could not update / create %s ", buff);
00095                         ret ++;
00096                         continue;
00097                 } else
00098                         close(fd);
00099 
00100                 free(buff);
00101         }
00102 
00103         if (ret)
00104                 return CMD_FAILURE;
00105         else
00106                 return CMD_SUCCESS;
00107 }
00108 

Generated on Thu Jun 2 07:45:41 2011 for HelenOS/USB by  doxygen 1.4.7