|
Packit |
c32a2d |
/*
|
|
Packit |
c32a2d |
sysutil: generic utilities to interact with the OS (signals, paths)
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
copyright ?-2014 by the mpg123 project - free software under the terms of the LGPL 2.1
|
|
Packit |
c32a2d |
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
|
Packit |
c32a2d |
initially written by Michael Hipp (dissected/renamed by Thomas Orgis)
|
|
Packit |
c32a2d |
*/
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#include "mpg123app.h"
|
|
Packit |
c32a2d |
#include <sys/stat.h>
|
|
Packit |
c32a2d |
#include "sysutil.h"
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#include "debug.h"
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#if 0
|
|
Packit |
c32a2d |
/* removed the strndup for better portability */
|
|
Packit |
c32a2d |
/*
|
|
Packit |
c32a2d |
* Allocate space for a new string containing the first
|
|
Packit |
c32a2d |
* "num" characters of "src". The resulting string is
|
|
Packit |
c32a2d |
* always zero-terminated. Returns NULL if malloc fails.
|
|
Packit |
c32a2d |
*/
|
|
Packit |
c32a2d |
char *strndup (const char *src, int num)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
char *dst;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (!(dst = (char *) malloc(num+1)))
|
|
Packit |
c32a2d |
return (NULL);
|
|
Packit |
c32a2d |
dst[num] = '\0';
|
|
Packit |
c32a2d |
return (strncpy(dst, src, num));
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
#endif
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
size_t dir_length(const char *path)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
char * slashpos = strrchr(path, '/');
|
|
Packit |
c32a2d |
return (slashpos ? slashpos-path : 0);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
/*
|
|
Packit |
c32a2d |
* Split "path" into directory and filename components.
|
|
Packit |
c32a2d |
*
|
|
Packit |
c32a2d |
* Return value is 0 if no directory was specified (i.e.
|
|
Packit |
c32a2d |
* "path" does not contain a '/'), OR if the directory
|
|
Packit |
c32a2d |
* is the same as on the previous call to this function.
|
|
Packit |
c32a2d |
*
|
|
Packit |
c32a2d |
* Return value is 1 if a directory was specified AND it
|
|
Packit |
c32a2d |
* is different from the previous one (if any).
|
|
Packit |
c32a2d |
*/
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
int split_dir_file (const char *path, char **dname, char **fname)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
static char *lastdir = NULL;
|
|
Packit |
c32a2d |
char *slashpos;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if ((slashpos = strrchr(path, '/'))) {
|
|
Packit |
c32a2d |
*fname = slashpos + 1;
|
|
Packit |
c32a2d |
*dname = compat_strdup(path); /* , 1 + slashpos - path); */
|
|
Packit |
c32a2d |
if(!(*dname)) {
|
|
Packit |
c32a2d |
perror("failed to allocate memory for dir name");
|
|
Packit |
c32a2d |
return 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
(*dname)[1 + slashpos - path] = 0;
|
|
Packit |
c32a2d |
if (lastdir && !strcmp(lastdir, *dname)) {
|
|
Packit |
c32a2d |
/*** same as previous directory ***/
|
|
Packit |
c32a2d |
free (*dname);
|
|
Packit |
c32a2d |
*dname = lastdir;
|
|
Packit |
c32a2d |
return 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else {
|
|
Packit |
c32a2d |
/*** different directory ***/
|
|
Packit |
c32a2d |
if (lastdir)
|
|
Packit |
c32a2d |
free (lastdir);
|
|
Packit |
c32a2d |
lastdir = *dname;
|
|
Packit |
c32a2d |
return 1;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else {
|
|
Packit |
c32a2d |
/*** no directory specified ***/
|
|
Packit |
c32a2d |
if (lastdir) {
|
|
Packit |
c32a2d |
free (lastdir);
|
|
Packit |
c32a2d |
lastdir = NULL;
|
|
Packit |
c32a2d |
};
|
|
Packit |
c32a2d |
*dname = NULL;
|
|
Packit |
c32a2d |
*fname = (char *)path;
|
|
Packit |
c32a2d |
return 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|