verify_file_perms_ownership() to just return if the file doesn't exist
[fwknop.git] / client / utils.c
1 /*
2  *****************************************************************************
3  *
4  * File:    utils.c
5  *
6  * Author:  Damien S. Stuart
7  *
8  * Purpose: General/Generic functions for the fwknop client.
9  *
10  * Copyright 2009-2010 Damien Stuart (dstuart@dstuart.org)
11  *
12  *  License (GNU Public License):
13  *
14  *  This program is free software; you can redistribute it and/or
15  *  modify it under the terms of the GNU General Public License
16  *  as published by the Free Software Foundation; either version 2
17  *  of the License, or (at your option) any later version.
18  *
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
27  *  USA
28  *
29  *****************************************************************************
30 */
31 #include "fwknop_common.h"
32 #include "utils.h"
33
34 /* Generic hex dump function.
35 */
36 void
37 hex_dump(const unsigned char *data, const int size)
38 {
39     int ln, i, j = 0;
40     char ascii_str[17] = {0};
41
42     for(i=0; i<size; i++)
43     {
44         if((i % 16) == 0)
45         {
46             printf(" %s\n  0x%.4x:  ", ascii_str, i);
47             memset(ascii_str, 0x0, 17);
48             j = 0;
49         }
50
51         printf("%.2x ", data[i]);
52
53         ascii_str[j++] = (data[i] < 0x20 || data[i] > 0x7e) ? '.' : data[i];
54
55         if(j == 8)
56             printf(" ");
57     }
58
59     /* Remainder...
60     */
61     ln = strlen(ascii_str);
62     if(ln > 0)
63     {
64         for(i=0; i < 16-ln; i++)
65             printf("   ");
66
67         printf(" %s\n\n", ascii_str);
68     }
69 }
70
71 int
72 set_file_perms(const char *file)
73 {
74     int res = 0;
75
76     res = chmod(file, S_IRUSR | S_IWUSR);
77
78     if(res != 0)
79     {
80         fprintf(stderr,
81             "[-] unable to chmod file %s to user read/write (0600, -rw-------): %s\n",
82             file,
83             strerror(errno)
84         );
85     }
86     return res;
87 }
88
89 int
90 verify_file_perms_ownership(const char *file)
91 {
92     int res = 1;
93 #if HAVE_STAT
94     struct stat st;
95
96     /* Every file that the fwknop client deals with should be owned
97      * by the user and permissions set to 600 (user read/write)
98     */
99     if((stat(file, &st)) != 0)
100     {
101         /* if the path doesn't exist, just return, but otherwise something
102          * went wrong
103         */
104         if(errno == ENOENT)
105         {
106             return 0;
107         } else {
108             fprintf(stderr, "[-] stat() against file: %s returned: %s\n",
109                 file, strerror(errno));
110             exit(EXIT_FAILURE);
111         }
112     }
113
114     /* Make sure it is a regular file or symbolic link
115     */
116     if(S_ISREG(st.st_mode) != 1 && S_ISLNK(st.st_mode) != 1)
117     {
118         fprintf(stderr,
119             "[-] file: %s is not a regular file or symbolic link.\n",
120             file
121         );
122         res = 0;
123     }
124
125     if((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR))
126     {
127         fprintf(stderr,
128             "[-] file: %s permissions should only be user read/write (0600, -rw-------)\n",
129             file
130         );
131         res = 0;
132     }
133
134     if(st.st_uid != getuid())
135     {
136         fprintf(stderr, "[-] file: %s not owned by current effective user id.\n",
137             file);
138         res = 0;
139     }
140 #endif
141
142     return res;
143 }
144
145 /***EOF***/