forked from videolan/vlc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvlc.c
191 lines (159 loc) · 6.22 KB
/
vlc.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*****************************************************************************
* vlc.c: the vlc player
*****************************************************************************
* Copyright (C) 1998-2004 the VideoLAN team
* $Id$
*
* Authors: Vincent Seguin <[email protected]>
* Samuel Hocevar <[email protected]>
* Gildas Bazin <[email protected]>
* Derk-Jan Hartman <hartman at videolan dot org>
* Lots of other people, see the libvlc AUTHORS file
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "config.h"
#include <stdio.h> /* fprintf() */
#include <stdlib.h> /* putenv(), strtol(), */
#ifdef HAVE_SIGNAL_H
# include <signal.h> /* SIGHUP, SIGINT, SIGKILL */
#endif
#ifdef HAVE_TIME_H
# include <time.h> /* time() */
#endif
#include <vlc/vlc.h>
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
#if !defined(WIN32) && !defined(UNDER_CE)
static void SigHandler ( int i_signal );
#endif
extern void rootwrap( void );
/*****************************************************************************
* main: parse command line, start interface and spawn threads.
*****************************************************************************/
int main( int i_argc, char *ppsz_argv[] )
{
int i_ret;
#ifndef __APPLE__
/* This clutters OSX GUI error logs */
fprintf( stderr, "VLC media player %s\n", VLC_Version() );
#endif
#ifdef HAVE_PUTENV
# ifdef DEBUG
/* Activate malloc checking routines to detect heap corruptions. */
putenv( "MALLOC_CHECK_=2" );
/* Disable the ugly Gnome crash dialog so that we properly segfault */
putenv( "GNOME_DISABLE_CRASH_DIALOG=1" );
# endif
/* If the user isn't using VLC_VERBOSE, set it to 0 by default */
if( getenv( "VLC_VERBOSE" ) == NULL )
{
putenv( "VLC_VERBOSE=0" );
}
#endif
rootwrap ();
/* Create a libvlc structure */
i_ret = VLC_Create();
if( i_ret < 0 )
{
return i_ret;
}
#if !defined(WIN32) && !defined(UNDER_CE)
/* Set the signal handlers. SIGTERM is not intercepted, because we need at
* least one method to kill the program when all other methods failed, and
* when we don't want to use SIGKILL.
* Note that we set the signals after the vlc_create call. */
signal( SIGINT, SigHandler );
signal( SIGHUP, SigHandler );
signal( SIGQUIT, SigHandler );
/* Other signals */
signal( SIGALRM, SIG_IGN );
signal( SIGPIPE, SIG_IGN );
#endif
/* Initialize libvlc */
i_ret = VLC_Init( 0, i_argc, ppsz_argv );
if( i_ret < 0 )
{
VLC_Destroy( 0 );
return i_ret == VLC_EEXITSUCCESS ? 0 : i_ret;
}
i_ret = VLC_AddIntf( 0, NULL, VLC_TRUE, VLC_TRUE );
/* Finish the threads */
VLC_CleanUp( 0 );
/* Destroy the libvlc structure */
VLC_Destroy( 0 );
return i_ret;
}
#if !defined(WIN32) && !defined(UNDER_CE)
/*****************************************************************************
* SigHandler: system signal handler
*****************************************************************************
* This function is called when a fatal signal is received by the program.
* It tries to end the program in a clean way.
*****************************************************************************/
static void SigHandler( int i_signal )
{
static time_t abort_time = 0;
static volatile vlc_bool_t b_die = VLC_FALSE;
/* Once a signal has been trapped, the termination sequence will be
* armed and subsequent signals will be ignored to avoid sending signals
* to a libvlc structure having been destroyed */
if( !b_die )
{
b_die = VLC_TRUE;
abort_time = time( NULL );
fprintf( stderr, "signal %d received, terminating vlc - do it "
"again in case it gets stuck\n", i_signal );
/* Acknowledge the signal received */
VLC_Die( 0 );
}
else if( time( NULL ) > abort_time + 2 )
{
/* If user asks again 1 or 2 seconds later, die badly */
signal( SIGINT, SIG_DFL );
signal( SIGHUP, SIG_DFL );
signal( SIGQUIT, SIG_DFL );
signal( SIGALRM, SIG_DFL );
signal( SIGPIPE, SIG_DFL );
fprintf( stderr, "user insisted too much, dying badly\n" );
abort();
}
}
#endif
#if defined(UNDER_CE)
# if defined( _MSC_VER ) && defined( UNDER_CE )
# include "vlc_common.h"
# endif
/*****************************************************************************
* WinMain: parse command line, start interface and spawn threads. (WinCE only)
*****************************************************************************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow )
{
char **argv, psz_cmdline[MAX_PATH];
int argc, i_ret;
WideCharToMultiByte( CP_ACP, 0, lpCmdLine, -1,
psz_cmdline, MAX_PATH, NULL, NULL );
argv = vlc_parse_cmdline( psz_cmdline, &argc );
argv = realloc( argv, (argc + 1) * sizeof(char *) );
if( !argv ) return -1;
if( argc ) memmove( argv + 1, argv, argc * sizeof(char *) );
argv[0] = ""; /* Fake program path */
i_ret = main( argc + 1, argv );
/* No need to free the argv memory */
return i_ret;
}
#endif