⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcl_data.c

📁 网络数据管理协议的开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/*                               -*- 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 + -