Ignore:
Timestamp:
Mar 17, 2004, 4:59:28 AM (22 years ago)
Author:
bird
Message:

More logging.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/src/lib/app/setenv.c

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1314 r1315  
    1717#include <emx/startup.h>
    1818#include <emx/time.h>           /* _tzset_flag */
     19
     20
    1921
    2022
     
    3436 * @author  knut st. osmundsen <[email protected]>
    3537 * @remark  We skip the first equal in the environment value like BSD does.
     38
    3639 */
    37 int _STD(setenv) (const char *envname, const char *envval, int overwrite)
     40int _STD(setenv)(const char *envname, const char *envval, int overwrite)
    3841{
    39   char **p;
    40   int   lenname;
    41   int   lenval;
    42   int   env_size;
     42    LIBCLOG_ENTER("envname=%s envval=%s overwrite=%d\n", envname, envval, overwrite);
     43    char **p;
     44    char *psz;
     45    int   lenname;
     46    int   lenval;
     47    int   env_size;
    4348
    44   /* validate */
    45   if (envname == NULL || *envname == '\0' || strchr(envname, '=') != NULL)
     49  /* validate */
     50  if (envname == NULL || *envname == '\0' || strchr(envname, '=') != NULL)
    4651    {
    47       errno = EINVAL;
    48       return -1;
     52        LIBC_ASSERTM_FAILED("invalid argument envname(%p='%s')\n", envname, envname);
     53        errno = EINVAL;
     54        LIBCLOG_RETURN_INT(-1);
    4955    }
    50   _tzset_flag = 0;              /* Call tzset() */
     56  _tzset_flag = 0;              /* Call tzset() */
    5157
    52   /* BSD Compatability. */
    53   if (*envval == '=')
    54       envval++;
     58  /* BSD Compatability. */
     59  if (*envval == '=')
     60      envval++;
    5561
    56   /* search for existing variable iinstance  */
    57   lenname = strlen (envname);
    58   p = environ;
    59   env_size = 0;
    60   if (p != NULL)
    61     while (*p != NULL)
    62       {
    63         char *s = *p;
    64         if (strncmp (s, envname, lenname) == 0 && (s[lenname] == 0 || s[lenname] == '='))
    65           break;
    66         ++p; ++env_size;
    67       }
     62    /* search for existing variable iinstance  */
     63    lenname = strlen(envname);
     64    p = environ;
     65    env_size = 0;
     66    if (p != NULL)
     67        while (*p != NULL)
     68        {
     69            char *s = *p;
     70            if (    strncmp(s, envname, lenname) == 0
     71                && (    s[lenname] == '\0'
     72                    ||  s[lenname] == '='))
     73                break;
     74            ++p; ++env_size;
     75        }
    6876
    69   /* found it? */
    70   lenval = strlen(envval);
    71   if (p != NULL && *p != NULL)
     77  /* found it? */
     78  lenval = strlen(envval);
     79  if (p != NULL && *p != NULL)
    7280    {
    73       if (!overwrite)
    74         return 0;
    75       /* if the older is larger then overwrite it */
    76       if (strlen(*p + lenname + 1) >= lenval)
     81        if (!overwrite)
    7782        {
    78            memcpy(*p + lenname + 1, envval, lenval + 1);
    79            return 0;
     83            LIBCLOG_MSG("exists, requested not to overwrite it\n");
     84            LIBCLOG_RETURN_INT(0);
     85        }
     86        /* if the older is larger then overwrite it */
     87        LIBCLOG_MSG("exists, overwrite\n");
     88        if (strlen(*p + lenname + 1) >= lenval)
     89        {
     90            memcpy(*p + lenname + 1, envval, lenval + 1);
     91            LIBCLOG_RETURN_INT(0);
    8092        }
    8193    }
    82   else
     94  else
    8395    {
    84       /* new variable: reallocate the environment pointer block */
    85       if (environ == _org_environ)
     96      /* new variable: reallocate the environment pointer block */
     97      if (environ == _org_environ)
    8698        {
    87           p = malloc ((env_size+2) * sizeof (char *));
    88           if (p == NULL)
    89               return -1;
    90           environ = p;
    91           if (env_size != 0)
    92             memcpy (environ, _org_environ, env_size * sizeof (char *));
     99            LIBCLOG_MSG("env_size=%d; new, first new\n", env_size);
     100            p = malloc((env_size + 2) * sizeof (char *));
     101            if (p == NULL)
     102                LIBCLOG_RETURN_INT(-1);
     103            environ = p;
     104            if (env_size != 0)
     105                memcpy(environ, _org_environ, env_size * sizeof (char *));
    93106        }
    94       else
     107      else
    95108        {
    96           p = realloc (environ, (env_size+2) * sizeof (char *));
    97           if (p == NULL)
    98               return -1;
    99           environ = p;
     109            LIBCLOG_MSG("env_size=%d; new, resize environ array\n", env_size);
     110            p = realloc(environ, (env_size + 2) * sizeof (char *));
     111            if (p == NULL)
     112                LIBCLOG_RETURN_INT(-1);
     113            environ = p;
    100114        }
    101115
    102       /* Add to end. */
    103       p = &environ[env_size+0];
    104       environ[env_size+1] = NULL;
     116      /* Add to end. */
     117      0];
     118      1] = NULL;
    105119    }
    106120
    107   /* Allocate space for new variable and assign it. */
    108   *p = malloc(lenname + lenval + 2);
    109   if (!*p)
    110     return -1;
    111   memcpy(*p, envname, lenname);
    112   (*p)[lenname] = '=';
    113   memcpy(*p + lenname + 1, envval, lenval + 1);
    114   return 0;
     121    /* Allocate space for new variable and assign it. */
     122    psz = malloc(lenname + lenval + 2);
     123    if (!psz)
     124        LIBCLOG_RETURN_INT(-1);
     125    memcpy(psz, envname, lenname);
     126    psz[lenname] = '=';
     127    memcpy(psz + lenname + 1, envval, lenval + 1);
     128    *p = psz;
     129    LIBCLOG_RETURN_INT(0);
    115130}
    116131
Note: See TracChangeset for help on using the changeset viewer.