Initial revision 6759
[qball-mpd.git] / src / .svn / text-base / utils.c.svn-base
blobea7edb4c597427a2238e7de195712a226c7581e8
1 /* the Music Player Daemon (MPD)
2  * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
3  * This project's homepage is: http://www.musicpd.org
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
19 #include "utils.h"
20 #include "log.h"
21 #include "conf.h"
23 #include <stdlib.h>
24 #include <string.h>
25 #include <ctype.h>
26 #include <sys/types.h>
27 #include <sys/socket.h>
28 #include <sys/select.h>
29 #include <sys/time.h>
30 #include <unistd.h>
31 #include <assert.h>
32 #include <pwd.h>
34 char *myFgets(char *buffer, int bufferSize, FILE * fp)
36         char *ret = fgets(buffer, bufferSize, fp);
37         if (ret && strlen(buffer) > 0 && buffer[strlen(buffer) - 1] == '\n') {
38                 buffer[strlen(buffer) - 1] = '\0';
39         }
40         if (ret && strlen(buffer) > 0 && buffer[strlen(buffer) - 1] == '\r') {
41                 buffer[strlen(buffer) - 1] = '\0';
42         }
43         return ret;
46 char *strDupToUpper(char *str)
48         char *ret = xstrdup(str);
49         int i;
51         for (i = 0; i < strlen(str); i++)
52                 ret[i] = toupper((int)ret[i]);
54         return ret;
57 void stripReturnChar(char *string)
59         while (string && (string = strchr(string, '\n'))) {
60                 *string = ' ';
61         }
64 void my_usleep(long usec)
66         struct timeval tv;
68         tv.tv_sec = 0;
69         tv.tv_usec = usec;
71         select(0, NULL, NULL, NULL, &tv);
74 int ipv6Supported(void)
76 #ifdef HAVE_IPV6
77         int s;
78         s = socket(AF_INET6, SOCK_STREAM, 0);
79         if (s == -1)
80                 return 0;
81         close(s);
82         return 1;
83 #endif
84         return 0;
87 char *appendToString(char *dest, const char *src)
89         int destlen;
90         int srclen = strlen(src);
92         if (dest == NULL) {
93                 dest = xmalloc(srclen + 1);
94                 memset(dest, 0, srclen + 1);
95                 destlen = 0;
96         } else {
97                 destlen = strlen(dest);
98                 dest = xrealloc(dest, destlen + srclen + 1);
99         }
101         memcpy(dest + destlen, src, srclen);
102         dest[destlen + srclen] = '\0';
104         return dest;
107 unsigned long readLEuint32(const unsigned char *p)
109         return ((unsigned long)p[0] << 0) |
110             ((unsigned long)p[1] << 8) |
111             ((unsigned long)p[2] << 16) | ((unsigned long)p[3] << 24);
114 mpd_malloc char *xstrdup(const char *s)
116         char *ret = strdup(s);
117         if (mpd_unlikely(!ret))
118                 FATAL("OOM: strdup\n");
119         return ret;
122 /* borrowed from git :) */
124 mpd_malloc void *xmalloc(size_t size)
126         void *ret;
128         assert(mpd_likely(size));
130         ret = malloc(size);
131         if (mpd_unlikely(!ret))
132                 FATAL("OOM: malloc\n");
133         return ret;
136 mpd_malloc void *xrealloc(void *ptr, size_t size)
138         void *ret = realloc(ptr, size);
140         /* some C libraries return NULL when size == 0,
141          * make sure we get a free()-able pointer (free(NULL)
142          * doesn't work with all C libraries, either) */
143         if (mpd_unlikely(!ret && !size))
144                 ret = realloc(ptr, 1);
146         if (mpd_unlikely(!ret))
147                 FATAL("OOM: realloc\n");
148         return ret;
151 mpd_malloc void *xcalloc(size_t nmemb, size_t size)
153         void *ret;
155         assert(mpd_likely(nmemb && size));
157         ret = calloc(nmemb, size);
158         if (mpd_unlikely(!ret))
159                 FATAL("OOM: calloc\n");
160         return ret;
163 char *parsePath(char *path)
165         ConfigParam *param;
166         struct passwd *passwd;
167         char *newPath;
168         char *c;
169         int foundSlash = 0;
170         int pos = 1;
172         if (path[0] != '/' && path[0] != '~') {
173                 ERROR("\"%s\" is not an absolute path\n", path);
174                 return NULL;
175         } else if (path[0] == '~') {
176                 if (path[1] == '/' || path[1] == '\0') {
177                         param = getConfigParam(CONF_USER);
178                         if (param && param->value) {
179                                 passwd = getpwnam(param->value);
180                                 if (!passwd) {
181                                         ERROR("no such user %s\n",
182                                               param->value);
183                                         return NULL;
184                                 }
185                         } else {
186                                 passwd = getpwuid(geteuid());
187                                 if (!passwd) {
188                                         ERROR("problems getting passwd entry "
189                                               "for current user\n");
190                                         return NULL;
191                                 }
192                         }
193                 } else {
194                         for (c = path + 1; *c != '\0' && *c != '/'; c++);
195                         if (*c == '/') {
196                                 foundSlash = 1;
197                                 *c = '\0';
198                         }
199                         pos = c - path;
201                         passwd = getpwnam(path + 1);
202                         if (!passwd) {
203                                 ERROR("user \"%s\" not found\n", path + 1);
204                                 return NULL;
205                         }
207                         if (foundSlash)
208                                 *c = '/';
209                 }
211                 newPath = xmalloc(strlen(passwd->pw_dir) + strlen(path + pos) + 1);
212                 strcpy(newPath, passwd->pw_dir);
213                 strcat(newPath, path + pos);
214         } else {
215                 newPath = xstrdup(path);
216         }
218         return newPath;