/**************************************************************************** mod_dav_pgsql (DASL) for apache 2.X CopyRight(C) 2005 SolutionBox Inc. All Rights reserved. CopyRight(C) 2006 Netomi Inc. All Rights reserved. Author : elenoa lazyfake (elenoa@solutionbox.co.kr) $Id: share.c,v 1.8 2007/02/22 08:22:13 elenoa Exp $ Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of SolutionBox Inc. ****************************************************************************/ #include #include #include #include #include #include #include #include /* for ap_construct_url */ #include #include #include #include "dav_repos.h" #include "dbms.h" #include "util.h" #include "share_common.h" #include "share_statistic.h" #ifndef __OPENDISK_SOLUTION_NOT_USE_TS__ /* for statistics */ static struct shm_mgnt stat_mgnt = { NULL, NULL, SHM_STAT, SHM_STAT_LOCK, 0, 0 }; struct service_network_stat *g_ts; static int maxvol = 0; int dav_initialize_shared_statistic(dav_repos_server_conf *dsc, server_rec *s, apr_pool_t *p) { if (dsc->user_cache <= 0) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "OPENDAV: initialize_shared_memory: " "MaxUserCache <= 0 (%d)", dsc->user_cache); return !OK; } maxvol = dsc->user_cache; /* statistics : calculate shared memory size from max_volume value */ stat_mgnt.size = (sizeof(struct service_network_stat) * maxvol * 2); g_ts = (struct service_network_stat *)dav_shared_get_new_memory(&stat_mgnt, s, p, true); if (!g_ts) return !OK; return OK; } void dav_cleanup_shared_statistic() { if (stat_mgnt.shm) { apr_shm_detach(stat_mgnt.shm); } if (stat_mgnt.lock) { apr_global_mutex_destroy(stat_mgnt.lock); } } static void dav_shared_ts_init(struct service_network_stat *ts, char *volume, unsigned int stamp) { acct_info id_parse; // CHG 2019-08-28 huibong ºÒÇÊ¿ä º¯¼ö »èÁ¦ (#32780) // - ºÒÇÊ¿ä ÇÔ¼ö È£Ãâ °á°ú ÀúÀå º¯¼ö¸¦ Á¦°ÅÇÑ´Ù. // - at_split() È£Ãâ ½ÇÆÐ½Ã¿¡µµ ÇØ´ç ÇÔ¼ö³»¿¡¼­ id_parse º¯¼ö¸¦ ÃʱâÈ­ ÇϹǷÎ.... // È£Ãâ °á°ú¿¡ µû¸¥ ´Ù¸¥ Á¶Ä¡´Â ºÒÇÊ¿ä. //int res = at_split(volume, &id_parse); at_split(volume, &id_parse); //memset(ts, 0, sizeof(struct service_network_stat)); ts->nServiceSeq = atoi(id_parse.szVolumeID); ts->nUserSeq = atoi(id_parse.szUserID); ts->down_content_size = 0; ts->up_content_size = 0; ts->down_traffic = 0; ts->up_traffic = 0; ts->timestamp = stamp; } // CHG 2010-08-30 huibong // °¢ ÇÔ¼ö¿¡¼­ Åë°èÁ¤º¸ ÀúÀåÀ» À§ÇÑ º»ÇÔ¼ö È£Ãâ½Ã ³»ºÎÀÇ apr_pstrcat() ÇÔ¼ö »ç¿ëÀ¸·Î ÀÎÇØ // °¢ Á¢¼Ó ¼¼¼Ç¸¶´Ù ¸Þ¸ð¸® ÇÒ´ç Çö»óÀÌ ¹Ýº¹ÇÏ¿© ¹ß»ý. // ƯÈ÷ ´ë¿ë·® ÆÄÀÏ¿¡ ´ëÇÑ ¾÷·Îµå/´Ù¿î·Îµå ¼¼¼ÇÀÎ °æ¿ì // ºÒÇÊ¿äÇÑ ¼¼¼Ç ¸Þ¸ð¸® pool À» °è¼ÓÀûÀ¸·Î ÇÒ´çÇÏ¿© °á±¹ ½Ã½ºÅÛ ¸Þ¸ð¸®°¡ ºÎÁ·, // swap ¸Þ¸ð¸® ÀÓ°èÄ¡ Ãʰú Çö»óÀÌ ¹ß»ýÇÏ´Â ¹®Á¦Á¡À» ¹ß»ý. // µû¶ó¼­ ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ apr_pstrcat() ÇÔ¼ö »ç¿ëºÎºÐÀ» Á¦°ÅÈÄ Áö¿ªº¯¼ö¸¦ »ç¿ëÇϵµ·Ï º¯°æÃ³¸®ÇÑ´Ù. static struct service_network_stat *dav_shared_ts_find(request_rec *r) { #ifndef __OPENDAV_SHARED_NOT_USE time_t t = time(0); unsigned int stamp = STAT_STAMP(t); // 2010-08-30 huibong //char *service = r->user; char service[128]; // service ÀúÀå Á¤º¸ Çü½ÄÀº 238.0@168 µîÀÇ Çü½ÄÀÓ acct_info acctinfo; int i; if (g_ts == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "OPENDAV: dav_shared_ts_find: global ts is null"); return NULL; } if (at_split(r->user, &acctinfo) <= 0) return NULL; /* 2010-08-30 huibong * apr_pstrcat() ÇÔ¼öÀÇ ¹Ýº¹ »ç¿ëÀ¸·Î ÀÎÇÑ ¸Þ¸ð¸® Áߺ¹ allocation ¹®Á¦·Î ÀÎÇØ ÄÚµå ¼öÁ¤Ã³¸® service = apr_pstrcat(r->pool, acctinfo.szVolumeID, #ifdef __CLASSIFIED_TRAFFIC_MANAGE__ ".", acctinfo.szTCClassID, #endif "@", acctinfo.szUserID, NULL); */ #ifdef __CLASSIFIED_TRAFFIC_MANAGE__ snprintf(service, sizeof(service), "%s.%s@%s", acctinfo.szVolumeID, acctinfo.szTCClassID, acctinfo.szUserID); #else // !__CLASSIFIED_TRAFFIC_MANAGE__ snprintf(service, sizeof(service), "%s@%s", acctinfo.szVolumeID, acctinfo.szUserID); #endif // __CLASSIFIED_TRAFFIC_MANAGE__ int nSvcsqe = atoi(acctinfo.szVolumeID); if (nSvcsqe <= 0) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "OPENDAV: dav_shared_ts_find: not found Service seq : %s", service); return NULL; } #define TS (g_ts + (i << 1) + STAT_LOC(stamp)) for (i = 0; i < maxvol; i++) { if (TS->nServiceSeq == 0) break; if (TS->nServiceSeq == nSvcsqe) { if (TS->timestamp != stamp) { dav_shared_ts_init(TS, service, stamp); } return TS; } } if (i < maxvol) { dav_shared_ts_init((g_ts + (i << 1)), service, stamp); dav_shared_ts_init((g_ts + (i << 1) + 1), service, stamp); return TS; } ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "OPENDAV: dav_shared_ts_find: volume limit exceeded: %s %d", service, i); #endif // !__OPENDAV_SHARED_NOT_USE return NULL; } int dav_shared_ts_access_statistic(request_rec *r) { #ifndef __OPENDAV_SHARED_NOT_USE #endif // !__OPENDAV_SHARED_NOT_USE return OK; } void dav_shared_ts_open_stream(request_rec *r, int bound) { DBG0("dav_shared_ts_open_stream debugging #0"); #ifndef __OPENDAV_SHARED_NOT_USE #endif // !__OPENDISK_SOLUTION_NOT_USE_TS__ } void dav_shared_ts_close_stream(request_rec *r, int bound) { #ifndef __OPENDAV_SHARED_NOT_USE #endif // !__OPENDISK_SOLUTION_NOT_USE_TS__ } void dav_shared_ts_transfer_data(request_rec *r, int bound, apr_size_t size, apr_size_t org_sent) { #ifndef __OPENDAV_SHARED_NOT_USE if (r == NULL) return; if (stat_mgnt.lock == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "OPENDAV: " "dav_shared_ts_transfer_data: lock null"); return; } if (size < 0) return; apr_global_mutex_lock(stat_mgnt.lock); struct service_network_stat *ts = dav_shared_ts_find(r); if (ts == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "OPENDAV: " "dav_shared_ts_transfer_data: cannot get transfer structure"); apr_global_mutex_unlock(stat_mgnt.lock); return; } if (bound == INB) { ts->up_content_size += size; ts->up_traffic += CONTENT_TO_TRAFFIC(size); } else { ts->down_content_size += size; ts->down_traffic += CONTENT_TO_TRAFFIC(size); } apr_global_mutex_unlock(stat_mgnt.lock); #endif // !__OPENDAV_SHARED_NOT_USE } #endif // !__OPENDISK_SOLUTION_NOT_USE_TS__