blob: 07eef824cc26379d34ba013ba9112a14d81423a1 [file] [log] [blame]
/** @file
A brief file description
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include "Protocol.h"
/* global variable */
INKTextLogObject protocol_plugin_log;
/* static variable */
static INKAction pending_action;
static int accept_port;
static int server_port;
/* Functions only seen in this file, should be static. */
static void protocol_init(int accept_port, int server_port);
static int accept_handler(INKCont contp, INKEvent event, void *edata);
/* When the handle is called, the net_vc is returned. */
static int
accept_handler(INKCont contp, INKEvent event, void *edata)
{
INKCont txn_sm;
INKMutex pmutex;
int lock;
switch (event) {
case INK_EVENT_NET_ACCEPT:
/* Create a new mutex for the TxnSM, which is going
to handle the incoming request. */
pmutex = (INKMutex) INKMutexCreate();
txn_sm = (INKCont) TxnSMCreate(pmutex, (INKVConn) edata, server_port);
/* This is no reason for not grabbing the lock.
So skip the routine which handle LockTry failure case. */
if (INKMutexLockTry(pmutex, &lock) == INK_SUCCESS) {
INKContCall(txn_sm, 0, NULL);
INKMutexUnlock(pmutex);
}
break;
default:
/* Something wrong with the network, if there are any
pending NetAccept, cancel them. */
if (pending_action && !INKActionDone(pending_action))
INKActionCancel(pending_action);
INKContDestroy(contp);
break;
}
return INK_EVENT_NONE;
}
static void
protocol_init(int accept_port, int server_port)
{
INKCont contp;
int ret_val;
/* create customized log */
ret_val = INKTextLogObjectCreate("protocol", INK_LOG_MODE_ADD_TIMESTAMP, &protocol_plugin_log);
if (ret_val != INK_SUCCESS) {
INKError("failed to create log");
}
/* format of the log entries, for caching_status, 1 for HIT and 0 for MISS */
ret_val = INKTextLogObjectWrite(protocol_plugin_log, "timestamp filename servername caching_status\n\n");
if (ret_val != INK_SUCCESS) {
INKError("failed to write into log");
}
contp = INKContCreate(accept_handler, INKMutexCreate());
/* Accept network traffic from the accept_port.
When there are requests coming in, contp's handler
should be called, in this case, contp's handler
is accept_event, see AcceptSM.c */
pending_action = INKNetAccept(contp, accept_port);
}
int
check_ts_version()
{
const char *ts_version = INKTrafficServerVersionGet();
int result = 0;
if (ts_version) {
int major_ts_version = 0;
int minor_ts_version = 0;
int patch_ts_version = 0;
if (sscanf(ts_version, "%d.%d.%d", &major_ts_version, &minor_ts_version, &patch_ts_version) != 3) {
return 0;
}
/* Need at least TS 2.0 */
if (major_ts_version >= 2) {
result = 1;
}
}
return result;
}
void
INKPluginInit(int argc, const char *argv[])
{
INKPluginRegistrationInfo info;
info.plugin_name = "output-header";
info.vendor_name = "MyCompany";
info.support_email = "ts-api-support@MyCompany.com";
if (!INKPluginRegister(INK_SDK_VERSION_2_0, &info)) {
INKError("[PluginInit] Plugin registration failed.\n");
goto error;
}
if (!check_ts_version()) {
INKError("[PluginInit] Plugin requires Traffic Server 2.0 or later\n");
goto error;
}
/* default value */
accept_port = 4666;
server_port = 4666;
if (argc < 3) {
INKDebug("protocol", "Usage: protocol.so accept_port server_port");
printf("[protocol_plugin] Usage: protocol.so accept_port server_port\n");
printf("[protocol_plugin] Wrong arguments. Using deafult ports.\n");
} else {
if (!isnan(atoi(argv[1]))) {
accept_port = atoi(argv[1]);
INKDebug("protocol", "using accept_port %d", accept_port);
printf("[protocol_plugin] using accept_port %d\n", accept_port);
} else {
printf("[protocol_plugin] Wrong argument for accept_port.");
printf("Using deafult port %d\n", accept_port);
}
if (!isnan(atoi(argv[2]))) {
server_port = atoi(argv[2]);
INKDebug("protocol", "using server_port %d", server_port);
printf("[protocol_plugin] using server_port %d\n", server_port);
} else {
printf("[protocol_plugin] Wrong argument for server_port.");
printf("Using deafult port %d\n", server_port);
}
}
protocol_init(accept_port, server_port);
error:
INKError("[PluginInit] Plugin not initialized");
}