summaryrefslogtreecommitdiffstats
path: root/lib/talloc/talloc.3.xml
blob: c23b9117044fbabb770be770f9428e5b61713b6d (plain)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
<?xml version="1.0"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<refentry>
  <refmeta>
    <refentrytitle>talloc</refentrytitle>
    <manvolnum>3</manvolnum>
  </refmeta>
  <refnamediv>
    <refname>talloc</refname>
<refpurpose>hierarchical reference counted memory pool system with destructors</refpurpose>
  </refnamediv>
  <refsynopsisdiv>
<synopsis>#include &lt;talloc/talloc.h&gt;</synopsis>
  </refsynopsisdiv>
  <refsect1><title>DESCRIPTION</title>
    <para>
      If you are used to talloc from Samba3 then please read this
      carefully, as talloc has changed a lot.
    </para>
    <para>
      The new talloc is a hierarchical, reference counted memory pool
      system with destructors.	Quite a mouthful really, but not too bad
      once you get used to it.
    </para>
    <para>
      Perhaps the biggest change from Samba3 is that there is no
      distinction between a "talloc context" and a "talloc pointer".  Any
      pointer returned from talloc() is itself a valid talloc context. 
      This means you can do this:
    </para>
    <programlisting>
    struct foo *X = talloc(mem_ctx, struct foo);
    X->name = talloc_strdup(X, "foo");
    </programlisting>
    <para>
      and the pointer <literal role="code">X-&gt;name</literal>
      would be a "child" of the talloc context <literal
      role="code">X</literal> which is itself a child of
      <literal role="code">mem_ctx</literal>.  So if you do
      <literal role="code">talloc_free(mem_ctx)</literal> then
      it is all destroyed, whereas if you do <literal
      role="code">talloc_free(X)</literal> then just <literal
      role="code">X</literal> and <literal
      role="code">X-&gt;name</literal> are destroyed, and if
      you do <literal
      role="code">talloc_free(X-&gt;name)</literal> then just
      the name element of <literal role="code">X</literal> is
      destroyed.
    </para>
    <para>
      If you think about this, then what this effectively gives you is an
      n-ary tree, where you can free any part of the tree with
      talloc_free().
    </para>
    <para>
      If you find this confusing, then I suggest you run the <literal
      role="code">testsuite</literal> program to watch talloc
      in action.  You may also like to add your own tests to <literal
      role="code">testsuite.c</literal> to clarify how some
      particular situation is handled.
    </para>
  </refsect1>
  <refsect1><title>TALLOC API</title>
    <para>
      The following is a complete guide to the talloc API. Read it all at
      least twice.
    </para>
    <refsect2><title>(type *)talloc(const void *ctx, type);</title>
        <para>
	  The talloc() macro is the core of the talloc library.  It takes a
	  memory <emphasis role="italic">ctx</emphasis> and a <emphasis
	  role="italic">type</emphasis>, and returns a pointer to a new
	  area of memory of the given <emphasis
	  role="italic">type</emphasis>.
        </para>
        <para>
	  The returned pointer is itself a talloc context, so you can use
	  it as the <emphasis role="italic">ctx</emphasis> argument to more
	  calls to talloc() if you wish.
        </para>
        <para>
	  The returned pointer is a "child" of the supplied context.  This
	  means that if you talloc_free() the <emphasis
	  role="italic">ctx</emphasis> then the new child disappears as
	  well.  Alternatively you can free just the child.
        </para>
        <para>
	  The <emphasis role="italic">ctx</emphasis> argument to talloc()
	  can be NULL, in which case a new top level context is created.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_size(const void *ctx, size_t size);</title>
        <para>
	  The function talloc_size() should be used when you don't have a
	  convenient type to pass to talloc().	Unlike talloc(), it is not
	  type safe (as it returns a void *), so you are on your own for
	  type checking.
        </para>
    </refsect2>
    <refsect2><title>(typeof(ptr)) talloc_ptrtype(const void *ctx, ptr);</title>
        <para>
	  The talloc_ptrtype() macro should be used when you have a pointer and
	  want to allocate memory to point at with this pointer. When compiling
	  with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_size()
	  and talloc_get_name() will return the current location in the source file.
	  and not the type.
        </para>
    </refsect2>
    <refsect2><title>int talloc_free(void *ptr);</title>
        <para>
	  The talloc_free() function frees a piece of talloc memory, and
	  all its children.  You can call talloc_free() on any pointer
	  returned by talloc().
        </para>
        <para>
	  The return value of talloc_free() indicates success or failure,
	  with 0 returned for success and -1 for failure.  The only
	  possible failure condition is if <emphasis
	  role="italic">ptr</emphasis> had a destructor attached to it and
	  the destructor returned -1.  See <link
	  linkend="talloc_set_destructor"><quote>talloc_set_destructor()</quote></link>
	  for details on destructors.
        </para>
        <para>
	  If this pointer has an additional parent when talloc_free() is
	  called then the memory is not actually released, but instead the
	  most recently established parent is destroyed.  See <link
	  linkend="talloc_reference"><quote>talloc_reference()</quote></link>
	  for details on establishing additional parents.
        </para>
        <para>
	  For more control on which parent is removed, see <link
	  linkend="talloc_unlink"><quote>talloc_unlink()</quote></link>.
        </para>
        <para>
	  talloc_free() operates recursively on its children.
        </para>
	<para>
	  From the 2.0 version of talloc, as a special case,
	  talloc_free() is refused on pointers that have more than one
	  parent, as talloc would have no way of knowing which parent
	  should be removed. To free a pointer that has more than one
	  parent please use talloc_unlink().
	</para>
	<para>
	  To help you find problems in your code caused by this behaviour, if
	  you do try and free a pointer with more than one parent then the
	  talloc logging function will be called to give output like this:
	</para>
	<para>
	  <screen format="linespecific">
	    ERROR: talloc_free with references at some_dir/source/foo.c:123
  	  	reference at some_dir/source/other.c:325
  	  	reference at some_dir/source/third.c:121
	  </screen>
	</para>
	<para>
	  Please see the documentation for talloc_set_log_fn() and
	  talloc_set_log_stderr() for more information on talloc logging
	  functions.
	</para>
    </refsect2>
    <refsect2 id="talloc_reference"><title>void *talloc_reference(const void *ctx, const void *ptr);</title>
        <para>
	  The talloc_reference() function makes <emphasis
	  role="italic">ctx</emphasis> an additional parent of <emphasis
	  role="italic">ptr</emphasis>.
        </para>
        <para>
	  The return value of talloc_reference() is always the original
	  pointer <emphasis role="italic">ptr</emphasis>, unless talloc ran
	  out of memory in creating the reference in which case it will
	  return NULL (each additional reference consumes around 48 bytes
	  of memory on intel x86 platforms).
        </para>
        <para>
	  If <emphasis role="italic">ptr</emphasis> is NULL, then the
	  function is a no-op, and simply returns NULL.
        </para>
        <para>
	  After creating a reference you can free it in one of the
	  following ways:
        </para>
      <para>
        <itemizedlist>
          <listitem>
            <para>
	      you can talloc_free() any parent of the original pointer. 
	      That will reduce the number of parents of this pointer by 1,
	      and will cause this pointer to be freed if it runs out of
	      parents.
            </para>
          </listitem>
          <listitem>
            <para>
	      you can talloc_free() the pointer itself.  That will destroy
	      the most recently established parent to the pointer and leave
	      the pointer as a child of its current parent.
            </para>
          </listitem>
        </itemizedlist>
      </para>
      <para>
	For more control on which parent to remove, see <link
	linkend="talloc_unlink"><quote>talloc_unlink()</quote></link>.
      </para>
    </refsect2>
    <refsect2 id="talloc_unlink"><title>int talloc_unlink(const void *ctx, const void *ptr);</title>
        <para>
	  The talloc_unlink() function removes a specific parent from
	  <emphasis role="italic">ptr</emphasis>. The <emphasis
	  role="italic">ctx</emphasis> passed must either be a context used
	  in talloc_reference() with this pointer, or must be a direct
	  parent of ptr.
        </para>
        <para>
	  Note that if the parent has already been removed using
	  talloc_free() then this function will fail and will return -1. 
	  Likewise, if <emphasis role="italic">ptr</emphasis> is NULL, then
	  the function will make no modifications and return -1.
        </para>
        <para>
	  Usually you can just use talloc_free() instead of
	  talloc_unlink(), but sometimes it is useful to have the
	  additional control on which parent is removed.
        </para>
    </refsect2>
    <refsect2 id="talloc_set_destructor"><title>void talloc_set_destructor(const void *ptr, int (*destructor)(void *));</title>
        <para>
	  The function talloc_set_destructor() sets the <emphasis
	  role="italic">destructor</emphasis> for the pointer <emphasis
	  role="italic">ptr</emphasis>.  A <emphasis
	  role="italic">destructor</emphasis> is a function that is called
	  when the memory used by a pointer is about to be released.  The
	  destructor receives <emphasis role="italic">ptr</emphasis> as an
	  argument, and should return 0 for success and -1 for failure.
        </para>
        <para>
	  The <emphasis role="italic">destructor</emphasis> can do anything
	  it wants to, including freeing other pieces of memory.  A common
	  use for destructors is to clean up operating system resources
	  (such as open file descriptors) contained in the structure the
	  destructor is placed on.
        </para>
        <para>
	  You can only place one destructor on a pointer.  If you need more
	  than one destructor then you can create a zero-length child of
	  the pointer and place an additional destructor on that.
        </para>
        <para>
	  To remove a destructor call talloc_set_destructor() with NULL for
	  the destructor.
        </para>
        <para>
	  If your destructor attempts to talloc_free() the pointer that it
	  is the destructor for then talloc_free() will return -1 and the
	  free will be ignored.  This would be a pointless operation
	  anyway, as the destructor is only called when the memory is just
	  about to go away.
        </para>
    </refsect2>
    <refsect2><title>int talloc_increase_ref_count(const void *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_increase_ref_count(<emphasis
	  role="italic">ptr</emphasis>) function is exactly equivalent to:
        </para>
        <programlisting>talloc_reference(NULL, ptr);</programlisting>
        <para>
	  You can use either syntax, depending on which you think is
	  clearer in your code.
        </para>
        <para>
	  It returns 0 on success and -1 on failure.
        </para>
    </refsect2>
    <refsect2><title>size_t talloc_reference_count(const void *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  Return the number of references to the pointer.
        </para>
    </refsect2>
    <refsect2 id="talloc_set_name"><title>void talloc_set_name(const void *ptr, const char *fmt, ...);</title>
        <para>
	  Each talloc pointer has a "name".  The name is used principally
	  for debugging purposes, although it is also possible to set and
	  get the name on a pointer in as a way of "marking" pointers in
	  your code.
        </para>
        <para>
	  The main use for names on pointer is for "talloc reports".  See
	  <link
	  linkend="talloc_report"><quote>talloc_report_depth_cb()</quote></link>,
	  <link
	  linkend="talloc_report"><quote>talloc_report_depth_file()</quote></link>,
	  <link
	  linkend="talloc_report"><quote>talloc_report()</quote></link>
	  <link
	  linkend="talloc_report"><quote>talloc_report()</quote></link>
	  and <link
	  linkend="talloc_report_full"><quote>talloc_report_full()</quote></link>
	  for details.	Also see <link
	  linkend="talloc_enable_leak_report"><quote>talloc_enable_leak_report()</quote></link>
	  and <link
	  linkend="talloc_enable_leak_report_full"><quote>talloc_enable_leak_report_full()</quote></link>.
        </para>
        <para>
	  The talloc_set_name() function allocates memory as a child of the
	  pointer.  It is logically equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, talloc_asprintf(ptr, fmt, ...));</programlisting>
        <para>
	  Note that multiple calls to talloc_set_name() will allocate more
	  memory without releasing the name.  All of the memory is released
	  when the ptr is freed using talloc_free().
        </para>
    </refsect2>
    <refsect2><title>void talloc_set_name_const(const void *<emphasis role="italic">ptr</emphasis>, const char *<emphasis role="italic">name</emphasis>);</title>
        <para>
	  The function talloc_set_name_const() is just like
	  talloc_set_name(), but it takes a string constant, and is much
	  faster.  It is extensively used by the "auto naming" macros, such
	  as talloc_p().
        </para>
        <para>
	  This function does not allocate any memory.  It just copies the
	  supplied pointer into the internal representation of the talloc
	  ptr. This means you must not pass a <emphasis
	  role="italic">name</emphasis> pointer to memory that will
	  disappear before <emphasis role="italic">ptr</emphasis> is freed
	  with talloc_free().
        </para>
    </refsect2>
    <refsect2><title>void *talloc_named(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, ...);</title>
        <para>
	  The talloc_named() function creates a named talloc pointer.  It
	  is equivalent to:
        </para>
        <programlisting>ptr = talloc_size(ctx, size);
talloc_set_name(ptr, fmt, ....);</programlisting>
    </refsect2>
    <refsect2><title>void *talloc_named_const(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>, const char *<emphasis role="italic">name</emphasis>);</title>
        <para>
	  This is equivalent to:
        </para>
        <programlisting>ptr = talloc_size(ctx, size);
talloc_set_name_const(ptr, name);</programlisting>
    </refsect2>
    <refsect2><title>const char *talloc_get_name(const void *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  This returns the current name for the given talloc pointer,
	  <emphasis role="italic">ptr</emphasis>. See <link
	  linkend="talloc_set_name"><quote>talloc_set_name()</quote></link>
	  for details.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_init(const char *<emphasis role="italic">fmt</emphasis>, ...);</title>
        <para>
	  This function creates a zero length named talloc context as a top
	  level context.  It is equivalent to:
        </para>
        <programlisting>talloc_named(NULL, 0, fmt, ...);</programlisting>
    </refsect2>
    <refsect2><title>void *talloc_new(void *<emphasis role="italic">ctx</emphasis>);</title>
        <para>
	  This is a utility macro that creates a new memory context hanging
	  off an existing context, automatically naming it "talloc_new:
	  __location__" where __location__ is the source line it is called
	  from.  It is particularly useful for creating a new temporary
	  working context.
        </para>
    </refsect2>
    <refsect2><title>(<emphasis role="italic">type</emphasis> *)talloc_realloc(const void *<emphasis role="italic">ctx</emphasis>, void *<emphasis role="italic">ptr</emphasis>, <emphasis role="italic">type</emphasis>, <emphasis role="italic">count</emphasis>);</title>
        <para>
	  The talloc_realloc() macro changes the size of a talloc pointer. 
	  It has the following equivalences:
        </para>
        <programlisting>talloc_realloc(ctx, NULL, type, 1) ==> talloc(ctx, type);
talloc_realloc(ctx, ptr, type, 0)  ==> talloc_free(ptr);</programlisting>
        <para>
	  The <emphasis role="italic">ctx</emphasis> argument is only used
	  if <emphasis role="italic">ptr</emphasis> is not NULL, otherwise
	  it is ignored.
        </para>
        <para>
	  talloc_realloc() returns the new pointer, or NULL on failure. 
	  The call will fail either due to a lack of memory, or because the
	  pointer has more than one parent (see <link
	  linkend="talloc_reference"><quote>talloc_reference()</quote></link>).
        </para>
    </refsect2>
    <refsect2><title>void *talloc_realloc_size(const void *ctx, void *ptr, size_t size);</title>
        <para>
	  the talloc_realloc_size() function is useful when the type is not
	  known so the type-safe talloc_realloc() cannot be used.
        </para>
    </refsect2>
    <refsect2><title>TYPE *talloc_steal(const void *<emphasis role="italic">new_ctx</emphasis>, const TYPE *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_steal() function changes the parent context of a
	  talloc pointer.  It is typically used when the context that the
	  pointer is currently a child of is going to be freed and you wish
	  to keep the memory for a longer time.
        </para>
        <para>
	  The talloc_steal() function returns the pointer that you pass it.
	   It does not have any failure modes.
        </para>
        <para>
	  It is possible to produce loops in the parent/child
	  relationship if you are not careful with talloc_steal().  No
	  guarantees are provided as to your sanity or the safety of your
	  data if you do this.
        </para>
        <para>
	  Note that if you try and call talloc_steal() on a pointer that has
	  more than one parent then the result is ambiguous. Talloc will choose
	  to remove the parent that is currently indicated by talloc_parent()
	  and replace it with the chosen parent. You will also get a message
	  like this via the talloc logging functions:
        </para>
        <para>
	  <screen format="linespecific">
	  WARNING: talloc_steal with references at some_dir/source/foo.c:123
  	  	reference at some_dir/source/other.c:325
  	  	reference at some_dir/source/third.c:121
	  </screen>
        </para>
        <para>
	  To unambiguously change the parent of a pointer please see
	  the
	  function <link linkend="talloc_reference"><quote>talloc_reparent()</quote></link>. See
	  the talloc_set_log_fn() documentation for more information
	  on talloc logging.  
	</para>
    </refsect2>
    <refsect2><title>TYPE *talloc_reparent(const void *<emphasis role="italic">old_parent</emphasis>, const void *<emphasis role="italic">new_parent</emphasis>, const TYPE *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_reparent() function changes the parent context of a talloc
	  pointer. It is typically used when the context that the pointer is
	  currently a child of is going to be freed and you wish to keep the
	  memory for a longer time.
        </para>
        <para>
	  The talloc_reparent() function returns the pointer that you pass it. It
	  does not have any failure modes.
        </para>
        <para>
	  The difference between talloc_reparent() and talloc_steal() is that
	  talloc_reparent() can specify which parent you wish to change. This is
	  useful when a pointer has multiple parents via references.
        </para>
    </refsect2>
    <refsect2><title>TYPE *talloc_move(const void *<emphasis role="italic">new_ctx</emphasis>, TYPE **<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_move() function is a wrapper around
	  talloc_steal() which zeros the source pointer after the
	  move. This avoids a potential source of bugs where a
	  programmer leaves a pointer in two structures, and uses the
	  pointer from the old structure after it has been moved to a
	  new one.
        </para>
    </refsect2>
    <refsect2><title>size_t talloc_total_size(const void *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_total_size() function returns the total size in bytes
	  used by this pointer and all child pointers.	Mostly useful for
	  debugging.
        </para>
        <para>
	  Passing NULL is allowed, but it will only give a meaningful
	  result if talloc_enable_leak_report() or
	  talloc_enable_leak_report_full() has been called.
        </para>
    </refsect2>
    <refsect2><title>size_t talloc_total_blocks(const void *<emphasis role="italic">ptr</emphasis>);</title>
        <para>
	  The talloc_total_blocks() function returns the total memory block
	  count used by this pointer and all child pointers.  Mostly useful
	  for debugging.
        </para>
        <para>
	  Passing NULL is allowed, but it will only give a meaningful
	  result if talloc_enable_leak_report() or
	  talloc_enable_leak_report_full() has been called.
        </para>
    </refsect2>
    <refsect2 id="talloc_report"><title>void talloc_report(const void *ptr, FILE *f);</title>
        <para>
	  The talloc_report() function prints a summary report of all
	  memory used by <emphasis role="italic">ptr</emphasis>.  One line
	  of report is printed for each immediate child of ptr, showing the
	  total memory and number of blocks used by that child.
        </para>
        <para>
	  You can pass NULL for the pointer, in which case a report is
	  printed for the top level memory context, but only if
	  talloc_enable_leak_report() or talloc_enable_leak_report_full()
	  has been called.
        </para>
    </refsect2>
    <refsect2 id="talloc_report_full"><title>void talloc_report_full(const void *<emphasis role="italic">ptr</emphasis>, FILE *<emphasis role="italic">f</emphasis>);</title>
        <para>
	  This provides a more detailed report than talloc_report().  It
	  will recursively print the entire tree of memory referenced by
	  the pointer. References in the tree are shown by giving the name
	  of the pointer that is referenced.
        </para>
        <para>
	  You can pass NULL for the pointer, in which case a report is
	  printed for the top level memory context, but only if
	  talloc_enable_leak_report() or talloc_enable_leak_report_full()
	  has been called.
        </para>
    </refsect2>
    <refsect2 id="talloc_report_depth_cb">
     <funcsynopsis><funcprototype>
      <funcdef>void <function>talloc_report_depth_cb</function></funcdef>
      <paramdef><parameter>const void *ptr</parameter></paramdef>
      <paramdef><parameter>int depth</parameter></paramdef>
      <paramdef><parameter>int max_depth</parameter></paramdef>
      <paramdef><parameter>void (*callback)(const void *ptr, int depth, int max_depth, int is_ref, void *priv)</parameter></paramdef>
      <paramdef><parameter>void *priv</parameter></paramdef>
     </funcprototype></funcsynopsis>
        <para>
	  This provides a more flexible reports than talloc_report(). It
	  will recursively call the callback for the entire tree of memory
	  referenced by the pointer. References in the tree are passed with
	  <emphasis role="italic">is_ref = 1</emphasis> and the pointer that is referenced.
        </para>
        <para>
	  You can pass NULL for the pointer, in which case a report is
	  printed for the top level memory context, but only if
	  talloc_enable_leak_report() or talloc_enable_leak_report_full()
	  has been called.
        </para>
        <para>
	  The recursion is stopped when depth >= max_depth.
	  max_depth = -1 means only stop at leaf nodes.
        </para>
    </refsect2>
    <refsect2 id="talloc_report_depth_file">
     <funcsynopsis><funcprototype>
      <funcdef>void <function>talloc_report_depth_file</function></funcdef>
      <paramdef><parameter>const void *ptr</parameter></paramdef>
      <paramdef><parameter>int depth</parameter></paramdef>
      <paramdef><parameter>int max_depth</parameter></paramdef>
      <paramdef><parameter>FILE *f</parameter></paramdef>
     </funcprototype></funcsynopsis>
        <para>
	  This provides a more flexible reports than talloc_report(). It
	  will let you specify the depth and max_depth.
        </para>
    </refsect2>
    <refsect2 id="talloc_enable_leak_report"><title>void talloc_enable_leak_report(void);</title>
        <para>
	  This enables calling of talloc_report(NULL, stderr) when the
	  program exits.  In Samba4 this is enabled by using the
	  --leak-report command line option.
        </para>
        <para>
	  For it to be useful, this function must be called before any
	  other talloc function as it establishes a "null context" that
	  acts as the top of the tree.	If you don't call this function
	  first then passing NULL to talloc_report() or
	  talloc_report_full() won't give you the full tree printout.
        </para>
        <para>
	  Here is a typical talloc report:
        </para>
        <screen format="linespecific">talloc report on 'null_context' (total 267 bytes in 15 blocks)
libcli/auth/spnego_parse.c:55  contains   31 bytes in   2 blocks
libcli/auth/spnego_parse.c:55  contains   31 bytes in   2 blocks
iconv(UTF8,CP850)              contains   42 bytes in   2 blocks
libcli/auth/spnego_parse.c:55  contains   31 bytes in   2 blocks
iconv(CP850,UTF8)              contains   42 bytes in   2 blocks
iconv(UTF8,UTF-16LE)           contains   45 bytes in   2 blocks
iconv(UTF-16LE,UTF8)           contains   45 bytes in   2 blocks
      </screen>
    </refsect2>
    <refsect2 id="talloc_enable_leak_report_full"><title>void talloc_enable_leak_report_full(void);</title>
        <para>
	  This enables calling of talloc_report_full(NULL, stderr) when the
	  program exits.  In Samba4 this is enabled by using the
	  --leak-report-full command line option.
        </para>
        <para>
	  For it to be useful, this function must be called before any
	  other talloc function as it establishes a "null context" that
	  acts as the top of the tree.	If you don't call this function
	  first then passing NULL to talloc_report() or
	  talloc_report_full() won't give you the full tree printout.
        </para>
        <para>
	  Here is a typical full report:
        </para>
        <screen format="linespecific">full talloc report on 'root' (total 18 bytes in 8 blocks)
p1               contains     18 bytes in   7 blocks (ref 0)
    r1               contains     13 bytes in   2 blocks (ref 0)
        reference to: p2
    p2               contains      1 bytes in   1 blocks (ref 1)
    x3               contains      1 bytes in   1 blocks (ref 0)
    x2               contains      1 bytes in   1 blocks (ref 0)
    x1               contains      1 bytes in   1 blocks (ref 0)
      </screen>
    </refsect2>
    <refsect2><title>(<emphasis role="italic">type</emphasis> *)talloc_zero(const void *<emphasis role="italic">ctx</emphasis>, <emphasis role="italic">type</emphasis>);</title>
        <para>
	  The talloc_zero() macro is equivalent to:
        </para>
        <programlisting>ptr = talloc(ctx, type);
if (ptr) memset(ptr, 0, sizeof(type));</programlisting>
    </refsect2>
    <refsect2><title>void *talloc_zero_size(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>)</title>
        <para>
	  The talloc_zero_size() function is useful when you don't have a
	  known type.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_memdup(const void *<emphasis role="italic">ctx</emphasis>, const void *<emphasis role="italic">p</emphasis>, size_t size);</title>
        <para>
	  The talloc_memdup() function is equivalent to:
        </para>
        <programlisting>ptr = talloc_size(ctx, size);
if (ptr) memcpy(ptr, p, size);</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_strdup(const void *<emphasis role="italic">ctx</emphasis>, const char *<emphasis role="italic">p</emphasis>);</title>
        <para>
	  The talloc_strdup() function is equivalent to:
        </para>
        <programlisting>ptr = talloc_size(ctx, strlen(p)+1);
if (ptr) memcpy(ptr, p, strlen(p)+1);</programlisting>
        <para>
	  This function sets the name of the new pointer to the passed
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_strndup(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">p</emphasis>, size_t <emphasis role="italic">n</emphasis>);</title>
        <para>
	  The talloc_strndup() function is the talloc equivalent of the C
	  library function strndup(3).
        </para>
        <para>
	  This function sets the name of the new pointer to the passed
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_append_string(const void *<emphasis role="italic">t</emphasis>, char *<emphasis role="italic">orig</emphasis>, const char *<emphasis role="italic">append</emphasis>);</title>
        <para>
	  The talloc_append_string() function appends the given formatted
	  string to the given string.
        </para>
        <para>
	  This function sets the name of the new pointer to the new
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_vasprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, va_list <emphasis role="italic">ap</emphasis>);</title>
        <para>
	  The talloc_vasprintf() function is the talloc equivalent of the C
	  library function vasprintf(3).
        </para>
        <para>
	  This function sets the name of the new pointer to the new
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_asprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, ...);</title>
        <para>
	  The talloc_asprintf() function is the talloc equivalent of the C
	  library function asprintf(3).
        </para>
        <para>
	  This function sets the name of the new pointer to the passed
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>char *talloc_asprintf_append(char *s, const char *fmt, ...);</title>
        <para>
	  The talloc_asprintf_append() function appends the given formatted
	  string to the given string.
        </para>
        <para>
	  This function sets the name of the new pointer to the new
	  string. This is equivalent to:
        </para>
        <programlisting>talloc_set_name_const(ptr, ptr)</programlisting>
    </refsect2>
    <refsect2><title>(type *)talloc_array(const void *ctx, type, unsigned int count);</title>
        <para>
	  The talloc_array() macro is equivalent to:
        </para>
        <programlisting>(type *)talloc_size(ctx, sizeof(type) * count);</programlisting>
        <para>
	  except that it provides integer overflow protection for the
	  multiply, returning NULL if the multiply overflows.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_array_size(const void *ctx, size_t size, unsigned int count);</title>
        <para>
	  The talloc_array_size() function is useful when the type is not
	  known. It operates in the same way as talloc_array(), but takes a
	  size instead of a type.
        </para>
    </refsect2>
    <refsect2><title>(typeof(ptr)) talloc_array_ptrtype(const void *ctx, ptr, unsigned int count);</title>
        <para>
	  The talloc_ptrtype() macro should be used when you have a pointer to an array
	  and want to allocate memory of an array to point at with this pointer. When compiling
	  with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_array_size()
	  and talloc_get_name() will return the current location in the source file.
	  and not the type.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size)</title>
        <para>
	  This is a non-macro version of talloc_realloc(), which is useful
	  as libraries sometimes want a realloc function pointer.  A
	  realloc(3) implementation encapsulates the functionality of
	  malloc(3), free(3) and realloc(3) in one call, which is why it is
	  useful to be able to pass around a single function pointer.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_autofree_context(void);</title>
        <para>
	  This is a handy utility function that returns a talloc context
	  which will be automatically freed on program exit.  This can be
	  used to reduce the noise in memory leak reports.
        </para>
    </refsect2>
    <refsect2><title>void *talloc_check_name(const void *ptr, const char *name);</title>
        <para>
	  This function checks if a pointer has the specified <emphasis
	  role="italic">name</emphasis>.  If it does then the pointer is
	  returned.  It it doesn't then NULL is returned.
        </para>
    </refsect2>
    <refsect2><title>(type *)talloc_get_type(const void *ptr, type);</title>
        <para>
	  This macro allows you to do type checking on talloc pointers.  It
	  is particularly useful for void* private pointers.  It is
	  equivalent to this:
        </para>
        <programlisting>(type *)talloc_check_name(ptr, #type)</programlisting>
    </refsect2>
    <refsect2><title>talloc_set_type(const void *ptr, type);</title>
        <para>
	  This macro allows you to force the name of a pointer to be a
	  particular <emphasis>type</emphasis>.  This can be
	  used in conjunction with talloc_get_type() to do type checking on
	  void* pointers.
        </para>
        <para>
	  It is equivalent to this:
        </para>
        <programlisting>talloc_set_name_const(ptr, #type)</programlisting>
    </refsect2>
    <refsect2><title>talloc_set_log_fn(void (*log_fn)(const char *message));</title>
        <para>
	  This function sets a logging function that talloc will use for
	  warnings and errors. By default talloc will not print any warnings or
	  errors.
	</para>
    </refsect2>
    <refsect2><title>talloc_set_log_stderr(void);</title>
        <para>
	  This sets the talloc log function to write log messages to stderr
	</para>
    </refsect2>
  </refsect1>
  <refsect1><title>PERFORMANCE</title>
    <para>
      All the additional features of talloc(3) over malloc(3) do come at a
      price.  We have a simple performance test in Samba4 that measures
      talloc() versus malloc() performance, and it seems that talloc() is
      about 10% slower than malloc() on my x86 Debian Linux box.  For
      Samba, the great reduction in code complexity that we get by using
      talloc makes this worthwhile, especially as the total overhead of
      talloc/malloc in Samba is already quite small.
    </para>
  </refsect1>
  <refsect1><title>SEE ALSO</title>
    <para>
      malloc(3), strndup(3), vasprintf(3), asprintf(3), 
      <ulink url="http://talloc.samba.org/"/>
    </para>
  </refsect1>
  <refsect1><title>COPYRIGHT/LICENSE</title>
    <para>
      Copyright (C) Andrew Tridgell 2004
    </para>
    <para>
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 3 of the License, or (at
      your option) any later version.
    </para>
    <para>
      This program is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      General Public License for more details.
    </para>
    <para>
      You should have received a copy of the GNU General Public License
      along with this program; if not, see http://www.gnu.org/licenses/.
    </para>
  </refsect1>
</refentry>
t__.py.in:219 msgid "Base DN for user lookups" msgstr "Base DN per i lookup utente" #: src/config/SSSDConfig/__init__.py.in:220 msgid "Scope of user lookups" msgstr "Ambito di applicazione dei lookup utente" #: src/config/SSSDConfig/__init__.py.in:221 msgid "Filter for user lookups" msgstr "Filtro per i lookup utente" #: src/config/SSSDConfig/__init__.py.in:222 msgid "Objectclass for users" msgstr "Objectclass per gli utenti" #: src/config/SSSDConfig/__init__.py.in:223 msgid "Username attribute" msgstr "Attributo del nome utente" #: src/config/SSSDConfig/__init__.py.in:225 msgid "UID attribute" msgstr "Attributo UID" #: src/config/SSSDConfig/__init__.py.in:226 msgid "Primary GID attribute" msgstr "Attributo del GID primario" #: src/config/SSSDConfig/__init__.py.in:227 msgid "GECOS attribute" msgstr "Attributo GECOS" #: src/config/SSSDConfig/__init__.py.in:228 msgid "Home directory attribute" msgstr "Attributo della home directory" #: src/config/SSSDConfig/__init__.py.in:229 msgid "Shell attribute" msgstr "Attributo della shell" #: src/config/SSSDConfig/__init__.py.in:230 msgid "UUID attribute" msgstr "Attributo UUID" #: src/config/SSSDConfig/__init__.py.in:231 #: src/config/SSSDConfig/__init__.py.in:267 msgid "objectSID attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:232 msgid "Active Directory primary group attribute for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:233 msgid "User principal attribute (for Kerberos)" msgstr "Attributo user principal (per Kerberos)" #: src/config/SSSDConfig/__init__.py.in:234 msgid "Full Name" msgstr "Nome completo" #: src/config/SSSDConfig/__init__.py.in:235 msgid "memberOf attribute" msgstr "Attributo memberOf" #: src/config/SSSDConfig/__init__.py.in:236 msgid "Modification time attribute" msgstr "Attributo data di modifica" #: src/config/SSSDConfig/__init__.py.in:238 msgid "shadowLastChange attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:239 msgid "shadowMin attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:240 msgid "shadowMax attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:241 msgid "shadowWarning attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:242 msgid "shadowInactive attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:243 msgid "shadowExpire attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:244 msgid "shadowFlag attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:245 msgid "Attribute listing authorized PAM services" msgstr "" #: src/config/SSSDConfig/__init__.py.in:246 msgid "Attribute listing authorized server hosts" msgstr "" #: src/config/SSSDConfig/__init__.py.in:247 msgid "krbLastPwdChange attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:248 msgid "krbPasswordExpiration attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:249 msgid "Attribute indicating that server side password policies are active" msgstr "" #: src/config/SSSDConfig/__init__.py.in:250 msgid "accountExpires attribute of AD" msgstr "" #: src/config/SSSDConfig/__init__.py.in:251 msgid "userAccountControl attribute of AD" msgstr "" #: src/config/SSSDConfig/__init__.py.in:252 msgid "nsAccountLock attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:253 msgid "loginDisabled attribute of NDS" msgstr "" #: src/config/SSSDConfig/__init__.py.in:254 msgid "loginExpirationTime attribute of NDS" msgstr "" #: src/config/SSSDConfig/__init__.py.in:255 msgid "loginAllowedTimeMap attribute of NDS" msgstr "" #: src/config/SSSDConfig/__init__.py.in:256 msgid "SSH public key attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:258 msgid "Base DN for group lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:261 msgid "Objectclass for groups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:262 msgid "Group name" msgstr "" #: src/config/SSSDConfig/__init__.py.in:263 msgid "Group password" msgstr "" #: src/config/SSSDConfig/__init__.py.in:264 msgid "GID attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:265 msgid "Group member attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:266 msgid "Group UUID attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:268 msgid "Modification time attribute for groups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:270 msgid "Maximum nesting level SSSd will follow" msgstr "" #: src/config/SSSDConfig/__init__.py.in:272 msgid "Base DN for netgroup lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:273 msgid "Objectclass for netgroups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:274 msgid "Netgroup name" msgstr "" #: src/config/SSSDConfig/__init__.py.in:275 msgid "Netgroups members attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:276 msgid "Netgroup triple attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:277 msgid "Netgroup UUID attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:278 msgid "Modification time attribute for netgroups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:280 msgid "Base DN for service lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:281 msgid "Objectclass for services" msgstr "" #: src/config/SSSDConfig/__init__.py.in:282 msgid "Service name attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:283 msgid "Service port attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:284 msgid "Service protocol attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:287 msgid "Lower bound for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:288 msgid "Upper bound for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:289 msgid "Number of IDs for each slice when ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:290 msgid "Use autorid-compatible algorithm for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:291 msgid "Name of the default domain for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:292 msgid "SID of the default domain for ID-mapping" msgstr "" #: src/config/SSSDConfig/__init__.py.in:294 msgid "Use LDAP_MATCHING_RULE_IN_CHAIN for group lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:295 msgid "Use LDAP_MATCHING_RULE_IN_CHAIN for initgroup lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:298 msgid "Policy to evaluate the password expiration" msgstr "Politica per controllare la scadenza della password" #: src/config/SSSDConfig/__init__.py.in:301 msgid "LDAP filter to determine access privileges" msgstr "Filtro LDAP per determinare i privilegi di accesso" #: src/config/SSSDConfig/__init__.py.in:302 msgid "Which attributes shall be used to evaluate if an account is expired" msgstr "" #: src/config/SSSDConfig/__init__.py.in:303 msgid "Which rules should be used to evaluate access control" msgstr "" #: src/config/SSSDConfig/__init__.py.in:306 msgid "URI of an LDAP server where password changes are allowed" msgstr "" #: src/config/SSSDConfig/__init__.py.in:307 msgid "URI of a backup LDAP server where password changes are allowed" msgstr "" #: src/config/SSSDConfig/__init__.py.in:308 msgid "DNS service name for LDAP password change server" msgstr "" #: src/config/SSSDConfig/__init__.py.in:309 msgid "" "Whether to update the ldap_user_shadow_last_change attribute after a " "password change" msgstr "" #: src/config/SSSDConfig/__init__.py.in:312 msgid "Base DN for sudo rules lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:313 msgid "Automatic full refresh period" msgstr "" #: src/config/SSSDConfig/__init__.py.in:314 msgid "Automatic smart refresh period" msgstr "" #: src/config/SSSDConfig/__init__.py.in:315 msgid "Whether to filter rules by hostname, IP addresses and network" msgstr "" #: src/config/SSSDConfig/__init__.py.in:316 msgid "" "Hostnames and/or fully qualified domain names of this machine to filter sudo " "rules" msgstr "" #: src/config/SSSDConfig/__init__.py.in:317 msgid "IPv4 or IPv6 addresses or network of this machine to filter sudo rules" msgstr "" #: src/config/SSSDConfig/__init__.py.in:318 msgid "Whether to include rules that contains netgroup in host attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:319 msgid "" "Whether to include rules that contains regular expression in host attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:320 msgid "Object class for sudo rules" msgstr "" #: src/config/SSSDConfig/__init__.py.in:321 msgid "Sudo rule name" msgstr "" #: src/config/SSSDConfig/__init__.py.in:322 msgid "Sudo rule command attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:323 msgid "Sudo rule host attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:324 msgid "Sudo rule user attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:325 msgid "Sudo rule option attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:326 msgid "Sudo rule runasuser attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:327 msgid "Sudo rule runasgroup attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:328 msgid "Sudo rule notbefore attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:329 msgid "Sudo rule notafter attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:330 msgid "Sudo rule order attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:333 msgid "Object class for automounter maps" msgstr "" #: src/config/SSSDConfig/__init__.py.in:334 msgid "Automounter map name attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:335 msgid "Object class for automounter map entries" msgstr "" #: src/config/SSSDConfig/__init__.py.in:336 msgid "Automounter map entry key attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:337 msgid "Automounter map entry value attribute" msgstr "" #: src/config/SSSDConfig/__init__.py.in:338 msgid "Base DN for automounter map lookups" msgstr "" #: src/config/SSSDConfig/__init__.py.in:341 msgid "Comma separated list of allowed users" msgstr "Lista separata da virgola degli utenti abilitati" #: src/config/SSSDConfig/__init__.py.in:342 msgid "Comma separated list of prohibited users" msgstr "Lista separata da virgola degli utenti non abilitati" #: src/config/SSSDConfig/__init__.py.in:345 msgid "Default shell, /bin/bash" msgstr "Shell predefinita, /bin/bash" #: src/config/SSSDConfig/__init__.py.in:346 msgid "Base for home directories" msgstr "Base delle home directory" #: src/config/SSSDConfig/__init__.py.in:349 msgid "The name of the NSS library to use" msgstr "Il nome della libreria NSS da usare" #: src/config/SSSDConfig/__init__.py.in:350 msgid "Whether to look up canonical group name from cache if possible" msgstr "" #: src/config/SSSDConfig/__init__.py.in:353 msgid "PAM stack to use" msgstr "Stack PAM da usare" #: src/monitor/monitor.c:2476 msgid "Become a daemon (default)" msgstr "Esegui come demone (default)" #: src/monitor/monitor.c:2478 msgid "Run interactive (not a daemon)" msgstr "Esegui interattivamente (non come demone)" #: src/monitor/monitor.c:2480 src/tools/sss_debuglevel.c:71 msgid "Specify a non-default config file" msgstr "Specificare un file di configurazione specifico" #: src/monitor/monitor.c:2482 msgid "Print version number and exit" msgstr "" #: src/monitor/monitor.c:2599 msgid "SSSD is already running\n" msgstr "" #: src/providers/krb5/krb5_child.c:1865 src/providers/ldap/ldap_child.c:407 #: src/util/util.h:94 msgid "Debug level" msgstr "Livello debug" #: src/providers/krb5/krb5_child.c:1867 src/providers/ldap/ldap_child.c:409 #: src/util/util.h:98 msgid "Add debug timestamps" msgstr "Includi timestamp di debug" #: src/providers/krb5/krb5_child.c:1869 src/providers/ldap/ldap_child.c:411 #: src/util/util.h:100 msgid "Show timestamps with microseconds" msgstr "" #: src/providers/krb5/krb5_child.c:1871 src/providers/ldap/ldap_child.c:413 msgid "An open file descriptor for the debug logs" msgstr "Un descrittore di file aperto per l'output di debug" #: src/providers/data_provider_be.c:2365 msgid "Domain of the information provider (mandatory)" msgstr "Dominio del provider di informazioni (obbligatorio)" #: src/sss_client/common.c:926 msgid "Privileged socket has wrong ownership or permissions." msgstr "Il socket privilegiato ha permessi o propritario non validi." #: src/sss_client/common.c:929 msgid "Public socket has wrong ownership or permissions." msgstr "Il socket pubblico ha permessi o propritario non validi." #: src/sss_client/common.c:932 msgid "Unexpected format of the server credential message." msgstr "" #: src/sss_client/common.c:935 msgid "SSSD is not run by root." msgstr "SSSD non è eseguito da root." #: src/sss_client/common.c:940 msgid "An error occurred, but no description can be found." msgstr "" #: src/sss_client/common.c:946 msgid "Unexpected error while looking for an error description" msgstr "" #: src/sss_client/pam_sss.c:375 msgid "Passwords do not match" msgstr "Le password non coincidono" #: src/sss_client/pam_sss.c:563 msgid "Password reset by root is not supported." msgstr "" #: src/sss_client/pam_sss.c:604 msgid "Authenticated with cached credentials" msgstr "Autenticato con le credenziali nella cache" #: src/sss_client/pam_sss.c:605 msgid ", your cached password will expire at: " msgstr ", la password in cache scadrà il: " #: src/sss_client/pam_sss.c:635 #, c-format msgid "Your password has expired. You have %1$d grace login(s) remaining." msgstr "" #: src/sss_client/pam_sss.c:681 #, c-format msgid "Your password will expire in %1$d %2$s." msgstr "" #: src/sss_client/pam_sss.c:730 msgid "Authentication is denied until: " msgstr "L'autenticazione verrà negata fino al: " #: src/sss_client/pam_sss.c:751 msgid "System is offline, password change not possible" msgstr "Il sistema è offline, non è possibile richiedere un cambio password" #: src/sss_client/pam_sss.c:781 src/sss_client/pam_sss.c:794 msgid "Password change failed. " msgstr "Cambio password fallito." #: src/sss_client/pam_sss.c:784 src/sss_client/pam_sss.c:795 msgid "Server message: " msgstr "Messaggio del server:" #: src/sss_client/pam_sss.c:1213 msgid "New Password: " msgstr "Nuova password: " #: src/sss_client/pam_sss.c:1214 msgid "Reenter new Password: " msgstr "Conferma nuova password: " #: src/sss_client/pam_sss.c:1300 msgid "Password: " msgstr "Password: " #: src/sss_client/pam_sss.c:1332 msgid "Current Password: " msgstr "Password corrente: " #: src/sss_client/pam_sss.c:1479 msgid "Password expired. Change your password now." msgstr "Password scaduta. Cambiare la password ora." #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:40 #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:192 src/tools/sss_useradd.c:48 #: src/tools/sss_groupadd.c:41 src/tools/sss_groupdel.c:43 #: src/tools/sss_groupmod.c:42 src/tools/sss_groupshow.c:651 #: src/tools/sss_userdel.c:131 src/tools/sss_usermod.c:47 #: src/tools/sss_cache.c:350 src/tools/sss_debuglevel.c:69 msgid "The debug level to run with" msgstr "Il livello di debug da utilizzare" #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:42 #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:196 msgid "The SSSD domain to use" msgstr "" #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:58 src/tools/sss_useradd.c:73 #: src/tools/sss_groupadd.c:58 src/tools/sss_groupdel.c:52 #: src/tools/sss_groupmod.c:65 src/tools/sss_groupshow.c:662 #: src/tools/sss_userdel.c:148 src/tools/sss_usermod.c:74 #: src/tools/sss_cache.c:381 msgid "Error setting the locale\n" msgstr "Errore di impostazione del locale\n" #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:65 #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:91 msgid "Not enough memory\n" msgstr "" #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:84 msgid "User not specified\n" msgstr "" #: src/sss_client/ssh/sss_ssh_authorizedkeys.c:105 msgid "Error looking up public keys\n" msgstr "" #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:194 msgid "The port to use to connect to the host" msgstr "" #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:238 msgid "Invalid port\n" msgstr "" #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:243 msgid "Host not specified\n" msgstr "" #: src/sss_client/ssh/sss_ssh_knownhostsproxy.c:249 msgid "The path to the proxy command must be absolute\n" msgstr "" #: src/tools/sss_useradd.c:49 src/tools/sss_usermod.c:48 msgid "The UID of the user" msgstr "L'UID dell'utente" #: src/tools/sss_useradd.c:50 src/tools/sss_usermod.c:50 msgid "The comment string" msgstr "La stringa di commento" #: src/tools/sss_useradd.c:51 src/tools/sss_usermod.c:51 msgid "Home directory" msgstr "Home directory" #: src/tools/sss_useradd.c:52 src/tools/sss_usermod.c:52 msgid "Login shell" msgstr "Shell di login" #: src/tools/sss_useradd.c:53 msgid "Groups" msgstr "Gruppi" #: src/tools/sss_useradd.c:54 msgid "Create user's directory if it does not exist" msgstr "Creare la directory utente se non esiste" #: src/tools/sss_useradd.c:55 msgid "Never create user's directory, overrides config" msgstr "Non creare mai le directory utente, forza la configurazione" #: src/tools/sss_useradd.c:56 msgid "Specify an alternative skeleton directory" msgstr "Specificare una directory skeleton alternativa" #: src/tools/sss_useradd.c:57 src/tools/sss_usermod.c:57 msgid "The SELinux user for user's login" msgstr "" #: src/tools/sss_useradd.c:86 src/tools/sss_groupmod.c:78 #: src/tools/sss_usermod.c:87 msgid "Specify group to add to\n" msgstr "" #: src/tools/sss_useradd.c:110 msgid "Specify user to add\n" msgstr "Specificare un utente da aggiungere\n" #: src/tools/sss_useradd.c:119 src/tools/sss_groupadd.c:84 #: src/tools/sss_groupdel.c:77 src/tools/sss_groupmod.c:111 #: src/tools/sss_groupshow.c:695 src/tools/sss_userdel.c:193 #: src/tools/sss_usermod.c:128 msgid "Error initializing the tools - no local domain\n" msgstr "Errore durante l'inizializzazione degli strumenti - nessun dominio\n" #: src/tools/sss_useradd.c:121 src/tools/sss_groupadd.c:86 #: src/tools/sss_groupdel.c:79 src/tools/sss_groupmod.c:113 #: src/tools/sss_groupshow.c:697 src/tools/sss_userdel.c:195 #: src/tools/sss_usermod.c:130 msgid "Error initializing the tools\n" msgstr "Errore durante l'inizializzazione degli strumenti\n" #: src/tools/sss_useradd.c:130 src/tools/sss_groupadd.c:95 #: src/tools/sss_groupdel.c:88 src/tools/sss_groupmod.c:121 #: src/tools/sss_groupshow.c:706 src/tools/sss_userdel.c:204 #: src/tools/sss_usermod.c:139 msgid "Invalid domain specified in FQDN\n" msgstr "Il dominio specificato nel FQDN non è valido\n" #: src/tools/sss_useradd.c:139 src/tools/sss_groupmod.c:141 #: src/tools/sss_groupmod.c:168 src/tools/sss_usermod.c:162 #: src/tools/sss_usermod.c:189 msgid "Internal error while parsing parameters\n" msgstr "Errore interno nel parsing dei parametri\n" #: src/tools/sss_useradd.c:147 src/tools/sss_usermod.c:170 #: src/tools/sss_usermod.c:197 msgid "Groups must be in the same domain as user\n" msgstr "I gruppi devono essere nello stesso dominio dell'utente\n" #: src/tools/sss_useradd.c:155 #, c-format msgid "Cannot find group %1$s in local domain\n" msgstr "" #: src/tools/sss_useradd.c:170 src/tools/sss_userdel.c:214 msgid "Cannot set default values\n" msgstr "Impossibile impostare i valori predefiniti\n" #: src/tools/sss_useradd.c:177 src/tools/sss_usermod.c:153 msgid "The selected UID is outside the allowed range\n" msgstr "L'UID specificato non rientra nel range permesso\n" #: src/tools/sss_useradd.c:206 src/tools/sss_usermod.c:243 msgid "Cannot set SELinux login context\n" msgstr "" #: src/tools/sss_useradd.c:221 msgid "Cannot get info about the user\n" msgstr "Impossibile determinare le informazioni dell'utente\n" #: src/tools/sss_useradd.c:233 msgid "User's home directory already exists, not copying data from skeldir\n" msgstr "" "La directory home dell'utente esiste, non vengono copiati dati dalla " "directory skeleton\n" #: src/tools/sss_useradd.c:236 #, c-format msgid "Cannot create user's home directory: %1$s\n" msgstr "" #: src/tools/sss_useradd.c:247 #, c-format msgid "Cannot create user's mail spool: %1$s\n" msgstr "" #: src/tools/sss_useradd.c:266 msgid "Could not allocate ID for the user - domain full?\n" msgstr "Impossibile allocare l'ID utente - dominio pieno?\n" #: src/tools/sss_useradd.c:270 msgid "A user or group with the same name or ID already exists\n" msgstr "Utente o gruppo con lo stesso nome o ID già presente\n" #: src/tools/sss_useradd.c:276 msgid "Transaction error. Could not add user.\n" msgstr "Errore nella transazione. L'utente non è stato aggiunto.\n" #: src/tools/sss_groupadd.c:43 src/tools/sss_groupmod.c:48 msgid "The GID of the group" msgstr "Il GID del gruppo" #: src/tools/sss_groupadd.c:75 msgid "Specify group to add\n" msgstr "Specificare un gruppo da aggiungere\n" #: src/tools/sss_groupadd.c:104 src/tools/sss_groupmod.c:192 msgid "The selected GID is outside the allowed range\n" msgstr "Il GID specificato non è nel range permesso\n" #: src/tools/sss_groupadd.c:141 msgid "Could not allocate ID for the group - domain full?\n" msgstr "Impossibile allocare l'ID per il gruppo - dominio pieno?\n" #: src/tools/sss_groupadd.c:145 msgid "A group with the same name or GID already exists\n" msgstr "Gruppo con lo stesso nome o GID già esistente\n" #: src/tools/sss_groupadd.c:150 msgid "Transaction error. Could not add group.\n" msgstr "Errore della transazione. Impossibile aggiungere il gruppo.\n" #: src/tools/sss_groupdel.c:68 msgid "Specify group to delete\n" msgstr "Specificare il gruppo da eliminare\n" #: src/tools/sss_groupdel.c:101 #, c-format msgid "Group %1$s is outside the defined ID range for domain\n" msgstr "" #: src/tools/sss_groupdel.c:115 msgid "" "No such group in local domain. Removing groups only allowed in local " "domain.\n" msgstr "" "Gruppo non presente nel dominio locale. L'eliminazione di gruppi è permessa " "solo nel dominio locale.\n" #: src/tools/sss_groupdel.c:120 msgid "Internal error. Could not remove group.\n" msgstr "Errore interno. Impossibile rimuovere il gruppo.\n" #: src/tools/sss_groupmod.c:44 msgid "Groups to add this group to" msgstr "Gruppi a cui aggiungere questo gruppo" #: src/tools/sss_groupmod.c:46 msgid "Groups to remove this group from" msgstr "Gruppi da cui eliminare questo gruppo" #: src/tools/sss_groupmod.c:86 src/tools/sss_usermod.c:95 msgid "Specify group to remove from\n" msgstr "" #: src/tools/sss_groupmod.c:100 msgid "Specify group to modify\n" msgstr "Specificare il gruppo da modificare\n" #: src/tools/sss_groupmod.c:128 msgid "" "Cannot find group in local domain, modifying groups is allowed only in local " "domain\n" msgstr "" "Gruppo non presente nel dominio locale. La modifica dei gruppi è permessa " "solo nel dominio locale.\n" #: src/tools/sss_groupmod.c:149 src/tools/sss_groupmod.c:176 msgid "Member groups must be in the same domain as parent group\n" msgstr "" "I gruppi membri devono appartenere allo stesso dominio del gruppo radice\n" #: src/tools/sss_groupmod.c:157 src/tools/sss_groupmod.c:184 #: src/tools/sss_usermod.c:178 src/tools/sss_usermod.c:205 #, c-format msgid "" "Cannot find group %1$s in local domain, only groups in local domain are " "allowed\n" msgstr "" #: src/tools/sss_groupmod.c:229 msgid "Could not modify group - check if member group names are correct\n" msgstr "" "Impossibile modificare il gruppo - controllare che i nomi dei gruppi siano " "corretti\n" #: src/tools/sss_groupmod.c:233 msgid "Could not modify group - check if groupname is correct\n" msgstr "" "Impossibile modificare il gruppo - controllare che il nome del gruppo sia " "corretto\n" #: src/tools/sss_groupmod.c:237 msgid "Transaction error. Could not modify group.\n" msgstr "Errore della transazione. Impossibile modificare il gruppo.\n" #: src/tools/sss_groupshow.c:598 #, c-format msgid "%1$s%2$sGroup: %3$s\n" msgstr "" #: src/tools/sss_groupshow.c:599 msgid "Magic Private " msgstr "Magic Private " #: src/tools/sss_groupshow.c:601 #, c-format msgid "%1$sGID number: %2$d\n" msgstr "" #: src/tools/sss_groupshow.c:603 #, c-format msgid "%1$sMember users: " msgstr "" #: src/tools/sss_groupshow.c:610 #, c-format msgid "" "\n" "%1$sIs a member of: " msgstr "" #: src/tools/sss_groupshow.c:617 #, c-format msgid "" "\n" "%1$sMember groups: " msgstr "" #: src/tools/sss_groupshow.c:653 msgid "Print indirect group members recursively" msgstr "Mostra ricorsivamente i membri indiretti del gruppo" #: src/tools/sss_groupshow.c:686 msgid "Specify group to show\n" msgstr "Specificare il gruppo da mostrate\n" #: src/tools/sss_groupshow.c:725 msgid "" "No such group in local domain. Printing groups only allowed in local " "domain.\n" msgstr "" "Gruppo non presente nel dominio locale. La stampa dei gruppi è permessa solo " "nel dominio locale.\n" #: src/tools/sss_groupshow.c:730 msgid "Internal error. Could not print group.\n" msgstr "Errore interno. Impossibile stampare il gruppo.\n" #: src/tools/sss_userdel.c:133 msgid "Remove home directory and mail spool" msgstr "Eliminare home directory e spool di mail" #: src/tools/sss_userdel.c:135 msgid "Do not remove home directory and mail spool" msgstr "Non eliminare la home directory e lo spool di mail" #: src/tools/sss_userdel.c:137 msgid "Force removal of files not owned by the user" msgstr "Forza la rimozione dei file non di proprietà dell'utente" #: src/tools/sss_userdel.c:139 msgid "Kill users' processes before removing him" msgstr "" #: src/tools/sss_userdel.c:184 msgid "Specify user to delete\n" msgstr "Specificare l'utente da cancellare\n" #: src/tools/sss_userdel.c:230 #, c-format msgid "User %1$s is outside the defined ID range for domain\n" msgstr "" #: src/tools/sss_userdel.c:255 msgid "Cannot reset SELinux login context\n" msgstr "" #: src/tools/sss_userdel.c:267 #, c-format msgid "WARNING: The user (uid %1$lu) was still logged in when deleted.\n" msgstr "" #: src/tools/sss_userdel.c:272 msgid "Cannot determine if the user was logged in on this platform" msgstr "" #: src/tools/sss_userdel.c:277 msgid "Error while checking if the user was logged in\n" msgstr "" #: src/tools/sss_userdel.c:284 #, c-format msgid "The post-delete command failed: %1$s\n" msgstr "" #: src/tools/sss_userdel.c:296 msgid "Not removing home dir - not owned by user\n" msgstr "Home directory non eliminata - non appartiene all'utente\n" #: src/tools/sss_userdel.c:298 #, c-format msgid "Cannot remove homedir: %1$s\n" msgstr "" #: src/tools/sss_userdel.c:309 msgid "" "No such user in local domain. Removing users only allowed in local domain.\n" msgstr "" "Utente non presente nel dominio locale. L'eliminazione degli utenti è " "permessa solo nel dominio locale.\n" #: src/tools/sss_userdel.c:314 msgid "Internal error. Could not remove user.\n" msgstr "Errore interno. Impossibile rimuovere l'utente.\n" #: src/tools/sss_usermod.c:49 msgid "The GID of the user" msgstr "Il GID dell'utente" #: src/tools/sss_usermod.c:53 msgid "Groups to add this user to" msgstr "Gruppi a cui aggiungere questo utente" #: src/tools/sss_usermod.c:54 msgid "Groups to remove this user from" msgstr "Gruppi da cui rimuovere questo utente" #: src/tools/sss_usermod.c:55 msgid "Lock the account" msgstr "Bloccare l'account" #: src/tools/sss_usermod.c:56 msgid "Unlock the account" msgstr "Sbloccare l'account" #: src/tools/sss_usermod.c:119 msgid "Specify user to modify\n" msgstr "Specificare l'utente da modificare\n" #: src/tools/sss_usermod.c:146 msgid "" "Cannot find user in local domain, modifying users is allowed only in local " "domain\n" msgstr "" "Utente non presente nel dominio locale. La modifica degli utenti è permessa " "solo nel dominio locale.\n" #: src/tools/sss_usermod.c:260 msgid "Could not modify user - check if group names are correct\n" msgstr "" "Impossibile modificare l'utente - controllare che i nomi dei gruppi siano " "corretti\n" #: src/tools/sss_usermod.c:264 msgid "Could not modify user - user already member of groups?\n" msgstr "Impossibile modificare l'utente - utente già membro di gruppi?\n" #: src/tools/sss_usermod.c:268 msgid "Transaction error. Could not modify user.\n" msgstr "Errore nella transazione. Impossibile modificare l'utente.\n" #: src/tools/sss_cache.c:142 msgid "No cache object matched the specified search\n" msgstr "" #: src/tools/sss_cache.c:201 #, c-format msgid "No such %1$s named %2$s, skipping\n" msgstr "" #: src/tools/sss_cache.c:204 #, c-format msgid "No objects of type %1$s in the cache, skipping\n" msgstr "" #: src/tools/sss_cache.c:216 #, c-format msgid "Couldn't invalidate %1$s" msgstr "" #: src/tools/sss_cache.c:223 #, c-format msgid "Couldn't invalidate %1$s %2$s" msgstr "" #: src/tools/sss_cache.c:352 msgid "Invalidate particular user" msgstr "" #: src/tools/sss_cache.c:354 msgid "Invalidate all users" msgstr "" #: src/tools/sss_cache.c:356 msgid "Invalidate particular group" msgstr "" #: src/tools/sss_cache.c:358 msgid "Invalidate all groups" msgstr "" #: src/tools/sss_cache.c:360 msgid "Invalidate particular netgroup" msgstr "" #: src/tools/sss_cache.c:362 msgid "Invalidate all netgroups" msgstr "" #: src/tools/sss_cache.c:364 msgid "Invalidate particular service" msgstr "" #: src/tools/sss_cache.c:366 msgid "Invalidate all services" msgstr "" #: src/tools/sss_cache.c:369 msgid "Invalidate particular autofs map" msgstr "" #: src/tools/sss_cache.c:371 msgid "Invalidate all autofs maps" msgstr "" #: src/tools/sss_cache.c:374 msgid "Only invalidate entries from a particular domain" msgstr "" #: src/tools/sss_cache.c:413 msgid "Please select at least one object to invalidate\n" msgstr "" #: src/tools/sss_cache.c:484 #, c-format msgid "Could not open domain %1$s\n" msgstr "" #: src/tools/sss_cache.c:486 msgid "Could not open available domains\n" msgstr "" #: src/tools/sss_debuglevel.c:40 msgid "\n" msgstr "" #: src/tools/sss_debuglevel.c:96 msgid "Specify debug level you want to set\n" msgstr "" #: src/tools/tools_util.c:280 msgid "Out of memory\n" msgstr "Memoria esaurita\n" #: src/tools/tools_util.h:43 #, c-format msgid "%1$s must be run as root\n" msgstr "" #: src/util/util.h:96 msgid "Send the debug output to files instead of stderr" msgstr "Redirigere l'output di debug su file anzichè stderr"