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

📄 tcl_data.c

📁 网络数据管理协议的开发
💻 C
📖 第 1 页 / 共 2 页
字号:
			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);	ndmpFreeMessage(connection);	return(TCL_OK);}/* * dataConnectCmd *   Sends an ndmp_data_connect_request to the NDMP server. *   usage: data_connect local *          data_connect tcp ip_addr port *          data_connect fc  loop_id *          data_connect ipc address  * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intdataConnectCmd(void*		clientData,			   Tcl_Interp*	interp,			   int			argc,			   char*		argv[]){	NdmpConnection				connection = (NdmpConnection)clientData;	ndmp_data_connect_request	request;	ndmp_data_connect_reply*	reply = 0;	int 						r;		if (argc < 2)	{		Tcl_SetResult(interp, "usage: data_connect local|tcp|fc|ipc ?address?",					  TCL_STATIC);		return(TCL_ERROR);	}	if (strcmp(argv[1], "local") == 0)	{		request.addr.addr_type = NDMP_ADDR_LOCAL;	}	else if (strcmp(argv[1], "tcp") == 0)	{		if (argc != 4)		{			Tcl_SetResult(interp, "usage: data_connect tcp ip_addr port",						  TCL_STATIC);			return(TCL_ERROR);		}				request.addr.addr_type = NDMP_ADDR_TCP;		request.addr.ndmp_addr_u.tcp_addr.ip_addr = strtoul(argv[2], 0, 0);		request.addr.ndmp_addr_u.tcp_addr.port = strtoul(argv[3], 0, 0);	}	else if (strcmp(argv[1], "fc") == 0)	{		if (argc != 3)		{			Tcl_SetResult(interp, "usage: data_connect fc loop_id",						  TCL_STATIC);			return(TCL_ERROR);		}				request.addr.addr_type = NDMP_ADDR_FC;		request.addr.ndmp_addr_u.fc_addr.loop_id = strtoul(argv[2], 0, 0);	}	else if (strcmp(argv[1], "ipc") == 0)	{		if (argc != 3)		{			Tcl_SetResult(interp, "usage: data_connect ipc address",						  TCL_STATIC);			return(TCL_ERROR);		}				request.addr.addr_type = NDMP_ADDR_IPC;		request.addr.ndmp_addr_u.ipc_addr.comm_data.comm_data_len = strlen(argv[2]);		request.addr.ndmp_addr_u.ipc_addr.comm_data.comm_data_val = argv[2];	}	else	{		Tcl_SetResult(interp,					  "usage: data_connect local|tcp|fc|ipc ?address?",					  TCL_STATIC);		return(TCL_ERROR);	}		r = ndmpSendRequest(connection, NDMP_DATA_CONNECT, NDMP_NO_ERR,						&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);}/* * addEnvCmd *   Adds an environment variable name/value pair to the *   environment list. *   usage: add_env name value * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intaddEnvCmd(void*			clientData __attribute__ ((unused)),		  Tcl_Interp*	interp,		  int			argc,		  char*			argv[]){	char*	namebuf;	char*	valbuf;		if (argc != 3)	{		Tcl_SetResult(interp, "usage: add_env name value",					  TCL_STATIC);		return(TCL_ERROR);	}	if ((namebuf = (char*)malloc(strlen(argv[1])+1)) == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		return(TCL_ERROR);	}		if ((valbuf = (char*)malloc(strlen(argv[2])+1)) == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		free(namebuf);		return(TCL_ERROR);	}	if (pvalhead == 0)	{		if ((pvalhead = (ndmp_pval*) malloc(sizeof (ndmp_pval))) == 0)		{			Error(LOG_ERR, "malloc error: %s", strerror(errno));			free(namebuf);			free(valbuf);			return(TCL_ERROR);		}	}	else	{		if ((pvalhead = (ndmp_pval*) realloc((char*)pvalhead,											   (envcnt + 1) * sizeof(ndmp_pval))) == 0)		{			Error(LOG_ERR, "realloc error: %s", strerror(errno));			free(namebuf);			free(valbuf);			return(TCL_ERROR);		}	}	strcpy(namebuf, argv[1]);	strcpy(valbuf, argv[2]);		pvalhead[envcnt].name  = namebuf;	pvalhead[envcnt].value = valbuf;	envcnt++;	return(TCL_OK);}/* * clearEnvCmd *   Clears the environment variable list. *   usage: clear_env * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intclearEnvCmd(void*		clientData __attribute__ ((unused)),			Tcl_Interp*	interp,			int			argc,			char*		argv[] __attribute__ ((unused))){	u_long i;	if (argc != 1)	{		Tcl_SetResult(interp, "usage: clear_env",					  TCL_STATIC);		return(TCL_ERROR);	}	if (envcnt == 0)		return(TCL_OK);			for (i = 0; i < envcnt; i++)	{		free(pvalhead[i].name);		free(pvalhead[i].value);	}	free(pvalhead);	pvalhead = 0;	envcnt   = 0;	return(TCL_OK);}/* * printEnvCmd *   Prints the environment variable list. *   usage: print_env * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intprintEnvCmd(void*		clientData __attribute__ ((unused)),			Tcl_Interp*	interp,			int			argc,			char*		argv[] __attribute__ ((unused))){	u_long i;	if (argc != 1)	{		Tcl_SetResult(interp, "usage: print_env",					  TCL_STATIC);		return(TCL_ERROR);	}	for (i = 0; i < envcnt; i++)	{		Log("%s %s\n", pvalhead[i].name, pvalhead[i].value);	}	return(TCL_OK);}/* * addNlistCmd *   Adds a name to the name list. *   usage: add_nlist name destination ?fh_info? * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intaddNlistCmd(void*		clientData __attribute__ ((unused)),			Tcl_Interp*	interp,			int			argc,			char*		argv[]){	char*	namebuf;	char*	destbuf;	char*	newnamebuf;	char*	othernamebuf;		if (argc < 3)	{		Tcl_SetResult(interp, "usage: add_nlist name destination ?fh_info? ?node? ?new_name? ?other_name?",					  TCL_STATIC);		return(TCL_ERROR);	}	if ((namebuf = (char*)malloc(strlen(argv[1])+1)) == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		return(TCL_ERROR);	}		if ((destbuf = (char*)malloc(strlen(argv[2])+1)) == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		free(namebuf);		return(TCL_ERROR);	}		if (argc >= 5)		newnamebuf = (char*)malloc(strlen(argv[5])+1);	else		newnamebuf = (char*)malloc(1);	if (newnamebuf == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		free(namebuf);		free(destbuf);		return(TCL_ERROR);	}	if (argc >= 6)		othernamebuf = (char*)malloc(strlen(argv[6])+1);	else		othernamebuf = (char*)malloc(1);		if (othernamebuf == 0)	{		Error(LOG_ERR, "malloc error: %s", strerror(errno));		free(namebuf);		free(destbuf);		free(newnamebuf);		return(TCL_ERROR);	}		if (nlisthead == 0)	{		if ((nlisthead = (ndmp_name*) 			 malloc(sizeof(ndmp_name))) == 0)		{		    Error(LOG_ERR, "malloc error: %s", strerror(errno));			free(namebuf);			free(destbuf);			free(newnamebuf);			free(othernamebuf);		    return(TCL_ERROR);		}	}	else	{	    if ((nlisthead =			 (ndmp_name*)realloc(nlisthead,								 (nlistcnt + 1) * sizeof(ndmp_name))) == 0)		{		    Error(LOG_ERR, "realloc error: %s", strerror(errno));			free(namebuf);			free(destbuf);			free(newnamebuf);			free(othernamebuf);			return(TCL_ERROR);	    }	}	strcpy(namebuf, argv[1]);	strcpy(destbuf, argv[2]);		nlisthead[nlistcnt].original_path   = namebuf;	nlisthead[nlistcnt].destination_dir = destbuf;	nlisthead[nlistcnt].new_name        = newnamebuf;	nlisthead[nlistcnt].other_name      = othernamebuf;	if (argc >= 3)		nlisthead[nlistcnt].fh_info   = longLongToQuad(0);	else		nlisthead[nlistcnt].fh_info   = longLongToQuad((u_longlong_t)strtoul(argv[3], 0, 0));			if (argc >= 4)		nlisthead[nlistcnt].node      = longLongToQuad(0);	else		nlisthead[nlistcnt].node      = longLongToQuad((u_longlong_t)strtoul(argv[4], 0, 0));	if (argc >= 5)		strcpy(newnamebuf, argv[5]);	else		newnamebuf[0] = '\0';		if (argc >= 6)		strcpy(othernamebuf, argv[6]);	else		othernamebuf[0] = '\0';			nlistcnt++;	return(TCL_OK);}/* * clearNlistCmd *   Clears the file name list *   usage: clear_nlist * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intclearNlistCmd(void*			clientData __attribute__ ((unused)),			  Tcl_Interp*	interp,			  int			argc,			  char*			argv[] __attribute__ ((unused))){	u_long i;	if (argc != 1)	{		Tcl_SetResult(interp, "usage: clear_nlist",					  TCL_STATIC);		return(TCL_ERROR);	}	if (nlistcnt == 0)		return(TCL_OK);		for (i = 0; i < nlistcnt; i++)	{		free(nlisthead[i].original_path);		free(nlisthead[i].destination_dir);		free(nlisthead[i].new_name);		free(nlisthead[i].other_name);	}	free(nlisthead);	nlisthead = 0;	nlistcnt  = 0;	return(TCL_OK);} /* * printNlistCmd *   Prints the file name list. *   usage: print_nlist * * Parameters: *   clientData (input) - connection handle. *   interp     (input) - Tcl interpreter. *   argc       (input) - argument count. *   argv       (input) - argument array. * * Returns: *   Tcl error code. */intprintNlistCmd(void*			clientData __attribute__ ((unused)),			  Tcl_Interp*	interp,			  int			argc,			  char*			argv[] __attribute__ ((unused))){	u_long i;	if (argc != 1)	{		Tcl_SetResult(interp, "usage: print_nlist",					  TCL_STATIC);		return(TCL_ERROR);	}	for (i = 0; i < nlistcnt; i++)	{		Log("%s %s %lld %lld %s %s\n",			nlisthead[i].original_path,			nlisthead[i].destination_dir,			quadToLongLong(nlisthead[i].fh_info),			quadToLongLong(nlisthead[i].node),			nlisthead[i].new_name,			nlisthead[i].other_name);	}	return(TCL_OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -