OSDN Git Service

* Fixed bug
[modchxj/mod_chxj.git] / src / chxj_img_conv_format.c
index 03461c2..a39d96a 100644 (file)
 
 #include <wand/magick_wand.h>
 
+#if !defined(LONG_LONG_MAX) && defined(LLONG_MAX)
+#  define LONG_LONG_MAX LLONG_MAX
+#endif
+
 
 #define EXIT_MAGICK_ERROR() \
   do { \
     char *description; ExceptionType severity; \
     description=MagickGetException(magick_wand,&severity); \
-    ap_log_rerror(APLOG_MARK,APLOG_DEBUG, 0, r,"%s %s %d %s\n",__FILE__,(__func__),__LINE__,description); \
+    ap_log_rerror(APLOG_MARK,APLOG_ERR, 0, r,"%s %s %d %s\n",__FILE__,(__func__),__LINE__,description); \
     description=(char *) MagickRelinquishMemory(description); \
     DestroyMagickWand(magick_wand); \
   } while(0) 
@@ -182,7 +186,8 @@ static apr_status_t s_create_cache_file(request_rec          *r,
                                         query_string_param_t *qsp,
                                         mod_chxj_config      *conf);
 
-static apr_status_t s_send_cache_file(device_table          *spec,
+static apr_status_t s_send_cache_file(mod_chxj_config       *conf,
+                                      device_table          *spec,
                                       query_string_param_t  *query_string,
                                       request_rec           *r,
                                       const char            *tmpfile);
@@ -428,7 +433,7 @@ s_img_conv_format_from_file(
   
     DBG(r,"REQ[%X] color=[%d]", TO_ADDR(r), spec->color);
     if (! r->header_only)  {
-      rv = s_send_cache_file(spec, qsp,r, tmpfile);
+      rv = s_send_cache_file(conf, spec, qsp,r, tmpfile);
     }
     else {
       rv = s_header_only_cache_file(spec, qsp, r, tmpfile);
@@ -510,7 +515,7 @@ s_create_cache_file(request_rec          *r,
     /*------------------------------------------------------------------------*/
     rv = apr_file_open(&fin, 
                     r->filename, 
-                    APR_READ|APR_BINARY ,
+                    APR_FOPEN_READ | APR_FOPEN_BINARY | APR_FOPEN_BUFFERED | APR_FOPEN_SHARELOCK | APR_FOPEN_SENDFILE_ENABLED,
                     APR_OS_DEFAULT, 
                     r->pool);
     if (rv != APR_SUCCESS) {
@@ -807,11 +812,12 @@ s_create_cache_file(request_rec          *r,
 
   /* to cache */
   rv = apr_file_open(&fout, tmpfile,
-                  APR_WRITE| APR_CREATE | APR_BINARY | APR_SHARELOCK ,APR_OS_DEFAULT,
+                  APR_FOPEN_WRITE| APR_FOPEN_CREATE | APR_FOPEN_BINARY | APR_SHARELOCK ,
+                  APR_OS_DEFAULT,
                   r->pool);
   if (rv != APR_SUCCESS) {
     DestroyMagickWand(magick_wand);
-    ERR(r,"file open error.[%s]", tmpfile);
+    ERR(r,"REQ[%X] file open error.[%s]", TO_ADDR(r), tmpfile);
     if (sv_writedata) free(sv_writedata);
     return HTTP_INTERNAL_SERVER_ERROR;
   }
@@ -1601,14 +1607,18 @@ s_img_down_sizing(MagickWand *magick_wand, request_rec *r, device_table *spec)
 
 
 static apr_status_t 
-s_send_cache_file(device_table *spec, query_string_param_t *query_string, request_rec *r, const char *tmpfile)
+s_send_cache_file(
+  mod_chxj_config      *conf,
+  device_table         *spec, 
+  query_string_param_t *query_string, 
+  request_rec          *r, 
+  const char           *tmpfile)
 {
   apr_status_t rv;
   apr_finfo_t  st;
   apr_file_t   *fout;
   apr_size_t   sendbyte;
   char         *contentLength;
-  mod_chxj_config *conf = ap_get_module_config(r->per_dir_config, &chxj_module);
 
   rv = apr_stat(&st, tmpfile, APR_FINFO_MIN, r->pool);
   if (rv != APR_SUCCESS)
@@ -1619,6 +1629,14 @@ s_send_cache_file(device_table *spec, query_string_param_t *query_string, reques
   DBG(r, "REQ[%X] offset:[%ld]", TO_ADDR(r), query_string->offset);
   DBG(r, "REQ[%X] count:[%ld]",  TO_ADDR(r), query_string->count);
 
+  /* for mod_cache */
+  {
+    apr_table_setn(r->headers_out, "Vary", "User-Agent");
+    apr_table_setn(r->err_headers_out, "Vary", "User-Agent");
+    ap_update_mtime(r, st.mtime);
+    ap_set_last_modified(r);
+  }
+
   if (query_string->mode != IMG_CONV_MODE_EZGET && query_string->name == NULL) {
     contentLength = apr_psprintf(r->pool, "%d", (int)st.size);
     apr_table_setn(r->headers_out, "Content-Length", (const char*)contentLength);
@@ -1665,7 +1683,8 @@ s_send_cache_file(device_table *spec, query_string_param_t *query_string, reques
       }
     }
     rv = apr_file_open(&fout, tmpfile, 
-      APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
+      APR_FOPEN_READ | APR_FOPEN_BINARY | APR_FOPEN_BUFFERED | APR_FOPEN_SHARELOCK | APR_FOPEN_SENDFILE_ENABLED, 
+      APR_OS_DEFAULT, r->pool);
     if (rv != APR_SUCCESS) {
       DBG(r, "cache file open failed[%s]", tmpfile);
       return HTTP_NOT_FOUND;
@@ -1721,7 +1740,8 @@ s_send_cache_file(device_table *spec, query_string_param_t *query_string, reques
       DBG(r, "Content-Length:[%d]", (int)st.size);
 
       rv = apr_file_open(&fout, tmpfile, 
-        APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
+        APR_FOPEN_READ | APR_FOPEN_BINARY | APR_FOPEN_BUFFERED | APR_FOPEN_SHARELOCK | APR_FOPEN_SENDFILE_ENABLED, 
+        APR_OS_DEFAULT, r->pool);
 
       if (rv != APR_SUCCESS) {
         DBG(r,"tmpfile open failed[%s]", tmpfile);
@@ -1751,8 +1771,17 @@ s_send_original_file(request_rec *r, const char *originalfile)
   if (rv != APR_SUCCESS)
     return HTTP_NOT_FOUND;
 
+  /* for mod_cache */
+  {
+    apr_table_setn(r->headers_out, "Vary", "User-Agent");
+    apr_table_setn(r->err_headers_out, "Vary", "User-Agent");
+    ap_update_mtime(r, st.mtime);
+    ap_set_last_modified(r);
+  }
+
   rv = apr_file_open(&fout, originalfile, 
-    APR_READ | APR_BINARY, APR_OS_DEFAULT, r->pool);
+    APR_FOPEN_READ | APR_FOPEN_BINARY | APR_FOPEN_BUFFERED | APR_FOPEN_SHARELOCK | APR_FOPEN_SENDFILE_ENABLED,
+    APR_OS_DEFAULT, r->pool);
   if (rv != APR_SUCCESS) {
     DBG(r, "originalfile open failed[%s]", originalfile);
     return HTTP_NOT_FOUND;
@@ -1892,7 +1921,7 @@ s_init_serial_pattern(apr_pool_t *p)
     v_docomo_serial_pattern3 = chxj_compile_for_preg_replace(p, ";icc[^;\\)]+");
   }  
   if (!v_softbank_serial_pattern1) {
-    v_softbank_serial_pattern1 = chxj_compile_for_preg_replace(p, "/SN[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z] ");
+    v_softbank_serial_pattern1 = chxj_compile_for_preg_replace(p, "/SN[0-9a-zA-Z]+ ");
   }  
 }
 
@@ -2438,7 +2467,7 @@ s_add_comment_to_png(request_rec *r, char *data, apr_size_t *len)
     pos += 4;
     memcpy(&result[pos], &data[PNG_SIG_AND_IHDR_SZ] , *len - PNG_SIG_AND_IHDR_SZ);
     *len = *len + total_tEXt_size;
-    DBG(r, "REQ[%X] writebyte:[%d]", (unsigned int)(apr_size_t)r, *len);
+    DBG(r, "REQ[%X] writebyte:[%d]", (unsigned int)(apr_size_t)r, (unsigned int)*len);
   }
   else {
     result = data;