bind.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 249 行
C
249 行
/* template.c - your comments here */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/quipu/uips/de/RCS/bind.c,v 9.0 1992/06/16 12:45:59 isode Rel $";#endif/* * $Header: /xtel/isode/isode/others/quipu/uips/de/RCS/bind.c,v 9.0 1992/06/16 12:45:59 isode Rel $ * * * $Log: bind.c,v $ * Revision 9.0 1992/06/16 12:45:59 isode * Release 8.0 * *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * *//***************************************************************************** bind.c -*****************************************************************************/#include <stdio.h>#include "bind.h"#include "util.h"#include "quipu/common.h"#include "quipu/bind.h"#include "quipu/dap2.h"#include "logger.h"extern char *dsa_address;extern char *backup_dsa_address;extern char *username;extern char callingDteNumber[];extern int boundToDSA;extern int deLogLevel;extern LLog *de_log;/* this is not the way to do it */extern int dsap_ad;struct DAPconnect dc;struct DAPindication di;static int bindres;static int triedBackup = FALSE;static int bindStarted = FALSE;static int boundOnce = FALSE;int tryBackup(){ if (triedBackup == TRUE) return NOTOK; if (backup_dsa_address == NULLCP) return NOTOK; else { free(dsa_address); dsa_address = copy_string(backup_dsa_address); triedBackup = TRUE; return OK; }}/* * bind_to_ds - Bind to directory * */int init_bind_to_ds(assoc)int * assoc;{struct ds_bind_arg bind_arg;struct PSAPaddr *addr;void exit(); if (dsa_address == NULLCP) { (void) fprintf(stderr, "No dsa address has been configured in dsaptailor or detailor\n\n"); exit(-1); } if (triedBackup == FALSE) if (boundOnce == FALSE) (void)printf("Connecting to the Directory - wait just a moment please ...\n"); bind_arg.dba_version = DBA_VERSION_V1988; bind_arg.dba_auth_type = DBA_AUTH_SIMPLE; bind_arg.dba_dn = str2dn(username); bind_arg.dba_passwd[0] = '\0'; bind_arg.dba_passwd_len = 0;try_bind: if ((addr = str2paddr (dsa_address)) == NULLPA) { (void) fprintf(stderr, "DSA address format problem\n"); exit(-1); } bindres = DapAsynBindRequest(addr, &bind_arg, &dc, &di, ROS_ASYNC); if (bindres == NOTOK) { (void) fprintf(stderr, "\n\nDirectory server temporarily unavailable\n\n"); if (tryBackup == OK) { (void) fprintf(stderr, "Trying another server ...\n\n"); goto try_bind; } return NOTOK; } *assoc = dc.dc_sd; dsap_ad = dc.dc_sd; return OK;}int wait_bind_to_ds(assoc, wantToBlock)int assoc;int wantToBlock;{ struct PSAPindication pi_s; struct PSAPindication * pi = &(pi_s); int nfds, nevents; fd_set rfds; fd_set wfds; while ((bindres == CONNECTING_1) || (bindres == CONNECTING_2)) { FD_ZERO (&rfds); FD_ZERO (&wfds); if ((bindres == CONNECTING_2) && (wantToBlock == FALSE)) return CONNECTING_2; if (bindres == CONNECTING_1) { if (PSelectMask (assoc, &wfds, &nfds, pi) == NOTOK) { (void) fprintf(stderr, "PSelectMask (write) failed\n"); return NOTOK; } } if (bindres == CONNECTING_2) { if (PSelectMask (assoc, &rfds, &nfds, pi) == NOTOK) { (void) fprintf(stderr, "PSelectMask (read) failed\n"); return NOTOK; } } nevents = xselect (nfds, &rfds, &wfds, NULLFD, NOTOK); if (nevents == NOTOK) { (void) fprintf(stderr, "xselect failed\n"); return NOTOK; } else { /* * Hack coming up: nevents is number of events, we only asked for * one event, so unless there are no events we go ahead without * checking those horrid fd things, which would be safer. */ if (nevents != OK) bindres = DapAsynBindRetry(assoc, 0, &dc, &di); } if (bindres == DONE) { if (dc.dc_result != DC_RESULT) { if ((dc.dc_un.dc_bind_err.dbe_type == DBE_TYPE_SECURITY) && (dc.dc_un.dc_bind_err.dbe_value == DSE_SC_INVALIDCREDENTIALS)) (void)fprintf(stderr, "\nBind error - check the username in the detailor file\n"); else (void)fprintf(stderr, "\nBind error - type %d, code %d\n", dc.dc_un.dc_bind_err.dbe_type, dc.dc_un.dc_bind_err.dbe_value); return NOTOK; } boundToDSA = TRUE; boundOnce = TRUE; if (deLogLevel) (void) ll_log (de_log, LLOG_NOTICE, NULLCP, "Bound: %s", callingDteNumber); return OK; } } if (tryBackup() == OK) if (init_bind_to_ds(&assoc) == OK) return OK; (void)fprintf(stderr, "\nCouldn't bind to the DSA - probably something wrong with the DSA address\n\n"); return NOTOK; /* exit this way if can't talk to access point(s) */} /* bind_to_ds */intrebind(){ if (boundToDSA == FALSE) return(de_bind(TRUE)); else return OK;}int de_bind(wantToBlock)int wantToBlock;{static int assoc; if (bindStarted == FALSE) { if (init_bind_to_ds(&assoc) != OK) return NOTOK; bindStarted = TRUE; if (wantToBlock == FALSE) return OK; } if (wait_bind_to_ds(assoc, wantToBlock) == NOTOK) /* don`t block */ return NOTOK; return OK;}de_unbind(){ if (deLogLevel) (void) ll_log (de_log, LLOG_NOTICE, NULLCP, "Unbind:"); (void) ds_unbind(); boundToDSA = FALSE; bindStarted = FALSE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?