NeoMutt  2020-11-20
Teaching an old dog new tricks
DOXYGEN
envlist.c
Go to the documentation of this file.
1 
29 #include "config.h"
30 #include <stdbool.h>
31 #include <stdio.h>
32 #include "envlist.h"
33 #include "memory.h"
34 #include "string2.h"
35 
36 char **EnvList = NULL;
37 
42 {
43  if (!EnvList)
44  return;
45 
46  for (char **p = EnvList; p && *p; p++)
47  FREE(p);
48 
49  FREE(&EnvList);
50 }
51 
56 void mutt_envlist_init(char *envp[])
57 {
58  if (EnvList)
60 
61  if (!envp)
62  return;
63 
64  char **src = NULL, **dst = NULL;
65  int count = 0;
66  for (src = envp; src && *src; src++)
67  count++;
68 
69  EnvList = mutt_mem_calloc(count + 1, sizeof(char *));
70  for (src = envp, dst = EnvList; src && *src; src++, dst++)
71  *dst = mutt_str_dup(*src);
72 }
73 
85 bool mutt_envlist_set(const char *name, const char *value, bool overwrite)
86 {
87  if (!name)
88  return false;
89 
90  char **envp = EnvList;
91  char work[1024];
92 
93  /* Look for current slot to overwrite */
94  int count = 0;
95  while (envp && *envp)
96  {
97  size_t len = mutt_str_startswith(*envp, name);
98  if ((len != 0) && ((*envp)[len] == '='))
99  {
100  if (!overwrite)
101  return false;
102  break;
103  }
104  envp++;
105  count++;
106  }
107 
108  /* Format var=value string */
109  snprintf(work, sizeof(work), "%s=%s", name, NONULL(value));
110 
111  if (envp && *envp)
112  {
113  /* slot found, overwrite */
114  mutt_str_replace(envp, work);
115  }
116  else
117  {
118  /* not found, add new slot */
119  mutt_mem_realloc(&EnvList, sizeof(char *) * (count + 2));
120  EnvList[count] = mutt_str_dup(work);
121  EnvList[count + 1] = NULL;
122  }
123  return true;
124 }
125 
132 bool mutt_envlist_unset(const char *name)
133 {
134  if (!name || (name[0] == '\0'))
135  return false;
136 
137  char **envp = EnvList;
138 
139  int count = 0;
140  while (envp && *envp)
141  {
142  size_t len = mutt_str_startswith(*envp, name);
143  if ((len != 0) && ((*envp)[len] == '='))
144  {
145  FREE(envp);
146  /* shuffle down */
147  char **save = envp++;
148  while (*envp)
149  {
150  *save++ = *envp++;
151  count++;
152  }
153  *save = NULL;
154  mutt_mem_realloc(&EnvList, sizeof(char *) * (count + 1));
155  return true;
156  }
157  envp++;
158  count++;
159  }
160  return false;
161 }
162 
170 {
171  return EnvList;
172 }
#define NONULL(x)
Definition: string2.h:37
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
char ** EnvList
Private copy of the environment variables.
Definition: envlist.c:36
Memory management wrappers.
void mutt_envlist_init(char *envp[])
Create a copy of the environment.
Definition: envlist.c:56
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:370
String manipulation functions.
void mutt_mem_realloc(void *ptr, size_t size)
Resize a block of memory on the heap.
Definition: memory.c:114
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
Definition: string.c:160
bool mutt_envlist_unset(const char *name)
Unset an environment variable.
Definition: envlist.c:132
void mutt_envlist_free(void)
Free the private copy of the environment.
Definition: envlist.c:41
Private copy of the environment variables.
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:446
#define FREE(x)
Definition: memory.h:40
bool mutt_envlist_set(const char *name, const char *value, bool overwrite)
Set an environment variable.
Definition: envlist.c:85
char ** mutt_envlist_getlist(void)
Get the private environment.
Definition: envlist.c:169