Blame src/sysutil.c

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
}