Annotation of freem/src/ssvn_zprocess.c, revision 1.5

1.1       snw         1: /*
1.5     ! snw         2:  *   $Id: ssvn_zprocess.c,v 1.4 2025/03/22 18:43:54 snw Exp $
1.3       snw         3:  *    ^$ZPROCESS ssvn
1.1       snw         4:  *
                      5:  *  
1.2       snw         6:  *   Author: Serena Willis <snw@coherent-logic.com>
1.1       snw         7:  *    Copyright (C) 1998 MUG Deutschland
1.3       snw         8:  *    Copyright (C) 2020, 2025 Coherent Logic Development LLC
1.1       snw         9:  *
                     10:  *
                     11:  *   This file is part of FreeM.
                     12:  *
                     13:  *   FreeM is free software: you can redistribute it and/or modify
                     14:  *   it under the terms of the GNU Affero Public License as published by
                     15:  *   the Free Software Foundation, either version 3 of the License, or
                     16:  *   (at your option) any later version.
                     17:  *
                     18:  *   FreeM is distributed in the hope that it will be useful,
                     19:  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
                     20:  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     21:  *   GNU Affero Public License for more details.
                     22:  *
                     23:  *   You should have received a copy of the GNU Affero Public License
                     24:  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
                     25:  *
1.4       snw        26:  *   $Log: ssvn_zprocess.c,v $
1.5     ! snw        27:  *   Revision 1.4  2025/03/22 18:43:54  snw
        !            28:  *   Make STRLEN 255 chars and add BIGSTR macro for larger buffers
        !            29:  *
1.4       snw        30:  *   Revision 1.3  2025/03/09 19:50:47  snw
                     31:  *   Second phase of REUSE compliance and header reformat
                     32:  *
1.3       snw        33:  *
                     34:  * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
                     35:  * SPDX-License-Identifier: AGPL-3.0-or-later
1.1       snw        36:  **/
                     37: 
                     38: #include <stdlib.h>
                     39: #include <stdio.h>
                     40: #include <string.h>
                     41: #include <dirent.h>
                     42: 
                     43: #include "mpsdef.h"
                     44: #include "mref.h"
                     45: #include "iniconf.h"
                     46: 
                     47: void ssvn_zprocess (short action, char *key, char *data)
                     48: {
                     49:     freem_ref_t *ref = (freem_ref_t *) malloc (sizeof(freem_ref_t));
                     50: 
                     51:     char *kbuf = (char *) malloc (STRLEN * sizeof(char));
                     52:     char *verb = (char *) malloc (STRLEN * sizeof(char));
1.4       snw        53:     char *proc_path = (char *) malloc (PATHLEN * sizeof(char));
1.1       snw        54: 
                     55:     pid_t t_pid;
                     56: 
                     57:     NULLPTRCHK(ref,"ssvn_zprocess");
                     58:     NULLPTRCHK(kbuf,"ssvn_zprocess");
                     59:     NULLPTRCHK(verb,"ssvn_zprocess");
                     60:     NULLPTRCHK(proc_path,"ssvn_zprocess");
                     61:     
                     62:     mref_init (ref, MREF_RT_SSVN, "");
                     63:     internal_to_mref (ref, key);
                     64: 
                     65:     if (ref->subscript_count < 2) {
                     66: 
                     67:         free (kbuf);
                     68:         free (ref);
                     69:         free (verb);
                     70:         free (proc_path);
                     71:         
                     72:         merr_raise (INVREF);
                     73:         return;
                     74:     }
                     75: 
                     76:     t_pid = atol(ref->subscripts[0]);
1.4       snw        77:     snprintf (proc_path, PATHLEN, "/proc/%d", t_pid);
1.1       snw        78: 
1.4       snw        79:     strncpy (verb, ref->subscripts[1], STRLEN);
1.1       snw        80: 
                     81: 
                     82:     stcpy (kbuf, key);
                     83: 
                     84:     switch (action) {
                     85:     
                     86:         case get_sym:
                     87: 
                     88:             if (strcmp (verb, "EXISTS") == 0) {
                     89:                 
                     90:                 if (kill (t_pid, 0) == 0) {
1.4       snw        91:                     snprintf (data, STRLEN, "%d\201", 1);
1.1       snw        92:                 }
                     93:                 else {
1.4       snw        94:                     snprintf (data, STRLEN, "%d\201", 0);
1.1       snw        95:                 }
                     96: 
                     97:                 free (kbuf);
                     98:                 free (ref);
                     99:                 free (verb);
                    100:                 free (proc_path);
                    101:                 
                    102:                 merr_raise (OK);
                    103:                 return;
                    104: 
                    105:             }
                    106:             else if (strcmp (verb, "ATTRIBUTE") == 0) {
                    107: 
1.4       snw       108:                 char attrib[STRLEN];
                    109:                 char fpath[PATHLEN];
1.1       snw       110:                 
                    111:                 FILE *fp;
                    112: 
                    113:                 strncpy (attrib, ref->subscripts[2], 255);
                    114: 
1.4       snw       115:                 snprintf (fpath, PATHLEN, "/proc/%d/%s", t_pid, attrib);
1.1       snw       116: 
                    117:                 if ((fp = fopen (fpath, "r")) == NULL) {
                    118: 
                    119:                     free (kbuf);
                    120:                     free (ref);
                    121:                     free (verb);
                    122:                     free (proc_path);
                    123:  
                    124:                     merr_raise (INVREF);
                    125:                     return;
                    126:                 }
                    127: 
1.4       snw       128:                 fgets (data, STRLEN, fp);
1.1       snw       129:                 stcnv_c2m (data);
                    130: 
                    131:                 fclose (fp);
                    132: 
                    133:                 free (kbuf);
                    134:                 free (ref);
                    135:                 free (verb);
                    136:                 free (proc_path);
                    137: 
                    138:                 
                    139:                 merr_raise (OK);
                    140:                 return;
                    141: 
                    142:             }            
                    143: 
                    144:             free (kbuf);            
                    145:             free (ref);
                    146:             free (verb);
                    147:             free (proc_path);
                    148: 
                    149:             merr_raise (INVREF);
                    150:             return;
                    151: 
                    152:         case set_sym:   
                    153: 
                    154:             if (strcmp (verb, "SIGNAL") == 0) {
                    155: 
                    156:                 int signum;
                    157: 
                    158:                 stcnv_m2c (data);
                    159: 
                    160:                 signum = atoi (data);
                    161:                 kill (t_pid, signum);
                    162: 
                    163:                 stcnv_c2m (data);
                    164: 
                    165:                 free (kbuf);
                    166:                 free (ref);
                    167:                 free (verb);
                    168:                 free (proc_path);
                    169: 
                    170:                 
                    171:                 merr_raise (OK);
                    172:                 return;
                    173: 
                    174:                 
                    175:             }
                    176:             else {
                    177: 
                    178:                 free (kbuf);
                    179:                 free (ref);
                    180:                 free (verb);
                    181:                 free (proc_path);
                    182: 
                    183:                 merr_raise (M29);
                    184:                 return;
                    185:             }
                    186: 
                    187:         case killone:
                    188:         case kill_sym:     
                    189:         
                    190:             kill (t_pid, 15);
                    191: 
                    192:             free (kbuf);
                    193:             free (ref);
                    194:             free (verb);
                    195:             free (proc_path);
                    196: 
                    197:             merr_raise (OK);
                    198:             return;
                    199:         
1.5     ! snw       200:         case fra_dat:
1.1       snw       201:         case fra_order:
                    202:         case fra_query:
                    203:         case bigquery:
                    204:         case getnext:
                    205:         case m_alias:
                    206:         case zdata:
                    207:             
                    208:         default:
                    209: 
                    210:             free (kbuf);
                    211:             free (ref);
                    212:             free (verb);
                    213:             free (proc_path);
                    214:             
                    215:             merr_raise (INVREF);
                    216:             return;
                    217: 
                    218:     }
                    219: 
                    220:     free (kbuf);
                    221:     free (ref);
                    222:     free (verb);
                    223:     free (proc_path);
                    224:     
                    225:     *data = EOL;
                    226:     return;
                    227: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>