get MAX_PORT_STR_LEN constant from fko_message.h
[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 #if HAVE_STAT
93     struct stat st;
94
95     /* Every file that the fwknop client deals with should be owned
96      * by the user and permissions set to 600 (user read/write)
97     */
98     if((stat(file, &st)) != 0)
99     {
100         fprintf(stderr, "[-] unable to run stat() against file: %s: %s\n",
101             file, strerror(errno));
102         exit(EXIT_FAILURE);
103     }
104
105     /* Make sure it is a regular file or symbolic link
106     */
107     if(S_ISREG(st.st_mode) != 1 && S_ISLNK(st.st_mode) != 1)
108     {
109         fprintf(stderr,
110             "[-] file: %s is not a regular file or symbolic link.\n",
111             file
112         );
113         return 0;
114     }
115
116     if((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR))
117     {
118         fprintf(stderr,
119             "[-] file: %s permissions should only be user read/write (0600, -rw-------)\n",
120             file
121         );
122         return 0;
123     }
124
125     if(st.st_uid != getuid())
126     {
127         fprintf(stderr, "[-] file: %s not owned by current effective user id.\n",
128             file);
129         return 0;
130     }
131 #endif
132
133     return 1;
134 }
135
136 /***EOF***/