X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fports.c;h=7e5421da1bdad7b2eacd64199d972b2add7fd3d8;hb=4f0019f03c2e85e8634150ff0c9a31bee6d35ce5;hp=6c6960633556f83337c7f93d0bc348f9371948d0;hpb=cc5e0346ef2b7d7d97623281d3f4fe891810a8f8;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/ports.c b/libhb/ports.c index 6c696063..7e5421da 100644 --- a/libhb/ports.c +++ b/libhb/ports.c @@ -54,7 +54,18 @@ #include #endif +#if defined( SYS_LINUX ) +#include +#include +#include +#elif defined( SYS_OPENBSD ) +#include +#include +#include +#endif + #include +#include #include "hb.h" @@ -82,6 +93,40 @@ int gettimeofday( struct timeval * tv, struct timezone * tz ) #endif */ +int hb_dvd_region(char *device, int *region_mask) +{ +#if defined( DVD_LU_SEND_RPC_STATE ) && defined( DVD_AUTH ) + struct stat st; + dvd_authinfo ai; + int fd, ret; + + fd = open( device, O_RDONLY ); + if ( fd < 0 ) + return -1; + if ( fstat( fd, &st ) < 0 ) + { + close( fd ); + return -1; + } + if ( !( S_ISBLK( st.st_mode ) || S_ISCHR( st.st_mode ) ) ) + { + close( fd ); + return -1; + } + + ai.type = DVD_LU_SEND_RPC_STATE; + ret = ioctl(fd, DVD_AUTH, &ai); + close( fd ); + if ( ret < 0 ) + return ret; + + *region_mask = ai.lrpcs.region_mask; + return 0; +#else + return -1; +#endif +} + uint64_t hb_get_date() { struct timeval tv; @@ -181,9 +226,9 @@ int hb_get_cpu_count() } /************************************************************************ - * Get a tempory directory for HB + * Get a temporary directory for HB ***********************************************************************/ -void hb_get_tempory_directory( hb_handle_t * h, char path[512] ) +void hb_get_temporary_directory( char path[512] ) { char base[512]; @@ -207,7 +252,7 @@ void hb_get_tempory_directory( hb_handle_t * h, char path[512] ) if( base[strlen(base)-1] == '/' ) base[strlen(base)-1] = '\0'; - snprintf( path, 512, "%s/hb.%d", base, hb_get_pid( h ) ); + snprintf( path, 512, "%s/hb.%d", base, getpid() ); } /************************************************************************ @@ -218,7 +263,7 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024], { va_list args; - hb_get_tempory_directory( h, name ); + hb_get_temporary_directory( name ); strcat( name, "/" ); va_start( args, fmt ); @@ -560,6 +605,35 @@ void hb_cond_wait( hb_cond_t * c, hb_lock_t * lock ) #endif } +void hb_clock_gettime( struct timespec *tp ) +{ + struct timeval tv; + time_t sec; + + sec = time( NULL ); + gettimeofday( &tv, NULL ); + tp->tv_sec = tv.tv_sec; + tp->tv_nsec = tv.tv_usec * 1000; +} + +void hb_cond_timedwait( hb_cond_t * c, hb_lock_t * lock, int msec ) +{ +#if defined( SYS_BEOS ) + c->thread = find_thread( NULL ); + release_sem( lock->sem ); + suspend_thread( c->thread ); + acquire_sem( lock->sem ); + c->thread = -1; +#elif USE_PTHREAD + struct timespec ts; + hb_clock_gettime(&ts); + ts.tv_nsec += (msec % 1000) * 1000000; + ts.tv_sec += msec / 1000 + (ts.tv_nsec / 1000000000); + ts.tv_nsec %= 1000000000; + pthread_cond_timedwait( &c->cond, &lock->mutex, &ts ); +#endif +} + void hb_cond_signal( hb_cond_t * c ) { #if defined( SYS_BEOS ) @@ -584,6 +658,13 @@ void hb_cond_signal( hb_cond_t * c ) #endif } +void hb_cond_broadcast( hb_cond_t * c ) +{ +#if USE_PTHREAD + pthread_cond_broadcast( &c->cond ); +#endif +} + /************************************************************************ * Network ***********************************************************************/ @@ -600,6 +681,23 @@ hb_net_t * hb_net_open( char * address, int port ) struct sockaddr_in sock; struct hostent * host; +#ifdef SYS_MINGW + WSADATA wsaData; + int iResult, winsock_init = 0; + + // Initialize Winsock + if (!winsock_init) + { + iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) + { + hb_log("WSAStartup failed: %d", iResult); + return NULL; + } + winsock_init = 1; + } +#endif + /* TODO: find out why this doesn't work on Win32 */ if( !( host = gethostbyname( address ) ) ) { @@ -649,3 +747,29 @@ void hb_net_close( hb_net_t ** _n ) *_n = NULL; } +#ifdef SYS_MINGW +char *strtok_r(char *s, const char *delim, char **save_ptr) +{ + char *token; + + if (s == NULL) s = *save_ptr; + + /* Scan leading delimiters. */ + s += strspn(s, delim); + if (*s == '\0') return NULL; + + /* Find the end of the token. */ + token = s; + s = strpbrk(token, delim); + if (s == NULL) + /* This token finishes the string. */ + *save_ptr = strchr(token, '\0'); + else { + /* Terminate the token and make *SAVE_PTR point past it. */ + *s = '\0'; + *save_ptr = s + 1; + } + + return token; +} +#endif