/***************************************************************************** * formatSegmentPath: create segment path name based on seg # *****************************************************************************/ static char *formatSegmentPath( sout_access_out_t *p_access, char *psz_path, uint32_t i_seg, bool b_sanitize ) { char *psz_result; char *psz_firstNumSign; if ( ! ( psz_result = str_format( p_access, psz_path ) ) ) return NULL; psz_firstNumSign = psz_result + strcspn( psz_result, SEG_NUMBER_PLACEHOLDER ); if ( *psz_firstNumSign ) { char *psz_newResult; int i_cnt = strspn( psz_firstNumSign, SEG_NUMBER_PLACEHOLDER ); int ret; *psz_firstNumSign = '\0'; ret = asprintf( &psz_newResult, "%s%0*d%s", psz_result, i_cnt, i_seg, psz_firstNumSign + i_cnt ); free ( psz_result ); if ( ret < 0 ) return NULL; psz_result = psz_newResult; } if ( b_sanitize ) path_sanitize( psz_result ); return psz_result; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; sout_access_out_sys_t *p_sys; char *psz_idx; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } if( !( p_sys = malloc ( sizeof( *p_sys ) ) ) ) return VLC_ENOMEM; p_sys->i_seglen = var_GetInteger( p_access, SOUT_CFG_PREFIX "seglen" ); p_sys->i_seglenm = CLOCK_FREQ * p_sys->i_seglen; p_sys->i_numsegs = var_GetInteger( p_access, SOUT_CFG_PREFIX "numsegs" ); p_sys->b_splitanywhere = var_GetBool( p_access, SOUT_CFG_PREFIX "splitanywhere" ); p_sys->b_delsegs = var_GetBool( p_access, SOUT_CFG_PREFIX "delsegs" ); p_sys->b_ratecontrol = var_GetBool( p_access, SOUT_CFG_PREFIX "ratecontrol") ; p_sys->psz_indexPath = NULL; psz_idx = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "index" ); if ( psz_idx ) { char *psz_tmp; psz_tmp = str_format( p_access, psz_idx ); free( psz_idx ); if ( !psz_tmp ) { free( p_sys ); return VLC_ENOMEM; } path_sanitize( psz_tmp ); p_sys->psz_indexPath = psz_tmp; vlc_unlink( p_sys->psz_indexPath ); } p_sys->psz_indexUrl = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "index-url" ); p_access->p_sys = p_sys; p_sys->i_handle = -1; p_sys->i_segment = 0; p_sys->psz_cursegPath = NULL; p_access->pf_write = Write; p_access->pf_seek = Seek; p_access->pf_control = Control; return VLC_SUCCESS; }
/***************************************************************************** * Save Picture to disk *****************************************************************************/ static void SavePicture( filter_t *p_filter, picture_t *p_pic ) { filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys; video_format_t fmt_in, fmt_out; char *psz_filename = NULL; char *psz_temp = NULL; int i_ret; memset( &fmt_in, 0, sizeof(video_format_t) ); memset( &fmt_out, 0, sizeof(video_format_t) ); /* Save snapshot psz_format to a memory zone */ fmt_in = p_pic->format; fmt_out.i_sar_num = fmt_out.i_sar_den = 1; fmt_out.i_width = p_sys->i_width; fmt_out.i_height = p_sys->i_height; fmt_out.i_chroma = p_sys->i_format; /* * Save the snapshot to a temporary file and * switch it to the real name afterwards. */ if( p_sys->b_replace ) i_ret = asprintf( &psz_filename, "%s" DIR_SEP "%s.%s", p_sys->psz_path, p_sys->psz_prefix, p_sys->psz_format ); else i_ret = asprintf( &psz_filename, "%s" DIR_SEP "%s%05d.%s", p_sys->psz_path, p_sys->psz_prefix, p_sys->i_frames, p_sys->psz_format ); if( i_ret == -1 ) { msg_Err( p_filter, "could not create snapshot %s", psz_filename ); goto error; } path_sanitize( psz_filename ); i_ret = asprintf( &psz_temp, "%s.swp", psz_filename ); if( i_ret == -1 ) { msg_Err( p_filter, "could not create snapshot temporarily file %s", psz_temp ); goto error; } path_sanitize( psz_temp ); /* Save the image */ i_ret = image_WriteUrl( p_sys->p_image, p_pic, &fmt_in, &fmt_out, psz_temp ); if( i_ret != VLC_SUCCESS ) { msg_Err( p_filter, "could not create snapshot %s", psz_temp ); } else { /* switch to the final destination */ #if defined (_WIN32) || defined(__OS2__) vlc_unlink( psz_filename ); #endif i_ret = vlc_rename( psz_temp, psz_filename ); if( i_ret == -1 ) { msg_Err( p_filter, "could not rename snapshot %s %m", psz_filename ); goto error; } } error: free( psz_temp ); free( psz_filename ); }
int vout_snapshot_SaveImage(char **name, int *sequential, const block_t *image, vout_thread_t *p_vout, const vout_snapshot_save_cfg_t *cfg) { /* */ char *filename; DIR *pathdir = vlc_opendir(cfg->path); input_thread_t *input = (input_thread_t*)p_vout->p->input; if (pathdir != NULL) { /* The use specified a directory path */ closedir(pathdir); /* */ char *prefix = NULL; if (cfg->prefix_fmt) prefix = str_format(input, cfg->prefix_fmt); if (prefix) filename_sanitize(prefix); else { prefix = strdup("vlcsnap-"); if (!prefix) goto error; } if (cfg->is_sequential) { for (int num = cfg->sequence; ; num++) { struct stat st; if (asprintf(&filename, "%s" DIR_SEP "%s%05d.%s", cfg->path, prefix, num, cfg->format) < 0) { free(prefix); goto error; } if (vlc_stat(filename, &st)) { *sequential = num; break; } free(filename); } } else { struct timespec ts; struct tm curtime; char buffer[128]; timespec_get(&ts, TIME_UTC); if (localtime_r(&ts.tv_sec, &curtime) == NULL) gmtime_r(&ts.tv_sec, &curtime); if (strftime(buffer, sizeof(buffer), "%Y-%m-%d-%Hh%Mm%Ss", &curtime) == 0) strcpy(buffer, "error"); if (asprintf(&filename, "%s" DIR_SEP "%s%s%03lu.%s", cfg->path, prefix, buffer, ts.tv_nsec / 1000000, cfg->format) < 0) filename = NULL; } free(prefix); } else { /* The user specified a full path name (including file name) */ filename = str_format(input, cfg->path); path_sanitize(filename); } if (!filename) goto error; /* Save the snapshot */ FILE *file = vlc_fopen(filename, "wb"); if (!file) { msg_Err(p_vout, "Failed to open '%s'", filename); free(filename); goto error; } if (fwrite(image->p_buffer, image->i_buffer, 1, file) != 1) { msg_Err(p_vout, "Failed to write to '%s'", filename); fclose(file); free(filename); goto error; } fclose(file); /* */ if (name) *name = filename; else free(filename); return VLC_SUCCESS; error: msg_Err(p_vout, "could not save snapshot"); return VLC_EGENERIC; }
int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ) { image_handler_t *p_image = image_HandlerCreate( p_vout ); video_format_t fmt_in, fmt_out; char *psz_filename = NULL; vlc_value_t val, format; DIR *path; int i_ret; bool b_embedded_snapshot; int i_id = 0; /* */ val.psz_string = var_GetNonEmptyString( p_vout, "snapshot-path" ); /* Embedded snapshot : if snapshot-path == object:id */ if( val.psz_string && sscanf( val.psz_string, "object:%d", &i_id ) > 0 ) b_embedded_snapshot = true; else b_embedded_snapshot = false; /* */ memset( &fmt_in, 0, sizeof(video_format_t) ); fmt_in = p_vout->fmt_in; if( fmt_in.i_sar_num <= 0 || fmt_in.i_sar_den <= 0 ) { fmt_in.i_sar_num = fmt_in.i_sar_den = 1; } /* */ memset( &fmt_out, 0, sizeof(video_format_t) ); fmt_out.i_sar_num = fmt_out.i_sar_den = 1; fmt_out.i_chroma = b_embedded_snapshot ? VLC_FOURCC('p','n','g',' ') : 0; fmt_out.i_width = var_GetInteger( p_vout, "snapshot-width" ); fmt_out.i_height = var_GetInteger( p_vout, "snapshot-height" ); if( b_embedded_snapshot && fmt_out.i_width == 0 && fmt_out.i_height == 0 ) { /* If snapshot-width and/or snapshot height were not specified, use a default snapshot width of 320 */ fmt_out.i_width = 320; } if( fmt_out.i_height == 0 && fmt_out.i_width > 0 ) { fmt_out.i_height = fmt_in.i_height * fmt_out.i_width / fmt_in.i_width; const int i_height = fmt_out.i_height * fmt_in.i_sar_den / fmt_in.i_sar_num; if( i_height > 0 ) fmt_out.i_height = i_height; } else { if( fmt_out.i_width == 0 && fmt_out.i_height > 0 ) { fmt_out.i_width = fmt_in.i_width * fmt_out.i_height / fmt_in.i_height; } else { fmt_out.i_width = fmt_in.i_width; fmt_out.i_height = fmt_in.i_height; } const int i_width = fmt_out.i_width * fmt_in.i_sar_num / fmt_in.i_sar_den; if( i_width > 0 ) fmt_out.i_width = i_width; } /* Embedded snapshot create a snapshot_t* and store it in object(object-id)->p_private, then unlock and signal the waiting object. */ if( b_embedded_snapshot ) { vlc_object_t* p_dest; block_t *p_block; snapshot_t *p_snapshot; size_t i_size; /* Destination object-id is following object: */ p_dest = ( vlc_object_t* )vlc_object_get( i_id ); if( !p_dest ) { msg_Err( p_vout, "Cannot find calling object" ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } /* Object must be locked. We will unlock it once we get the snapshot and written it to p_private */ p_dest->p_private = NULL; /* Save the snapshot to a memory zone */ p_block = image_Write( p_image, p_pic, &fmt_in, &fmt_out ); if( !p_block ) { msg_Err( p_vout, "Could not get snapshot" ); image_HandlerDelete( p_image ); vlc_object_signal( p_dest ); vlc_object_release( p_dest ); return VLC_EGENERIC; } /* Copy the p_block data to a snapshot structure */ /* FIXME: get the timestamp */ p_snapshot = malloc( sizeof( snapshot_t ) ); if( !p_snapshot ) { block_Release( p_block ); image_HandlerDelete( p_image ); vlc_object_signal( p_dest ); vlc_object_release( p_dest ); return VLC_ENOMEM; } i_size = p_block->i_buffer; p_snapshot->i_width = fmt_out.i_width; p_snapshot->i_height = fmt_out.i_height; p_snapshot->i_datasize = i_size; p_snapshot->date = p_block->i_pts; /* FIXME ?? */ p_snapshot->p_data = malloc( i_size ); if( !p_snapshot->p_data ) { block_Release( p_block ); free( p_snapshot ); image_HandlerDelete( p_image ); vlc_object_signal( p_dest ); vlc_object_release( p_dest ); return VLC_ENOMEM; } memcpy( p_snapshot->p_data, p_block->p_buffer, p_block->i_buffer ); p_dest->p_private = p_snapshot; block_Release( p_block ); /* Unlock the object */ vlc_object_signal( p_dest ); vlc_object_release( p_dest ); image_HandlerDelete( p_image ); return VLC_SUCCESS; } /* Get default directory if none provided */ if( !val.psz_string ) val.psz_string = VoutSnapshotGetDefaultDirectory( p_vout ); if( !val.psz_string ) { msg_Err( p_vout, "no path specified for snapshots" ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } /* Get snapshot format, default being "png" */ format.psz_string = var_GetNonEmptyString( p_vout, "snapshot-format" ); if( !format.psz_string ) format.psz_string = strdup( "png" ); if( !format.psz_string ) { free( val.psz_string ); image_HandlerDelete( p_image ); return VLC_ENOMEM; } /* * Did the user specify a directory? If not, path = NULL. */ path = utf8_opendir ( (const char *)val.psz_string ); if( path != NULL ) { char *psz_prefix = var_GetNonEmptyString( p_vout, "snapshot-prefix" ); if( psz_prefix == NULL ) psz_prefix = strdup( "vlcsnap-" ); else { char *psz_tmp = str_format( p_vout, psz_prefix ); filename_sanitize( psz_tmp ); free( psz_prefix ); psz_prefix = psz_tmp; } closedir( path ); if( var_GetBool( p_vout, "snapshot-sequential" ) == true ) { int i_num = var_GetInteger( p_vout, "snapshot-num" ); struct stat st; do { free( psz_filename ); if( asprintf( &psz_filename, "%s" DIR_SEP "%s%05d.%s", val.psz_string, psz_prefix, i_num++, format.psz_string ) == -1 ) { msg_Err( p_vout, "could not create snapshot" ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } } while( utf8_stat( psz_filename, &st ) == 0 ); var_SetInteger( p_vout, "snapshot-num", i_num ); } else { if( asprintf( &psz_filename, "%s" DIR_SEP "%s%u.%s", val.psz_string, psz_prefix, (unsigned int)(p_pic->date / 100000) & 0xFFFFFF, format.psz_string ) == -1 ) { msg_Err( p_vout, "could not create snapshot" ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } } free( psz_prefix ); } else // The user specified a full path name (including file name) { psz_filename = str_format( p_vout, val.psz_string ); path_sanitize( psz_filename ); } free( val.psz_string ); free( format.psz_string ); /* Save the snapshot */ i_ret = image_WriteUrl( p_image, p_pic, &fmt_in, &fmt_out, psz_filename ); if( i_ret != VLC_SUCCESS ) { msg_Err( p_vout, "could not create snapshot %s", psz_filename ); free( psz_filename ); image_HandlerDelete( p_image ); return VLC_EGENERIC; } /* */ msg_Dbg( p_vout, "snapshot taken (%s)", psz_filename ); vout_OSDMessage( VLC_OBJECT( p_vout ), DEFAULT_CHAN, "%s", psz_filename ); free( psz_filename ); /* */ if( var_GetBool( p_vout, "snapshot-preview" ) ) { if( VoutSnapshotPip( p_vout, p_image, p_pic, &fmt_in ) ) msg_Warn( p_vout, "Failed to display snapshot" ); } image_HandlerDelete( p_image ); return VLC_SUCCESS; }
int vout_snapshot_SaveImage(char **name, int *sequential, const block_t *image, vlc_object_t *object, const vout_snapshot_save_cfg_t *cfg) { /* */ char *filename; DIR *pathdir = vlc_opendir(cfg->path); if (pathdir != NULL) { /* The use specified a directory path */ closedir(pathdir); /* */ char *prefix = NULL; if (cfg->prefix_fmt) prefix = str_format(object, cfg->prefix_fmt); if (prefix) filename_sanitize(prefix); else { prefix = strdup("vlcsnap-"); if (!prefix) goto error; } if (cfg->is_sequential) { for (int num = cfg->sequence; ; num++) { struct stat st; if (asprintf(&filename, "%s" DIR_SEP "%s%05d.%s", cfg->path, prefix, num, cfg->format) < 0) { free(prefix); goto error; } if (vlc_stat(filename, &st)) { *sequential = num; break; } free(filename); } } else { struct tm curtime; time_t lcurtime = time(NULL) ; if (!localtime_r(&lcurtime, &curtime)) { const unsigned int id = (image->i_pts / 100000) & 0xFFFFFF; msg_Warn(object, "failed to get current time. Falling back to legacy snapshot naming"); if (asprintf(&filename, "%s" DIR_SEP "%s%u.%s", cfg->path, prefix, id, cfg->format) < 0) filename = NULL; } else { /* suffix with the last decimal digit in 10s of seconds resolution * FIXME gni ? */ const int id = (image->i_pts / (100*1000)) & 0xFF; char buffer[128]; if (!strftime(buffer, sizeof(buffer), "%Y-%m-%d-%Hh%Mm%Ss", &curtime)) strcpy(buffer, "error"); if (asprintf(&filename, "%s" DIR_SEP "%s%s%1u.%s", cfg->path, prefix, buffer, id, cfg->format) < 0) filename = NULL; } } free(prefix); } else { /* The user specified a full path name (including file name) */ filename = str_format(object, cfg->path); path_sanitize(filename); } if (!filename) goto error; /* Save the snapshot */ FILE *file = vlc_fopen(filename, "wb"); if (!file) { msg_Err(object, "Failed to open '%s'", filename); free(filename); goto error; } if (fwrite(image->p_buffer, image->i_buffer, 1, file) != 1) { msg_Err(object, "Failed to write to '%s'", filename); fclose(file); free(filename); goto error; } fclose(file); /* */ if (name) *name = filename; else free(filename); return VLC_SUCCESS; error: msg_Err(object, "could not save snapshot"); return VLC_EGENERIC; }
// ************************************************************************** // * サーバ HTTP処理部 // ************************************************************************** void server_http_process(int accept_socket) { int result; HTTP_RECV_INFO http_recv_info; //HTTP受信情報保存構造体 int i; int flag_allow_user_agent_check; int found; memset(&http_recv_info, 0, sizeof(http_recv_info)); // ---------------------------------------- // HTTP リクエストヘッダ受信 // ---------------------------------------- debug_log_output("HTTP Header receive start!\n"); result = http_header_receive(accept_socket, &http_recv_info); if ( result != 0 ) // エラーチェック { // エラーメッセージ debug_log_output("http_header_receive() Error. result=%d\n", result); // ソケットクローズ close(accept_socket); return; } debug_log_output("HTTP Header receive end!\n"); debug_log_output("recv_uri:'%s'\n", http_recv_info.recv_uri); debug_log_output("user_agent:'%s'\n", http_recv_info.user_agent); debug_log_output("range_start_pos=%lld\n", http_recv_info.range_start_pos); debug_log_output("range_end_pos=%lld\n", http_recv_info.range_end_pos); if (http_recv_info.passwd[0]) { debug_log_output("http passwd:'%s'\n", http_recv_info.passwd); } // ========================== // = User-Agent チェック // ========================== flag_allow_user_agent_check = 0; if ( strlen(allow_user_agent[0].user_agent) == 0 ) // User-Agnet指示が無し。 { debug_log_output("user_agent: allow_user_agent No List. All Allow."); flag_allow_user_agent_check = 1; // OK } else { // User-Agent チェック実行 for ( i=0; i<ALLOW_USER_AGENT_LIST_MAX; i++) { if ( strlen(allow_user_agent[i].user_agent) == 0 ) { break; } // 一致チェック debug_log_output("user_agent: Check[%d] '%s' in '%s'",i, allow_user_agent[i].user_agent, http_recv_info.user_agent); if ( strstr( http_recv_info.user_agent, allow_user_agent[i].user_agent ) != NULL ) { debug_log_output("user_agent: '%s' OK.", allow_user_agent[i].user_agent ); flag_allow_user_agent_check = 1; // 一致。OK break; } } } if (global_param.http_passwd[0] && !flag_allow_user_agent_check) { // パスワードが設定されて、正しければ、User-AgentチェックNGでもOK. char *pass, *p; pass = base64(global_param.http_passwd); if ((p = strchr(pass, '=')) != NULL) { *p = '\0'; } if ((p = strchr(http_recv_info.passwd, '=')) != NULL) { *p = '\0'; } if (!strcmp(pass, http_recv_info.passwd)) { // 一致 flag_allow_user_agent_check = 1; } else { // 不一致 // flag_allow_user_agent_check = 0; http_unauthorized_response(accept_socket, &http_recv_info); close(accept_socket); return ; } } // User-Agentチェック NGならば、ソケットクローズ。終了。 if ( flag_allow_user_agent_check == 0 ) { debug_log_output("allow_user_agent check. Deny. Socket close."); // ソケットクローズ close(accept_socket); return; } // クライアントがPCかどうか判断 http_recv_info.flag_pc = (global_param.user_agent_pc[0] && !strncmp(http_recv_info.user_agent, global_param.user_agent_pc , strlen(global_param.user_agent_pc)) ) ? 1 : 0; if(global_param.user_agent_pc[0]) { debug_log_output("Checking for PC user agent '%s'", global_param.user_agent_pc); } debug_log_output("flag_pc: %d", http_recv_info.flag_pc); // User-Agent // HD: 'Syabas/13-14-060414-04-IOD-234-000/04-IOD (uCOS-II v2.05;NOS;KA9Q; Res1280x720-HiColor; TV Res1920x1080; Browser Res1104x656-8bits; www.syabas.com mac_addr=00.a0.b0.65.51.31)'(186 byte) // SD: 'Syabas/13-14-060414-04-IOD-234-000/04-IOD (uCOS-II v2.05;NOS;KA9Q; Res624x416-HiColor; TV Res1920x1080; Browser Res624x416-8bits; www.syabas.com mac_addr=00.a0.b0.65.51.31)' http_recv_info.flag_hd = (strstr(http_recv_info.user_agent, "Res624x416") == NULL); if (!strncmp(http_recv_info.recv_uri, "/-.-", 4)) { // proxy if (http_proxy_response(accept_socket, &http_recv_info) < 0) { http_not_found_response(accept_socket, &http_recv_info); } // ソケットクローズ close(accept_socket); return; } if (path_sanitize(http_recv_info.recv_uri, sizeof(http_recv_info.recv_uri)) == NULL) { // BAD REQUEST! debug_log_output("BAD REQUEST!"); http_not_found_response(accept_socket, &http_recv_info); close(accept_socket); return; } debug_log_output("sanitized recv_uri: %s", http_recv_info.recv_uri); // ---------------------------------------- // 受け取ったURIの拡張子がrename対象ならばrename // ---------------------------------------- extension_del_rename(http_recv_info.recv_uri, sizeof(http_recv_info.recv_uri)); // ============================ // ファイルチェック // 種類に応じて分岐 // ============================ result = http_file_check(&http_recv_info); debug_log_output("http_file_check returns %d\n", result); if (result != CGI_TYPE && !strcmp(http_recv_info.request_method, "POST")) { debug_log_output("BAD POST REQUEST."); http_not_found_response(accept_socket, &http_recv_info); } else if (result == -2) { // Directory without the trailing slash -> redirect char buffer[WIZD_FILENAME_MAX]; sprintf(buffer, "%s/", http_recv_info.recv_uri); http_redirect_response(accept_socket, &http_recv_info, buffer); } else if ( result < 0 ) // File not found { http_not_found_response(accept_socket, &http_recv_info); } else if ( result == GENERAL_FILE_TYPE ) // ファイル実体ならば、実体転送。 { if ( global_param.flag_allow_delete && (strcasecmp(http_recv_info.action, "delete" ) == 0) ) { // ---------------------------------------- // Delete file // ---------------------------------------- char path[WIZD_FILENAME_MAX]; debug_log_output("Delete file start!\n"); debug_log_output("unlink(%s)", http_recv_info.send_filename); unlink(http_recv_info.send_filename); // Remove any associated bookmarks if they exist snprintf(path, sizeof(path), "%s.wizd.bookmark", http_recv_info.send_filename); unlink(path); // Redirect to directory strncpy(path, http_recv_info.recv_uri, sizeof(path)); cut_after_last_character(path, '/'); strcat(path, "/"); http_redirect_response(accept_socket, &http_recv_info, path); debug_log_output("Delete file end!\n"); } else // actionに、ImageViewerが指示されている? if ( strcasecmp(http_recv_info.action, "ImageView" ) == 0) { // ---------------------------------------- // イメージファイルビューアー // ---------------------------------------- debug_log_output("Image Viewer start!\n"); http_image_viewer(accept_socket, &http_recv_info); debug_log_output("Image Viewer end!\n"); } // actionに、SinglePlayが指示されている? else if ( strcasecmp(http_recv_info.action, "SinglePlay" ) == 0) { // ---------------------------------------- // Musicファイル 単独プレイ // ---------------------------------------- debug_log_output("Single Play start!\n"); http_music_single_play(accept_socket, &http_recv_info); debug_log_output("Single Play end!\n"); } #ifdef RESIZE_JPEG // actionに、Resizeが指示されている? else if ( strcasecmp(http_recv_info.action, "Resize.jpg" ) == 0) { // ---------------------------------------- // JPEG Resize // ---------------------------------------- debug_log_output("JPEG Resize start!\n"); if(http_send_resized_jpeg(accept_socket, &http_recv_info) == 0) { // Failed to resize - send the original file as-is // (this can happen if we have the wrong file extension) http_file_response(accept_socket, &http_recv_info); } debug_log_output("JPEG Resize end!\n"); } #endif else if (strcmp(http_recv_info.option, "aviinfo") == 0) { debug_log_output("got aviinfo option\n"); http_menu(accept_socket, &http_recv_info); } else if (strcmp(http_recv_info.option, "mp3info") == 0) { http_menu(accept_socket, &http_recv_info); } else // アクションに指定無し。 { // ---------------------------------------- // ファイルの実体 // HTTPリクエストヘッダに従ってデータを返信。 // ---------------------------------------- found = 0; if (global_param.flag_use_index && strstr(http_recv_info.recv_uri, "wizd") != 0 && strstr(http_recv_info.recv_uri, ".htm") != 0) { if (http_find_and_replace_html(accept_socket, &http_recv_info)) { found = 1; } } if (!found) { debug_log_output("HTTP response start!\n"); http_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP response end!\n"); } } } else if ( result == SVI_TYPE ) { // ---------------------------------------- // SVIファイル(;´Д`) // SVIファイル処理してデータを返信 // ---------------------------------------- // actionに、SinglePlayが指示されている? if ( strcasecmp(http_recv_info.action, "SinglePlay" ) == 0) { // ---------------------------------------- // Musicファイル 単独プレイ // ---------------------------------------- debug_log_output("Single Play start!(SVI)\n"); http_music_single_play(accept_socket, &http_recv_info); debug_log_output("Single Play end!(SVI)\n"); } else // アクションに指定無し。 { debug_log_output("HTTP joint file response start!\n"); http_joint_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP joint file response end!\n"); } } else if ( result == PLW_UPL_TYPE ) { // --------------------------------------------- // plw/uplファイル(`・ω・´) // リストファイルから、プレイリスト生成して返信 // --------------------------------------------- debug_log_output("HTTP wizd play list create and response start!\n"); http_listfile_to_playlist_create(accept_socket, &http_recv_info); debug_log_output("HTTP wizd play list create and response end!\n"); } else if ( result == VOB_TYPE ) { // --------------------------------------------- // vobファイル 連結 // vobを連結して返信 // --------------------------------------------- // actionに、SinglePlayが指示されている? if ( strcasecmp(http_recv_info.action, "SinglePlay" ) == 0) { // ---------------------------------------- // Musicファイル 単独プレイ // ---------------------------------------- debug_log_output("Single Play start!(VOB)\n"); http_music_single_play(accept_socket, &http_recv_info); debug_log_output("Single Play end!(VOB)\n"); } else // アクションに指定無し。 { debug_log_output("HTTP vob file response start!\n"); http_vob_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP vob file response end!\n"); } } else if ( result == CGI_TYPE ) { // --------------------------------------------- // cgiファイル // cgiを実行して結果を返信 // --------------------------------------------- debug_log_output("HTTP CGI response start!\n"); http_cgi_response(accept_socket, &http_recv_info); debug_log_output("HTTP CGI response end!\n"); } else if ( result == ISO_TYPE ) { // ISO file handling if ( (strcasecmp(http_recv_info.action, "IsoPlay" ) == 0) || (strcasecmp(http_recv_info.action, "dvdplay" ) == 0) || (strncmp(http_recv_info.action, "showchapters", 12 ) == 0)) { debug_log_output("ISO playlist create start!\n"); http_menu(accept_socket, &http_recv_info); debug_log_output("ISO playlist create end!\n"); } else { // Start to stream the VOB debug_log_output("HTTP ISO file response start!\n"); http_vob_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP ISO file response end!\n"); } } else { // ---------------------------------------- // ディレクトリ // ---------------------------------------- // actionに、OptionMenuが指示されている? if ( strcasecmp(http_recv_info.action, "OptionMenu" ) == 0) { debug_log_output("HTTP Option menu create.\n"); http_option_menu(accept_socket, &http_recv_info); debug_log_output("HTTP Option menu end.\n"); } else if ( strcasecmp(http_recv_info.action, "copy" ) == 0) { // -------------------------------------------- // Copy the default playlist to this directory // -------------------------------------------- char source[WIZD_FILENAME_MAX]; char dest[WIZD_FILENAME_MAX]; int fd_source, fd_dest; if(http_recv_info.default_file_type == TYPE_MUSICLIST) { snprintf(dest, sizeof(dest), "%s/%s", http_recv_info.send_filename, DEFAULT_MUSICLIST); snprintf(source, sizeof(source), "%s/%s/%s", global_param.skin_root, global_param.skin_name, DEFAULT_MUSICLIST); } else { snprintf(dest, sizeof(dest), "%s/%s", http_recv_info.send_filename, DEFAULT_PHOTOLIST); snprintf(source, sizeof(source), "%s/%s/%s", global_param.skin_root, global_param.skin_name, DEFAULT_PHOTOLIST); } duplex_character_to_unique(source, '/'); duplex_character_to_unique(dest, '/'); debug_log_output("Copying '%s' to '%s'", source, dest); // Copy the file fd_source = open(source, O_RDONLY); if(fd_source >= 0) { fd_dest = open(dest, O_CREAT | O_TRUNC | O_WRONLY, S_IREAD | S_IWRITE); if(fd_dest >= 0) { while( (i = read(fd_source, source, sizeof(source))) > 0 ) { write(fd_dest, source, i); } close(fd_dest); } else { debug_log_output("Failed to open destination file"); } close(fd_source); } else { debug_log_output("Failed to open source file"); } // Redirect to the directory strncpy(dest, http_recv_info.recv_uri, sizeof(dest)); cut_after_last_character(dest, '/'); strcat(dest, "/"); http_redirect_response(accept_socket, &http_recv_info, dest); debug_log_output("Copy playlist end!\n"); } else // DIRECTORY_TYPE or {wizd,index}.htm{l} { int found = 0; if (global_param.flag_use_index) { if (http_find_and_replace(accept_socket, &http_recv_info)) found = 1; } if (!found) { debug_log_output("HTTP file menu create.\n"); http_menu(accept_socket, &http_recv_info); debug_log_output("HTTP file menu end.\n"); } } } // Clean shutdown shutdown(accept_socket, SHUT_WR); for(i=0; i<1 && (read(accept_socket, &result, sizeof(result))>0); i++); // ソケットクローズ close(accept_socket); return; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; sout_access_out_sys_t *p_sys; char *psz_idx; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } if( unlikely( !( p_sys = calloc ( 1, sizeof( *p_sys ) ) ) ) ) return VLC_ENOMEM; p_sys->i_seglen = var_GetInteger( p_access, SOUT_CFG_PREFIX "seglen" ); /* Try to get within asked segment length */ p_sys->i_seglenm = CLOCK_FREQ * p_sys->i_seglen; p_sys->block_buffer = NULL; p_sys->i_numsegs = var_GetInteger( p_access, SOUT_CFG_PREFIX "numsegs" ); p_sys->i_initial_segment = var_GetInteger( p_access, SOUT_CFG_PREFIX "initial-segment-number" ); p_sys->b_splitanywhere = var_GetBool( p_access, SOUT_CFG_PREFIX "splitanywhere" ); p_sys->b_delsegs = var_GetBool( p_access, SOUT_CFG_PREFIX "delsegs" ); p_sys->b_ratecontrol = var_GetBool( p_access, SOUT_CFG_PREFIX "ratecontrol") ; p_sys->b_caching = var_GetBool( p_access, SOUT_CFG_PREFIX "caching") ; p_sys->b_generate_iv = var_GetBool( p_access, SOUT_CFG_PREFIX "generate-iv") ; p_sys->segments_t = vlc_array_new(); p_sys->stuffing_size = 0; p_sys->i_opendts = VLC_TS_INVALID; p_sys->psz_indexPath = NULL; psz_idx = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "index" ); if ( psz_idx ) { char *psz_tmp; psz_tmp = str_format_time( psz_idx ); free( psz_idx ); if ( !psz_tmp ) { free( p_sys ); return VLC_ENOMEM; } path_sanitize( psz_tmp ); p_sys->psz_indexPath = psz_tmp; vlc_unlink( p_sys->psz_indexPath ); } p_sys->psz_indexUrl = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "index-url" ); p_sys->psz_keyfile = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "key-loadfile" ); p_sys->key_uri = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "key-uri" ); p_access->p_sys = p_sys; if( p_sys->psz_keyfile && ( LoadCryptFile( p_access ) < 0 ) ) { free( p_sys->psz_indexUrl ); free( p_sys->psz_indexPath ); free( p_sys ); msg_Err( p_access, "Encryption init failed" ); return VLC_EGENERIC; } else if( !p_sys->psz_keyfile && ( CryptSetup( p_access, NULL ) < 0 ) ) { free( p_sys->psz_indexUrl ); free( p_sys->psz_indexPath ); free( p_sys ); msg_Err( p_access, "Encryption init failed" ); return VLC_EGENERIC; } p_sys->i_handle = -1; p_sys->i_segment = p_sys->i_initial_segment > 0 ? p_sys->i_initial_segment -1 : 0; p_sys->psz_cursegPath = NULL; p_access->pf_write = Write; p_access->pf_seek = Seek; p_access->pf_control = Control; return VLC_SUCCESS; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; int fd; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } bool overwrite = var_GetBool (p_access, SOUT_CFG_PREFIX"overwrite"); bool append = var_GetBool( p_access, SOUT_CFG_PREFIX "append" ); if (!strcmp (p_access->psz_access, "fd")) { char *end; fd = strtol (p_access->psz_path, &end, 0); if (!*p_access->psz_path || *end) { msg_Err (p_access, "invalid file descriptor: %s", p_access->psz_path); return VLC_EGENERIC; } fd = vlc_dup (fd); if (fd == -1) { msg_Err (p_access, "cannot use file descriptor: %s", vlc_strerror_c(errno)); return VLC_EGENERIC; } } else if( !strcmp( p_access->psz_path, "-" ) ) { #if defined( _WIN32 ) || defined( __OS2__ ) setmode (STDOUT_FILENO, O_BINARY); #endif fd = vlc_dup (STDOUT_FILENO); if (fd == -1) { msg_Err (p_access, "cannot use standard output: %s", vlc_strerror_c(errno)); return VLC_EGENERIC; } msg_Dbg( p_access, "using stdout" ); } else { const char *path = p_access->psz_path; char *buf = NULL; if (var_InheritBool (p_access, SOUT_CFG_PREFIX"format")) { buf = str_format_time (path); path_sanitize (buf); path = buf; } int flags = O_RDWR | O_CREAT | O_LARGEFILE; if (!overwrite) flags |= O_EXCL; if (!append) flags |= O_TRUNC; #ifdef O_SYNC if (var_GetBool (p_access, SOUT_CFG_PREFIX"sync")) flags |= O_SYNC; #endif do { fd = vlc_open (path, flags, 0666); if (fd != -1) break; if (fd == -1) msg_Err (p_access, "cannot create %s: %s", path, vlc_strerror_c(errno)); if (overwrite || errno != EEXIST) break; flags &= ~O_EXCL; } while (vlc_dialog_wait_question (p_access, VLC_DIALOG_QUESTION_NORMAL, _("Keep existing file"), _("Overwrite"), NULL, path, _("The output file already exists. " "If recording continues, the file will be " "overridden and its content will be lost.")) == 1); free (buf); if (fd == -1) return VLC_EGENERIC; } struct stat st; if (fstat (fd, &st)) { msg_Err (p_access, "write error: %s", vlc_strerror_c(errno)); close (fd); return VLC_EGENERIC; } p_access->pf_read = Read; if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) { p_access->pf_write = Write; p_access->pf_seek = Seek; } #ifdef S_ISSOCK else if (S_ISSOCK(st.st_mode)) { p_access->pf_write = Send; p_access->pf_seek = NoSeek; } #endif else { p_access->pf_write = WritePipe; p_access->pf_seek = NoSeek; } p_access->pf_control = Control; p_access->p_sys = (void *)(intptr_t)fd; msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path ); if (append) lseek (fd, 0, SEEK_END); return VLC_SUCCESS; }
/***************************************************************************** * Open: open the file *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_access_out_t *p_access = (sout_access_out_t*)p_this; int fd; config_ChainParse( p_access, SOUT_CFG_PREFIX, ppsz_sout_options, p_access->p_cfg ); if( !p_access->psz_path ) { msg_Err( p_access, "no file name specified" ); return VLC_EGENERIC; } bool append = var_GetBool( p_access, SOUT_CFG_PREFIX "append" ); if (!strcmp (p_access->psz_access, "fd")) { char *end; fd = strtol (p_access->psz_path, &end, 0); if (!*p_access->psz_path || *end) { msg_Err (p_access, "invalid file descriptor: %s", p_access->psz_path); return VLC_EGENERIC; } fd = vlc_dup (fd); if (fd == -1) { msg_Err (p_access, "cannot use file descriptor: %m"); return VLC_EGENERIC; } } #ifndef UNDER_CE else if( !strcmp( p_access->psz_path, "-" ) ) { #ifdef WIN32 setmode (fileno (stdout), O_BINARY); #endif fd = vlc_dup (fileno (stdout)); if (fd == -1) { msg_Err (p_access, "cannot use standard output: %m"); return VLC_EGENERIC; } msg_Dbg( p_access, "using stdout" ); } #endif else { char *psz_tmp = str_format( p_access, p_access->psz_path ); path_sanitize( psz_tmp ); fd = vlc_open( psz_tmp, O_RDWR | O_CREAT | O_LARGEFILE | #ifdef O_SYNC (var_GetBool( p_access, SOUT_CFG_PREFIX "sync" ) ? O_SYNC : 0) | #endif (append ? 0 : O_TRUNC), 0666 ); free( psz_tmp ); if (fd == -1) { msg_Err (p_access, "cannot create %s: %m", p_access->psz_path); return VLC_EGENERIC; } } p_access->pf_write = Write; p_access->pf_read = Read; p_access->pf_seek = Seek; p_access->pf_control = Control; p_access->p_sys = (void *)(intptr_t)fd; msg_Dbg( p_access, "file access output opened (%s)", p_access->psz_path ); if (append) lseek (fd, 0, SEEK_END); return VLC_SUCCESS; }
/** * This function will save a video snapshot to a file */ static int VoutWriteSnapshot( vout_thread_t *p_vout, char **ppsz_filename, const block_t *p_image, const char *psz_path, const char *psz_format, const char *psz_prefix_fmt ) { /* */ char *psz_filename; DIR *p_path = utf8_opendir( psz_path ); if( p_path != NULL ) { /* The use specified a directory path */ closedir( p_path ); /* */ char *psz_prefix = NULL; if( psz_prefix_fmt ) psz_prefix = str_format( p_vout, psz_prefix_fmt ); if( !psz_prefix ) { psz_prefix = strdup( "vlcsnap-" ); if( !psz_prefix ) goto error; } if( var_GetBool( p_vout, "snapshot-sequential" ) ) { int i_num = var_GetInteger( p_vout, "snapshot-num" ); for( ; ; i_num++ ) { struct stat st; if( asprintf( &psz_filename, "%s" DIR_SEP "%s%05d.%s", psz_path, psz_prefix, i_num++, psz_format ) < 0 ) { free( psz_prefix ); goto error; } if( utf8_stat( psz_filename, &st ) ) break; free( psz_filename ); } var_SetInteger( p_vout, "snapshot-num", i_num ); } else { struct tm curtime; time_t lcurtime = time( NULL ) ; if( !localtime_r( &lcurtime, &curtime ) ) { const unsigned int i_id = (p_image->i_pts / 100000) & 0xFFFFFF; msg_Warn( p_vout, "failed to get current time. Falling back to legacy snapshot naming" ); if( asprintf( &psz_filename, "%s" DIR_SEP "%s%u.%s", psz_path, psz_prefix, i_id, psz_format ) < 0 ) psz_filename = NULL; } else { /* suffix with the last decimal digit in 10s of seconds resolution * FIXME gni ? */ const int i_id = (p_image->i_pts / (100*1000)) & 0xFF; char psz_curtime[128]; if( !strftime( psz_curtime, sizeof(psz_curtime), "%Y-%m-%d-%Hh%Mm%Ss", &curtime ) ) strcpy( psz_curtime, "error" ); if( asprintf( &psz_filename, "%s" DIR_SEP "%s%s%1u.%s", psz_path, psz_prefix, psz_curtime, i_id, psz_format ) < 0 ) psz_filename = NULL; } } free( psz_prefix ); } else { /* The user specified a full path name (including file name) */ psz_filename = str_format( p_vout, psz_path ); path_sanitize( psz_filename ); } if( !psz_filename ) goto error; /* Save the snapshot */ FILE *p_file = utf8_fopen( psz_filename, "wb" ); if( !p_file ) { msg_Err( p_vout, "Failed to open '%s'", psz_filename ); free( psz_filename ); goto error; } if( fwrite( p_image->p_buffer, p_image->i_buffer, 1, p_file ) != 1 ) { msg_Err( p_vout, "Failed to write to '%s'", psz_filename ); fclose( p_file ); free( psz_filename ); goto error; } fclose( p_file ); /* */ if( ppsz_filename ) *ppsz_filename = psz_filename; else free( psz_filename ); return VLC_SUCCESS; error: msg_Err( p_vout, "could not save snapshot" ); return VLC_EGENERIC; }
// ************************************************************************** // * サーバ HTTP処理部 // ************************************************************************** void server_http_process(int accept_socket) { FILETYPES result; HTTP_RECV_INFO http_recv_info; //HTTP受信情報保存構造体 int flag_allow_user_agent_check; int ret; memset(&http_recv_info, 0, sizeof(http_recv_info)); // ---------------------------------------- // HTTP リクエストヘッダ受信 // ---------------------------------------- debug_log_output("HTTP Header receive start!\n"); ret = http_header_receive(accept_socket, &http_recv_info); if ( ret != 0 ){ // エラーチェック // エラーメッセージ debug_log_output("http_header_receive() Error. result=%d\n", ret); // ソケットクローズ sClose(accept_socket); return; } debug_log_output("recv_uri:'%s'\n", http_recv_info.recv_uri); debug_log_output("user_agent:'%s'\n", http_recv_info.user_agent); debug_log_output("range_start_pos=%d\n", http_recv_info.range_start_pos); debug_log_output("range_end_pos=%d\n", http_recv_info.range_end_pos); // ========================== // = User-Agent チェック // ========================== flag_allow_user_agent_check = 0; if ( strlen(allow_user_agent[0].user_agent) == 0 ){ // User-Agnet指示が無し。 debug_log_output("user_agent: allow_user_agent No List. All Allow."); flag_allow_user_agent_check = 1; // OK }else{ // User-Agent チェック実行 //TODO iはかきつぶしちゃいけないよ。 for ( int i=0; i<ALLOW_USER_AGENT_LIST_MAX; i++){ if ( strlen(allow_user_agent[i].user_agent) == 0 ){ break; } // 一致チェック debug_log_output("user_agent: Check[%d] '%s' in '%s'",i, allow_user_agent[i].user_agent, http_recv_info.user_agent); if ( strstr( http_recv_info.user_agent, allow_user_agent[i].user_agent ) != NULL ){ debug_log_output("user_agent: '%s' OK.", allow_user_agent[i].user_agent ); flag_allow_user_agent_check = 1; // 一致。OK break; } } } // User-Agentチェック NGならば、ソケットクローズ。終了。 if ( flag_allow_user_agent_check == 0 ){ debug_log_output("allow_user_agent check. Deny. Socket close."); // ソケットクローズ sClose(accept_socket); return; } //PROXY判定 if (!strncmp(http_recv_info.recv_uri, "/-.-", 4)) { // proxy if (http_proxy_response(accept_socket, &http_recv_info) < 0){ debug_log_output("error close not found"); http_not_found_response(accept_socket, &http_recv_info); } // ソケットクローズ sClose(accept_socket); return; } if (path_sanitize(http_recv_info.recv_uri, sizeof(http_recv_info.recv_uri)) == NULL){ // BAD REQUEST! debug_log_output("BAD REQUEST!"); http_not_found_response(accept_socket, &http_recv_info); sClose(accept_socket); return; } debug_log_output("sanitized recv_uri: %s", http_recv_info.recv_uri); // ---------------------------------------- // 受け取ったURIの拡張子がrename対象ならばrename // ---------------------------------------- extension_del_rename(http_recv_info.recv_uri); // ============================ // ファイルチェック // 種類に応じて分岐 // ============================ result = http_file_check(&http_recv_info); if (result == _OPENDIR){ // ディレクトリだが終端が '/' ではない char buffer[FILENAME_MAX]; sprintf(buffer, "%s/", http_recv_info.recv_uri); http_redirect_response(accept_socket, &http_recv_info, buffer); }else if ( result < _FILE ){ // ファイルが見つからない http_not_found_response(accept_socket, &http_recv_info); }else if ( result == _FILE ){ // ファイル実体ならば、実体転送。 // actionに、ImageViewerが指示されている? //if ( strcasecmp(http_recv_info.action, "ImageView" ) == 0){ // // ---------------------------------------- // // イメージファイルビューアー // // ---------------------------------------- // debug_log_output("Image Viewer start!\n"); // http_image_viewer(accept_socket, &http_recv_info); // debug_log_output("Image Viewer end!\n"); // // actionに、SinglePlayが指示されている? if ( strcasecmp(http_recv_info.action, "SinglePlay" ) == 0){ // ---------------------------------------- // Musicファイル 単独プレイ // ---------------------------------------- debug_log_output("Single Play start!\n"); //http_music_single_play(accept_socket, &http_recv_info); debug_log_output("Single Play end!\n"); }else{ // アクションに指定無し。 // ---------------------------------------- // ファイルの実体 // HTTPリクエストヘッダに従ってデータを返信。 // ---------------------------------------- debug_log_output("HTTP response start!\n"); http_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP response end!\n"); return; } }else if ( result == _PLW ){ // --------------------------------------------- // plw/uplファイル(`・ω・´) // リストファイルから、プレイリスト生成して返信 // --------------------------------------------- debug_log_output("HTTP wizd play list create and response start!\n"); //http_listfile_to_playlist_create(accept_socket, &http_recv_info); debug_log_output("HTTP wizd play list create and response end!\n"); }else if ( result == _CGI ){ // --------------------------------------------- // cgiファイル // cgiを実行して結果を返信 // --------------------------------------------- debug_log_output("HTTP CGI response start!\n"); http_cgi_response(accept_socket, &http_recv_info); debug_log_output("HTTP CGI response end!\n"); return; }else{ // ---------------------------------------- // ディレクトリ 内にindex.html or index.htm or index.cgi があったら、そちらを表示する。 // ---------------------------------------- //request_uriの最後が?なら強制的にmenu.jssを起動。それ以外は通常のファイル処理 //request_uriの設定 //?以降のパラメータがあるなら付け替える。なければsend_filenameをつける wString tmp(http_recv_info.request_uri); int pos=tmp.Pos("?"); if( pos >= 0 ){ strcpy(http_recv_info.recv_uri,"/menu.jss"); tmp = tmp.substr(pos+1,tmp.Length()-pos-1); if(tmp.Length()){ sprintf(http_recv_info.request_uri,"/menu.jss?%s", tmp.c_str()); }else{ sprintf(http_recv_info.request_uri,"/menu.jss?root=%s", http_recv_info.send_filename); } //send file nameの設定 sprintf(http_recv_info.send_filename,"%s%smenu.jss", global_param.skin_root,global_param.skin_name); http_cgi_response(accept_socket, &http_recv_info); debug_log_output("HTTP file menu end.\n"); return; //通常の処理 }else{ result = http_index( &http_recv_info ); if( result == _FILE ){ // ---------------------------------------- // ファイルの実体 // HTTPリクエストヘッダに従ってデータを返信。 // ---------------------------------------- debug_log_output("HTTP response start!\n"); http_file_response(accept_socket, &http_recv_info); debug_log_output("HTTP response end!\n"); }else if ( result == _CGI ){ debug_log_output("HTTP CGI response start! %d\n",accept_socket); http_cgi_response(accept_socket, &http_recv_info); debug_log_output("HTTP CGI response end!\n"); return; }else{ debug_log_output("BAD REQUEST!"); http_not_found_response(accept_socket, &http_recv_info); } } } sClose(accept_socket); return; }