📄 tcl_data.c
字号:
/* -*- Mode: C -*- * tcl_data.c * * Description : ndmpc Tcl data commands. * * Copyright (c) 1996,1997 PDC, Network Appliance. All Rights Reserved. * * $Id: tcl_data.c,v 1.11 1998/05/26 03:51:55 tim Exp $ */#if !defined(lint) && !defined(SABER)static char rcsId[] __attribute__ ((unused)) = "@(#) $Id: tcl_data.c,v 1.11 1998/05/26 03:51:55 tim Exp $";#endif#include <stdlib.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <tcl.h>#include "ndmpc.h"static ndmp_pval* pvalhead = 0;static u_long envcnt = 0;static ndmp_name* nlisthead = 0;static u_long nlistcnt = 0;/* * dataGetStateCmd * Sends an ndmp_data_get_state_request to the NDMP server. * usage: data_get_state * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataGetStateCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[] __attribute__ ((unused))){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_get_state_reply* reply = 0; int r; char buf[32]; char addrStr[400]; if (argc != 1) { Tcl_SetResult(interp, "usage: data_get_state", TCL_STATIC); return(TCL_ERROR); } r = ndmpSendRequest(connection, NDMP_DATA_GET_STATE, NDMP_NO_ERR, 0, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } ndmpcTclAddToResult(interp, "operation", reply->operation == NDMP_DATA_OP_NOACTION ? "NDMP_DATA_OP_NOACTION" : reply->operation == NDMP_DATA_OP_BACKUP ? "NDMP_DATA_OP_BACKUP" : reply->operation == NDMP_DATA_OP_RESTORE ? "NDMP_DATA_OP_RESTORE" : "undefined"); ndmpcTclAddToResult(interp, "state", reply->state == NDMP_DATA_STATE_IDLE ? "NDMP_DATA_STATE_IDLE" : reply->state == NDMP_DATA_STATE_ACTIVE ? "NDMP_DATA_STATE_ACTIVE" : reply->state == NDMP_DATA_STATE_HALTED ? "NDMP_DATA_STATE_HALTED" : reply->state == NDMP_DATA_STATE_LISTEN ? "NDMP_DATA_STATE_LISTEN" : reply->state == NDMP_DATA_STATE_CONNECTED ? "NDMP_DATA_STATE_CONNECTED" : "undefined"); ndmpcTclAddToResult(interp, "halt_reason", reply->halt_reason == NDMP_DATA_HALT_NA ? "NDMP_DATA_HALT_NA" : reply->halt_reason == NDMP_DATA_HALT_SUCCESSFUL ? "NDMP_DATA_HALT_SUCCESSFUL" : reply->halt_reason == NDMP_DATA_HALT_ABORTED ? "NDMP_DATA_HALT_ABORTED" : reply->halt_reason == NDMP_DATA_HALT_INTERNAL_ERROR ? "NDMP_DATA_HALT_INTERNAL_ERROR" : reply->halt_reason == NDMP_DATA_HALT_CONNECT_ERROR ? "NDMP_DATA_HALT_CONNECT_ERROR" : "undefined"); sprintf(buf, "%llu", quadToLongLong(reply->bytes_processed)); ndmpcTclAddToResult(interp, "bytes_processed", buf); sprintf(buf, "%llu", quadToLongLong(reply->est_bytes_remain)); ndmpcTclAddToResult(interp, "est_bytes_remain", buf); sprintf(buf, "%lu", reply->est_time_remain); ndmpcTclAddToResult(interp, "est_time_remain", buf); switch (reply->data_connection_addr.addr_type) { case NDMP_ADDR_LOCAL: { sprintf(addrStr, "LOCAL"); break; } case NDMP_ADDR_TCP: { sprintf(addrStr, "TCP 0x%lx %u", reply->data_connection_addr.ndmp_addr_u.tcp_addr.ip_addr, reply->data_connection_addr.ndmp_addr_u.tcp_addr.port); break; } case NDMP_ADDR_FC: { sprintf(addrStr, "FC %ld", reply->data_connection_addr.ndmp_addr_u.fc_addr.loop_id); break; } case NDMP_ADDR_IPC: { char dataStr[300]; u_long i; char* p = dataStr; u_int length = reply->data_connection_addr.ndmp_addr_u.ipc_addr.comm_data.comm_data_len; char* data = reply->data_connection_addr.ndmp_addr_u.ipc_addr.comm_data.comm_data_val; for (i = 0; i < sizeof(dataStr)/3 && i < length; i++) { sprintf(p, "%02x ", (u_int)data[i]&0xff); p += 3; } sprintf(addrStr, "IPC 0x%s", dataStr); break; } default: { sprintf(addrStr, "undefined"); break; } } ndmpcTclAddToResult(interp, "data_connection_addr", addrStr); sprintf(buf, "%llu", quadToLongLong(reply->read_offset)); ndmpcTclAddToResult(interp, "read_offset", buf); sprintf(buf, "%llu", quadToLongLong(reply->read_length)); ndmpcTclAddToResult(interp, "read_length", buf); ndmpFreeMessage(connection); return(TCL_OK);}/* * dataStartBackupCmd * Sends an ndmp_data_start_backup_request to the NDMP server. * usage: data_start_backup backup-type * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataStartBackupCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[]){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_start_backup_request request; ndmp_data_start_backup_reply* reply = 0; int r; if (argc != 2) { Tcl_SetResult(interp, "usage: data_start_backup backup-type", TCL_STATIC); return(TCL_ERROR); } request.bu_type = argv[1]; request.env.env_val = pvalhead; request.env.env_len = envcnt; r = ndmpSendRequest(connection, NDMP_DATA_START_BACKUP, NDMP_NO_ERR, (void*)&request, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } ndmpFreeMessage(connection); return(TCL_OK);}/* * dataStartRecoverCmd * Sends an ndmp_data_start_recover_request to the NDMP server. * usage: data_start_recover backup-type * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataStartRecoverCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[]){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_start_recover_request request; ndmp_data_start_recover_reply* reply = 0; int r; if (argc != 2) { Tcl_SetResult(interp, "usage: data_start_recover backup-type", TCL_STATIC); return(TCL_ERROR); } request.bu_type = argv[1]; request.env.env_len = envcnt; request.env.env_val = pvalhead; request.nlist.nlist_len = nlistcnt; request.nlist.nlist_val = nlisthead; r = ndmpSendRequest(connection, NDMP_DATA_START_RECOVER, NDMP_NO_ERR, (void*)&request, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } ndmpFreeMessage(connection); return(TCL_OK);}/* * dataAbortCmd * Sends an ndmp_data_abort_request to the NDMP server. * usage: data_abort * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataAbortCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[] __attribute__ ((unused))){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_abort_reply* reply = 0; int r; if (argc != 1) { Tcl_SetResult(interp, "usage: data_abort", TCL_STATIC); return(TCL_ERROR); } r = ndmpSendRequest(connection, NDMP_DATA_ABORT, NDMP_NO_ERR, 0, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } ndmpFreeMessage(connection); return(TCL_OK);}/* * dataStopCmd * Sends an ndmp_data_stop_request to the NDMP server. * usage: data_stop * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataStopCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[] __attribute__ ((unused))){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_stop_reply* reply = 0; int r; if (argc != 1) { Tcl_SetResult(interp, "usage: data_stop", TCL_STATIC); return(TCL_ERROR); } r = ndmpSendRequest(connection, NDMP_DATA_STOP, NDMP_NO_ERR, 0, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } ndmpFreeMessage(connection); return(TCL_OK);}/* * dataGetEnvCmd * Sends an ndmp_data_get_env_request to the NDMP server. * usage: data_get_env * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataGetEnvCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[] __attribute__ ((unused))){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_get_env_reply* reply = 0; int r; Tcl_DString env_list; ndmp_pval* envp; u_long i; if (argc != 1) { Tcl_SetResult(interp, "usage: data_get_env", TCL_STATIC); return(TCL_ERROR); } r = ndmpSendRequest(connection, NDMP_DATA_GET_ENV, NDMP_NO_ERR, 0, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } Tcl_DStringInit(&env_list); for (i = 0; i < reply->env.env_len; i++) { envp = &reply->env.env_val[i]; Tcl_DStringStartSublist(&env_list); Tcl_DStringAppend(&env_list, envp->name, -1); Tcl_DStringAppendElement(&env_list, envp->value); Tcl_DStringEndSublist(&env_list); } ndmpcTclAddToResult(interp, "env", Tcl_DStringValue(&env_list)); Tcl_DStringFree(&env_list); ndmpFreeMessage(connection); return(TCL_OK);}/* * dataListenCmd * Sends an ndmp_data_listen_request to the NDMP server. * usage: data_listen local|tcp|fc|ipc * * Parameters: * clientData (input) - connection handle. * interp (input) - Tcl interpreter. * argc (input) - argument count. * argv (input) - argument array. * * Returns: * Tcl error code. */intdataListenCmd(void* clientData, Tcl_Interp* interp, int argc, char* argv[]){ NdmpConnection connection = (NdmpConnection)clientData; ndmp_data_listen_request request; ndmp_data_listen_reply* reply = 0; int r; char addrStr[400]; if (argc != 2) { Tcl_SetResult(interp, "usage: data_listen local|tcp|fc|ipc", TCL_STATIC); return(TCL_ERROR); } if (strcmp(argv[1], "local") == 0) request.addr_type = NDMP_ADDR_LOCAL; else if (strcmp(argv[1], "tcp") == 0) request.addr_type = NDMP_ADDR_TCP; else if (strcmp(argv[1], "fc") == 0) request.addr_type = NDMP_ADDR_FC; else if (strcmp(argv[1], "ipc") == 0) request.addr_type = NDMP_ADDR_IPC; else { Tcl_SetResult(interp, "usage: data_listen local|tcp|fc|ipc", TCL_STATIC); return(TCL_ERROR); } r = ndmpSendRequest(connection, NDMP_DATA_LISTEN, NDMP_NO_ERR, &request, (void*)&reply); if (ndmpcCheckNdmpSend(interp, r, reply ? reply->error : 0)) { ndmpFreeMessage(connection); return(r < 0 ? TCL_ERROR : TCL_OK); } switch (reply->data_connection_addr.addr_type) { case NDMP_ADDR_LOCAL: { sprintf(addrStr, "LOCAL"); break; } case NDMP_ADDR_TCP: { sprintf(addrStr, "TCP 0x%lx %u", reply->data_connection_addr.ndmp_addr_u.tcp_addr.ip_addr, reply->data_connection_addr.ndmp_addr_u.tcp_addr.port); break; } case NDMP_ADDR_FC: { sprintf(addrStr, "FC %ld", reply->data_connection_addr.ndmp_addr_u.fc_addr.loop_id); break; } case NDMP_ADDR_IPC: { char dataStr[300]; u_long i; char* p = dataStr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -