1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25: #include "dbus-internals.h"
26: #include "dbus-sysdeps.h"
27: #include "dbus-threads.h"
28: #include "dbus-protocol.h"
29: #include "dbus-string.h"
30:
31:
32:
33:
34:
35:
36: #include <locale.h>
37: #include <stdlib.h>
38: #include <string.h>
39: #include <stdio.h>
40:
41:
42:
43:
44:
45: #ifdef HAVE_ERRNO_H
46: #include <errno.h>
47: #endif
48:
49: _DBUS_DEFINE_GLOBAL_LOCK (win_fds);
50: _DBUS_DEFINE_GLOBAL_LOCK (sid_atom_cache);
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69: void
70: _dbus_abort (void)
71: {
72: const char *s;
73:
74: _dbus_print_backtrace ();
75:
76: s = _dbus_getenv ("DBUS_BLOCK_ON_ABORT");
77: if (s && *s)
78: {
79:
80: fprintf (stderr, " Process %lu sleeping for gdb attach\n", (unsigned long) _dbus_getpid());
81: _dbus_sleep_milliseconds (1000 * 180);
82: }
83:
84: abort ();
85: _dbus_exit (1);
86: }
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101: dbus_bool_t
102: _dbus_setenv (const char *varname,
103: const char *value)
104: {
105: _dbus_assert (varname != NULL);
106:
107: if (value == NULL)
108: {
109: #ifdef HAVE_UNSETENV
110: unsetenv (varname);
111: return TRUE;
112: #else
113: char *putenv_value;
114: size_t len;
115:
116: len = strlen (varname);
117:
118:
119:
120:
121:
122: putenv_value = malloc (len + 1);
123: if (putenv_value == NULL)
124: return FALSE;
125:
126: strcpy (putenv_value, varname);
127:
128: return (putenv (putenv_value) == 0);
129: #endif
130: }
131: else
132: {
133: #ifdef HAVE_SETENV
134: return (setenv (varname, value, TRUE) == 0);
135: #else
136: char *putenv_value;
137: size_t len;
138: size_t varname_len;
139: size_t value_len;
140:
141: varname_len = strlen (varname);
142: value_len = strlen (value);
143:
144: len = varname_len + value_len + 1 ;
145:
146:
147:
148:
149:
150: putenv_value = malloc (len + 1);
151: if (putenv_value == NULL)
152: return FALSE;
153:
154: strcpy (putenv_value, varname);
155: strcpy (putenv_value + varname_len, "=");
156: strcpy (putenv_value + varname_len + 1, value);
157:
158: return (putenv (putenv_value) == 0);
159: #endif
160: }
161: }
162:
163:
164:
165:
166:
167:
168:
169: const char*
170: _dbus_getenv (const char *varname)
171: {
172: return getenv (varname);
173: }
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189: dbus_bool_t
190: _dbus_string_append_int (DBusString *str,
191: long value)
192: {
193:
194: #define MAX_LONG_LEN ((sizeof (long) * 8 + 2) / 3 + 1)
195: int orig_len;
196: int i;
197: char *buf;
198:
199: orig_len = _dbus_string_get_length (str);
200:
201: if (!_dbus_string_lengthen (str, MAX_LONG_LEN))
202: return FALSE;
203:
204: buf = _dbus_string_get_data_len (str, orig_len, MAX_LONG_LEN);
205:
206: snprintf (buf, MAX_LONG_LEN, "%ld", value);
207:
208: i = 0;
209: while (*buf)
210: {
211: ++buf;
212: ++i;
213: }
214:
215: _dbus_string_shorten (str, MAX_LONG_LEN - i);
216:
217: return TRUE;
218: }
219:
220:
221:
222:
223:
224:
225:
226:
227: dbus_bool_t
228: _dbus_string_append_uint (DBusString *str,
229: unsigned long value)
230: {
231:
232: #define MAX_ULONG_LEN (MAX_LONG_LEN * 2)
233: int orig_len;
234: int i;
235: char *buf;
236:
237: orig_len = _dbus_string_get_length (str);
238:
239: if (!_dbus_string_lengthen (str, MAX_ULONG_LEN))
240: return FALSE;
241:
242: buf = _dbus_string_get_data_len (str, orig_len, MAX_ULONG_LEN);
243:
244: snprintf (buf, MAX_ULONG_LEN, "%lu", value);
245:
246: i = 0;
247: while (*buf)
248: {
249: ++buf;
250: ++i;
251: }
252:
253: _dbus_string_shorten (str, MAX_ULONG_LEN - i);
254:
255: return TRUE;
256: }
257:
258: #ifdef DBUS_BUILD_TESTS
259:
260:
261:
262:
263:
264:
265:
266: dbus_bool_t
267: _dbus_string_append_double (DBusString *str,
268: double value)
269: {
270: #define MAX_DOUBLE_LEN 64
271: int orig_len;
272: char *buf;
273: int i;
274:
275: orig_len = _dbus_string_get_length (str);
276:
277: if (!_dbus_string_lengthen (str, MAX_DOUBLE_LEN))
278: return FALSE;
279:
280: buf = _dbus_string_get_data_len (str, orig_len, MAX_DOUBLE_LEN);
281:
282: snprintf (buf, MAX_LONG_LEN, "%g", value);
283:
284: i = 0;
285: while (*buf)
286: {
287: ++buf;
288: ++i;
289: }
290:
291: _dbus_string_shorten (str, MAX_DOUBLE_LEN - i);
292:
293: return TRUE;
294: }
295: #endif
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309: dbus_bool_t
310: _dbus_string_parse_int (const DBusString *str,
311: int start,
312: long *value_return,
313: int *end_return)
314: {
315: long v;
316: const char *p;
317: char *end;
318:
319: p = _dbus_string_get_const_data_len (str, start,
320: _dbus_string_get_length (str) - start);
321:
322: end = NULL;
323: errno = 0;
324: v = strtol (p, &end, 0);
325: if (end == NULL || end == p || errno != 0)
326: return FALSE;
327:
328: if (value_return)
329: *value_return = v;
330: if (end_return)
331: *end_return = start + (end - p);
332:
333: return TRUE;
334: }
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348: dbus_bool_t
349: _dbus_string_parse_uint (const DBusString *str,
350: int start,
351: unsigned long *value_return,
352: int *end_return)
353: {
354: unsigned long v;
355: const char *p;
356: char *end;
357:
358: p = _dbus_string_get_const_data_len (str, start,
359: _dbus_string_get_length (str) - start);
360:
361: end = NULL;
362: errno = 0;
363: v = strtoul (p, &end, 0);
364: if (end == NULL || end == p || errno != 0)
365: return FALSE;
366:
367: if (value_return)
368: *value_return = v;
369: if (end_return)
370: *end_return = start + (end - p);
371:
372: return TRUE;
373: }
374:
375: #ifdef DBUS_BUILD_TESTS
376: static dbus_bool_t
377: ascii_isspace (char c)
378: {
379: return (c == ' ' ||
380: c == '\f' ||
381: c == '\n' ||
382: c == '\r' ||
383: c == '\t' ||
384: c == '\v');
385: }
386: #endif
387:
388: #ifdef DBUS_BUILD_TESTS
389: static dbus_bool_t
390: ascii_isdigit (char c)
391: {
392: return c >= '0' && c <= '9';
393: }
394: #endif
395:
396: #ifdef DBUS_BUILD_TESTS
397: static dbus_bool_t
398: ascii_isxdigit (char c)
399: {
400: return (ascii_isdigit (c) ||
401: (c >= 'a' && c <= 'f') ||
402: (c >= 'A' && c <= 'F'));
403: }
404: #endif
405:
406: #ifdef DBUS_BUILD_TESTS
407:
408:
409:
410:
411:
412: static double
413: ascii_strtod (const char *nptr,
414: char **endptr)
415: {
416: char *fail_pos;
417: double val;
418: struct lconv *locale_data;
419: const char *decimal_point;
420: int decimal_point_len;
421: const char *p, *decimal_point_pos;
422: const char *end = NULL;
423:
424: fail_pos = NULL;
425:
426: locale_data = localeconv ();
427: decimal_point = locale_data->decimal_point;
428: decimal_point_len = strlen (decimal_point);
429:
430: _dbus_assert (decimal_point_len != 0);
431:
432: decimal_point_pos = NULL;
433: if (decimal_point[0] != '.' ||
434: decimal_point[1] != 0)
435: {
436: p = nptr;
437:
438: while (ascii_isspace (*p))
439: p++;
440:
441:
442: if (*p == '+' || *p == '-')
443: p++;
444:
445: if (p[0] == '0' &&
446: (p[1] == 'x' || p[1] == 'X'))
447: {
448: p += 2;
449:
450:
451: while (ascii_isxdigit (*p))
452: p++;
453:
454: if (*p == '.')
455: {
456: decimal_point_pos = p++;
457:
458: while (ascii_isxdigit (*p))
459: p++;
460:
461: if (*p == 'p' || *p == 'P')
462: p++;
463: if (*p == '+' || *p == '-')
464: p++;
465: while (ascii_isdigit (*p))
466: p++;
467: end = p;
468: }
469: }
470: else
471: {
472: while (ascii_isdigit (*p))
473: p++;
474:
475: if (*p == '.')
476: {
477: decimal_point_pos = p++;
478:
479: while (ascii_isdigit (*p))
480: p++;
481:
482: if (*p == 'e' || *p == 'E')
483: p++;
484: if (*p == '+' || *p == '-')
485: p++;
486: while (ascii_isdigit (*p))
487: p++;
488: end = p;
489: }
490: }
491:
492: }
493:
494:
495:
496: errno = 0;
497:
498: if (decimal_point_pos)
499: {
500: char *copy, *c;
501:
502:
503: copy = dbus_malloc (end - nptr + 1 + decimal_point_len);
504:
505: c = copy;
506: memcpy (c, nptr, decimal_point_pos - nptr);
507: c += decimal_point_pos - nptr;
508: memcpy (c, decimal_point, decimal_point_len);
509: c += decimal_point_len;
510: memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
511: c += end - (decimal_point_pos + 1);
512: *c = 0;
513:
514: val = strtod (copy, &fail_pos);
515:
516: if (fail_pos)
517: {
518: if (fail_pos > decimal_point_pos)
519: fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
520: else
521: fail_pos = (char *)nptr + (fail_pos - copy);
522: }
523:
524: dbus_free (copy);
525:
526: }
527: else
528: val = strtod (nptr, &fail_pos);
529:
530: if (endptr)
531: *endptr = fail_pos;
532:
533: return val;
534: }
535: #endif
536:
537: #ifdef DBUS_BUILD_TESTS
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550: dbus_bool_t
551: _dbus_string_parse_double (const DBusString *str,
552: int start,
553: double *value_return,
554: int *end_return)
555: {
556: double v;
557: const char *p;
558: char *end;
559:
560: p = _dbus_string_get_const_data_len (str, start,
561: _dbus_string_get_length (str) - start);
562:
563: end = NULL;
564: errno = 0;
565: v = ascii_strtod (p, &end);
566: if (end == NULL || end == p || errno != 0)
567: return FALSE;
568:
569: if (value_return)
570: *value_return = v;
571: if (end_return)
572: *end_return = start + (end - p);
573:
574: return TRUE;
575: }
576: #endif
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590: void
591: _dbus_user_info_free (DBusUserInfo *info)
592: {
593: dbus_free (info->group_ids);
594: dbus_free (info->username);
595: dbus_free (info->homedir);
596: }
597:
598:
599:
600:
601:
602:
603: void
604: _dbus_group_info_free (DBusGroupInfo *info)
605: {
606: dbus_free (info->groupname);
607: }
608:
609:
610:
611:
612:
613:
614:
615: void
616: _dbus_credentials_clear (DBusCredentials *credentials)
617: {
618: credentials->pid = DBUS_PID_UNSET;
619: credentials->uid = DBUS_UID_UNSET;
620: credentials->gid = DBUS_GID_UNSET;
621: }
622:
623:
624:
625:
626:
627: