📄 tcl_data.c
字号:
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 + -