LCOV - code coverage report
Current view: top level - openssh-6.6p1/openbsd-compat - setproctitle.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 33 36 91.7 %
Date: 2014-08-01 Functions: 2 2 100.0 %
Branches: 22 32 68.8 %

           Branch data     Line data    Source code
       1                 :            : /* Based on conf.c from UCB sendmail 8.8.8 */
       2                 :            : 
       3                 :            : /*
       4                 :            :  * Copyright 2003 Damien Miller
       5                 :            :  * Copyright (c) 1983, 1995-1997 Eric P. Allman
       6                 :            :  * Copyright (c) 1988, 1993
       7                 :            :  *      The Regents of the University of California.  All rights reserved.
       8                 :            :  *
       9                 :            :  * Redistribution and use in source and binary forms, with or without
      10                 :            :  * modification, are permitted provided that the following conditions
      11                 :            :  * are met:
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer.
      14                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      15                 :            :  *    notice, this list of conditions and the following disclaimer in the
      16                 :            :  *    documentation and/or other materials provided with the distribution.
      17                 :            :  * 3. Neither the name of the University nor the names of its contributors
      18                 :            :  *    may be used to endorse or promote products derived from this software
      19                 :            :  *    without specific prior written permission.
      20                 :            :  *
      21                 :            :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      22                 :            :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      23                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      24                 :            :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      25                 :            :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      26                 :            :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      27                 :            :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      28                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      29                 :            :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      30                 :            :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      31                 :            :  * SUCH DAMAGE.
      32                 :            :  */
      33                 :            : 
      34                 :            : #include "includes.h"
      35                 :            : 
      36                 :            : #ifndef HAVE_SETPROCTITLE
      37                 :            : 
      38                 :            : #include <stdarg.h>
      39                 :            : #include <stdlib.h>
      40                 :            : #include <unistd.h>
      41                 :            : #ifdef HAVE_SYS_PSTAT_H
      42                 :            : #include <sys/pstat.h>
      43                 :            : #endif
      44                 :            : #include <string.h>
      45                 :            : 
      46                 :            : #include <vis.h>
      47                 :            : 
      48                 :            : #define SPT_NONE        0       /* don't use it at all */
      49                 :            : #define SPT_PSTAT       1       /* use pstat(PSTAT_SETCMD, ...) */
      50                 :            : #define SPT_REUSEARGV   2       /* cover argv with title information */
      51                 :            : 
      52                 :            : #ifndef SPT_TYPE
      53                 :            : # define SPT_TYPE       SPT_NONE
      54                 :            : #endif
      55                 :            : 
      56                 :            : #ifndef SPT_PADCHAR
      57                 :            : # define SPT_PADCHAR    '\0'
      58                 :            : #endif
      59                 :            : 
      60                 :            : #if SPT_TYPE == SPT_REUSEARGV
      61                 :            : static char *argv_start = NULL;
      62                 :            : static size_t argv_env_len = 0;
      63                 :            : #endif
      64                 :            : 
      65                 :            : #endif /* HAVE_SETPROCTITLE */
      66                 :            : 
      67                 :            : void
      68                 :       3247 : compat_init_setproctitle(int argc, char *argv[])
      69                 :            : {
      70                 :            : #if !defined(HAVE_SETPROCTITLE) && \
      71                 :            :     defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV
      72                 :            :         extern char **environ;
      73                 :       3247 :         char *lastargv = NULL;
      74                 :       3247 :         char **envp = environ;
      75                 :            :         int i;
      76                 :            : 
      77                 :            :         /*
      78                 :            :          * NB: This assumes that argv has already been copied out of the
      79                 :            :          * way. This is true for sshd, but may not be true for other 
      80                 :            :          * programs. Beware.
      81                 :            :          */
      82                 :            : 
      83 [ +  - ][ +  - ]:       3247 :         if (argc == 0 || argv[0] == NULL)
      84                 :            :                 return;
      85                 :            : 
      86                 :            :         /* Fail if we can't allocate room for the new environment */
      87         [ +  + ]:     180587 :         for (i = 0; envp[i] != NULL; i++)
      88                 :            :                 ;
      89         [ +  - ]:       3247 :         if ((environ = calloc(i + 1, sizeof(*environ))) == NULL) {
      90                 :          0 :                 environ = envp; /* put it back */
      91                 :          0 :                 return;
      92                 :            :         }
      93                 :            : 
      94                 :            :         /*
      95                 :            :          * Find the last argv string or environment variable within 
      96                 :            :          * our process memory area.
      97                 :            :          */
      98         [ +  + ]:      25410 :         for (i = 0; i < argc; i++) {
      99 [ +  + ][ +  - ]:      22163 :                 if (lastargv == NULL || lastargv + 1 == argv[i])
     100                 :      22163 :                         lastargv = argv[i] + strlen(argv[i]);
     101                 :            :         }
     102         [ +  + ]:     180587 :         for (i = 0; envp[i] != NULL; i++) {
     103         [ +  - ]:     177340 :                 if (lastargv + 1 == envp[i])
     104                 :     177340 :                         lastargv = envp[i] + strlen(envp[i]);
     105                 :            :         }
     106                 :            : 
     107                 :       3247 :         argv[1] = NULL;
     108                 :       3247 :         argv_start = argv[0];
     109                 :       3247 :         argv_env_len = lastargv - argv[0] - 1;
     110                 :            : 
     111                 :            :         /* 
     112                 :            :          * Copy environment 
     113                 :            :          * XXX - will truncate env on strdup fail
     114                 :            :          */
     115         [ +  + ]:     180587 :         for (i = 0; envp[i] != NULL; i++)
     116                 :     177340 :                 environ[i] = strdup(envp[i]);
     117                 :       3247 :         environ[i] = NULL;
     118                 :            : #endif /* SPT_REUSEARGV */
     119                 :            : }
     120                 :            : 
     121                 :            : #ifndef HAVE_SETPROCTITLE
     122                 :            : void
     123                 :       5345 : setproctitle(const char *fmt, ...)
     124                 :            : {
     125                 :            : #if SPT_TYPE != SPT_NONE
     126                 :            :         va_list ap;
     127                 :            :         char buf[1024], ptitle[1024];
     128                 :            :         size_t len;
     129                 :            :         int r;
     130                 :            :         extern char *__progname;
     131                 :            : #if SPT_TYPE == SPT_PSTAT
     132                 :            :         union pstun pst;
     133                 :            : #endif
     134                 :            : 
     135                 :            : #if SPT_TYPE == SPT_REUSEARGV
     136         [ +  - ]:       5345 :         if (argv_env_len <= 0)
     137                 :          0 :                 return;
     138                 :            : #endif
     139                 :            : 
     140                 :       5345 :         strlcpy(buf, __progname, sizeof(buf));
     141                 :            : 
     142                 :       5345 :         r = -1;
     143                 :       5345 :         va_start(ap, fmt);
     144         [ +  - ]:       5345 :         if (fmt != NULL) {
     145                 :       5345 :                 len = strlcat(buf, ": ", sizeof(buf));
     146         [ +  - ]:       5345 :                 if (len < sizeof(buf))
     147                 :       5345 :                         r = vsnprintf(buf + len, sizeof(buf) - len , fmt, ap);
     148                 :            :         }
     149                 :       5345 :         va_end(ap);
     150 [ +  - ][ +  - ]:       5345 :         if (r == -1 || (size_t)r >= sizeof(buf) - len)
     151                 :            :                 return;
     152                 :       5345 :         strnvis(ptitle, buf, sizeof(ptitle),
     153                 :            :             VIS_CSTYLE|VIS_NL|VIS_TAB|VIS_OCTAL);
     154                 :            : 
     155                 :            : #if SPT_TYPE == SPT_PSTAT
     156                 :            :         pst.pst_command = ptitle;
     157                 :            :         pstat(PSTAT_SETCMD, pst, strlen(ptitle), 0, 0);
     158                 :            : #elif SPT_TYPE == SPT_REUSEARGV
     159                 :            : /*      debug("setproctitle: copy \"%s\" into len %d", 
     160                 :            :             buf, argv_env_len); */
     161                 :       5345 :         len = strlcpy(argv_start, ptitle, argv_env_len);
     162         [ +  + ]:   22427865 :         for(; len < argv_env_len; len++)
     163                 :   22422520 :                 argv_start[len] = SPT_PADCHAR;
     164                 :            : #endif
     165                 :            : 
     166                 :            : #endif /* SPT_NONE */
     167                 :            : }
     168                 :            : 
     169                 :            : #endif /* HAVE_SETPROCTITLE */

Generated by: LCOV version 1.9