[BACK]Return to environ.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/environ.c between version 1.9 and 1.10

version 1.9, 2015/10/28 09:51:55 version 1.10, 2015/11/24 23:46:15
Line 83 
Line 83 
 {  {
         struct environ_entry    *envent;          struct environ_entry    *envent;
   
         RB_FOREACH(envent, environ, srcenv)          RB_FOREACH(envent, environ, srcenv) {
                 environ_set(dstenv, envent->name, envent->value);                  if (envent->value == NULL)
                           environ_clear(dstenv, envent->name);
                   else
                           environ_set(dstenv, envent->name, "%s", envent->value);
           }
 }  }
   
 /* Find an environment variable. */  /* Find an environment variable. */
Line 99 
Line 103 
   
 /* Set an environment variable. */  /* Set an environment variable. */
 void  void
 environ_set(struct environ *env, const char *name, const char *value)  environ_set(struct environ *env, const char *name, const char *fmt, ...)
 {  {
         struct environ_entry    *envent;          struct environ_entry    *envent;
           va_list                  ap;
   
           va_start(ap, fmt);
         if ((envent = environ_find(env, name)) != NULL) {          if ((envent = environ_find(env, name)) != NULL) {
                 free(envent->value);                  free(envent->value);
                 if (value != NULL)                  xvasprintf(&envent->value, fmt, ap);
                         envent->value = xstrdup(value);  
                 else  
                         envent->value = NULL;  
         } else {          } else {
                 envent = xmalloc(sizeof *envent);                  envent = xmalloc(sizeof *envent);
                 envent->name = xstrdup(name);                  envent->name = xstrdup(name);
                 if (value != NULL)                  xvasprintf(&envent->value, fmt, ap);
                         envent->value = xstrdup(value);  
                 else  
                         envent->value = NULL;  
                 RB_INSERT(environ, env, envent);                  RB_INSERT(environ, env, envent);
         }          }
           va_end(ap);
 }  }
   
   /* Clear an environment variable. */
   void
   environ_clear(struct environ *env, const char *name)
   {
           struct environ_entry    *envent;
   
           if ((envent = environ_find(env, name)) != NULL) {
                   free(envent->value);
                   envent->value = NULL;
           } else {
                   envent = xmalloc(sizeof *envent);
                   envent->name = xstrdup(name);
                   envent->value = NULL;
                   RB_INSERT(environ, env, envent);
           }
   }
   
 /* Set an environment variable from a NAME=VALUE string. */  /* Set an environment variable from a NAME=VALUE string. */
 void  void
 environ_put(struct environ *env, const char *var)  environ_put(struct environ *env, const char *var)
Line 134 
Line 152 
         name = xstrdup(var);          name = xstrdup(var);
         name[strcspn(name, "=")] = '\0';          name[strcspn(name, "=")] = '\0';
   
         environ_set(env, name, value);          environ_set(env, name, "%s", value);
         free(name);          free(name);
 }  }
   
Line 166 
Line 184 
         copyvars = next = xstrdup(vars);          copyvars = next = xstrdup(vars);
         while ((var = strsep(&next, " ")) != NULL) {          while ((var = strsep(&next, " ")) != NULL) {
                 if ((envent = environ_find(srcenv, var)) == NULL)                  if ((envent = environ_find(srcenv, var)) == NULL)
                         environ_set(dstenv, var, NULL);                          environ_clear(dstenv, var);
                 else                  else
                         environ_set(dstenv, envent->name, envent->value);                          environ_set(dstenv, envent->name, "%s", envent->value);
         }          }
         free(copyvars);          free(copyvars);
 }  }

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10