Annotation of 43BSDReno/contrib/isode-beta/psap2/psapexec.c, revision 1.1.1.1

1.1       root        1: /* psapexec.c - PPM: exec */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/psap2/RCS/psapexec.c,v 7.2 90/07/01 21:04:58 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/psap2/RCS/psapexec.c,v 7.2 90/07/01 21:04:58 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       psapexec.c,v $
                     12:  * Revision 7.2  90/07/01  21:04:58  mrose
                     13:  * pepsy
                     14:  * 
                     15:  * Revision 7.1  89/11/24  16:22:12  mrose
                     16:  * sync
                     17:  * 
                     18:  * Revision 7.0  89/11/23  22:14:19  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: /* LINTLIBRARY */
                     35: 
                     36: #include <stdio.h>
                     37: #include "PS-types.h"
                     38: #include "ppkt.h"
                     39: #include "isoservent.h"
                     40: #include "tailor.h"
                     41: 
                     42: /*    SERVER only */
                     43: 
                     44: int    PExec (ss, pi, arg1, arg2, hook, setperms)
                     45: struct SSAPstart *ss;
                     46: struct PSAPindication *pi;
                     47: char   *arg1,
                     48:        *arg2;
                     49: IFP    hook,
                     50:        setperms;
                     51: {
                     52:     int            len,
                     53:            result,
                     54:            result2;
                     55:     char   *base;
                     56:     register struct isoservent *is;
                     57:     register struct psapblk *pb;
                     58:     PE     pe;
                     59:     struct SSAPref ref;
                     60:     struct SSAPindication   sis;
                     61:     register struct SSAPindication *si = &sis;
                     62:     struct type_PS_CP__type *cp;
                     63:     register struct element_PS_0 *cp_normal;
                     64:     register struct type_PS_CPR__type *cpr;
                     65: 
                     66:     missingP (ss);
                     67:     missingP (pi);
                     68:     missingP (arg1);
                     69:     missingP (arg2);
                     70: 
                     71:     cp = NULL, cpr = NULL;
                     72:     pe = NULLPE;
                     73: 
                     74:     if ((pb = newpblk ()) == NULL)
                     75:        goto congest;
                     76:     pb -> pb_fd = ss -> ss_sd;
                     77: 
                     78:     if ((pe = ssdu2pe (ss -> ss_data, ss -> ss_cc, NULLCP, &result))
                     79:            == NULLPE) {
                     80:        if (result == PS_ERR_NMEM)
                     81:            goto congest;
                     82: 
                     83:        (void) ppktlose (pb, pi, PC_PROTOCOL, PPDU_CP, NULLCP, "%s",
                     84:                         ps_error (result));
                     85:        goto out1;
                     86:     }
                     87: 
                     88:     if (decode_PS_CP__type (pe, 1, NULLIP, NULLVP, &cp) == NOTOK) {
                     89:        (void) ppktlose (pb, pi, PC_UNRECOGNIZED, PPDU_CP, NULLCP, "%s",
                     90:                         PY_pepy);
                     91:        goto out1;
                     92:     }
                     93: 
                     94:     PLOGP (psap2_log,PS_CP__type, pe, "CP-type", 1);
                     95: 
                     96:     if (cp -> mode -> parm != int_PS_Mode__selector_normal__mode) {
                     97:        (void) ppktlose (pb, pi, PC_INVALID, PPDU_CP, NULLCP,
                     98:                         "X.410-mode not supported");
                     99:        goto out1;
                    100:     }
                    101:     cp_normal = cp -> normal__mode;
                    102: 
                    103:     pe_free (pe);
                    104:     pe = NULLPE;
                    105: 
                    106:     if (cp_normal -> called == NULL)
                    107:        base = NULL, len = 0;
                    108:     else {
                    109:        if ((base = qb2str (cp_normal -> called)) == NULLCP)
                    110:            goto congest;
                    111:        len = cp_normal -> called -> qb_len;
                    112:     }
                    113: 
                    114:     switch (len) {
                    115:        case 0:
                    116:            is = NULL;
                    117:            break;
                    118: 
                    119:        default:
                    120:            is = getisoserventbyselector ("psap", base, len);
                    121:            break;
                    122:     }
                    123:     if (base)
                    124:        free (base);
                    125:     if (is == NULL) {
                    126:        result = SC_REJECTED, result2 = PC_ADDRESS;
                    127:        goto out2;
                    128:     }
                    129: 
                    130:     *is -> is_tail++ = arg1;
                    131:     *is -> is_tail++ = arg2;
                    132:     *is -> is_tail = NULL;
                    133: 
                    134:     switch (hook ? (*hook) (is, pi) : OK) {
                    135:        case NOTOK:
                    136:            return NOTOK;
                    137: 
                    138:        case DONE:
                    139:            return OK;
                    140: 
                    141:        case OK:
                    142:        default:
                    143:            if (setperms)
                    144:                (void) (*setperms) (is);
                    145:            (void) execv (*is -> is_vec, is -> is_vec);
                    146:            SLOG (psap2_log, LLOG_FATAL, *is -> is_vec,
                    147:                  ("unable to exec"));
                    148:            break;
                    149:     }
                    150: 
                    151: congest: ;
                    152:     result = SC_CONGESTION;
                    153:     (void) psaplose (pi, result2 = PC_CONGEST, NULLCP, NULLCP);
                    154: 
                    155: out2: ;
                    156:     if (pe) {
                    157:        pe_free (pe);
                    158:        pe = NULLPE;
                    159:     }
                    160: 
                    161:     if (cpr = (struct type_PS_CPR__type *) calloc (1, sizeof *cpr)) {
                    162:        if (cp
                    163:                && cp -> mode
                    164:                && cp -> mode -> parm ==
                    165:                                    int_PS_Mode__selector_x410__1984__mode) {
                    166:            cpr -> offset = type_PS_CPR__type_x410__mode;
                    167:            if (pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) {
                    168:                cpr -> un.x410__mode = pe;
                    169:                (void) set_add (pe, num2prim (result2 != PC_CONGEST ? 0 : 3,
                    170:                                              PE_CLASS_CONT, 0));
                    171:            }
                    172:        }
                    173:        else {
                    174:            register struct element_PS_2 *cpr_normal;
                    175: 
                    176:            cpr -> offset = type_PS_CPR__type_normal__mode;
                    177:            if (cpr_normal = (struct element_PS_2 *)
                    178:                                            calloc (1, sizeof *cpr_normal)) {
                    179:                cpr -> un.normal__mode = cpr_normal;
                    180:                cpr_normal -> optionals |= opt_PS_element_PS_2_reason;
                    181:                cpr_normal -> reason = result2 - PC_PROV_BASE;
                    182:            }
                    183:        }
                    184:     }
                    185: 
                    186:     if (encode_PS_CPR__type (&pe, 1, 0, NULLCP, cpr) != NOTOK) {
                    187:        PLOGP (psap2_log,PS_CPR__type, pe, "CPR-type", 0);
                    188: 
                    189:        if (pe)
                    190:            (void) pe2ssdu (pe, &base, &len);
                    191:     }
                    192:     else
                    193:        base = NULL, len = 0;
                    194: 
                    195:     bzero ((char *) &ref, sizeof ref);
                    196:     (void) SConnResponse (ss -> ss_sd, &ref, NULLSA, result, 0, 0,
                    197:            SERIAL_NONE, base, len, si);
                    198:     if (base)
                    199:        free (base);
                    200:     (void) psaplose (pi, result2, NULLCP, NULLCP);
                    201: 
                    202: out1: ;
                    203:     SSFREE (ss);
                    204:     if (pe)
                    205:        pe_free (pe);
                    206:     if (cp)
                    207:        free_PS_CP__type (cp);
                    208:     if (cpr)
                    209:        free_PS_CPR__type (cpr);
                    210:        
                    211:     freepblk (pb);
                    212: 
                    213:     return NOTOK;
                    214: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.