aboutsummaryrefslogtreecommitdiffstats
path: root/src/ls.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ls.c')
-rw-r--r--src/ls.c286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/ls.c b/src/ls.c
new file mode 100644
index 000000000..4c974690b
--- /dev/null
+++ b/src/ls.c
@@ -0,0 +1,286 @@
+/* the Music Player Daemon (MPD)
+ * (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu)
+ * This project's homepage is: http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ls.h"
+#include "command.h"
+#include "playlist.h"
+#include "path.h"
+#include "myfprintf.h"
+#include "log.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+char * dupAndStripPlaylistSuffix(char * file) {
+ int size = strlen(file)-strlen(PLAYLIST_FILE_SUFFIX)-1;
+ char * ret = malloc(size+1);
+
+ strncpy(ret,file,size);
+ ret[size] = '\0';
+
+ return ret;
+}
+
+int lsPlaylists(FILE * fp, char * utf8path) {
+ DIR * dir;
+ struct stat st;
+ struct dirent * ent;
+ char * dup;
+ char s[MAXPATHLEN+1];
+ List * list = NULL;
+ ListNode * node = NULL;
+ char * path = strdup(utf8ToFsCharset(utf8path));
+ char * actualPath = rpp2app(path);
+ int actlen = strlen(actualPath)+1;
+ int maxlen = MAXPATHLEN-actlen;
+ int suflen = strlen(PLAYLIST_FILE_SUFFIX)+1;
+ int suff;
+
+ if(actlen>MAXPATHLEN-1 || (dir = opendir(actualPath))==NULL) {
+ free(path);
+ return 0;
+ }
+
+ s[MAXPATHLEN] = '\0';
+ strcpy(s,actualPath);
+ strcat(s,"/");
+
+ while((ent = readdir(dir))) {
+ dup = ent->d_name;
+ if(dup[0]!='.' &&
+ (suff=strlen(dup)-suflen)>0 &&
+ dup[suff]=='.' &&
+ strcmp(dup+suff+1,PLAYLIST_FILE_SUFFIX)==0)
+ {
+ strncpy(s+actlen,ent->d_name,maxlen);
+ if(stat(s,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ if(list==NULL) list = makeList(NULL);
+ dup = strdup(ent->d_name);
+ dup[suff] = '\0';
+ insertInList(list,
+ fsCharsetToUtf8(dup),NULL);
+ free(dup);
+ }
+ }
+ }
+ }
+
+ closedir(dir);
+ free(path);
+
+ if(list) {
+ sortList(list);
+
+ dup = malloc(strlen(utf8path)+2);
+ strcpy(dup,utf8path);
+ while(dup[strlen(dup)-1]=='/') dup[strlen(dup)-1] = '\0';
+ if(strlen(dup)) strcat(dup,"/");
+
+ node = list->firstNode;
+ while(node!=NULL) {
+ myfprintf(fp,"playlist: %s%s\n",dup,node->key);
+ node = node->nextNode;
+ }
+
+ freeList(list);
+ free(dup);
+ }
+
+ return 0;
+}
+
+time_t isMusic(char * utf8file) {
+ time_t ret = 0;
+
+#ifdef HAVE_OGG
+ if((ret = isOgg(utf8file))) return ret;
+#endif
+#ifdef HAVE_FLAC
+ if((ret = isFlac(utf8file))) return ret;
+#endif
+#ifdef HAVE_MAD
+ if((ret = isMp3(utf8file))) return ret;
+#endif
+#ifdef HAVE_AUDIOFILE
+ if((ret = isWave(utf8file))) return ret;
+#endif
+
+ return ret;
+}
+
+time_t isPlaylist(char * utf8file) {
+ struct stat st;
+ char * file = utf8ToFsCharset(utf8file);
+ char * actualFile = file;
+ char * temp = NULL;
+
+ if(actualFile[0]!='/') actualFile = rpp2app(file);
+
+ if(stat(actualFile,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ char * dup;
+ char * cLast;
+ char * cNext;
+ int ret = 0;
+ dup = strdup(file);
+ cNext = cLast = strtok(dup,".");
+ while((cNext = strtok(NULL,"."))) cLast = cNext;
+ if(cLast && 0==strcmp(cLast,PLAYLIST_FILE_SUFFIX)) {
+ ret = st.st_mtime;
+ }
+ free(dup);
+ if(temp) free(temp);
+ return ret;
+ }
+ }
+
+ if(temp) free(temp);
+ return 0;
+}
+
+time_t isWave(char * utf8file) {
+ struct stat st;
+ char * file = utf8ToFsCharset(utf8file);
+ char * actualFile = file;
+
+ if(actualFile[0]!='/') actualFile = rmp2amp(file);
+
+ if(stat(actualFile,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ char * dup;
+ char * cLast;
+ char * cNext;
+ time_t ret = 0;
+ dup = strdup(file);
+ cNext = cLast = strtok(dup,".");
+ while((cNext = strtok(NULL,"."))) cLast = cNext;
+ if(cLast && 0==strcasecmp(cLast,"wav")) {
+ ret = st.st_mtime;
+ }
+ free(dup);
+ return ret;
+ }
+ else return 0;
+ }
+
+ return 0;
+}
+
+time_t isFlac(char * utf8file) {
+ struct stat st;
+ char * file = utf8ToFsCharset(utf8file);
+ char * actualFile = file;
+
+ if(actualFile[0]!='/') actualFile = rmp2amp(file);
+
+ if(stat(actualFile,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ char * dup;
+ char * cLast;
+ char * cNext;
+ time_t ret = 0;
+ dup = strdup(file);
+ cNext = cLast = strtok(dup,".");
+ while((cNext = strtok(NULL,"."))) cLast = cNext;
+ if(cLast && 0==strcasecmp(cLast,"flac")) {
+ ret = st.st_mtime;
+ }
+ free(dup);
+ return ret;
+ }
+ else return 0;
+ }
+
+ return 0;
+}
+
+time_t isOgg(char * utf8file) {
+ struct stat st;
+ char * file = utf8ToFsCharset(utf8file);
+ char * actualFile = file;
+
+ if(actualFile[0]!='/') actualFile = rmp2amp(file);
+
+ if(stat(actualFile,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ char * dup;
+ char * cLast;
+ char * cNext;
+ time_t ret = 0;
+ dup = strdup(file);
+ cNext = cLast = strtok(dup,".");
+ while((cNext = strtok(NULL,"."))) cLast = cNext;
+ if(cLast && 0==strcasecmp(cLast,"ogg")) {
+ ret = st.st_mtime;
+ }
+ free(dup);
+ return ret;
+ }
+ else return 0;
+ }
+
+ return 0;
+}
+
+time_t isMp3(char * utf8file) {
+ struct stat st;
+ char * file = utf8ToFsCharset(utf8file);
+ char * actualFile = file;
+
+ if(actualFile[0]!='/') actualFile = rmp2amp(file);
+
+ if(stat(actualFile,&st)==0) {
+ if(S_ISREG(st.st_mode)) {
+ char * dup;
+ char * cLast;
+ char * cNext;
+ time_t ret = 0;
+ dup = strdup(file);
+ cNext = cLast = strtok(dup,".");
+ while((cNext = strtok(NULL,"."))) cLast = cNext;
+ if(cLast && 0==strcasecmp(cLast,"mp3")) {
+ ret = st.st_mtime;
+ }
+ free(dup);
+ return ret;
+ }
+ else return 0;
+ }
+
+ return 0;
+}
+
+time_t isDir(char * utf8name) {
+ struct stat st;
+
+ if(stat(rmp2amp(utf8ToFsCharset(utf8name)),&st)==0) {
+ if(S_ISDIR(st.st_mode)) return st.st_mtime;
+ }
+ else {
+ DEBUG("isDir: unable to stat: %s (%s)\n",utf8name,
+ rmp2amp(utf8ToFsCharset(utf8name)));
+ }
+
+ return 0;
+}