[libmultipath] Remove libsysfs
[multipath-tools/.git] / libmultipath / util.c
1 #include <string.h>
2 #include <ctype.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <unistd.h>
6
7 #include "debug.h"
8 #include "memory.h"
9
10 #define PARAMS_SIZE 255
11
12 int
13 strcmp_chomp(char *str1, char *str2)
14 {
15         int i;
16         char s1[PARAMS_SIZE],s2[PARAMS_SIZE];
17  
18         if(!str1 || !str2)
19                 return 1;
20
21         strncpy(s1, str1, PARAMS_SIZE);
22         strncpy(s2, str2, PARAMS_SIZE);
23
24         for (i=strlen(s1)-1; i >=0 && isspace(s1[i]); --i) ;
25         s1[++i] = '\0';
26         for (i=strlen(s2)-1; i >=0 && isspace(s2[i]); --i) ;
27         s2[++i] = '\0';
28
29         return(strcmp(s1,s2));
30 }
31
32 void
33 strchop(char *str)
34 {
35         int i;
36
37         for (i=strlen(str)-1; i >=0 && isspace(str[i]); --i) ;
38         str[++i] = '\0';
39 }
40
41 void
42 basename (char * str1, char * str2)
43 {
44         char *p = str1 + (strlen(str1) - 1);
45
46         while (*--p != '/' && p != str1)
47                 continue;
48
49         if (p != str1)
50                 p++;
51
52         strcpy(str2, p);
53 }
54
55 int
56 filepresent (char * run) {
57         struct stat buf;
58
59         if(!stat(run, &buf))
60                 return 1;
61         return 0;
62 }
63
64 int
65 get_word (char * sentence, char ** word)
66 {
67         char * p;
68         int len;
69         int skip = 0;
70         
71         if (word)
72                 *word = NULL;
73
74         while (*sentence ==  ' ') {
75                 sentence++;
76                 skip++;
77         }
78         if (*sentence == '\0')
79                 return 0;
80
81         p = sentence;
82
83         while (*p !=  ' ' && *p != '\0')
84                 p++;
85
86         len = (int) (p - sentence);
87
88         if (!word)
89                 return skip + len;
90
91         *word = MALLOC(len + 1);
92
93         if (!*word) {
94                 condlog(0, "get_word : oom\n");
95                 return 0;
96         }
97         strncpy(*word, sentence, len);
98         condlog(4, "*word = %s, len = %i", *word, len);
99
100         if (*p == '\0')
101                 return 0;
102
103         return skip + len;
104 }
105
106 size_t strlcpy(char *dst, const char *src, size_t size)
107 {
108         size_t bytes = 0;
109         char *q = dst;
110         const char *p = src;
111         char ch;
112
113         while ((ch = *p++)) {
114                 if (bytes+1 < size)
115                         *q++ = ch;
116                 bytes++;
117         }
118
119         /* If size == 0 there is no space for a final null... */
120         if (size)
121                 *q = '\0';
122         return bytes;
123 }
124
125 size_t strlcat(char *dst, const char *src, size_t size)
126 {
127         size_t bytes = 0;
128         char *q = dst;
129         const char *p = src;
130         char ch;
131
132         while (bytes < size && *q) {
133                 q++;
134                 bytes++;
135         }
136         if (bytes == size)
137                 return (bytes + strlen(src));
138
139         while ((ch = *p++)) {
140                 if (bytes+1 < size)
141                 *q++ = ch;
142                 bytes++;
143         }
144
145         *q = '\0';
146         return bytes;
147 }
148
149 void remove_trailing_chars(char *path, char c)
150 {
151         size_t len;
152
153         len = strlen(path);
154         while (len > 0 && path[len-1] == c)
155                 path[--len] = '\0';
156 }
157