* Add support for other operating systems (kFreeBSD, FreeBSD, and OSX for now).
* Switch to autoconf from genconfig.sh.
This commit is contained in:
parent
715af3519b
commit
773e1f6566
375
INSTALL
375
INSTALL
@ -1,19 +1,376 @@
|
||||
MiniDLNA project.
|
||||
(c) 2009 Justin Maggard
|
||||
Parts (c) 2006-2008 Thomas Bernard
|
||||
Homepage : http://sourceforge.net/projects/minidlna/
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Prerequisites :
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Prerequisites
|
||||
==================
|
||||
|
||||
- libexif
|
||||
- libjpeg
|
||||
- libid3tag
|
||||
- libFLAC
|
||||
- libvorbis
|
||||
- sqlite3
|
||||
- libsqlite3
|
||||
- libavformat (the ffmpeg libraries)
|
||||
- libuuid
|
||||
|
||||
To Build and install :
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
- Just run make, and hope it works. :)
|
||||
|
135
Makefile
135
Makefile
@ -1,135 +0,0 @@
|
||||
# $Id$
|
||||
# MiniDLNA project
|
||||
# http://sourceforge.net/projects/minidlna/
|
||||
# (c) 2008-2009 Justin Maggard
|
||||
# for use with GNU Make
|
||||
# To install use :
|
||||
# $ DESTDIR=/dummyinstalldir make install
|
||||
# or :
|
||||
# $ INSTALLPREFIX=/usr/local make install
|
||||
# or :
|
||||
# $ make install
|
||||
#
|
||||
#CFLAGS = -Wall -O -D_GNU_SOURCE -g -DDEBUG
|
||||
#CFLAGS = -Wall -g -Os -D_GNU_SOURCE
|
||||
CFLAGS = -Wall -g -O3 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 \
|
||||
-I/usr/include/ffmpeg \
|
||||
-I/usr/include/libavutil -I/usr/include/libavcodec -I/usr/include/libavformat \
|
||||
-I/usr/include/ffmpeg/libavutil -I/usr/include/ffmpeg/libavcodec -I/usr/include/ffmpeg/libavformat
|
||||
#STATIC_LINKING: CFLAGS += -DSTATIC
|
||||
#STATIC_LINKING: LDFLAGS = -static
|
||||
CC = gcc
|
||||
RM = rm -f
|
||||
INSTALL = install
|
||||
|
||||
INSTALLPREFIX ?= $(DESTDIR)/usr
|
||||
SBININSTALLDIR = $(INSTALLPREFIX)/sbin
|
||||
ETCINSTALLDIR = $(DESTDIR)/etc
|
||||
|
||||
BASEOBJS = minidlna.o upnphttp.o upnpdescgen.o upnpsoap.o \
|
||||
upnpreplyparse.o minixml.o \
|
||||
getifaddr.o daemonize.o upnpglobalvars.o \
|
||||
options.o minissdp.o uuid.o upnpevents.o \
|
||||
sql.o utils.o metadata.o scanner.o inotify.o \
|
||||
tivo_utils.o tivo_beacon.o tivo_commands.o \
|
||||
tagutils/textutils.o tagutils/misc.o tagutils/tagutils.o \
|
||||
playlist.o image_utils.o albumart.o log.o
|
||||
|
||||
ALLOBJS = $(BASEOBJS) $(LNXOBJS)
|
||||
|
||||
LIBS = -lpthread -lexif -ljpeg -lsqlite3 -lavformat -lavutil -lavcodec -lid3tag -lFLAC -logg -lvorbis
|
||||
#STATIC_LINKING: LIBS = -lvorbis -logg -lm -lsqlite3 -lpthread -lexif -ljpeg -lFLAC -lm -lid3tag -lz -lavformat -lavutil -lavcodec -lm
|
||||
|
||||
TESTUPNPDESCGENOBJS = testupnpdescgen.o upnpdescgen.o
|
||||
|
||||
EXECUTABLES = minidlna testupnpdescgen
|
||||
|
||||
.PHONY: all clean distclean install depend
|
||||
|
||||
all: $(EXECUTABLES)
|
||||
|
||||
clean:
|
||||
$(RM) $(ALLOBJS)
|
||||
$(RM) $(EXECUTABLES)
|
||||
$(RM) testupnpdescgen.o
|
||||
|
||||
distclean: clean
|
||||
$(RM) config.h
|
||||
|
||||
install: minidlna
|
||||
$(INSTALL) -d $(SBININSTALLDIR)
|
||||
$(INSTALL) minidlna $(SBININSTALLDIR)
|
||||
|
||||
install-conf:
|
||||
$(INSTALL) -d $(ETCINSTALLDIR)
|
||||
$(INSTALL) --mode=0644 minidlna.conf $(ETCINSTALLDIR)
|
||||
|
||||
minidlna: $(BASEOBJS) $(LNXOBJS) $(LIBS)
|
||||
@echo Linking $@
|
||||
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BASEOBJS) $(LNXOBJS) $(LIBS)
|
||||
|
||||
|
||||
testupnpdescgen: $(TESTUPNPDESCGENOBJS)
|
||||
@echo Linking $@
|
||||
@$(CC) $(CFLAGS) -o $@ $(TESTUPNPDESCGENOBJS)
|
||||
|
||||
config.h: genconfig.sh
|
||||
./genconfig.sh
|
||||
|
||||
depend: config.h
|
||||
makedepend -f$(MAKEFILE_LIST) -Y \
|
||||
$(ALLOBJS:.o=.c) $(TESTUPNPDESCGENOBJS:.o=.c) 2>/dev/null
|
||||
|
||||
# DO NOT DELETE
|
||||
|
||||
minidlna.o: config.h upnpglobalvars.h minidlnatypes.h
|
||||
minidlna.o: upnphttp.h upnpdescgen.h minidlnapath.h getifaddr.h upnpsoap.h
|
||||
minidlna.o: options.h minissdp.h daemonize.h upnpevents.h log.h
|
||||
upnphttp.o: config.h upnphttp.h upnpdescgen.h minidlnapath.h upnpsoap.h
|
||||
upnphttp.o: upnpevents.h image_utils.h sql.h log.h icons.c
|
||||
upnpdescgen.o: config.h upnpdescgen.h minidlnapath.h upnpglobalvars.h
|
||||
upnpdescgen.o: minidlnatypes.h upnpdescstrings.h log.h
|
||||
upnpsoap.o: config.h upnpglobalvars.h minidlnatypes.h log.h utils.h sql.h
|
||||
upnpsoap.o: upnphttp.h upnpsoap.h upnpreplyparse.h getifaddr.h log.h
|
||||
upnpreplyparse.o: upnpreplyparse.h minixml.h log.h
|
||||
minixml.o: minixml.h
|
||||
getifaddr.o: getifaddr.h log.h
|
||||
daemonize.o: daemonize.h config.h log.h
|
||||
upnpglobalvars.o: config.h upnpglobalvars.h
|
||||
upnpglobalvars.o: minidlnatypes.h
|
||||
options.o: options.h config.h upnpglobalvars.h
|
||||
options.o: minidlnatypes.h
|
||||
minissdp.o: config.h upnpdescstrings.h minidlnapath.h upnphttp.h
|
||||
minissdp.o: upnpglobalvars.h minidlnatypes.h minissdp.h log.h
|
||||
upnpevents.o: config.h upnpevents.h minidlnapath.h upnpglobalvars.h
|
||||
upnpevents.o: minidlnatypes.h upnpdescgen.h log.h uuid.h
|
||||
uuid.o: uuid.h
|
||||
testupnpdescgen.o: config.h upnpdescgen.h
|
||||
upnpdescgen.o: config.h upnpdescgen.h minidlnapath.h upnpglobalvars.h
|
||||
upnpdescgen.o: minidlnatypes.h upnpdescstrings.h
|
||||
scanner.o: upnpglobalvars.h metadata.h utils.h sql.h scanner.h log.h playlist.h
|
||||
metadata.o: upnpglobalvars.h metadata.h albumart.h utils.h sql.h log.h
|
||||
albumart.o: upnpglobalvars.h albumart.h utils.h image_utils.h sql.h log.h
|
||||
tagutils/misc.o: tagutils/misc.h
|
||||
tagutils/textutils.o: tagutils/misc.h tagutils/textutils.h log.h
|
||||
tagutils/tagutils.o: tagutils/tagutils-asf.c tagutils/tagutils-flc.c tagutils/tagutils-plist.c tagutils/tagutils-misc.c
|
||||
tagutils/tagutils.o: tagutils/tagutils-aac.c tagutils/tagutils-asf.h tagutils/tagutils-flc.h tagutils/tagutils-mp3.c tagutils/tagutils-wav.c
|
||||
tagutils/tagutils.o: tagutils/tagutils-ogg.c tagutils/tagutils-aac.h tagutils/tagutils.h tagutils/tagutils-mp3.h tagutils/tagutils-ogg.h log.h
|
||||
playlist.o: playlist.h
|
||||
inotify.o: inotify.h playlist.h
|
||||
image_utils.o: image_utils.h
|
||||
tivo_utils.o: config.h tivo_utils.h
|
||||
tivo_beacon.o: config.h tivo_beacon.h tivo_utils.h
|
||||
tivo_commands.o: config.h tivo_commands.h tivo_utils.h utils.h
|
||||
utils.o: utils.h
|
||||
sql.o: sql.h
|
||||
log.o: log.h
|
||||
|
||||
.SUFFIXES: .c .o
|
||||
|
||||
.c.o:
|
||||
@echo Compiling $*.c
|
||||
@$(CC) $(CFLAGS) -o $@ -c $< && exit 0;\
|
||||
echo "The following command failed:" 1>&2;\
|
||||
echo "$(CC) $(CFLAGS) -o $@ -c $<";\
|
||||
$(CC) $(CFLAGS) -o $@ -c $< &>/dev/null
|
53
Makefile.am
Normal file
53
Makefile.am
Normal file
@ -0,0 +1,53 @@
|
||||
AM_CFLAGS = -Wall -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 @STATIC_CFLAGS@
|
||||
|
||||
SUBDIRS=po
|
||||
|
||||
bin_PROGRAMS = minidlna testupnpdescgen
|
||||
minidlna_SOURCES = minidlna.c upnphttp.c upnpdescgen.c upnpsoap.c \
|
||||
upnpreplyparse.c minixml.c \
|
||||
getifaddr.c daemonize.c upnpglobalvars.c \
|
||||
options.c minissdp.c uuid.c upnpevents.c \
|
||||
sql.c utils.c metadata.c scanner.c inotify.c \
|
||||
tivo_utils.c tivo_beacon.c tivo_commands.c \
|
||||
tagutils/textutils.c tagutils/misc.c tagutils/tagutils.c \
|
||||
playlist.c image_utils.c albumart.c log.c
|
||||
|
||||
|
||||
#if NEED_VORBIS
|
||||
vorbisflag = -lvorbis
|
||||
#endif
|
||||
|
||||
#if NEED_OGG
|
||||
flacoggflag = -logg
|
||||
#endif
|
||||
|
||||
minidlna_LDADD = \
|
||||
@LIBJPEG_LIBS@ \
|
||||
@LIBID3TAG_LIBS@ \
|
||||
@LIBSQLITE3_LIBS@ \
|
||||
@LIBAVFORMAT_LIBS@ \
|
||||
@LIBAVUTIL_LIBS@ \
|
||||
@LIBAVCODEC_LIBS@ \
|
||||
@LIBEXIF_LIBS@ \
|
||||
@LIBDL_LIBS@ \
|
||||
@LIBRT_LIBS@ \
|
||||
-lpthread -lFLAC $(flacoggflag) $(vorbisflag)
|
||||
|
||||
minidlna_LDFLAGS = @STATIC_LDFLAGS@
|
||||
|
||||
testupnpdescgen_SOURCES = testupnpdescgen.c upnpdescgen.c
|
||||
testupnpdescgen_LDADD = \
|
||||
@LIBJPEG_LIBS@ \
|
||||
@LIBID3TAG_LIBS@ \
|
||||
@LIBSQLITE3_LIBS@ \
|
||||
@LIBAVFORMAT_LIBS@ \
|
||||
@LIBAVUTIL_LIBS@ \
|
||||
@LIBAVCODEC_LIBS@ \
|
||||
@LIBEXIF_LIBS@ \
|
||||
@LIBDL_LIBS@ \
|
||||
-lpthread -lFLAC $(flacoggflag) $(vorbisflag)
|
||||
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = m4/ChangeLog
|
4
NEWS
4
NEWS
@ -1,5 +1,7 @@
|
||||
1.0.23 - Released 00-Month-0000
|
||||
1.1.0 - Released 00-Month-0000
|
||||
--------------------------------
|
||||
- Add support for other operating systems.
|
||||
- Switch to autoconf from our little genconfig.sh.
|
||||
- Enable the subtitle menu on some Samsung TV's.
|
||||
|
||||
1.0.22 - Released 24-Aug-2011
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/param.h>
|
||||
#include <libgen.h>
|
||||
|
36
autogen.sh
Executable file
36
autogen.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
|
||||
package="minidlna"
|
||||
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
cd "$srcdir"
|
||||
DIE=0
|
||||
|
||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have autoconf installed to compile $package."
|
||||
echo "Download the appropriate package for your system,"
|
||||
echo "or get the source from one of the GNU ftp sites"
|
||||
echo "listed in http://www.gnu.org/order/ftp.html"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
(automake --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have automake installed to compile $package."
|
||||
echo "Download the appropriate package for your system,"
|
||||
echo "or get the source from one of the GNU ftp sites"
|
||||
echo "listed in http://www.gnu.org/order/ftp.html"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
if test "$DIE" -eq 1; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Generating configuration files for $package, please wait...."
|
||||
|
||||
autoreconf -vfi
|
||||
|
481
config.h.in
Normal file
481
config.h.in
Normal file
@ -0,0 +1,481 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define if building universal (internal helper macro) */
|
||||
#undef AC_APPLE_UNIVERSAL_BUILD
|
||||
|
||||
/* DB path */
|
||||
#undef DEFAULT_DB_PATH
|
||||
|
||||
/* Log path */
|
||||
#undef DEFAULT_LOG_PATH
|
||||
|
||||
/* Define to 1 if translation of program messages to the user's native
|
||||
language is requested. */
|
||||
#undef ENABLE_NLS
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#undef HAVE_ARPA_INET_H
|
||||
|
||||
/* Define to 1 if you have the <avcodec.h> header file. */
|
||||
#undef HAVE_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <avformat.h> header file. */
|
||||
#undef HAVE_AVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <avutil.h> header file. */
|
||||
#undef HAVE_AVUTIL_H
|
||||
|
||||
/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
|
||||
CoreFoundation framework. */
|
||||
#undef HAVE_CFLOCALECOPYCURRENT
|
||||
|
||||
/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
|
||||
the CoreFoundation framework. */
|
||||
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
|
||||
|
||||
/* Whether the __NR_clock_gettime syscall is defined */
|
||||
#undef HAVE_CLOCK_GETTIME_SYSCALL
|
||||
|
||||
/* Whether darwin sendfile() API is available */
|
||||
#undef HAVE_DARWIN_SENDFILE_API
|
||||
|
||||
/* Define if the GNU dcgettext() function is already present or preinstalled.
|
||||
*/
|
||||
#undef HAVE_DCGETTEXT
|
||||
|
||||
/* Define to 1 if you have the <endian.h> header file. */
|
||||
#undef HAVE_ENDIAN_H
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/avcodec.h> header file. */
|
||||
#undef HAVE_FFMPEG_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/avutil.h> header file. */
|
||||
#undef HAVE_FFMPEG_AVUTIL_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/libavcodec/avcodec.h> header file. */
|
||||
#undef HAVE_FFMPEG_LIBAVCODEC_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/libavformat/avformat.h> header file. */
|
||||
#undef HAVE_FFMPEG_LIBAVFORMAT_AVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/libavformat.h> header file. */
|
||||
#undef HAVE_FFMPEG_LIBAVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <ffmpeg/libavutil/avutil.h> header file. */
|
||||
#undef HAVE_FFMPEG_LIBAVUTIL_AVUTIL_H
|
||||
|
||||
/* Have flac */
|
||||
#undef HAVE_FLAC
|
||||
|
||||
/* Define to 1 if you have the <FLAC/all.h> header file. */
|
||||
#undef HAVE_FLAC_ALL_H
|
||||
|
||||
/* Define to 1 if you have the <FLAC/metadata.h> header file. */
|
||||
#undef HAVE_FLAC_METADATA_H
|
||||
|
||||
/* Define to 1 if you have the `fork' function. */
|
||||
#undef HAVE_FORK
|
||||
|
||||
/* Whether freebsd sendfile() API is available */
|
||||
#undef HAVE_FREEBSD_SENDFILE_API
|
||||
|
||||
/* Define to 1 if you have the `gethostname' function. */
|
||||
#undef HAVE_GETHOSTNAME
|
||||
|
||||
/* Define to 1 if you have the `getifaddrs' function. */
|
||||
#undef HAVE_GETIFADDRS
|
||||
|
||||
/* Define if the GNU gettext() function is already present or preinstalled. */
|
||||
#undef HAVE_GETTEXT
|
||||
|
||||
/* Define to 1 if you have the `gettimeofday' function. */
|
||||
#undef HAVE_GETTIMEOFDAY
|
||||
|
||||
/* Define if you have the iconv() function. */
|
||||
#undef HAVE_ICONV
|
||||
|
||||
/* Define to 1 if you have the <id3tag.h> header file. */
|
||||
#undef HAVE_ID3TAG_H
|
||||
|
||||
/* Define to 1 if you have the `inet_ntoa' function. */
|
||||
#undef HAVE_INET_NTOA
|
||||
|
||||
/* Define to enable inotify */
|
||||
#undef HAVE_INOTIFY_H
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <jpeglib.h> header file. */
|
||||
#undef HAVE_JPEGLIB_H
|
||||
|
||||
/* Define to 1 if you have the <libavcodec/avcodec.h> header file. */
|
||||
#undef HAVE_LIBAVCODEC_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <libavformat/avformat.h> header file. */
|
||||
#undef HAVE_LIBAVFORMAT_AVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <libavutil/avutil.h> header file. */
|
||||
#undef HAVE_LIBAVUTIL_AVUTIL_H
|
||||
|
||||
/* Define to 1 if you have the <libav/avcodec.h> header file. */
|
||||
#undef HAVE_LIBAV_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <libav/avutil.h> header file. */
|
||||
#undef HAVE_LIBAV_AVUTIL_H
|
||||
|
||||
/* Define to 1 if you have the <libav/libavcodec/avcodec.h> header file. */
|
||||
#undef HAVE_LIBAV_LIBAVCODEC_AVCODEC_H
|
||||
|
||||
/* Define to 1 if you have the <libav/libavformat/avformat.h> header file. */
|
||||
#undef HAVE_LIBAV_LIBAVFORMAT_AVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <libav/libavformat.h> header file. */
|
||||
#undef HAVE_LIBAV_LIBAVFORMAT_H
|
||||
|
||||
/* Define to 1 if you have the <libav/libavutil/avutil.h> header file. */
|
||||
#undef HAVE_LIBAV_LIBAVUTIL_AVUTIL_H
|
||||
|
||||
/* Define to 1 if you have the <libexif/exif-loader.h> header file. */
|
||||
#undef HAVE_LIBEXIF_EXIF_LOADER_H
|
||||
|
||||
/* Define to 1 if you have the <libintl.h> header file. */
|
||||
#undef HAVE_LIBINTL_H
|
||||
|
||||
/* Define to 1 if you have the `pthread' library (-lpthread). */
|
||||
#undef HAVE_LIBPTHREAD
|
||||
|
||||
/* Whether linux sendfile() API is available */
|
||||
#undef HAVE_LINUX_SENDFILE_API
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#undef HAVE_LOCALE_H
|
||||
|
||||
/* Define to 1 if you have the <machine/endian.h> header file. */
|
||||
#undef HAVE_MACHINE_ENDIAN_H
|
||||
|
||||
/* Define to 1 if you have the <mach/mach_time.h> header file. */
|
||||
#undef HAVE_MACH_MACH_TIME_H
|
||||
|
||||
/* Define to 1 if you have the `memmove' function. */
|
||||
#undef HAVE_MEMMOVE
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#undef HAVE_MEMSET
|
||||
|
||||
/* Define to 1 if you have the `mkdir' function. */
|
||||
#undef HAVE_MKDIR
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#undef HAVE_NETDB_H
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#undef HAVE_NETINET_IN_H
|
||||
|
||||
/* Define to 1 if you have the <ogg/ogg.h> header file. */
|
||||
#undef HAVE_OGG_OGG_H
|
||||
|
||||
/* Define to 1 if you have the `realpath' function. */
|
||||
#undef HAVE_REALPATH
|
||||
|
||||
/* Define to 1 if you have the `select' function. */
|
||||
#undef HAVE_SELECT
|
||||
|
||||
/* Define to 1 if you have the `sendfile' function. */
|
||||
#undef HAVE_SENDFILE
|
||||
|
||||
/* Define to 1 if you have the `setlocale' function. */
|
||||
#undef HAVE_SETLOCALE
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
#undef HAVE_SOCKET
|
||||
|
||||
/* Define to 1 if you have the <sqlite3.h> header file. */
|
||||
#undef HAVE_SQLITE3_H
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
|
||||
/* Define to 1 if you have the <stddef.h> header file. */
|
||||
#undef HAVE_STDDEF_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#undef HAVE_STRCHR
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#undef HAVE_STRNCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strpbrk' function. */
|
||||
#undef HAVE_STRPBRK
|
||||
|
||||
/* Define to 1 if you have the `strrchr' function. */
|
||||
#undef HAVE_STRRCHR
|
||||
|
||||
/* Define to 1 if you have the `strstr' function. */
|
||||
#undef HAVE_STRSTR
|
||||
|
||||
/* Define to 1 if you have the `strtol' function. */
|
||||
#undef HAVE_STRTOL
|
||||
|
||||
/* Define to 1 if you have the `strtoul' function. */
|
||||
#undef HAVE_STRTOUL
|
||||
|
||||
/* Define to 1 if `st_blocks' is a member of `struct stat'. */
|
||||
#undef HAVE_STRUCT_STAT_ST_BLOCKS
|
||||
|
||||
/* Define to 1 if your `struct stat' has `st_blocks'. Deprecated, use
|
||||
`HAVE_STRUCT_STAT_ST_BLOCKS' instead. */
|
||||
#undef HAVE_ST_BLOCKS
|
||||
|
||||
/* Define to 1 if you have the <syscall.h> header file. */
|
||||
#undef HAVE_SYSCALL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/file.h> header file. */
|
||||
#undef HAVE_SYS_FILE_H
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#undef HAVE_SYS_IOCTL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#undef HAVE_SYS_SOCKET_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/syscall.h> header file. */
|
||||
#undef HAVE_SYS_SYSCALL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#undef HAVE_SYS_TIME_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if you have the `vfork' function. */
|
||||
#undef HAVE_VFORK
|
||||
|
||||
/* Define to 1 if you have the <vfork.h> header file. */
|
||||
#undef HAVE_VFORK_H
|
||||
|
||||
/* lacking vorbisfile */
|
||||
#undef HAVE_VORBISFILE
|
||||
|
||||
/* Define to 1 if you have the <vorbis/codec.h> header file. */
|
||||
#undef HAVE_VORBIS_CODEC_H
|
||||
|
||||
/* Define to 1 if you have the <vorbis/vorbisfile.h> header file. */
|
||||
#undef HAVE_VORBIS_VORBISFILE_H
|
||||
|
||||
/* Define to 1 if `fork' works. */
|
||||
#undef HAVE_WORKING_FORK
|
||||
|
||||
/* Define to 1 if `vfork' works. */
|
||||
#undef HAVE_WORKING_VFORK
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#undef HAVE__BOOL
|
||||
|
||||
/* Define as const if the declaration of iconv() needs const. */
|
||||
#undef ICONV_CONST
|
||||
|
||||
/* Define to enable logging */
|
||||
#undef LOG_PERROR
|
||||
|
||||
/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
|
||||
slash. */
|
||||
#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
|
||||
/* Define to 1 if you want to enable NETGEAR support */
|
||||
#undef NETGEAR
|
||||
|
||||
/* OS Name */
|
||||
#undef OS_NAME
|
||||
|
||||
/* OS URL */
|
||||
#undef OS_URL
|
||||
|
||||
/* OS Version */
|
||||
#undef OS_VERSION
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you want to enable NETGEAR support */
|
||||
#undef PNPX
|
||||
|
||||
/* Define to 1 if you want to enable NETGEAR support */
|
||||
#undef READYNAS
|
||||
|
||||
/* scandir needs const char cast */
|
||||
#undef SCANDIR_CONST
|
||||
|
||||
/* we are on solaris */
|
||||
#undef SOLARIS
|
||||
|
||||
/* Define to enable Solaris Kernel Stats */
|
||||
#undef SOLARIS_KSTATS
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Define to 1 if you want to enable TiVo support */
|
||||
#undef TIVO_SUPPORT
|
||||
|
||||
/* use the system's builtin daemon() */
|
||||
#undef USE_DAEMON
|
||||
|
||||
/* Define to enable IPF */
|
||||
#undef USE_IPF
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
||||
# if defined __BIG_ENDIAN__
|
||||
# define WORDS_BIGENDIAN 1
|
||||
# endif
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
# undef WORDS_BIGENDIAN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
#undef _UINT32_T
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
#undef _UINT64_T
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
#undef _UINT8_T
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
#undef inline
|
||||
#endif
|
||||
|
||||
/* Define to the type of a signed integer type of width exactly 32 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef int32_t
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef mode_t
|
||||
|
||||
/* Define to `long int' if <sys/types.h> does not define. */
|
||||
#undef off_t
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef pid_t
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
#undef size_t
|
||||
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef ssize_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 32 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint32_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 64 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint64_t
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 8 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
#undef uint8_t
|
||||
|
||||
/* Define as `fork' if `vfork' does not work. */
|
||||
#undef vfork
|
556
configure.ac
Normal file
556
configure.ac
Normal file
@ -0,0 +1,556 @@
|
||||
AC_INIT(MiniDLNA,1.1.0,,minidlna)
|
||||
#LT_INIT
|
||||
|
||||
AC_CANONICAL_TARGET
|
||||
AM_INIT_AUTOMAKE(minidlna,1.1.0)
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
#MiniDLNA
|
||||
|
||||
AM_ICONV
|
||||
AM_GNU_GETTEXT([external])
|
||||
AM_GNU_GETTEXT_VERSION(0.14.4)
|
||||
|
||||
# Checks for programs.
|
||||
# AC_PROG_CXX
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CC
|
||||
# AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
|
||||
################################################################################################################
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_INLINE
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_MODE_T
|
||||
AC_TYPE_OFF_T
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SSIZE_T
|
||||
AC_STRUCT_ST_BLOCKS
|
||||
AC_HEADER_STDBOOL
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT64_T
|
||||
AC_TYPE_UINT8_T
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_FORK
|
||||
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
AC_CHECK_FUNCS([gethostname getifaddrs gettimeofday inet_ntoa memmove memset mkdir realpath select sendfile setlocale socket strcasecmp strchr strdup strerror strncasecmp strpbrk strrchr strstr strtol strtoul])
|
||||
|
||||
################################################################################################################
|
||||
# Special include directories
|
||||
case $host in
|
||||
*-*-darwin*)
|
||||
DARWIN_OS=1
|
||||
SEARCH_DIR="/opt/local"
|
||||
;;
|
||||
*-*-solaris*)
|
||||
AC_DEFINE([SOLARIS], [1], [we are on solaris])
|
||||
;;
|
||||
*-*-cygwin*)
|
||||
CYGWIN_OS=1
|
||||
;;
|
||||
*-*-freebsd*)
|
||||
FREEBSD_OS=1
|
||||
;;
|
||||
*-*-openbsd*)
|
||||
OPENBSD_OS=1
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_CHECK_HEADERS(syscall.h sys/syscall.h mach/mach_time.h)
|
||||
AC_MSG_CHECKING([for __NR_clock_gettime syscall])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <asm/unistd.h>
|
||||
],
|
||||
[
|
||||
#ifndef __NR_clock_gettime
|
||||
#error
|
||||
#endif
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_CLOCK_GETTIME_SYSCALL], [1], [Whether the __NR_clock_gettime syscall is defined])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
AC_CHECK_LIB([rt], [clock_gettime], [LIBRT_LIBS="-lrt"],)
|
||||
AC_SUBST(LIBRT_LIBS)
|
||||
])
|
||||
|
||||
################################################################################################################
|
||||
### Library checks
|
||||
#AM_NLS
|
||||
AC_CHECK_LIB([dl], [dlopen], [LIBDL_LIBS="-ldl"],)
|
||||
AC_SUBST(LIBDL_LIBS)
|
||||
|
||||
CPPFLAGS_SAVE="$CPPFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$dir/include"
|
||||
fi
|
||||
AC_CHECK_HEADERS([libavutil/avutil.h ffmpeg/libavutil/avutil.h libav/libavutil/avutil.h avutil.h ffmpeg/avutil.h libav/avutil.h], [break], [continue], [])
|
||||
if test -n "$dir"; then
|
||||
if test x"$ac_cv_header_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include"
|
||||
elif test x"$ac_cv_header_libavutil_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libavutil"
|
||||
elif test x"$ac_cv_header_ffmpeg_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg"
|
||||
elif test x"$ac_cv_header_ffmpeg_libavutil_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg/libavutil"
|
||||
elif test x"$ac_cv_header_libav_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav"
|
||||
elif test x"$ac_cv_header_libav_libavutil_avutil_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav/libavutil"
|
||||
else
|
||||
unset ac_cv_header_avutil_h
|
||||
unset ac_cv_header_libavutil_avutil_h
|
||||
unset ac_cv_header_ffmpeg_avutil_h
|
||||
unset ac_cv_header_ffmpeg_libavutil_avutil_h
|
||||
unset ac_cv_header_libav_avutil_h
|
||||
unset ac_cv_header_libav_libavutil_avutil_h
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
HAVE_LIBAVUTIL=1
|
||||
break
|
||||
done
|
||||
if test -z "$HAVE_LIBAVUTIL"; then
|
||||
AC_MSG_ERROR([libavutil headers not found or not usable])
|
||||
fi
|
||||
|
||||
CPPFLAGS_SAVE="$CPPFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$dir/include"
|
||||
fi
|
||||
AC_CHECK_HEADERS([libavcodec/avcodec.h ffmpeg/libavcodec/avcodec.h libav/libavcodec/avcodec.h avcodec.h ffmpeg/avcodec.h libav/avcodec.h], [break], [continue], [])
|
||||
if test -n "$dir"; then
|
||||
if test x"$ac_cv_header_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include"
|
||||
elif test x"$ac_cv_header_libavcodec_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libavcodec"
|
||||
elif test x"$ac_cv_header_ffmpeg_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg"
|
||||
elif test x"$ac_cv_header_ffmpeg_libavcodec_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg/libavcodec"
|
||||
elif test x"$ac_cv_header_libav_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav"
|
||||
elif test x"$ac_cv_header_libav_libavcodec_avcodec_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav/libavcodec"
|
||||
else
|
||||
unset ac_cv_header_avcodec_h
|
||||
unset ac_cv_header_libavcodec_avcodec_h
|
||||
unset ac_cv_header_ffmpeg_avcodec_h
|
||||
unset ac_cv_header_ffmpeg_libavcodec_avcodec_h
|
||||
unset ac_cv_header_libav_avcodec_h
|
||||
unset ac_cv_header_libav_libavcodec_avcodec_h
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
HAVE_LIBAVCODEC=1
|
||||
break
|
||||
done
|
||||
if test -z "$HAVE_LIBAVCODEC"; then
|
||||
AC_MSG_ERROR([libavcodec headers not found or not usable])
|
||||
fi
|
||||
|
||||
CPPFLAGS_SAVE="$CPPFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$dir/include"
|
||||
fi
|
||||
AC_CHECK_HEADERS([libavformat/avformat.h ffmpeg/libavformat/avformat.h libav/libavformat/avformat.h avformat.h ffmpeg/avformat.h libav/avformat.h], [break], [continue], [])
|
||||
if test -n "$dir"; then
|
||||
if test x"$ac_cv_header_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include"
|
||||
elif test x"$ac_cv_header_libavformat_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libavformat"
|
||||
elif test x"$ac_cv_header_ffmpeg_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg"
|
||||
elif test x"$ac_cv_header_ffmpeg_libavformat_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/ffmpeg/libavformat"
|
||||
elif test x"$ac_cv_header_libav_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav"
|
||||
elif test x"$ac_cv_header_libav_libavformat_avformat_h" = xyes; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE -I$dir/include/libav/libavformat"
|
||||
else
|
||||
unset ac_cv_header_avformat_h
|
||||
unset ac_cv_header_libavformat_avformat_h
|
||||
unset ac_cv_header_ffmpeg_avformat_h
|
||||
unset ac_cv_header_ffmpeg_libavformat_avformat_h
|
||||
unset ac_cv_header_libav_avformat_h
|
||||
unset ac_cv_header_libav_libavformat_avformat_h
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
HAVE_LIBAVFORMAT=1
|
||||
break
|
||||
done
|
||||
if test -z "$HAVE_LIBAVFORMAT"; then
|
||||
AC_MSG_ERROR([libavformat headers not found or not usable])
|
||||
fi
|
||||
|
||||
CPPFLAGS_SAVE="$CPPFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$dir/include"
|
||||
fi
|
||||
AC_CHECK_HEADERS([jpeglib.h sqlite3.h libexif/exif-loader.h id3tag.h ogg/ogg.h vorbis/codec.h FLAC/metadata.h],,[unset $as_ac_Header; break],)
|
||||
if test x"$ac_cv_header_jpeglib_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_sqlite3_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_libexif_exif_loader_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_id3tag_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_ogg_ogg_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_vorbis_codec_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
elif test x"$ac_cv_header_FLAC_metadata_h" != x"yes"; then
|
||||
CPPFLAGS="$CPPFLAGS_SAVE"
|
||||
continue
|
||||
else
|
||||
break;
|
||||
fi
|
||||
done
|
||||
test x"$ac_cv_header_jpeglib_h" != x"yes" && AC_MSG_ERROR([libjpeg headers not found or not usable])
|
||||
test x"$ac_cv_header_sqlite3_h" != x"yes" && AC_MSG_ERROR([libsqlite3 headers not found or not usable])
|
||||
test x"$ac_cv_header_libexif_exif_loader_h" != x"yes" && AC_MSG_ERROR([libexif headers not found or not usable])
|
||||
test x"$ac_cv_header_id3tag_h" != x"yes" && AC_MSG_ERROR([libid3tag headers not found or not usable])
|
||||
test x"$ac_cv_header_ogg_ogg_h" != x"yes" && AC_MSG_ERROR([libogg headers not found or not usable])
|
||||
test x"$ac_cv_header_vorbis_codec_h" != x"yes" && AC_MSG_ERROR([libvorbis headers not found or not usable])
|
||||
test x"$ac_cv_header_FLAC_metadata_h" != x"yes" && AC_MSG_ERROR([libFLAC headers not found or not usable])
|
||||
|
||||
CFLAGS_SAVE="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Wall -Werror"
|
||||
AC_MSG_CHECKING([if we should use the daemon() libc function])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <stdlib.h>
|
||||
],
|
||||
[
|
||||
(void)daemon(0, 0);
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_DEFINE([USE_DAEMON], [1],
|
||||
[use the system's builtin daemon()])
|
||||
AC_MSG_RESULT([yes])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([if scandir declaration requires const char cast])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
],
|
||||
[
|
||||
int filter(struct dirent *d);
|
||||
struct dirent **ptr = NULL;
|
||||
char *name = NULL;
|
||||
(void)scandir(name, &ptr, filter, alphasort);
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
],
|
||||
[
|
||||
AC_DEFINE([SCANDIR_CONST], [1],
|
||||
[scandir needs const char cast])
|
||||
|
||||
AC_MSG_RESULT([yes])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for linux sendfile support])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <sys/types.h>
|
||||
#include <sys/sendfile.h>
|
||||
],
|
||||
[
|
||||
int tofd = 0, fromfd = 0;
|
||||
off_t offset;
|
||||
size_t total = 0;
|
||||
ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
|
||||
return nwritten;
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_LINUX_SENDFILE_API], [1], [Whether linux sendfile() API is available])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for darwin sendfile support])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
],
|
||||
[
|
||||
int fd = 0, s = 0;
|
||||
off_t offset = 0, len;
|
||||
struct sf_hdtr *hdtr = NULL;
|
||||
int flags = 0;
|
||||
int ret;
|
||||
ret = sendfile(fd, s, offset, &len, hdtr, flags);
|
||||
return ret;
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_DARWIN_SENDFILE_API], [1], [Whether darwin sendfile() API is available])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for freebsd sendfile support])
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
],
|
||||
[
|
||||
int fromfd=0, tofd=0, ret, total=0;
|
||||
off_t offset=0, nwritten;
|
||||
struct sf_hdtr hdr;
|
||||
struct iovec hdtrl;
|
||||
hdr.headers = &hdtrl;
|
||||
hdr.hdr_cnt = 1;
|
||||
hdr.trailers = NULL;
|
||||
hdr.trl_cnt = 0;
|
||||
hdtrl.iov_base = NULL;
|
||||
hdtrl.iov_len = 0;
|
||||
ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0);
|
||||
]
|
||||
)],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_FREEBSD_SENDFILE_API], [1], [Whether freebsd sendfile() API is available])
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
CFLAGS="$CFLAGS_SAVE"
|
||||
|
||||
LDFLAGS_SAVE="$LDFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
LDFLAGS="$LDFLAGS -L$dir/lib"
|
||||
fi
|
||||
AC_CHECK_LIB([jpeg], [jpeg_set_defaults], [LIBJPEG_LIBS="-ljpeg"], [unset ac_cv_lib_jpeg_jpeg_set_defaults; LDFLAGS="$LDFLAGS_SAVE"; continue])
|
||||
break
|
||||
done
|
||||
test x"$ac_cv_lib_jpeg_jpeg_set_defaults" = x"yes" || AC_MSG_ERROR([Could not find libjpeg])
|
||||
AC_SUBST(LIBJPEG_LIBS)
|
||||
|
||||
LDFLAGS_SAVE="$LDFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
LDFLAGS="$LDFLAGS -L$dir/lib"
|
||||
fi
|
||||
AC_CHECK_LIB([exif], [exif_data_new_from_file], [LIBEXIF_LIBS="-lexif"], [unset ac_cv_lib_exif_exif_data_new_from_file; LDFLAGS="$LDFLAGS_SAVE"; continue])
|
||||
break
|
||||
done
|
||||
test x"$ac_cv_lib_jpeg_jpeg_set_defaults" = x"yes" || AC_MSG_ERROR([Could not find libexif])
|
||||
AC_SUBST(LIBEXIF_LIBS)
|
||||
|
||||
LDFLAGS_SAVE="$LDFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
LDFLAGS="$LDFLAGS -L$dir/lib"
|
||||
fi
|
||||
AC_CHECK_LIB([id3tag], [id3_file_open], [LIBID3TAG_LIBS="-lid3tag"], [unset ac_cv_lib_id3tag_id3_file_open; LDFLAGS="$LDFLAGS_SAVE"; continue])
|
||||
break
|
||||
done
|
||||
test x"$ac_cv_lib_id3tag_id3_file_open" = x"yes" || AC_MSG_ERROR([Could not find libid3tag])
|
||||
AC_SUBST(LIBID3TAG_LIBS)
|
||||
|
||||
LDFLAGS_SAVE="$LDFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
LDFLAGS="$LDFLAGS -L$dir/lib"
|
||||
fi
|
||||
AC_CHECK_LIB([sqlite3], [sqlite3_open], [LIBSQLITE3_LIBS="-lsqlite3"], [unset ac_cv_lib_sqlite3_sqlite3_open; LDFLAGS="$LDFLAGS_SAVE"; continue])
|
||||
break
|
||||
done
|
||||
test x"$ac_cv_lib_sqlite3_sqlite3_open" = x"yes" || AC_MSG_ERROR([Could not find libsqlite3])
|
||||
AC_SUBST(LIBSQLITE3_LIBS)
|
||||
|
||||
LDFLAGS_SAVE="$LDFLAGS"
|
||||
for dir in "" /usr/local $SEARCH_DIR; do
|
||||
if test -n "$dir"; then
|
||||
LDFLAGS="$LDFLAGS -L$dir/lib"
|
||||
fi
|
||||
AC_CHECK_LIB([avformat], [av_open_input_file], [LIBAVFORMAT_LIBS="-lavformat"], [unset ac_cv_lib_avformat_av_open_input_file; LDFLAGS="$LDFLAGS_SAVE"; continue])
|
||||
AC_SUBST(LIBJPEG_LIBS)
|
||||
break
|
||||
done
|
||||
test x"$ac_cv_lib_avformat_av_open_input_file" = x"yes" || AC_MSG_ERROR([Could not find libavformat - part of ffmpeg])
|
||||
AC_SUBST(LIBAVFORMAT_LIBS)
|
||||
|
||||
AC_CHECK_LIB(avutil ,[av_rescale_q], [LIBAVUTIL_LIBS="-lavutil"], [AC_MSG_ERROR([Could not find libavutil - part of ffmpeg])])
|
||||
AC_SUBST(LIBAVUTIL_LIBS)
|
||||
|
||||
AC_CHECK_LIB(avcodec ,[avcodec_init], [LIBAVCODEC_LIBS="-lavcodec"], [AC_MSG_ERROR([Could not find libavcodec - part of ffmpeg])])
|
||||
AC_SUBST(LIBAVCODEC_LIBS)
|
||||
|
||||
AC_CHECK_LIB(pthread, pthread_create)
|
||||
|
||||
# test if we have vorbisfile
|
||||
# prior versions had ov_open_callbacks in libvorbis, test that, too.
|
||||
AC_CHECK_LIB(vorbisfile, ov_open_callbacks,
|
||||
[AC_CHECK_HEADERS([vorbis/vorbisfile.h],
|
||||
AM_CONDITIONAL(HAVE_VORBISFILE, true)
|
||||
AC_DEFINE(HAVE_VORBISFILE,1,[Have vorbisfile]),
|
||||
AM_CONDITIONAL(HAVE_VORBISFILE, false)
|
||||
AC_DEFINE(HAVE_VORBISFILE,0,[lacking vorbisfile]))],
|
||||
AM_CONDITIONAL(HAVE_VORBISFILE, false),
|
||||
-lvorbis -logg)
|
||||
AC_CHECK_LIB(FLAC, FLAC__stream_decoder_init_stream,
|
||||
[AC_CHECK_HEADERS([FLAC/all.h],
|
||||
AM_CONDITIONAL(HAVE_FLAC, true)
|
||||
AC_DEFINE(HAVE_FLAC,1,[Have flac]),
|
||||
AM_CONDITIONAL(HAVE_FLAC, false))],
|
||||
AM_CONDITIONAL(HAVE_FLAC, false),
|
||||
-logg)
|
||||
# test without -logg to see whether we really need it (libflac can be without)
|
||||
AC_CHECK_LIB(FLAC, FLAC__stream_decoder_init_ogg_stream,
|
||||
AM_CONDITIONAL(HAVE_FLAC, true)
|
||||
AC_DEFINE(HAVE_FLAC,1,[Have flac])
|
||||
AM_CONDITIONAL(NEED_OGG, false),
|
||||
[AM_CONDITIONAL(NEED_OGG, true)])
|
||||
AC_CHECK_LIB(vorbisfile, vorbis_comment_query,
|
||||
AM_CONDITIONAL(NEED_VORBIS, false),
|
||||
AM_CONDITIONAL(NEED_VORBIS, true),
|
||||
-logg)
|
||||
|
||||
################################################################################################################
|
||||
### Header checks
|
||||
|
||||
#AC_HEADER_CHECK(libintl.h, AC_DEFINE([ENABLE_NLS], [1], [Define to use NLS]))
|
||||
AC_HEADER_CHECK(inotify.h, AC_DEFINE([HAVE_INOTIFY_H], [1], [Define to enable inotify]))
|
||||
|
||||
# Checks for header files. (From autoscan)
|
||||
AC_CHECK_HEADERS([arpa/inet.h endian.h machine/endian.h fcntl.h libintl.h locale.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h unistd.h])
|
||||
|
||||
################################################################################################################
|
||||
### Build Options
|
||||
|
||||
AC_ARG_WITH(logpath,
|
||||
AS_HELP_STRING([--with-log-path],[Log path]),
|
||||
[with_logpath="$withval"],[with_logpath="/var/log"])
|
||||
AC_DEFINE_UNQUOTED([DEFAULT_LOG_PATH],"${with_logpath}",[Log path])
|
||||
|
||||
|
||||
AC_ARG_WITH(dbpath,
|
||||
AS_HELP_STRING([--with-db-path],[DB path]),
|
||||
[with_dbpath="$withval"],[with_dbpath="/var/cache/minidlna"])
|
||||
AC_DEFINE_UNQUOTED([DEFAULT_DB_PATH],"${with_dbpath}",[DB path])
|
||||
|
||||
AC_ARG_WITH(osname,
|
||||
AS_HELP_STRING([--with-os-name],[OS Name]),
|
||||
[with_osname="$withval"],[with_osname="$(uname -s)"])
|
||||
AC_DEFINE_UNQUOTED([OS_NAME],"${with_osname}",[OS Name])
|
||||
|
||||
AC_ARG_WITH(osver,
|
||||
AS_HELP_STRING([--with-os-version],[OS Version]),
|
||||
[with_osver="$withval"],[with_osver="$(uname -r)"])
|
||||
AC_DEFINE_UNQUOTED([OS_VERSION],"${with_osver}",[OS Version])
|
||||
|
||||
AC_ARG_WITH(osurl,
|
||||
AS_HELP_STRING([--with-os-url],[OS URL]),
|
||||
[with_osurl="$withval"],[with_osurl="http://www.netgear.com"])
|
||||
AC_DEFINE_UNQUOTED([OS_URL],"${with_osurl}",[OS URL])
|
||||
|
||||
AC_ARG_WITH(tivo,
|
||||
AS_HELP_STRING([--with-tivo],[TiVo Support]),
|
||||
[with_tivo="$withval"],[with_tivo="yes"])
|
||||
if test "$with_tivo" = "yes"; then
|
||||
AC_DEFINE([TIVO_SUPPORT],[1],[Define to 1 if you want to enable TiVo support])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(netgear,
|
||||
AS_HELP_STRING([--with-netgear],[NETGEAR ReadyNAS Support]),
|
||||
[with_netgear="$withval"],[with_netgear="no"])
|
||||
if test "$with_netgear" = "yes"; then
|
||||
AC_DEFINE([NETGEAR],[1],[Define to 1 if you want to enable NETGEAR support])
|
||||
AC_DEFINE([READYNAS],[1],[Define to 1 if you want to enable NETGEAR support])
|
||||
AC_DEFINE([PNPX],[5],[Define to 1 if you want to enable NETGEAR support])
|
||||
AC_DEFINE_UNQUOTED([OS_URL],"http://www.readynas.com/",[OS URL])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(staticbin,
|
||||
AS_HELP_STRING([--with-staticbin],[Build statically linked binaries]),
|
||||
[with_staticbin="$withval"],[with_staticbin="no"])
|
||||
if test "$with_staticbin" = "yes"; then
|
||||
STATIC_CFLAGS="-DSTATIC"
|
||||
AC_SUBST(STATIC_CFLAGS)
|
||||
STATIC_LDFLAGS="-Wl,-Bstatic"
|
||||
AC_SUBST(STATIC_LDFLAGS)
|
||||
fi
|
||||
|
||||
case "$target_os" in
|
||||
darwin*)
|
||||
;;
|
||||
freebsd*)
|
||||
VER=`grep '#define __FreeBSD_version' /usr/include/sys/param.h | awk '{print $3}'`
|
||||
OS_URL=http://www.freebsd.org/
|
||||
;;
|
||||
solaris*)
|
||||
AC_DEFINE([USE_IPF], [1], [Define to enable IPF])
|
||||
AC_DEFINE([LOG_PERROR], [0], [Define to enable logging])
|
||||
AC_DEFINE([SOLARIS_KSTATS], [1], [Define to enable Solaris Kernel Stats])
|
||||
;;
|
||||
kfreebsd*)
|
||||
OS_URL=http://www.debian.org/
|
||||
;;
|
||||
linux*)
|
||||
;;
|
||||
*)
|
||||
echo "Unknown OS : $target_os"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
AC_OUTPUT([ po/Makefile.in
|
||||
Makefile
|
||||
])
|
@ -94,7 +94,7 @@ writepidfile(const char * fname, int pid)
|
||||
int pidstringlen;
|
||||
int pidfile;
|
||||
|
||||
if(!fname || (strlen(fname) == 0))
|
||||
if(!fname || *fname == '\0')
|
||||
return -1;
|
||||
|
||||
if( (pidfile = open(fname, O_WRONLY|O_CREAT, 0644)) < 0)
|
||||
@ -129,7 +129,7 @@ checkforrunning(const char * fname)
|
||||
int pidfile;
|
||||
pid_t pid;
|
||||
|
||||
if(!fname || (strlen(fname) == 0))
|
||||
if(!fname || *fname == '\0')
|
||||
return -1;
|
||||
|
||||
if( (pidfile = open(fname, O_RDONLY)) < 0)
|
||||
|
215
genconfig.sh
215
genconfig.sh
@ -1,215 +0,0 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# MiniDLNA project
|
||||
# http://sourceforge.net/projects/minidlna/
|
||||
#
|
||||
# MiniDLNA media server
|
||||
# Copyright (C) 2008-2009 Justin Maggard
|
||||
#
|
||||
# This file is part of MiniDLNA.
|
||||
#
|
||||
# MiniDLNA is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# MiniDLNA 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 MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
RM="rm -f"
|
||||
CONFIGFILE="config.h"
|
||||
CONFIGMACRO="__CONFIG_H__"
|
||||
|
||||
# Database path
|
||||
DB_PATH="/tmp/minidlna"
|
||||
# Log path
|
||||
LOG_PATH="${DB_PATH}"
|
||||
|
||||
# detecting the OS name and version
|
||||
OS_NAME=`uname -s`
|
||||
OS_VERSION=`uname -r`
|
||||
TIVO="/*#define TIVO_SUPPORT*/"
|
||||
NETGEAR="/*#define NETGEAR*/"
|
||||
READYNAS="/*#define READYNAS*/"
|
||||
PNPX="#define PNPX 0"
|
||||
|
||||
${RM} ${CONFIGFILE}
|
||||
|
||||
# Detect if there are missing headers
|
||||
# NOTE: This check only works with a normal distro
|
||||
[ ! -e "/usr/include/sqlite3.h" ] && MISSING="libsqlite3 $MISSING"
|
||||
[ ! -e "/usr/include/jpeglib.h" ] && MISSING="libjpeg $MISSING"
|
||||
[ ! -e "/usr/include/libexif/exif-loader.h" ] && MISSING="libexif $MISSING"
|
||||
[ ! -e "/usr/include/id3tag.h" ] && MISSING="libid3tag $MISSING"
|
||||
[ ! -e "/usr/include/ogg/ogg.h" ] && MISSING="libogg $MISSING"
|
||||
[ ! -e "/usr/include/vorbis/codec.h" ] && MISSING="libvorbis $MISSING"
|
||||
[ ! -e "/usr/include/FLAC/metadata.h" ] && MISSING="libflac $MISSING"
|
||||
[ ! -e "/usr/include/ffmpeg/avutil.h" -a \
|
||||
! -e "/usr/include/libavutil/avutil.h" -a \
|
||||
! -e "/usr/include/ffmpeg/libavutil/avutil.h" ] && MISSING="libavutil $MISSING"
|
||||
[ ! -e "/usr/include/ffmpeg/avformat.h" -a \
|
||||
! -e "/usr/include/libavformat/avformat.h" -a \
|
||||
! -e "/usr/include/ffmpeg/libavformat/avformat.h" ] && MISSING="libavformat $MISSING"
|
||||
[ ! -e "/usr/include/ffmpeg/avcodec.h" -a \
|
||||
! -e "/usr/include/libavcodec/avcodec.h" -a \
|
||||
! -e "/usr/include/ffmpeg/libavcodec/avcodec.h" ] && MISSING="libavcodec $MISSING"
|
||||
if [ -n "$MISSING" ]; then
|
||||
echo -e "\nERROR! Cannot continue."
|
||||
echo -e "The following required libraries are either missing, or are missing development headers:\n"
|
||||
echo -e "$MISSING\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "/* MiniDLNA Project" >> ${CONFIGFILE}
|
||||
echo " * http://sourceforge.net/projects/minidlna/" >> ${CONFIGFILE}
|
||||
echo " * (c) 2008-2009 Justin Maggard" >> ${CONFIGFILE}
|
||||
echo " * generated by $0 on `date` */" >> ${CONFIGFILE}
|
||||
echo "#ifndef $CONFIGMACRO" >> ${CONFIGFILE}
|
||||
echo "#define $CONFIGMACRO" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
# OS Specific stuff
|
||||
case $OS_NAME in
|
||||
OpenBSD)
|
||||
MAJORVER=`echo $OS_VERSION | cut -d. -f1`
|
||||
MINORVER=`echo $OS_VERSION | cut -d. -f2`
|
||||
#echo "OpenBSD majorversion=$MAJORVER minorversion=$MINORVER"
|
||||
# rtableid was introduced in OpenBSD 4.0
|
||||
if [ $MAJORVER -ge 4 ]; then
|
||||
echo "#define PFRULE_HAS_RTABLEID" >> ${CONFIGFILE}
|
||||
fi
|
||||
# from the 3.8 version, packets and bytes counters are double : in/out
|
||||
if [ \( $MAJORVER -ge 4 \) -o \( $MAJORVER -eq 3 -a $MINORVER -ge 8 \) ]; then
|
||||
echo "#define PFRULE_INOUT_COUNTS" >> ${CONFIGFILE}
|
||||
fi
|
||||
OS_URL=http://www.openbsd.org/
|
||||
;;
|
||||
FreeBSD)
|
||||
VER=`grep '#define __FreeBSD_version' /usr/include/sys/param.h | awk '{print $3}'`
|
||||
if [ $VER -ge 700049 ]; then
|
||||
echo "#define PFRULE_INOUT_COUNTS" >> ${CONFIGFILE}
|
||||
fi
|
||||
OS_URL=http://www.freebsd.org/
|
||||
;;
|
||||
pfSense)
|
||||
# we need to detect if PFRULE_INOUT_COUNTS macro is needed
|
||||
OS_URL=http://www.pfsense.com/
|
||||
;;
|
||||
NetBSD)
|
||||
OS_URL=http://www.netbsd.org/
|
||||
;;
|
||||
SunOS)
|
||||
echo "#define USE_IPF 1" >> ${CONFIGFILE}
|
||||
echo "#define LOG_PERROR 0" >> ${CONFIGFILE}
|
||||
echo "#define SOLARIS_KSTATS 1" >> ${CONFIGFILE}
|
||||
echo "typedef uint64_t u_int64_t;" >> ${CONFIGFILE}
|
||||
echo "typedef uint32_t u_int32_t;" >> ${CONFIGFILE}
|
||||
echo "typedef uint16_t u_int16_t;" >> ${CONFIGFILE}
|
||||
echo "typedef uint8_t u_int8_t;" >> ${CONFIGFILE}
|
||||
OS_URL=http://www.sun.com/solaris/
|
||||
;;
|
||||
Linux)
|
||||
OS_URL=http://www.kernel.org/
|
||||
KERNVERA=`echo $OS_VERSION | awk -F. '{print $1}'`
|
||||
KERNVERB=`echo $OS_VERSION | awk -F. '{print $2}'`
|
||||
KERNVERC=`echo $OS_VERSION | awk -F. '{print $3}'`
|
||||
KERNVERD=`echo $OS_VERSION | awk -F. '{print $4}'`
|
||||
#echo "$KERNVERA.$KERNVERB.$KERNVERC.$KERNVERD"
|
||||
# NETGEAR ReadyNAS special case
|
||||
if [ -f /etc/raidiator_version ]; then
|
||||
OS_NAME=$(awk -F'!!|=' '{ print $1 }' /etc/raidiator_version)
|
||||
OS_VERSION=$(awk -F'!!|[=,.]' '{ print $3"."$4 }' /etc/raidiator_version)
|
||||
OS_URL="http://www.readynas.com/"
|
||||
LOG_PATH="/var/log"
|
||||
DB_PATH="/var/cache/minidlna"
|
||||
TIVO="#define TIVO_SUPPORT"
|
||||
NETGEAR="#define NETGEAR"
|
||||
READYNAS="#define READYNAS"
|
||||
PNPX="#define PNPX 5"
|
||||
# Debian GNU/Linux special case
|
||||
elif [ -f /etc/debian_version ]; then
|
||||
OS_NAME=Debian
|
||||
OS_VERSION=`cat /etc/debian_version`
|
||||
OS_URL=http://www.debian.org/
|
||||
LOG_PATH="/var/log"
|
||||
# use lsb_release (Linux Standard Base) when available
|
||||
LSB_RELEASE=`which lsb_release 2>/dev/null`
|
||||
if [ 0 -eq $? ]; then
|
||||
OS_NAME=`${LSB_RELEASE} -i -s`
|
||||
OS_VERSION=`${LSB_RELEASE} -r -s`
|
||||
fi
|
||||
else
|
||||
# use lsb_release (Linux Standard Base) when available
|
||||
LSB_RELEASE=`which lsb_release 2>/dev/null`
|
||||
if [ 0 -eq $? ]; then
|
||||
OS_NAME=`${LSB_RELEASE} -i -s`
|
||||
OS_VERSION=`${LSB_RELEASE} -r -s`
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Unknown OS : $OS_NAME"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "#define OS_NAME \"$OS_NAME\"" >> ${CONFIGFILE}
|
||||
echo "#define OS_VERSION \"$OS_NAME/$OS_VERSION\"" >> ${CONFIGFILE}
|
||||
echo "#define OS_URL \"${OS_URL}\"" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* full path of the file database */" >> ${CONFIGFILE}
|
||||
echo "#define DEFAULT_DB_PATH \"${DB_PATH}\"" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* full path of the log directory */" >> ${CONFIGFILE}
|
||||
echo "#define DEFAULT_LOG_PATH \"${LOG_PATH}\"" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* Comment the following line to use home made daemonize() func instead" >> ${CONFIGFILE}
|
||||
echo " * of BSD daemon() */" >> ${CONFIGFILE}
|
||||
echo "#define USE_DAEMON" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* Enable if the system inotify.h exists. Otherwise our own inotify.h will be used. */" >> ${CONFIGFILE}
|
||||
if [ -f /usr/include/sys/inotify.h ]; then
|
||||
echo "#define HAVE_INOTIFY_H" >> ${CONFIGFILE}
|
||||
else
|
||||
echo "/*#define HAVE_INOTIFY_H*/" >> ${CONFIGFILE}
|
||||
fi
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* Enable if the system iconv.h exists. ID3 tag reading in various character sets will not work properly otherwise. */" >> ${CONFIGFILE}
|
||||
if [ -f /usr/include/iconv.h ]; then
|
||||
echo "#define HAVE_ICONV_H" >> ${CONFIGFILE}
|
||||
else
|
||||
echo -e "\nWARNING!! Iconv support not found. ID3 tag reading may not work."
|
||||
echo "/*#define HAVE_ICONV_H*/" >> ${CONFIGFILE}
|
||||
fi
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* Enable if the system libintl.h exists for NLS support. */" >> ${CONFIGFILE}
|
||||
if [ -f /usr/include/libintl.h ]; then
|
||||
echo "#define ENABLE_NLS" >> ${CONFIGFILE}
|
||||
else
|
||||
echo "/*#define ENABLE_NLS*/" >> ${CONFIGFILE}
|
||||
fi
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "/* Enable NETGEAR-specific tweaks. */" >> ${CONFIGFILE}
|
||||
echo "${NETGEAR}" >> ${CONFIGFILE}
|
||||
echo "/* Enable ReadyNAS-specific tweaks. */" >> ${CONFIGFILE}
|
||||
echo "${READYNAS}" >> ${CONFIGFILE}
|
||||
echo "/* Compile in TiVo support. */" >> ${CONFIGFILE}
|
||||
echo "${TIVO}" >> ${CONFIGFILE}
|
||||
echo "/* Enable PnPX support. */" >> ${CONFIGFILE}
|
||||
echo "${PNPX}" >> ${CONFIGFILE}
|
||||
echo "" >> ${CONFIGFILE}
|
||||
|
||||
echo "#endif" >> ${CONFIGFILE}
|
||||
|
||||
exit 0
|
203
getifaddr.c
203
getifaddr.c
@ -43,19 +43,82 @@
|
||||
#include <sys/sockio.h>
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#if HAVE_GETIFADDRS
|
||||
#include <ifaddrs.h>
|
||||
#ifdef __linux__
|
||||
#ifndef AF_LINK
|
||||
#define AF_LINK AF_INET
|
||||
#endif
|
||||
#else
|
||||
#include <net/if_dl.h>
|
||||
#endif
|
||||
#endif
|
||||
#include "getifaddr.h"
|
||||
#include "log.h"
|
||||
|
||||
static uint32_t
|
||||
get_netmask(struct sockaddr_in *netmask)
|
||||
{
|
||||
uint32_t mask;
|
||||
int i;
|
||||
|
||||
if (!netmask)
|
||||
return 0;
|
||||
mask = ntohl(netmask->sin_addr.s_addr);
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if ((mask >> i) & 1)
|
||||
break;
|
||||
}
|
||||
mask = 32 - i;
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
int
|
||||
getifaddr(const char * ifname, char * buf, int len)
|
||||
{
|
||||
/* SIOCGIFADDR struct ifreq * */
|
||||
uint32_t mask = 0;
|
||||
int i;
|
||||
#if HAVE_GETIFADDRS
|
||||
struct ifaddrs *ifap, *p;
|
||||
struct sockaddr_in *addr_in;
|
||||
|
||||
if( getifaddrs(&ifap) != 0 )
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "getifaddrs(): %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
for( p = ifap; p != NULL; p = p->ifa_next )
|
||||
{
|
||||
if( p->ifa_addr->sa_family == AF_INET )
|
||||
{
|
||||
if( strcmp(p->ifa_name, ifname) != 0 )
|
||||
continue;
|
||||
addr_in = (struct sockaddr_in *)p->ifa_addr;
|
||||
if(!inet_ntop(AF_INET, &addr_in->sin_addr, buf, len))
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "inet_ntop(): %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
addr_in = (struct sockaddr_in *)p->ifa_netmask;
|
||||
mask = get_netmask(addr_in);
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeifaddrs(ifap);
|
||||
if( !p )
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "Network interface %s not found\n", ifname);
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
int s;
|
||||
struct ifreq ifr;
|
||||
int ifrlen;
|
||||
struct sockaddr_in * addr;
|
||||
uint32_t mask;
|
||||
int i;
|
||||
|
||||
ifrlen = sizeof(ifr);
|
||||
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
@ -81,22 +144,17 @@ getifaddr(const char * ifname, char * buf, int len)
|
||||
if(ioctl(s, SIOCGIFNETMASK, &ifr, &ifrlen) == 0)
|
||||
{
|
||||
addr = (struct sockaddr_in *)&ifr.ifr_netmask;
|
||||
mask = ntohl(addr->sin_addr.s_addr);
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if ((mask >> i) & 1)
|
||||
break;
|
||||
}
|
||||
mask = 32 - i;
|
||||
if (mask)
|
||||
{
|
||||
i = strlen(buf);
|
||||
snprintf(buf+i, len-i, "/%u", mask);
|
||||
}
|
||||
mask = get_netmask(addr);
|
||||
}
|
||||
else
|
||||
DPRINTF(E_ERROR, L_GENERAL, "ioctl(s, SIOCGIFNETMASK, ...): %s\n", strerror(errno));
|
||||
close(s);
|
||||
#endif
|
||||
if (mask)
|
||||
{
|
||||
i = strlen(buf);
|
||||
snprintf(buf+i, len-i, "/%u", mask);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -104,12 +162,42 @@ int
|
||||
getsysaddr(char * buf, int len)
|
||||
{
|
||||
int i;
|
||||
uint32_t mask = 0;
|
||||
int ret = -1;
|
||||
#if HAVE_GETIFADDRS
|
||||
struct ifaddrs *ifap, *p;
|
||||
struct sockaddr_in *addr_in;
|
||||
uint8_t a;
|
||||
|
||||
if( getifaddrs(&ifap) != 0 )
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "getifaddrs(): %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
for( p = ifap; p != NULL; p = p->ifa_next )
|
||||
{
|
||||
if (p->ifa_addr->sa_family == AF_INET)
|
||||
{
|
||||
addr_in = (struct sockaddr_in *)p->ifa_addr;
|
||||
a = (htonl(addr_in->sin_addr.s_addr) >> 0x18) & 0xFF;
|
||||
if( a == 127 )
|
||||
continue;
|
||||
if(!inet_ntop(AF_INET, &addr_in->sin_addr, buf, len))
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "inet_ntop(): %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
addr_in = (struct sockaddr_in *)p->ifa_netmask;
|
||||
mask = get_netmask(addr_in);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeifaddrs(ifap);
|
||||
#else
|
||||
int s = socket(PF_INET, SOCK_STREAM, 0);
|
||||
struct sockaddr_in addr;
|
||||
struct ifreq ifr;
|
||||
uint32_t mask;
|
||||
int ret = -1;
|
||||
|
||||
for (i=1; i > 0; i++)
|
||||
{
|
||||
ifr.ifr_ifindex = i;
|
||||
@ -128,24 +216,19 @@ getsysaddr(char * buf, int len)
|
||||
close(s);
|
||||
break;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
memcpy(&addr, &ifr.ifr_netmask, sizeof(addr));
|
||||
mask = ntohl(addr.sin_addr.s_addr);
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if ((mask >> i) & 1)
|
||||
break;
|
||||
}
|
||||
mask = 32 - i;
|
||||
if (mask)
|
||||
{
|
||||
i = strlen(buf);
|
||||
snprintf(buf+i, len-i, "/%u", mask);
|
||||
}
|
||||
mask = get_netmask(&addr);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
close(s);
|
||||
#endif
|
||||
|
||||
if (mask)
|
||||
{
|
||||
i = strlen(buf);
|
||||
snprintf(buf+i, len-i, "/%u", mask);
|
||||
}
|
||||
|
||||
return(ret);
|
||||
}
|
||||
@ -153,11 +236,55 @@ getsysaddr(char * buf, int len)
|
||||
int
|
||||
getsyshwaddr(char * buf, int len)
|
||||
{
|
||||
struct if_nameindex *ifaces, *if_idx;
|
||||
unsigned char mac[6];
|
||||
int ret = -1;
|
||||
#if HAVE_GETIFADDRS
|
||||
struct ifaddrs *ifap, *p;
|
||||
struct sockaddr_in *addr_in;
|
||||
uint8_t a;
|
||||
|
||||
if( getifaddrs(&ifap) != 0 )
|
||||
{
|
||||
DPRINTF(E_ERROR, L_GENERAL, "getifaddrs(): %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
for( p = ifap; p != NULL; p = p->ifa_next )
|
||||
{
|
||||
if (p->ifa_addr->sa_family == AF_LINK)
|
||||
{
|
||||
addr_in = (struct sockaddr_in *)p->ifa_addr;
|
||||
a = (htonl(addr_in->sin_addr.s_addr) >> 0x18) & 0xFF;
|
||||
if( a == 127 )
|
||||
continue;
|
||||
#ifdef __linux__
|
||||
struct ifreq ifr;
|
||||
int fd;
|
||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if( fd < 0 )
|
||||
continue;
|
||||
strncpy(ifr.ifr_name, p->ifa_name, IFNAMSIZ);
|
||||
if( ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 )
|
||||
{
|
||||
close(fd);
|
||||
continue;
|
||||
}
|
||||
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
|
||||
#else
|
||||
struct sockaddr_dl *sdl;
|
||||
sdl = (struct sockaddr_dl*)p->ifa_addr;
|
||||
memcpy(mac, LLADDR(sdl), sdl->sdl_alen);
|
||||
#endif
|
||||
if( MACADDR_IS_ZERO(mac) )
|
||||
continue;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeifaddrs(ifap);
|
||||
#else
|
||||
struct if_nameindex *ifaces, *if_idx;
|
||||
struct ifreq ifr;
|
||||
int fd;
|
||||
int ret = -1;
|
||||
|
||||
memset(&mac, '\0', sizeof(mac));
|
||||
/* Get the spatially unique node identifier */
|
||||
@ -180,25 +307,21 @@ getsyshwaddr(char * buf, int len)
|
||||
continue;
|
||||
if( MACADDR_IS_ZERO(ifr.ifr_hwaddr.sa_data) )
|
||||
continue;
|
||||
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
if_freenameindex(ifaces);
|
||||
close(fd);
|
||||
|
||||
#endif
|
||||
if(ret == 0)
|
||||
{
|
||||
if(len > 12)
|
||||
{
|
||||
memmove(mac, ifr.ifr_hwaddr.sa_data, 6);
|
||||
sprintf(buf, "%02x%02x%02x%02x%02x%02x",
|
||||
mac[0]&0xFF, mac[1]&0xFF, mac[2]&0xFF,
|
||||
mac[3]&0xFF, mac[4]&0xFF, mac[5]&0xFF);
|
||||
}
|
||||
else if(len == 6)
|
||||
{
|
||||
memmove(buf, ifr.ifr_hwaddr.sa_data, 6);
|
||||
}
|
||||
memmove(buf, mac, 6);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
* The resize functions come from the resize_image project, at http://www.golac.fr/Image-Resizer
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -33,7 +34,11 @@
|
||||
#include <sys/types.h>
|
||||
#include <setjmp.h>
|
||||
#include <jpeglib.h>
|
||||
#ifdef HAVE_MACHINE_ENDIAN_H
|
||||
#include <machine/endian.h>
|
||||
#else
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
#include "upnpreplyparse.h"
|
||||
#include "image_utils.h"
|
||||
@ -380,8 +385,7 @@ image_get_jpeg_date_xmp(const char * path, char ** date)
|
||||
}
|
||||
}
|
||||
fclose(img);
|
||||
if( data )
|
||||
free(data);
|
||||
free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -463,8 +467,7 @@ image_new_from_jpeg(const char * path, int is_file, const char * buf, int size,
|
||||
fclose(file);
|
||||
if( vimage )
|
||||
{
|
||||
if( vimage->buf )
|
||||
free(vimage->buf);
|
||||
free(vimage->buf);
|
||||
free(vimage);
|
||||
}
|
||||
return NULL;
|
||||
|
@ -16,6 +16,8 @@
|
||||
* along with MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_INOTIFY
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@ -216,8 +218,7 @@ inotify_remove_watches(int fd)
|
||||
{
|
||||
last_w = w;
|
||||
inotify_rm_watch(fd, w->wd);
|
||||
if( w->path )
|
||||
free(w->path);
|
||||
free(w->path);
|
||||
rm_watches++;
|
||||
w = w->next;
|
||||
free(last_w);
|
||||
@ -729,3 +730,4 @@ quitting:
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
#ifdef HAVE_INOTIFY
|
||||
int
|
||||
inotify_remove_file(const char * path);
|
||||
|
||||
void *
|
||||
start_inotify();
|
||||
#endif
|
||||
|
103
metadata.c
103
metadata.c
@ -19,21 +19,61 @@
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <libgen.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "config.h"
|
||||
#include <libexif/exif-loader.h>
|
||||
#include "image_utils.h"
|
||||
#include "tagutils/tagutils.h"
|
||||
#include <jpeglib.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#if HAVE_FFMPEG_LIBAVUTIL_AVUTIL_H
|
||||
#include <ffmpeg/libavutil/avutil.h>
|
||||
#elif HAVE_LIBAV_LIBAVUTIL_AVUTIL_H
|
||||
#include <libav/libavutil/avutil.h>
|
||||
#elif HAVE_LIBAVUTIL_AVUTIL_H
|
||||
#include <libavutil/avutil.h>
|
||||
#elif HAVE_FFMPEG_AVUTIL_H
|
||||
#include <ffmpeg/avutil.h>
|
||||
#elif HAVE_LIBAV_AVUTIL_H
|
||||
#include <libav/avutil.h>
|
||||
#elif HAVE_AVUTIL_H
|
||||
#include <avutil.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_FFMPEG_LIBAVCODEC_AVCODEC_H
|
||||
#include <ffmpeg/libavcodec/avcodec.h>
|
||||
#elif HAVE_LIBAV_LIBAVCODEC_AVCODEC_H
|
||||
#include <libav/libavcodec/avcodec.h>
|
||||
#elif HAVE_LIBAVCODEC_AVCODEC_H
|
||||
#include <libavcodec/avcodec.h>
|
||||
#elif HAVE_FFMPEG_AVCODEC_H
|
||||
#include <ffmpeg/avcodec.h>
|
||||
#elif HAVE_LIBAV_AVCODEC_H
|
||||
#include <libav/avcodec.h>
|
||||
#elif HAVE_AVCODEC_H
|
||||
#include <avcodec.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_FFMPEG_LIBAVFORMAT_AVFORMAT_H
|
||||
#include <ffmpeg/libavformat/avformat.h>
|
||||
#elif HAVE_LIBAV_LIBAVFORMAT_AVFORMAT_H
|
||||
#include <libav/libavformat/avformat.h>
|
||||
#elif HAVE_LIBAVFORMAT_AVFORMAT_H
|
||||
#include <libavformat/avformat.h>
|
||||
#elif HAVE_FFMPEG_AVFORMAT_H
|
||||
#include <ffmpeg/avformat.h>
|
||||
#elif HAVE_LIBAV_LIBAVFORMAT_H
|
||||
#include <libav/avformat.h>
|
||||
#elif HAVE_AVFORMAT_H
|
||||
#include <avformat.h>
|
||||
#include "tagutils/tagutils.h"
|
||||
#endif
|
||||
|
||||
#include "upnpglobalvars.h"
|
||||
#include "upnpreplyparse.h"
|
||||
@ -150,7 +190,7 @@ is_tivo_file(const char * path)
|
||||
void
|
||||
check_for_captions(const char * path, sqlite_int64 detailID)
|
||||
{
|
||||
char *file = malloc(PATH_MAX);
|
||||
char *file = malloc(MAXPATHLEN);
|
||||
char *id = NULL;
|
||||
|
||||
sprintf(file, "%s", path);
|
||||
@ -655,10 +695,11 @@ GetVideoMetadata(const char * path, char * name)
|
||||
enum audio_profiles audio_profile = PROFILE_AUDIO_UNKNOWN;
|
||||
char fourcc[4];
|
||||
sqlite_int64 album_art = 0;
|
||||
char nfo[PATH_MAX], *ext;
|
||||
char nfo[MAXPATHLEN], *ext;
|
||||
struct song_metadata video;
|
||||
metadata_t m;
|
||||
uint32_t free_flags = 0xFFFFFFFF;
|
||||
char *path_cpy, *basepath;
|
||||
|
||||
memset(&m, '\0', sizeof(m));
|
||||
memset(&video, '\0', sizeof(video));
|
||||
@ -698,12 +739,15 @@ GetVideoMetadata(const char * path, char * name)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
/* This must not be a video file. */
|
||||
path_cpy = strdup(path);
|
||||
basepath = basename(path_cpy);
|
||||
if( !vc )
|
||||
{
|
||||
/* This must not be a video file. */
|
||||
av_close_input_file(ctx);
|
||||
if( !is_audio(path) )
|
||||
DPRINTF(E_DEBUG, L_METADATA, "File %s does not contain a video stream.\n", basename(path));
|
||||
DPRINTF(E_DEBUG, L_METADATA, "File %s does not contain a video stream.\n", basepath);
|
||||
free(path_cpy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -819,7 +863,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
int off;
|
||||
int duration, hours, min, sec, ms;
|
||||
ts_timestamp_t ts_timestamp = NONE;
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Container: '%s' [%s]\n", ctx->iformat->name, basename(path));
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Container: '%s' [%s]\n", ctx->iformat->name, basepath);
|
||||
asprintf(&m.resolution, "%dx%d", vc->width, vc->height);
|
||||
if( ctx->bit_rate > 8 )
|
||||
asprintf(&m.bitrate, "%u", ctx->bit_rate / 8);
|
||||
@ -880,7 +924,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
int raw_packet_size;
|
||||
int dlna_ts_present = dlna_timestamp_is_present(path, &raw_packet_size);
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is %s MPEG2 TS packet size %d\n",
|
||||
video_stream, basename(path), m.resolution, raw_packet_size);
|
||||
video_stream, basepath, m.resolution, raw_packet_size);
|
||||
off += sprintf(m.dlna_pn+off, "TS_");
|
||||
if( (vc->width >= 1280) &&
|
||||
(vc->height >= 720) )
|
||||
@ -906,7 +950,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else if( raw_packet_size != MPEG_TS_PACKET_LENGTH )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Unsupported DLNA TS packet size [%d] (%s)\n",
|
||||
raw_packet_size, basename(path));
|
||||
raw_packet_size, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -928,7 +972,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else if( strcmp(ctx->iformat->name, "mpeg") == 0 )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is %s MPEG2 PS\n",
|
||||
video_stream, basename(path), m.resolution);
|
||||
video_stream, basepath, m.resolution);
|
||||
off += sprintf(m.dlna_pn+off, "PS_");
|
||||
if( (vc->height == 576) ||
|
||||
(vc->height == 288) )
|
||||
@ -940,7 +984,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s [%s] is %s non-DLNA MPEG2\n",
|
||||
video_stream, basename(path), ctx->iformat->name, m.resolution);
|
||||
video_stream, basepath, ctx->iformat->name, m.resolution);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -1019,7 +1063,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
vc->profile != FF_PROFILE_H264_MAIN )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Unknown AVC profile %d; assuming MP. [%s]\n",
|
||||
vc->profile, basename(path));
|
||||
vc->profile, basepath);
|
||||
}
|
||||
if( vc->width <= 720 &&
|
||||
vc->height <= 576 &&
|
||||
@ -1036,7 +1080,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Unsupported h.264 video profile! [%s, %dx%d, %dbps : %s]\n",
|
||||
m.dlna_pn, vc->width, vc->height, vc->bit_rate, basename(path));
|
||||
m.dlna_pn, vc->width, vc->height, vc->bit_rate, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -1053,7 +1097,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Unsupported h.264 HP video profile! [%dbps, %d audio : %s]\n",
|
||||
vc->bit_rate, audio_profile, basename(path));
|
||||
vc->bit_rate, audio_profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -1077,7 +1121,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for %s file [%s]\n",
|
||||
m.dlna_pn, basename(path));
|
||||
m.dlna_pn, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1095,7 +1139,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
else if( raw_packet_size != MPEG_TS_PACKET_LENGTH )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Unsupported DLNA TS packet size [%d] (%s)\n",
|
||||
raw_packet_size, basename(path));
|
||||
raw_packet_size, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -1223,7 +1267,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
if( strlen(m.dlna_pn) <= 11 )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for %s file %s\n",
|
||||
m.dlna_pn, basename(path));
|
||||
m.dlna_pn, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
}
|
||||
@ -1239,7 +1283,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "AVC profile [%d] not recognized for file %s\n",
|
||||
vc->profile, basename(path));
|
||||
vc->profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1252,7 +1296,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
}
|
||||
if( m.dlna_pn )
|
||||
sprintf(m.dlna_pn+off, ";%s", dlna_no_conv);
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is h.264\n", video_stream, basename(path));
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is h.264\n", video_stream, basepath);
|
||||
break;
|
||||
case CODEC_ID_MPEG4:
|
||||
fourcc[0] = vc->codec_tag & 0xff;
|
||||
@ -1260,7 +1304,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
fourcc[2] = vc->codec_tag>>16 & 0xff;
|
||||
fourcc[3] = vc->codec_tag>>24 & 0xff;
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is MPEG4 [%c%c%c%c/0x%X]\n",
|
||||
video_stream, basename(path),
|
||||
video_stream, basepath,
|
||||
isprint(fourcc[0]) ? fourcc[0] : '_',
|
||||
isprint(fourcc[1]) ? fourcc[1] : '_',
|
||||
isprint(fourcc[2]) ? fourcc[2] : '_',
|
||||
@ -1285,7 +1329,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for MPEG4-P2 3GP/0x%X file %s\n",
|
||||
ac->codec_id, basename(path));
|
||||
ac->codec_id, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1336,7 +1380,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
}
|
||||
m.dlna_pn = malloc(64);
|
||||
off = sprintf(m.dlna_pn, "WMV");
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is VC1\n", video_stream, basename(path));
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is VC1\n", video_stream, basepath);
|
||||
asprintf(&m.mime, "video/x-ms-wmv");
|
||||
if( (vc->width <= 176) &&
|
||||
(vc->height <= 144) &&
|
||||
@ -1353,7 +1397,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for WMVSPLL/0x%X file %s\n",
|
||||
audio_profile, basename(path));
|
||||
audio_profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1375,7 +1419,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for WMVSPML/0x%X file %s\n",
|
||||
audio_profile, basename(path));
|
||||
audio_profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1399,7 +1443,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for WMVMED/0x%X file %s\n",
|
||||
audio_profile, basename(path));
|
||||
audio_profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1420,7 +1464,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
break;
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "No DLNA profile found for WMVHIGH/0x%X file %s\n",
|
||||
audio_profile, basename(path));
|
||||
audio_profile, basepath);
|
||||
free(m.dlna_pn);
|
||||
m.dlna_pn = NULL;
|
||||
break;
|
||||
@ -1433,7 +1477,7 @@ GetVideoMetadata(const char * path, char * name)
|
||||
asprintf(&m.mime, "video/x-msvideo");
|
||||
default:
|
||||
DPRINTF(E_DEBUG, L_METADATA, "Stream %d of %s is %s [type %d]\n",
|
||||
video_stream, basename(path), m.resolution, vc->codec_id);
|
||||
video_stream, basepath, m.resolution, vc->codec_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1551,6 +1595,7 @@ video_no_dlna:
|
||||
check_for_captions(path, ret);
|
||||
}
|
||||
free_metadata(&m, free_flags);
|
||||
free(path_cpy);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
14
minidlna.c
14
minidlna.c
@ -53,14 +53,15 @@
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <pwd.h>
|
||||
@ -836,7 +837,7 @@ init(int argc, char * * argv)
|
||||
}
|
||||
|
||||
/* set signal handler */
|
||||
signal(SIGCLD, SIG_IGN);
|
||||
signal(SIGCHLD, SIG_IGN);
|
||||
memset(&sa, 0, sizeof(struct sigaction));
|
||||
sa.sa_handler = sigterm;
|
||||
if (sigaction(SIGTERM, &sa, NULL))
|
||||
@ -922,7 +923,7 @@ main(int argc, char * * argv)
|
||||
{
|
||||
if( i < 0 )
|
||||
{
|
||||
DPRINTF(E_WARN, L_GENERAL, "Creating new database...\n");
|
||||
DPRINTF(E_WARN, L_GENERAL, "Creating new database at %s/files.db\n", db_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -970,12 +971,13 @@ main(int argc, char * * argv)
|
||||
start_scanner();
|
||||
#endif
|
||||
}
|
||||
#ifdef HAVE_INOTIFY
|
||||
if( sqlite3_threadsafe() && sqlite3_libversion_number() >= 3005001 &&
|
||||
GETFLAG(INOTIFY_MASK) && pthread_create(&inotify_thread, NULL, start_inotify, NULL) )
|
||||
{
|
||||
DPRINTF(E_FATAL, L_GENERAL, "ERROR: pthread_create() failed for start_inotify.\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
sudp = OpenAndConfSSDPReceiveSocket(n_lan_addr, lan_addr);
|
||||
if(sudp < 0)
|
||||
{
|
||||
|
15
options.c
15
options.c
@ -76,7 +76,7 @@ readoptionsfile(const char * fname)
|
||||
int i;
|
||||
enum upnpconfigoptions id;
|
||||
|
||||
if(!fname || (strlen(fname) == 0))
|
||||
if(!fname || *fname == '\0')
|
||||
return -1;
|
||||
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
@ -155,8 +155,17 @@ readoptionsfile(const char * fname)
|
||||
}
|
||||
else
|
||||
{
|
||||
num_options += 1;
|
||||
ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option));
|
||||
num_options++;
|
||||
t = realloc(ary_options, num_options * sizeof(struct option));
|
||||
if(!t)
|
||||
{
|
||||
fprintf(stderr, "memory allocation error: %s=%s\n",
|
||||
name, value);
|
||||
num_options--;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
ary_options = (struct option *)t;
|
||||
|
||||
ary_options[num_options-1].id = id;
|
||||
strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN);
|
||||
|
@ -102,10 +102,7 @@ fill_playlists()
|
||||
if( sql_get_table(db, sql_buf, &result, &rows, NULL) != SQLITE_OK )
|
||||
return -1;
|
||||
if( !rows )
|
||||
{
|
||||
sqlite3_free_table(result);
|
||||
return 0;
|
||||
}
|
||||
goto done;
|
||||
|
||||
rows++;
|
||||
for( i=3; i<rows*3; i++ )
|
||||
@ -221,6 +218,7 @@ found:
|
||||
}
|
||||
sql_exec(db, "UPDATE PLAYLISTS set FOUND = %d where ID = %lld", found, plID);
|
||||
}
|
||||
done:
|
||||
sqlite3_free_table(result);
|
||||
DPRINTF(E_WARN, L_SCANNER, "Finished parsing playlists.\n");
|
||||
|
||||
|
73
scanner.c
73
scanner.c
@ -23,6 +23,7 @@
|
||||
#include <locale.h>
|
||||
#include <libgen.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
@ -43,6 +44,12 @@
|
||||
#include "albumart.h"
|
||||
#include "log.h"
|
||||
|
||||
#if SCANDIR_CONST
|
||||
typedef const struct dirent scan_filter;
|
||||
#else
|
||||
typedef struct dirent scan_filter;
|
||||
#endif
|
||||
|
||||
int valid_cache = 0;
|
||||
|
||||
struct virtual_item
|
||||
@ -112,7 +119,7 @@ insert_container(const char * item, const char * rootParent, const char * refID,
|
||||
ret = sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', %Q, %"PRId64", 'container.%s', '%q')",
|
||||
" ('%s$%llX', '%s', %Q, %lld, 'container.%s', '%q')",
|
||||
rootParent, *parentID, rootParent, refID, detailID, class, item);
|
||||
}
|
||||
sqlite3_free(result);
|
||||
@ -138,7 +145,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
static struct virtual_item last_camdate;
|
||||
static sqlite_int64 last_all_objectID = 0;
|
||||
|
||||
asprintf(&sql, "SELECT DATE, CREATOR from DETAILS where ID = %"PRId64, detailID);
|
||||
asprintf(&sql, "SELECT DATE, CREATOR from DETAILS where ID = %lld", detailID);
|
||||
ret = sql_get_table(db, sql, &result, &row, &cols);
|
||||
free(sql);
|
||||
if( ret == SQLITE_OK )
|
||||
@ -164,7 +171,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
else
|
||||
{
|
||||
insert_container(date_taken, IMAGE_DATE_ID, NULL, "album.photoAlbum", NULL, NULL, NULL, &objectID, &parentID);
|
||||
sprintf(last_date.parentID, IMAGE_DATE_ID"$%"PRIX64, parentID);
|
||||
sprintf(last_date.parentID, IMAGE_DATE_ID"$%llX", parentID);
|
||||
last_date.objectID = objectID;
|
||||
strcpy(last_date.name, date_taken);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached date item: %s/%s/%X\n", last_date.name, last_date.parentID, last_date.objectID);
|
||||
@ -172,7 +179,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_date.parentID, last_date.objectID, last_date.parentID, refID, class, detailID, name);
|
||||
|
||||
if( cam )
|
||||
@ -187,7 +194,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
if( !valid_cache || strcmp(camera, last_cam.name) != 0 )
|
||||
{
|
||||
insert_container(camera, IMAGE_CAMERA_ID, NULL, "storageFolder", NULL, NULL, NULL, &objectID, &parentID);
|
||||
sprintf(last_cam.parentID, IMAGE_CAMERA_ID"$%"PRIX64, parentID);
|
||||
sprintf(last_cam.parentID, IMAGE_CAMERA_ID"$%llX", parentID);
|
||||
strncpy(last_cam.name, camera, 255);
|
||||
last_camdate.name[0] = '\0';
|
||||
}
|
||||
@ -199,7 +206,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
else
|
||||
{
|
||||
insert_container(date_taken, last_cam.parentID, NULL, "album.photoAlbum", NULL, NULL, NULL, &objectID, &parentID);
|
||||
sprintf(last_camdate.parentID, "%s$%"PRIX64, last_cam.parentID, parentID);
|
||||
sprintf(last_camdate.parentID, "%s$%llX", last_cam.parentID, parentID);
|
||||
last_camdate.objectID = objectID;
|
||||
strcpy(last_camdate.name, date_taken);
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached camdate item: %s/%s/%s/%X\n", camera, last_camdate.name, last_camdate.parentID, last_camdate.objectID);
|
||||
@ -207,7 +214,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_camdate.parentID, last_camdate.objectID, last_camdate.parentID, refID, class, detailID, name);
|
||||
/* All Images */
|
||||
if( !last_all_objectID )
|
||||
@ -217,12 +224,12 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('"IMAGE_ALL_ID"$%"PRIX64"', '"IMAGE_ALL_ID"', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('"IMAGE_ALL_ID"$%llX', '"IMAGE_ALL_ID"', '%s', '%s', %lld, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
}
|
||||
else if( strstr(class, "audioItem") )
|
||||
{
|
||||
asprintf(&sql, "SELECT ALBUM, ARTIST, GENRE, ALBUM_ART from DETAILS where ID = %"PRId64, detailID);
|
||||
asprintf(&sql, "SELECT ALBUM, ARTIST, GENRE, ALBUM_ART from DETAILS where ID = %lld", detailID);
|
||||
ret = sql_get_table(db, sql, &result, &row, &cols);
|
||||
free(sql);
|
||||
if( ret != SQLITE_OK )
|
||||
@ -261,7 +268,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_album.parentID, last_album.objectID, last_album.parentID, refID, class, detailID, name);
|
||||
}
|
||||
if( artist )
|
||||
@ -269,12 +276,12 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
if( !valid_cache || strcmp(artist, last_artist.name) != 0 )
|
||||
{
|
||||
insert_container(artist, MUSIC_ARTIST_ID, NULL, "person.musicArtist", NULL, genre, NULL, &objectID, &parentID);
|
||||
sprintf(last_artist.parentID, MUSIC_ARTIST_ID"$%"PRIX64, parentID);
|
||||
sprintf(last_artist.parentID, MUSIC_ARTIST_ID"$%llX", parentID);
|
||||
strcpy(last_artist.name, artist);
|
||||
last_artistAlbum.name[0] = '\0';
|
||||
/* Add this file to the "- All Albums -" container as well */
|
||||
insert_container(_("- All Albums -"), last_artist.parentID, NULL, "album", artist, genre, NULL, &objectID, &parentID);
|
||||
sprintf(last_artistAlbumAll.parentID, "%s$%"PRIX64, last_artist.parentID, parentID);
|
||||
sprintf(last_artistAlbumAll.parentID, "%s$%llX", last_artist.parentID, parentID);
|
||||
last_artistAlbumAll.objectID = objectID;
|
||||
}
|
||||
else
|
||||
@ -290,7 +297,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
{
|
||||
insert_container(album?album:_("Unknown Album"), last_artist.parentID, album?last_album.parentID:NULL,
|
||||
"album.musicAlbum", artist, genre, album_art, &objectID, &parentID);
|
||||
sprintf(last_artistAlbum.parentID, "%s$%"PRIX64, last_artist.parentID, parentID);
|
||||
sprintf(last_artistAlbum.parentID, "%s$%llX", last_artist.parentID, parentID);
|
||||
last_artistAlbum.objectID = objectID;
|
||||
strcpy(last_artistAlbum.name, album?album:_("Unknown Album"));
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached artist/album item: %s/%s/%X\n", last_artist.name, last_artist.parentID, last_artist.objectID);
|
||||
@ -298,12 +305,12 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_artistAlbum.parentID, last_artistAlbum.objectID, last_artistAlbum.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_artistAlbumAll.parentID, last_artistAlbumAll.objectID, last_artistAlbumAll.parentID, refID, class, detailID, name);
|
||||
}
|
||||
if( genre )
|
||||
@ -311,12 +318,12 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
if( !valid_cache || strcmp(genre, last_genre.name) != 0 )
|
||||
{
|
||||
insert_container(genre, MUSIC_GENRE_ID, NULL, "genre.musicGenre", NULL, NULL, NULL, &objectID, &parentID);
|
||||
sprintf(last_genre.parentID, MUSIC_GENRE_ID"$%"PRIX64, parentID);
|
||||
sprintf(last_genre.parentID, MUSIC_GENRE_ID"$%llX", parentID);
|
||||
strcpy(last_genre.name, genre);
|
||||
last_genreArtist.name[0] = '\0';
|
||||
/* Add this file to the "- All Artists -" container as well */
|
||||
insert_container(_("- All Artists -"), last_genre.parentID, NULL, "person", NULL, genre, NULL, &objectID, &parentID);
|
||||
sprintf(last_genreArtistAll.parentID, "%s$%"PRIX64, last_genre.parentID, parentID);
|
||||
sprintf(last_genreArtistAll.parentID, "%s$%llX", last_genre.parentID, parentID);
|
||||
last_genreArtistAll.objectID = objectID;
|
||||
}
|
||||
else
|
||||
@ -331,7 +338,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
{
|
||||
insert_container(artist?artist:_("Unknown Artist"), last_genre.parentID, artist?last_artist.parentID:NULL,
|
||||
"person.musicArtist", NULL, genre, NULL, &objectID, &parentID);
|
||||
sprintf(last_genreArtist.parentID, "%s$%"PRIX64, last_genre.parentID, parentID);
|
||||
sprintf(last_genreArtist.parentID, "%s$%llX", last_genre.parentID, parentID);
|
||||
last_genreArtist.objectID = objectID;
|
||||
strcpy(last_genreArtist.name, artist?artist:_("Unknown Artist"));
|
||||
//DEBUG DPRINTF(E_DEBUG, L_SCANNER, "Creating cached genre/artist item: %s/%s/%X\n", last_genreArtist.name, last_genreArtist.parentID, last_genreArtist.objectID);
|
||||
@ -339,12 +346,12 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_genreArtist.parentID, last_genreArtist.objectID, last_genreArtist.parentID, refID, class, detailID, name);
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s$%"PRIX64"', '%s', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('%s$%llX', '%s', '%s', '%s', %lld, %Q)",
|
||||
last_genreArtistAll.parentID, last_genreArtistAll.objectID, last_genreArtistAll.parentID, refID, class, detailID, name);
|
||||
}
|
||||
/* All Music */
|
||||
@ -355,7 +362,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('"MUSIC_ALL_ID"$%"PRIX64"', '"MUSIC_ALL_ID"', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('"MUSIC_ALL_ID"$%llX', '"MUSIC_ALL_ID"', '%s', '%s', %lld, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
}
|
||||
else if( strstr(class, "videoItem") )
|
||||
@ -370,7 +377,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('"VIDEO_ALL_ID"$%"PRIX64"', '"VIDEO_ALL_ID"', '%s', '%s', %"PRId64", %Q)",
|
||||
" ('"VIDEO_ALL_ID"$%llX', '"VIDEO_ALL_ID"', '%s', '%s', %lld, %Q)",
|
||||
last_all_objectID++, refID, class, detailID, name);
|
||||
return;
|
||||
}
|
||||
@ -423,7 +430,7 @@ insert_directory(const char * name, const char * path, const char * base, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s', %Q, %"PRId64", '%s', '%q')",
|
||||
" ('%s', '%s', %Q, %lld, '%s', '%q')",
|
||||
id_buf, parent_buf, refID, detailID, class, strrchr(dir, '/')+1);
|
||||
if( (p = strrchr(id_buf, '$')) )
|
||||
*p = '\0';
|
||||
@ -444,10 +451,9 @@ insert_directory(const char * name, const char * path, const char * base, const
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, DETAIL_ID, CLASS, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', %Q, %"PRId64", '%s', '%q')",
|
||||
" ('%s%s$%X', '%s%s', %Q, %lld, '%s', '%q')",
|
||||
base, parentID, objectID, base, parentID, refID, detailID, class, name);
|
||||
if( refID )
|
||||
free(refID);
|
||||
free(refID);
|
||||
|
||||
return -1;
|
||||
}
|
||||
@ -492,8 +498,7 @@ insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
strcpy(class, "item.audioItem.musicTrack");
|
||||
detailID = GetAudioMetadata(path, name);
|
||||
}
|
||||
if( orig_name )
|
||||
free(orig_name);
|
||||
free(orig_name);
|
||||
if( !detailID )
|
||||
{
|
||||
DPRINTF(E_WARN, L_SCANNER, "Unsuccessful getting details for %s!\n", path);
|
||||
@ -505,7 +510,7 @@ insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s', '%s%s', '%s', %"PRId64", '%q')",
|
||||
" ('%s', '%s%s', '%s', %lld, '%q')",
|
||||
objectID, BROWSEDIR_ID, parentID, class, detailID, name);
|
||||
|
||||
if( *parentID )
|
||||
@ -524,7 +529,7 @@ insert_file(char * name, const char * path, const char * parentID, int object)
|
||||
sql_exec(db, "INSERT into OBJECTS"
|
||||
" (OBJECT_ID, PARENT_ID, REF_ID, CLASS, DETAIL_ID, NAME) "
|
||||
"VALUES"
|
||||
" ('%s%s$%X', '%s%s', '%s', '%s', %"PRId64", '%q')",
|
||||
" ('%s%s$%X', '%s%s', '%s', '%s', %lld, '%q')",
|
||||
base, parentID, object, base, parentID, objectID, class, detailID, name);
|
||||
|
||||
insert_containers(name, path, objectID, class, detailID);
|
||||
@ -655,7 +660,7 @@ sql_failed:
|
||||
}
|
||||
|
||||
int
|
||||
filter_audio(const struct dirent *d)
|
||||
filter_audio(scan_filter *d)
|
||||
{
|
||||
return ( (*d->d_name != '.') &&
|
||||
((d->d_type == DT_DIR) ||
|
||||
@ -669,7 +674,7 @@ filter_audio(const struct dirent *d)
|
||||
}
|
||||
|
||||
int
|
||||
filter_video(const struct dirent *d)
|
||||
filter_video(scan_filter *d)
|
||||
{
|
||||
return ( (*d->d_name != '.') &&
|
||||
((d->d_type == DT_DIR) ||
|
||||
@ -681,7 +686,7 @@ filter_video(const struct dirent *d)
|
||||
}
|
||||
|
||||
int
|
||||
filter_images(const struct dirent *d)
|
||||
filter_images(scan_filter *d)
|
||||
{
|
||||
return ( (*d->d_name != '.') &&
|
||||
((d->d_type == DT_DIR) ||
|
||||
@ -693,7 +698,7 @@ filter_images(const struct dirent *d)
|
||||
}
|
||||
|
||||
int
|
||||
filter_media(const struct dirent *d)
|
||||
filter_media(scan_filter *d)
|
||||
{
|
||||
return ( (*d->d_name != '.') &&
|
||||
((d->d_type == DT_DIR) ||
|
||||
|
53
sendfile.h
Normal file
53
sendfile.h
Normal file
@ -0,0 +1,53 @@
|
||||
#if defined(HAVE_LINUX_SENDFILE_API)
|
||||
|
||||
#include <sys/sendfile.h>
|
||||
|
||||
int sys_sendfile(int sock, int sendfd, off_t *offset, off_t len)
|
||||
{
|
||||
return sendfile(sock, sendfd, offset, len);
|
||||
}
|
||||
|
||||
#elif defined(HAVE_DARWIN_SENDFILE_API)
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
int sys_sendfile(int sock, int sendfd, off_t *offset, off_t len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sendfile(sendfd, sock, *offset, &len, NULL, 0);
|
||||
*offset += len;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_FREEBSD_SENDFILE_API)
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
int sys_sendfile(int sock, int sendfd, off_t *offset, off_t len)
|
||||
{
|
||||
int ret;
|
||||
size_t nbytes = len;
|
||||
|
||||
ret = sendfile(sendfd, sock, *offset, nbytes, NULL, &len, SF_MNOWAIT);
|
||||
*offset += len;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
int sys_sendfile(int sock, int sendfd, off_t *offset, off_t len)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
@ -19,9 +19,14 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef HAVE_MACHINE_ENDIAN_H
|
||||
#include <machine/endian.h>
|
||||
#else
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
|
@ -23,7 +23,11 @@
|
||||
|
||||
#define __PACKED__ __attribute__((packed))
|
||||
|
||||
#ifdef HAVE_MACHINE_ENDIAN_H
|
||||
#include <machine/endian.h>
|
||||
#else
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
typedef struct _GUID {
|
||||
__u32 l;
|
||||
|
@ -33,10 +33,10 @@ typedef enum {
|
||||
|
||||
static iconv_result
|
||||
do_iconv(const char* to_ces, const char* from_ces,
|
||||
char *inbuf, size_t inbytesleft,
|
||||
ICONV_CONST char *inbuf, size_t inbytesleft,
|
||||
char *outbuf_orig, size_t outbytesleft_orig)
|
||||
{
|
||||
#ifdef HAVE_ICONV_H
|
||||
#ifdef HAVE_ICONV
|
||||
size_t rc;
|
||||
iconv_result ret = ICONV_OK;
|
||||
|
||||
@ -65,9 +65,9 @@ do_iconv(const char* to_ces, const char* from_ces,
|
||||
iconv_close(cd);
|
||||
|
||||
return ret;
|
||||
#else // HAVE_ICONV_H
|
||||
#else // HAVE_ICONV
|
||||
return ICONV_FATAL;
|
||||
#endif // HAVE_ICONV_H
|
||||
#endif // HAVE_ICONV
|
||||
}
|
||||
|
||||
#define N_LANG_ALT 8
|
||||
|
@ -232,8 +232,7 @@ _get_mp3tags(char *file, struct song_metadata *psong)
|
||||
if((utf8_text) && (strncasecmp((char*)utf8_text, "iTun", 4) != 0))
|
||||
{
|
||||
// read comment
|
||||
if(utf8_text)
|
||||
free(utf8_text);
|
||||
free(utf8_text);
|
||||
|
||||
native_text = id3_field_getfullstring(&pid3frame->fields[3]);
|
||||
if(native_text)
|
||||
@ -241,16 +240,14 @@ _get_mp3tags(char *file, struct song_metadata *psong)
|
||||
utf8_text = (unsigned char*)id3_ucs4_utf8duplicate(native_text);
|
||||
if(utf8_text)
|
||||
{
|
||||
if (psong->comment)
|
||||
free(psong->comment);
|
||||
free(psong->comment);
|
||||
psong->comment = (char*)utf8_text;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(utf8_text)
|
||||
free(utf8_text);
|
||||
free(utf8_text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
#include <FLAC/metadata.h>
|
||||
|
||||
#include "../config.h"
|
||||
#ifdef HAVE_ICONV_H
|
||||
#ifdef HAVE_ICONV
|
||||
#include <iconv.h>
|
||||
#endif
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <libgen.h>
|
||||
|
||||
#define ROLE_NOUSE 0
|
||||
#define ROLE_START 1
|
||||
|
@ -274,8 +274,9 @@ rcvBeaconMessage(char * beacon)
|
||||
|
||||
if( strcasecmp(method, "broadcast") == 0 )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_TIVO, "Received new beacon: machine(%s) platform(%s) services(%s)\n",
|
||||
DPRINTF(E_DEBUG, L_TIVO, "Received new beacon: machine(%s/%s) platform(%s) services(%s)\n",
|
||||
machine ? machine : "-",
|
||||
identity ? identity : "-",
|
||||
platform ? platform : "-",
|
||||
services ? services : "-" );
|
||||
return 1;
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <string.h>
|
||||
#include <libgen.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "tivo_utils.h"
|
||||
#include "upnpglobalvars.h"
|
||||
|
@ -74,8 +74,7 @@ decodeString(char * string, int inplace)
|
||||
}
|
||||
if( inplace )
|
||||
{
|
||||
if( ns )
|
||||
free(ns);
|
||||
free(ns);
|
||||
return string;
|
||||
}
|
||||
else
|
||||
|
@ -584,7 +584,7 @@ static char *
|
||||
genXML(char * str, int * len, int * tmplen,
|
||||
const struct XMLElt * p)
|
||||
{
|
||||
u_int16_t i, j, k;
|
||||
uint16_t i, j, k;
|
||||
int top;
|
||||
const char * eltname, *s;
|
||||
char c;
|
||||
|
@ -340,10 +340,7 @@ static void upnp_event_prepare(struct upnp_event_notify * obj)
|
||||
obj->sub->uuid, obj->sub->seq,
|
||||
l, xml);
|
||||
obj->buffersize = obj->tosend;
|
||||
if(xml) {
|
||||
free(xml);
|
||||
xml = NULL;
|
||||
}
|
||||
free(xml);
|
||||
DPRINTF(E_DEBUG, L_HTTP, "Sending UPnP Event response:\n%s\n", obj->buffer);
|
||||
obj->state = ESending;
|
||||
}
|
||||
@ -468,9 +465,7 @@ void upnpevents_processfds(fd_set *readset, fd_set *writeset)
|
||||
free(obj->sub);
|
||||
}
|
||||
#endif
|
||||
if(obj->buffer) {
|
||||
free(obj->buffer);
|
||||
}
|
||||
free(obj->buffer);
|
||||
LIST_REMOVE(obj, entries);
|
||||
free(obj);
|
||||
}
|
||||
|
@ -48,7 +48,7 @@
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <linux/limits.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "upnpglobalvars.h"
|
||||
|
22
upnphttp.c
22
upnphttp.c
@ -54,6 +54,12 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/param.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "upnphttp.h"
|
||||
#include "upnpdescgen.h"
|
||||
@ -61,13 +67,6 @@
|
||||
#include "upnpsoap.h"
|
||||
#include "upnpevents.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <sys/sendfile.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "upnpglobalvars.h"
|
||||
#include "utils.h"
|
||||
#include "getifaddr.h"
|
||||
@ -79,6 +78,9 @@
|
||||
#include "tivo_utils.h"
|
||||
#include "tivo_commands.h"
|
||||
#endif
|
||||
|
||||
#include "sendfile.h"
|
||||
|
||||
//#define MAX_BUFFER_SIZE 4194304 // 4MB -- Too much?
|
||||
#define MAX_BUFFER_SIZE 2147483647 // 2GB -- Too much?
|
||||
#define MIN_BUFFER_SIZE 65536
|
||||
@ -1172,14 +1174,17 @@ send_file(struct upnphttp * h, int sendfd, off_t offset, off_t end_offset)
|
||||
off_t send_size;
|
||||
off_t ret;
|
||||
char *buf = NULL;
|
||||
#if HAVE_SENDFILE
|
||||
int try_sendfile = 1;
|
||||
#endif
|
||||
|
||||
while( offset < end_offset )
|
||||
{
|
||||
#if HAVE_SENDFILE
|
||||
if( try_sendfile )
|
||||
{
|
||||
send_size = ( ((end_offset - offset) < MAX_BUFFER_SIZE) ? (end_offset - offset + 1) : MAX_BUFFER_SIZE);
|
||||
ret = sendfile(h->socket, sendfd, &offset, send_size);
|
||||
ret = sys_sendfile(h->socket, sendfd, &offset, send_size);
|
||||
if( ret == -1 )
|
||||
{
|
||||
DPRINTF(E_DEBUG, L_HTTP, "sendfile error :: error no. %d [%s]\n", errno, strerror(errno));
|
||||
@ -1195,6 +1200,7 @@ send_file(struct upnphttp * h, int sendfd, off_t offset, off_t end_offset)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Fall back to regular I/O */
|
||||
if( !buf )
|
||||
buf = malloc(MIN_BUFFER_SIZE);
|
||||
|
@ -119,6 +119,10 @@ struct upnphttp {
|
||||
#define FLAG_FREE_OBJECT_ID 0x00000001
|
||||
#define FLAG_ROOT_CONTAINER 0x00000002
|
||||
|
||||
#ifndef MSG_MORE
|
||||
#define MSG_MORE 0
|
||||
#endif
|
||||
|
||||
/* New_upnphttp() */
|
||||
struct upnphttp *
|
||||
New_upnphttp(int);
|
||||
|
@ -353,7 +353,7 @@ static u_int32_t
|
||||
set_filter_flags(char * filter, struct upnphttp *h)
|
||||
{
|
||||
char *item, *saveptr = NULL;
|
||||
u_int32_t flags = 0;
|
||||
uint32_t flags = 0;
|
||||
|
||||
if( !filter || (strlen(filter) <= 1) )
|
||||
return 0xFFFFFFFF;
|
||||
|
7
utils.c
7
utils.c
@ -19,7 +19,7 @@
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <linux/limits.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
@ -193,6 +193,11 @@ make_dir(char * path, mode_t mode)
|
||||
do {
|
||||
c = '\0';
|
||||
|
||||
/* Before we do anything, skip leading /'s, so we don't bother
|
||||
* trying to create /. */
|
||||
while (*s == '/')
|
||||
++s;
|
||||
|
||||
/* Bypass leading non-'/'s and then subsequent '/'s. */
|
||||
while (*s) {
|
||||
if (*s == '/') {
|
||||
|
53
uuid.c
53
uuid.c
@ -28,22 +28,27 @@
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <string.h>
|
||||
#include <net/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#if HAVE_MACH_MACH_TIME_H
|
||||
#include <mach/mach_time.h>
|
||||
#elif HAVE_CLOCK_GETTIME_SYSCALL
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
#include "getifaddr.h"
|
||||
#include "log.h"
|
||||
|
||||
#define ETH_ALEN 6
|
||||
#ifndef NSEC_PER_SEC
|
||||
#define NSEC_PER_SEC 1000000000L
|
||||
#endif
|
||||
#define NSEC_PER_MSEC 1000000L
|
||||
|
||||
static u_int32_t clock_seq;
|
||||
static const u_int32_t clock_seq_max = 0x3fff; /* 14 bits */
|
||||
static uint32_t clock_seq;
|
||||
static const uint32_t clock_seq_max = 0x3fff; /* 14 bits */
|
||||
static int clock_seq_initialized;
|
||||
|
||||
unsigned long long
|
||||
@ -51,7 +56,17 @@ monotonic_us(void)
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
#if defined(HAVE_LIBRT)
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
#elif HAVE_CLOCK_GETTIME_SYSCALL
|
||||
syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts);
|
||||
#elif HAVE_MACH_MACH_TIME_H
|
||||
return mach_absolute_time();
|
||||
#else
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, 0);
|
||||
TIMEVAL_TO_TIMESPEC(&tv, &ts);
|
||||
#endif
|
||||
return ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000;
|
||||
}
|
||||
|
||||
@ -120,12 +135,12 @@ init_clockseq(void)
|
||||
int
|
||||
generate_uuid(unsigned char uuid_out[16])
|
||||
{
|
||||
static u_int64_t last_time_all;
|
||||
static uint64_t last_time_all;
|
||||
static unsigned int clock_seq_started;
|
||||
static char last_node[6] = { 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
struct timespec ts;
|
||||
u_int64_t time_all;
|
||||
uint64_t time_all;
|
||||
int inc_clock_seq = 0;
|
||||
|
||||
unsigned char mac[6];
|
||||
@ -162,8 +177,16 @@ generate_uuid(unsigned char uuid_out[16])
|
||||
* nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of
|
||||
* Gregorian reform to the Christian calendar).
|
||||
*/
|
||||
#if HAVE_LIBRT
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
#elif HAVE_CLOCK_GETTIME_SYSCALL
|
||||
syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts);
|
||||
time_all = ((u_int64_t)ts.tv_sec) * (NSEC_PER_SEC / 100);
|
||||
#else
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, 0);
|
||||
TIMEVAL_TO_TIMESPEC(&tv, &ts);
|
||||
#endif
|
||||
time_all = ((uint64_t)ts.tv_sec) * (NSEC_PER_SEC / 100);
|
||||
time_all += ts.tv_nsec / 100;
|
||||
|
||||
/* add offset from Gregorian Calendar to Jan 1 1970 */
|
||||
@ -192,14 +215,14 @@ generate_uuid(unsigned char uuid_out[16])
|
||||
last_time_all = time_all;
|
||||
|
||||
/* Fill in timestamp and clock_seq values */
|
||||
uuid_out[3] = (u_int8_t)time_all;
|
||||
uuid_out[2] = (u_int8_t)(time_all >> 8);
|
||||
uuid_out[1] = (u_int8_t)(time_all >> 16);
|
||||
uuid_out[0] = (u_int8_t)(time_all >> 24);
|
||||
uuid_out[5] = (u_int8_t)(time_all >> 32);
|
||||
uuid_out[4] = (u_int8_t)(time_all >> 40);
|
||||
uuid_out[7] = (u_int8_t)(time_all >> 48);
|
||||
uuid_out[6] = (u_int8_t)(time_all >> 56);
|
||||
uuid_out[3] = (uint8_t)time_all;
|
||||
uuid_out[2] = (uint8_t)(time_all >> 8);
|
||||
uuid_out[1] = (uint8_t)(time_all >> 16);
|
||||
uuid_out[0] = (uint8_t)(time_all >> 24);
|
||||
uuid_out[5] = (uint8_t)(time_all >> 32);
|
||||
uuid_out[4] = (uint8_t)(time_all >> 40);
|
||||
uuid_out[7] = (uint8_t)(time_all >> 48);
|
||||
uuid_out[6] = (uint8_t)(time_all >> 56);
|
||||
|
||||
uuid_out[8] = clock_seq >> 8;
|
||||
uuid_out[9] = clock_seq & 0xff;
|
||||
|
Loading…
x
Reference in New Issue
Block a user