Artifact 9fab975312547931e0bfc2a6374f2c39b3a9776864d87512c0de076f014c7393:
- File pwlist.c — part of check-in [c14cf350df] at 2014-05-15 21:36:21 on branch manualheaven — Move src and doc files to top directory (user: base@atomicules.co.uk size: 15575) [more...]
- File
src/pwlist.c
— part of check-in
[80ff0d7b69]
at
2011-01-29 22:27:43
on branch origin/tweaks
— Fixes to compiler warnings
git-svn-id: https://pwman.svn.sourceforge.net/svnroot/pwman/trunk@111 db5f1c25-4851-472e-ac1e-5437d07aece1 (user: gagravarr@users.sourceforge.net size: 15575)
0000: 2f 2a 0a 20 2a 20 20 50 57 4d 61 6e 20 2d 20 70 /*. * PWMan - p
0010: 61 73 73 77 6f 72 64 20 6d 61 6e 61 67 65 6d 65 assword manageme
0020: 6e 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 nt application.
0030: 2a 0a 20 2a 20 20 43 6f 70 79 72 69 67 68 74 20 *. * Copyright
0040: 28 43 29 20 32 30 30 32 20 20 49 76 61 6e 20 4b (C) 2002 Ivan K
0050: 65 6c 6c 79 20 3c 69 76 61 6e 40 69 76 61 6e 6b elly <ivan@ivank
0060: 65 6c 6c 79 2e 6e 65 74 3e 0a 20 2a 0a 20 2a 20 elly.net>. *. *
0070: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 This program is
0080: 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 free software;
0090: 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 you can redistri
00a0: 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d bute it and/or m
00b0: 6f 64 69 66 79 0a 20 2a 20 20 69 74 20 75 6e 64 odify. * it und
00c0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 er the terms of
00d0: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 the GNU General
00e0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 61 Public License a
00f0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 20 s published by.
0100: 2a 20 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 * the Free Soft
0110: 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b ware Foundation;
0120: 20 65 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 either version
0130: 32 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2 of the License
0140: 2c 20 6f 72 0a 20 2a 20 20 28 61 74 20 79 6f 75 , or. * (at you
0150: 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61 r option) any la
0160: 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 20 2a 0a ter version.. *.
0170: 20 2a 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d * This program
0180: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 is distributed
0190: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74 in the hope that
01a0: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 it will be usef
01b0: 75 6c 2c 0a 20 2a 20 20 62 75 74 20 57 49 54 48 ul,. * but WITH
01c0: 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 OUT ANY WARRANTY
01d0: 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 ; without even t
01e0: 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 he implied warra
01f0: 6e 74 79 20 6f 66 0a 20 2a 20 20 4d 45 52 43 48 nty of. * MERCH
0200: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 ANTABILITY or FI
0210: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 TNESS FOR A PART
0220: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 ICULAR PURPOSE.
0230: 20 53 65 65 20 74 68 65 0a 20 2a 20 20 47 4e 55 See the. * GNU
0240: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 General Public
0250: 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 License for more
0260: 20 64 65 74 61 69 6c 73 2e 0a 20 2a 0a 20 2a 20 details.. *. *
0270: 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65 You should have
0280: 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70 79 received a copy
0290: 20 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 of the GNU Gene
02a0: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e ral Public Licen
02b0: 73 65 0a 20 2a 20 20 61 6c 6f 6e 67 20 77 69 74 se. * along wit
02c0: 68 20 74 68 69 73 20 70 72 6f 67 72 61 6d 3b 20 h this program;
02d0: 69 66 20 6e 6f 74 2c 20 77 72 69 74 65 20 74 6f if not, write to
02e0: 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 the Free Softwa
02f0: 72 65 0a 20 2a 20 20 46 6f 75 6e 64 61 74 69 6f re. * Foundatio
0300: 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54 65 6d 70 n, Inc., 59 Temp
0310: 6c 65 20 50 6c 61 63 65 2c 20 53 75 69 74 65 20 le Place, Suite
0320: 33 33 30 2c 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 330, Boston, MA
0330: 20 30 32 31 31 31 2d 31 33 30 37 20 20 55 53 41 02111-1307 USA
0340: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c . */..#include <
0350: 70 77 6d 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 pwman.h>.#includ
0360: 65 20 3c 67 6e 75 70 67 2e 68 3e 0a 23 69 6e 63 e <gnupg.h>.#inc
0370: 6c 75 64 65 20 3c 75 69 2e 68 3e 0a 23 69 6e 63 lude <ui.h>.#inc
0380: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 lude <errno.h>.#
0390: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
03a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 h>.#include <uni
03b0: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 std.h>.#include
03c0: 3c 6c 69 62 78 6d 6c 2f 74 72 65 65 2e 68 3e 0a <libxml/tree.h>.
03d0: 23 69 6e 63 6c 75 64 65 20 3c 6c 69 62 78 6d 6c #include <libxml
03e0: 2f 70 61 72 73 65 72 2e 68 3e 0a 0a 69 6e 74 20 /parser.h>..int
03f0: 70 77 69 6e 64 65 78 20 3d 20 30 3b 0a 65 78 74 pwindex = 0;.ext
0400: 65 72 6e 20 69 6e 74 20 65 72 72 6e 6f 3b 0a 76 ern int errno;.v
0410: 6f 69 64 20 70 77 6c 69 73 74 5f 66 72 65 65 5f oid pwlist_free_
0420: 70 77 28 50 77 2a 29 3b 0a 0a 0a 50 57 4c 69 73 pw(Pw*);...PWLis
0430: 74 20 2a 0a 70 77 6c 69 73 74 5f 6e 65 77 28 63 t *.pwlist_new(c
0440: 68 61 72 20 2a 6e 61 6d 65 29 0a 7b 0a 09 50 57 har *name).{..PW
0450: 4c 69 73 74 20 2a 6e 65 77 3b 0a 09 6e 65 77 20 List *new;..new
0460: 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 = malloc( sizeof
0470: 28 50 57 4c 69 73 74 29 20 29 3b 0a 09 6e 65 77 (PWList) );..new
0480: 2d 3e 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 ->name = malloc(
0490: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a STRING_MEDIUM);.
04a0: 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6e 61 .strncpy(new->na
04b0: 6d 65 2c 20 6e 61 6d 65 2c 20 53 54 52 49 4e 47 me, name, STRING
04c0: 5f 4d 45 44 49 55 4d 29 3b 0a 09 6e 65 77 2d 3e _MEDIUM);..new->
04d0: 70 61 72 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 09 parent = NULL;..
04e0: 6e 65 77 2d 3e 6c 69 73 74 20 3d 20 4e 55 4c 4c new->list = NULL
04f0: 3b 0a 09 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 4e ;..new->next = N
0500: 55 4c 4c 3b 0a 09 6e 65 77 2d 3e 73 75 62 6c 69 ULL;..new->subli
0510: 73 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 64 65 62 sts = NULL;..deb
0520: 75 67 28 22 6e 65 77 5f 70 77 6c 69 73 74 3a 20 ug("new_pwlist:
0530: 25 73 22 2c 20 6e 61 6d 65 29 3b 0a 0a 09 72 65 %s", name);...re
0540: 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 69 6e 74 turn new;.}..int
0550: 0a 70 77 6c 69 73 74 5f 69 6e 69 74 28 29 0a 7b .pwlist_init().{
0560: 0a 09 70 77 69 6e 64 65 78 20 3d 20 30 3b 0a 09 ..pwindex = 0;..
0570: 70 77 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 pwlist = NULL;..
0580: 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62 6c 69 current_pw_subli
0590: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 72 65 74 75 st = NULL;..retu
05a0: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 0a 70 77 rn 0;.}..int .pw
05b0: 6c 69 73 74 5f 66 72 65 65 28 50 57 4c 69 73 74 list_free(PWList
05c0: 20 2a 6f 6c 64 29 0a 7b 0a 09 50 77 20 2a 63 75 *old).{..Pw *cu
05d0: 72 72 65 6e 74 2c 20 2a 6e 65 78 74 3b 0a 09 50 rrent, *next;..P
05e0: 57 4c 69 73 74 20 2a 63 75 72 6c 69 73 74 2c 20 WList *curlist,
05f0: 2a 6e 6c 69 73 74 3b 0a 0a 09 69 66 28 6f 6c 64 *nlist;...if(old
0600: 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 72 65 74 == NULL){...ret
0610: 75 72 6e 20 30 3b 0a 09 7d 0a 09 66 6f 72 28 63 urn 0;..}..for(c
0620: 75 72 72 65 6e 74 20 3d 20 6f 6c 64 2d 3e 6c 69 urrent = old->li
0630: 73 74 3b 20 63 75 72 72 65 6e 74 20 21 3d 20 4e st; current != N
0640: 55 4c 4c 3b 20 63 75 72 72 65 6e 74 20 3d 20 6e ULL; current = n
0650: 65 78 74 29 7b 0a 09 09 6e 65 78 74 20 3d 20 63 ext){...next = c
0660: 75 72 72 65 6e 74 2d 3e 6e 65 78 74 3b 0a 0a 09 urrent->next;...
0670: 09 70 77 6c 69 73 74 5f 66 72 65 65 5f 70 77 28 .pwlist_free_pw(
0680: 63 75 72 72 65 6e 74 29 3b 0a 09 7d 0a 09 66 6f current);..}..fo
0690: 72 28 63 75 72 6c 69 73 74 20 3d 20 6f 6c 64 2d r(curlist = old-
06a0: 3e 73 75 62 6c 69 73 74 73 3b 20 63 75 72 6c 69 >sublists; curli
06b0: 73 74 20 21 3d 20 4e 55 4c 4c 3b 20 63 75 72 6c st != NULL; curl
06c0: 69 73 74 20 3d 20 6e 6c 69 73 74 29 7b 0a 09 09 ist = nlist){...
06d0: 6e 6c 69 73 74 20 3d 20 63 75 72 6c 69 73 74 2d nlist = curlist-
06e0: 3e 6e 65 78 74 3b 0a 0a 09 09 70 77 6c 69 73 74 >next;....pwlist
06f0: 5f 66 72 65 65 28 63 75 72 6c 69 73 74 29 3b 0a _free(curlist);.
0700: 09 7d 0a 09 0a 09 66 72 65 65 28 6f 6c 64 2d 3e .}....free(old->
0710: 6e 61 6d 65 29 3b 0a 09 66 72 65 65 28 6f 6c 64 name);..free(old
0720: 29 3b 0a 09 6f 6c 64 20 3d 20 4e 55 4c 4c 3b 0a );..old = NULL;.
0730: 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e .return 0;.}..in
0740: 74 0a 70 77 6c 69 73 74 5f 66 72 65 65 5f 61 6c t.pwlist_free_al
0750: 6c 28 29 0a 7b 0a 09 70 77 6c 69 73 74 5f 66 72 l().{..pwlist_fr
0760: 65 65 28 70 77 6c 69 73 74 29 3b 0a 09 72 65 74 ee(pwlist);..ret
0770: 75 72 6e 20 30 3b 0a 7d 0a 0a 50 77 2a 0a 70 77 urn 0;.}..Pw*.pw
0780: 6c 69 73 74 5f 6e 65 77 5f 70 77 28 29 0a 7b 0a list_new_pw().{.
0790: 09 50 77 20 2a 6e 65 77 3b 0a 09 6e 65 77 20 3d .Pw *new;..new =
07a0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 malloc(sizeof(P
07b0: 77 29 29 3b 0a 09 6e 65 77 2d 3e 69 64 20 3d 20 w));..new->id =
07c0: 30 3b 0a 09 6e 65 77 2d 3e 6e 61 6d 65 20 3d 20 0;..new->name =
07d0: 6d 61 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 4d 45 malloc(STRING_ME
07e0: 44 49 55 4d 29 3b 0a 09 6e 65 77 2d 3e 68 6f 73 DIUM);..new->hos
07f0: 74 20 3d 20 6d 61 6c 6c 6f 63 28 53 54 52 49 4e t = malloc(STRIN
0800: 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 6e 65 77 2d G_MEDIUM);..new-
0810: 3e 75 73 65 72 20 3d 20 6d 61 6c 6c 6f 63 28 53 >user = malloc(S
0820: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 TRING_MEDIUM);..
0830: 6e 65 77 2d 3e 70 61 73 73 77 64 20 3d 20 6d 61 new->passwd = ma
0840: 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 53 48 4f 52 lloc(STRING_SHOR
0850: 54 29 3b 0a 09 6e 65 77 2d 3e 6c 61 75 6e 63 68 T);..new->launch
0860: 20 3d 20 6d 61 6c 6c 6f 63 28 53 54 52 49 4e 47 = malloc(STRING
0870: 5f 4c 4f 4e 47 29 3b 0a 0a 09 6d 65 6d 73 65 74 _LONG);...memset
0880: 28 6e 65 77 2d 3e 6e 61 6d 65 2c 20 30 2c 20 53 (new->name, 0, S
0890: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 TRING_MEDIUM);..
08a0: 6d 65 6d 73 65 74 28 6e 65 77 2d 3e 68 6f 73 74 memset(new->host
08b0: 2c 20 30 2c 20 53 54 52 49 4e 47 5f 4d 45 44 49 , 0, STRING_MEDI
08c0: 55 4d 29 3b 0a 09 6d 65 6d 73 65 74 28 6e 65 77 UM);..memset(new
08d0: 2d 3e 75 73 65 72 2c 20 30 2c 20 53 54 52 49 4e ->user, 0, STRIN
08e0: 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 6d 65 6d 73 G_MEDIUM);..mems
08f0: 65 74 28 6e 65 77 2d 3e 70 61 73 73 77 64 2c 20 et(new->passwd,
0900: 30 2c 20 53 54 52 49 4e 47 5f 53 48 4f 52 54 29 0, STRING_SHORT)
0910: 3b 0a 09 6d 65 6d 73 65 74 28 6e 65 77 2d 3e 6c ;..memset(new->l
0920: 61 75 6e 63 68 2c 20 30 2c 20 53 54 52 49 4e 47 aunch, 0, STRING
0930: 5f 4c 4f 4e 47 29 3b 0a 09 0a 09 72 65 74 75 72 _LONG);....retur
0940: 6e 20 6e 65 77 3b 0a 7d 0a 0a 76 6f 69 64 0a 70 n new;.}..void.p
0950: 77 6c 69 73 74 5f 66 72 65 65 5f 70 77 28 50 77 wlist_free_pw(Pw
0960: 20 2a 6f 6c 64 29 0a 7b 0a 09 66 72 65 65 28 6f *old).{..free(o
0970: 6c 64 2d 3e 6e 61 6d 65 29 3b 0a 09 66 72 65 65 ld->name);..free
0980: 28 6f 6c 64 2d 3e 75 73 65 72 29 3b 0a 09 66 72 (old->user);..fr
0990: 65 65 28 6f 6c 64 2d 3e 68 6f 73 74 29 3b 0a 09 ee(old->host);..
09a0: 66 72 65 65 28 6f 6c 64 2d 3e 70 61 73 73 77 64 free(old->passwd
09b0: 29 3b 0a 09 66 72 65 65 28 6f 6c 64 2d 3e 6c 61 );..free(old->la
09c0: 75 6e 63 68 29 3b 0a 09 66 72 65 65 28 6f 6c 64 unch);..free(old
09d0: 29 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 );.}..int.pwlist
09e0: 5f 63 68 61 6e 67 65 5f 69 74 65 6d 5f 6f 72 64 _change_item_ord
09f0: 65 72 28 50 77 2a 20 70 77 2c 20 50 57 4c 69 73 er(Pw* pw, PWLis
0a00: 74 20 2a 70 61 72 65 6e 74 2c 20 69 6e 74 20 6d t *parent, int m
0a10: 6f 76 65 55 70 29 20 7b 0a 09 50 77 20 2a 69 74 oveUp) {..Pw *it
0a20: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 50 77 20 2a er = NULL;..Pw *
0a30: 70 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 50 pprev = NULL;..P
0a40: 77 20 2a 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a w *prev = NULL;.
0a50: 09 50 77 20 2a 6e 65 78 74 20 3d 20 4e 55 4c 4c .Pw *next = NULL
0a60: 3b 0a 09 50 77 20 2a 6e 6e 65 78 74 20 3d 20 4e ;..Pw *nnext = N
0a70: 55 4c 4c 3b 0a 0a 09 2f 2f 20 46 69 6e 64 20 75 ULL;...// Find u
0a80: 73 2c 20 69 6e 20 6f 75 72 20 70 61 72 65 6e 74 s, in our parent
0a90: 73 20 6c 69 73 74 20 6f 66 20 63 68 69 6c 64 72 s list of childr
0aa0: 65 6e 0a 09 66 6f 72 28 69 74 65 72 20 3d 20 70 en..for(iter = p
0ab0: 61 72 65 6e 74 2d 3e 6c 69 73 74 3b 20 69 74 65 arent->list; ite
0ac0: 72 20 21 3d 20 4e 55 4c 4c 3b 20 69 74 65 72 20 r != NULL; iter
0ad0: 3d 20 69 74 65 72 2d 3e 6e 65 78 74 29 7b 0a 09 = iter->next){..
0ae0: 09 69 66 28 69 74 65 72 20 3d 3d 20 70 77 29 20 .if(iter == pw)
0af0: 7b 0a 09 09 09 2f 2f 20 47 72 61 62 20 74 68 65 {....// Grab the
0b00: 20 6e 65 78 74 20 6f 6e 65 2c 20 61 6e 64 20 74 next one, and t
0b10: 68 65 20 6f 6e 65 20 61 66 74 65 72 0a 09 09 09 he one after....
0b20: 6e 65 78 74 20 3d 20 70 77 2d 3e 6e 65 78 74 3b next = pw->next;
0b30: 0a 09 09 09 69 66 28 6e 65 78 74 20 21 3d 20 4e ....if(next != N
0b40: 55 4c 4c 29 20 7b 0a 09 09 09 09 6e 6e 65 78 74 ULL) {.....nnext
0b50: 20 3d 20 6e 65 78 74 2d 3e 6e 65 78 74 3b 0a 09 = next->next;..
0b60: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 6e ..} else {.....n
0b70: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 next = NULL;....
0b80: 7d 0a 0a 09 09 09 2f 2f 20 57 68 69 63 68 20 77 }.....// Which w
0b90: 61 79 20 64 6f 20 77 65 20 6e 65 65 64 20 74 6f ay do we need to
0ba0: 20 73 68 75 66 66 6c 65 3f 0a 09 09 09 69 66 28 shuffle?....if(
0bb0: 6d 6f 76 65 55 70 29 20 7b 0a 09 09 09 09 2f 2f moveUp) {.....//
0bc0: 20 55 70 20 74 68 65 20 6c 69 73 74 2c 20 69 66 Up the list, if
0bd0: 20 77 65 20 63 61 6e 0a 09 09 09 09 69 66 28 70 we can.....if(p
0be0: 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 20 7b 20 62 rev == NULL) { b
0bf0: 72 65 61 6b 3b 20 7d 0a 0a 09 09 09 09 2f 2f 20 reak; }......//
0c00: 41 72 65 20 77 65 20 67 6f 69 6e 67 20 74 6f 20 Are we going to
0c10: 74 68 65 20 74 6f 70 3f 0a 09 09 09 09 69 66 28 the top?.....if(
0c20: 70 72 65 76 20 3d 3d 20 70 61 72 65 6e 74 2d 3e prev == parent->
0c30: 6c 69 73 74 29 20 7b 0a 09 09 09 09 09 70 61 72 list) {......par
0c40: 65 6e 74 2d 3e 6c 69 73 74 20 3d 20 70 77 3b 0a ent->list = pw;.
0c50: 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20 3d 20 .....pw->next =
0c60: 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65 76 2d prev;......prev-
0c70: 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 09 09 >next = next;...
0c80: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 ..} else {......
0c90: 70 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 70 77 pprev->next = pw
0ca0: 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20 ;......pw->next
0cb0: 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65 = prev;......pre
0cc0: 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a v->next = next;.
0cd0: 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75 72 6e ....}.....return
0ce0: 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 1;....} else {.
0cf0: 09 09 09 09 2f 2f 20 44 6f 77 6e 20 74 68 65 20 ....// Down the
0d00: 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61 6e 0a list, if we can.
0d10: 09 09 09 09 69 66 28 6e 65 78 74 20 3d 3d 20 4e ....if(next == N
0d20: 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20 7d 0a ULL) { break; }.
0d30: 0a 09 09 09 09 2f 2f 20 57 65 72 65 20 77 65 20 .....// Were we
0d40: 61 74 20 74 68 65 20 74 6f 70 3f 0a 09 09 09 09 at the top?.....
0d50: 69 66 28 70 77 20 3d 3d 20 70 61 72 65 6e 74 2d if(pw == parent-
0d60: 3e 6c 69 73 74 29 20 7b 0a 09 09 09 09 09 70 61 >list) {......pa
0d70: 72 65 6e 74 2d 3e 6c 69 73 74 20 3d 20 6e 65 78 rent->list = nex
0d80: 74 3b 0a 09 09 09 09 09 6e 65 78 74 2d 3e 6e 65 t;......next->ne
0d90: 78 74 20 3d 20 70 77 3b 0a 09 09 09 09 09 70 77 xt = pw;......pw
0da0: 2d 3e 6e 65 78 74 20 3d 20 6e 6e 65 78 74 3b 0a ->next = nnext;.
0db0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
0dc0: 09 09 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 6e ..prev->next = n
0dd0: 65 78 74 3b 0a 09 09 09 09 09 6e 65 78 74 2d 3e ext;......next->
0de0: 6e 65 78 74 20 3d 20 70 77 3b 0a 09 09 09 09 09 next = pw;......
0df0: 70 77 2d 3e 6e 65 78 74 20 3d 20 6e 6e 65 78 74 pw->next = nnext
0e00: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75 ;.....}.....retu
0e10: 72 6e 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 rn 1;....}...} e
0e20: 6c 73 65 20 7b 0a 09 09 09 2f 2f 20 55 70 64 61 lse {....// Upda
0e30: 74 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 6c te the running l
0e40: 69 73 74 20 6f 66 20 70 72 65 76 20 61 6e 64 20 ist of prev and
0e50: 70 70 72 65 76 0a 09 09 09 70 70 72 65 76 20 3d pprev....pprev =
0e60: 20 70 72 65 76 3b 0a 09 09 09 70 72 65 76 20 3d prev;....prev =
0e70: 20 69 74 65 72 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 iter;...}..}...
0e80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 return 0;.}..int
0e90: 0a 70 77 6c 69 73 74 5f 63 68 61 6e 67 65 5f 6c .pwlist_change_l
0ea0: 69 73 74 5f 6f 72 64 65 72 28 50 57 4c 69 73 74 ist_order(PWList
0eb0: 20 2a 70 77 2c 20 69 6e 74 20 6d 6f 76 65 55 70 *pw, int moveUp
0ec0: 29 20 7b 0a 09 2f 2f 20 47 72 61 62 20 74 68 65 ) {..// Grab the
0ed0: 20 70 61 72 65 6e 74 2c 20 61 73 73 75 6d 69 6e parent, assumin
0ee0: 67 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 09 g there is one..
0ef0: 50 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 20 3d PWList *parent =
0f00: 20 70 77 2d 3e 70 61 72 65 6e 74 3b 0a 09 69 66 pw->parent;..if
0f10: 28 70 61 72 65 6e 74 3d 3d 4e 55 4c 4c 29 20 7b (parent==NULL) {
0f20: 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 0a 0a 09 return 0; }....
0f30: 2f 2f 20 46 69 6e 64 20 75 73 0a 09 50 57 4c 69 // Find us..PWLi
0f40: 73 74 20 2a 69 74 65 72 20 3d 20 4e 55 4c 4c 3b st *iter = NULL;
0f50: 0a 09 50 57 4c 69 73 74 20 2a 70 70 72 65 76 20 ..PWList *pprev
0f60: 3d 20 4e 55 4c 4c 3b 0a 09 50 57 4c 69 73 74 20 = NULL;..PWList
0f70: 2a 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 50 *prev = NULL;..P
0f80: 57 4c 69 73 74 20 2a 6e 65 78 74 20 3d 20 4e 55 WList *next = NU
0f90: 4c 4c 3b 0a 09 50 57 4c 69 73 74 20 2a 6e 6e 65 LL;..PWList *nne
0fa0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2f 20 xt = NULL;...//
0fb0: 46 69 6e 64 20 75 73 2c 20 69 6e 20 6f 75 72 20 Find us, in our
0fc0: 70 61 72 65 6e 74 73 20 6c 69 73 74 20 6f 66 20 parents list of
0fd0: 63 68 69 6c 64 72 65 6e 0a 09 66 6f 72 28 69 74 children..for(it
0fe0: 65 72 20 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62 er = parent->sub
0ff0: 6c 69 73 74 73 3b 20 69 74 65 72 20 21 3d 20 4e lists; iter != N
1000: 55 4c 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72 ULL; iter = iter
1010: 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 69 74 ->next){...if(it
1020: 65 72 20 3d 3d 20 70 77 29 20 7b 0a 09 09 09 2f er == pw) {..../
1030: 2f 20 47 72 61 62 20 74 68 65 20 6e 65 78 74 20 / Grab the next
1040: 6f 6e 65 2c 20 61 6e 64 20 74 68 65 20 6f 6e 65 one, and the one
1050: 20 61 66 74 65 72 0a 09 09 09 6e 65 78 74 20 3d after....next =
1060: 20 70 77 2d 3e 6e 65 78 74 3b 0a 09 09 09 69 66 pw->next;....if
1070: 28 6e 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b (next != NULL) {
1080: 0a 09 09 09 09 6e 6e 65 78 74 20 3d 20 6e 65 78 .....nnext = nex
1090: 74 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 20 65 6c t->next;....} el
10a0: 73 65 20 7b 0a 09 09 09 09 6e 6e 65 78 74 20 3d se {.....nnext =
10b0: 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 NULL;....}.....
10c0: 2f 2f 20 57 68 69 63 68 20 77 61 79 20 64 6f 20 // Which way do
10d0: 77 65 20 6e 65 65 64 20 74 6f 20 73 68 75 66 66 we need to shuff
10e0: 6c 65 3f 0a 09 09 09 69 66 28 6d 6f 76 65 55 70 le?....if(moveUp
10f0: 29 20 7b 0a 09 09 09 09 2f 2f 20 55 70 20 74 68 ) {.....// Up th
1100: 65 20 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61 e list, if we ca
1110: 6e 0a 09 09 09 09 69 66 28 70 72 65 76 20 3d 3d n.....if(prev ==
1120: 20 4e 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20 NULL) { break;
1130: 7d 0a 0a 09 09 09 09 2f 2f 20 41 72 65 20 77 65 }......// Are we
1140: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 74 6f going to the to
1150: 70 3f 0a 09 09 09 09 69 66 28 70 72 65 76 20 3d p?.....if(prev =
1160: 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 = parent->sublis
1170: 74 73 29 20 7b 0a 09 09 09 09 09 70 61 72 65 6e ts) {......paren
1180: 74 2d 3e 73 75 62 6c 69 73 74 73 20 3d 20 70 77 t->sublists = pw
1190: 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20 ;......pw->next
11a0: 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65 = prev;......pre
11b0: 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a v->next = next;.
11c0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
11d0: 09 09 70 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 ..pprev->next =
11e0: 70 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 pw;......pw->nex
11f0: 74 20 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70 t = prev;......p
1200: 72 65 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 rev->next = next
1210: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75 ;.....}.....retu
1220: 72 6e 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 rn 1;....} else
1230: 7b 0a 09 09 09 09 2f 2f 20 44 6f 77 6e 20 74 68 {.....// Down th
1240: 65 20 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61 e list, if we ca
1250: 6e 0a 09 09 09 09 69 66 28 6e 65 78 74 20 3d 3d n.....if(next ==
1260: 20 4e 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20 NULL) { break;
1270: 7d 0a 0a 09 09 09 09 2f 2f 20 57 65 72 65 20 77 }......// Were w
1280: 65 20 61 74 20 74 68 65 20 74 6f 70 3f 0a 09 09 e at the top?...
1290: 09 09 69 66 28 70 77 20 3d 3d 20 70 61 72 65 6e ..if(pw == paren
12a0: 74 2d 3e 73 75 62 6c 69 73 74 73 29 20 7b 0a 09 t->sublists) {..
12b0: 09 09 09 09 70 61 72 65 6e 74 2d 3e 73 75 62 6c ....parent->subl
12c0: 69 73 74 73 20 3d 20 6e 65 78 74 3b 0a 09 09 09 ists = next;....
12d0: 09 09 6e 65 78 74 2d 3e 6e 65 78 74 20 3d 20 70 ..next->next = p
12e0: 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 w;......pw->next
12f0: 20 3d 20 6e 6e 65 78 74 3b 0a 09 09 09 09 7d 20 = nnext;.....}
1300: 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 72 65 76 else {......prev
1310: 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 09 ->next = next;..
1320: 09 09 09 09 6e 65 78 74 2d 3e 6e 65 78 74 20 3d ....next->next =
1330: 20 70 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 pw;......pw->ne
1340: 78 74 20 3d 20 6e 6e 65 78 74 3b 0a 09 09 09 09 xt = nnext;.....
1350: 7d 0a 09 09 09 09 72 65 74 75 72 6e 20 31 3b 0a }.....return 1;.
1360: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a ...}...} else {.
1370: 09 09 09 2f 2f 20 55 70 64 61 74 65 20 74 68 65 ...// Update the
1380: 20 72 75 6e 6e 69 6e 67 20 6c 69 73 74 20 6f 66 running list of
1390: 20 70 72 65 76 20 61 6e 64 20 70 70 72 65 76 0a prev and pprev.
13a0: 09 09 09 70 70 72 65 76 20 3d 20 70 72 65 76 3b ...pprev = prev;
13b0: 0a 09 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b ....prev = iter;
13c0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e ...}..}...return
13d0: 20 30 3b 0a 7d 0a 0a 76 6f 69 64 0a 70 77 6c 69 0;.}..void.pwli
13e0: 73 74 5f 72 65 6e 61 6d 65 5f 69 74 65 6d 28 50 st_rename_item(P
13f0: 77 2a 20 70 77 69 74 65 6d 2c 20 63 68 61 72 2a w* pwitem, char*
1400: 20 6e 65 77 5f 6e 61 6d 65 29 20 7b 0a 09 73 74 new_name) {..st
1410: 72 6e 63 70 79 28 70 77 69 74 65 6d 2d 3e 6e 61 rncpy(pwitem->na
1420: 6d 65 2c 20 6e 65 77 5f 6e 61 6d 65 2c 20 53 54 me, new_name, ST
1430: 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 7d 0a RING_MEDIUM);.}.
1440: 76 6f 69 64 0a 70 77 6c 69 73 74 5f 72 65 6e 61 void.pwlist_rena
1450: 6d 65 5f 73 75 62 6c 69 73 74 28 50 57 4c 69 73 me_sublist(PWLis
1460: 74 20 2a 70 77 6c 69 73 74 2c 20 63 68 61 72 2a t *pwlist, char*
1470: 20 6e 65 77 5f 6e 61 6d 65 29 20 7b 0a 09 73 74 new_name) {..st
1480: 72 6e 63 70 79 28 70 77 6c 69 73 74 2d 3e 6e 61 rncpy(pwlist->na
1490: 6d 65 2c 20 6e 65 77 5f 6e 61 6d 65 2c 20 53 54 me, new_name, ST
14a0: 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 7d 0a RING_MEDIUM);.}.
14b0: 0a 69 6e 74 0a 70 77 6c 69 73 74 5f 61 64 64 28 .int.pwlist_add(
14c0: 50 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 2c 20 PWList *parent,
14d0: 63 68 61 72 2a 20 6e 61 6d 65 2c 20 63 68 61 72 char* name, char
14e0: 2a 20 68 6f 73 74 2c 20 63 68 61 72 2a 20 75 73 * host, char* us
14f0: 65 72 2c 20 63 68 61 72 2a 20 70 61 73 73 77 64 er, char* passwd
1500: 2c 20 63 68 61 72 2a 20 6c 61 75 6e 63 68 29 0a , char* launch).
1510: 7b 0a 09 50 77 2a 20 6e 65 77 20 3d 20 70 77 6c {..Pw* new = pwl
1520: 69 73 74 5f 6e 65 77 5f 70 77 28 29 3b 0a 09 0a ist_new_pw();...
1530: 09 6e 65 77 2d 3e 69 64 20 3d 20 70 77 69 6e 64 .new->id = pwind
1540: 65 78 2b 2b 3b 0a 09 73 74 72 6e 63 70 79 28 6e ex++;..strncpy(n
1550: 65 77 2d 3e 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 ew->name, name,
1560: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a STRING_MEDIUM);.
1570: 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 68 6f .strncpy(new->ho
1580: 73 74 2c 20 68 6f 73 74 2c 20 53 54 52 49 4e 47 st, host, STRING
1590: 5f 4d 45 44 49 55 4d 29 3b 0a 09 73 74 72 6e 63 _MEDIUM);..strnc
15a0: 70 79 28 6e 65 77 2d 3e 75 73 65 72 2c 20 75 73 py(new->user, us
15b0: 65 72 2c 20 53 54 52 49 4e 47 5f 4d 45 44 49 55 er, STRING_MEDIU
15c0: 4d 29 3b 0a 09 73 74 72 6e 63 70 79 28 6e 65 77 M);..strncpy(new
15d0: 2d 3e 70 61 73 73 77 64 2c 20 70 61 73 73 77 64 ->passwd, passwd
15e0: 2c 20 53 54 52 49 4e 47 5f 53 48 4f 52 54 29 3b , STRING_SHORT);
15f0: 0a 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6c ..strncpy(new->l
1600: 61 75 6e 63 68 2c 20 6c 61 75 6e 63 68 2c 20 53 aunch, launch, S
1610: 54 52 49 4e 47 5f 4c 4f 4e 47 29 3b 0a 0a 09 70 TRING_LONG);...p
1620: 77 6c 69 73 74 5f 61 64 64 5f 70 74 72 28 70 61 wlist_add_ptr(pa
1630: 72 65 6e 74 2c 20 6e 65 77 29 3b 0a 0a 09 72 65 rent, new);...re
1640: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 0a turn 0;.}..int .
1650: 70 77 6c 69 73 74 5f 61 64 64 5f 73 75 62 6c 69 pwlist_add_subli
1660: 73 74 28 50 57 4c 69 73 74 20 2a 70 61 72 65 6e st(PWList *paren
1670: 74 2c 20 50 57 4c 69 73 74 20 2a 6e 65 77 29 0a t, PWList *new).
1680: 7b 0a 09 50 57 4c 69 73 74 20 2a 63 75 72 72 65 {..PWList *curre
1690: 6e 74 3b 0a 0a 09 63 75 72 72 65 6e 74 20 3d 20 nt;...current =
16a0: 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73 parent->sublists
16b0: 3b 0a 09 6e 65 77 2d 3e 70 61 72 65 6e 74 20 3d ;..new->parent =
16c0: 20 70 61 72 65 6e 74 3b 0a 09 6e 65 77 2d 3e 63 parent;..new->c
16d0: 75 72 72 65 6e 74 5f 69 74 65 6d 20 3d 20 31 3b urrent_item = 1;
16e0: 0a 0a 09 69 66 28 63 75 72 72 65 6e 74 20 3d 3d ...if(current ==
16f0: 20 4e 55 4c 4c 29 7b 0a 09 09 64 65 62 75 67 28 NULL){...debug(
1700: 22 61 64 64 5f 70 77 5f 73 75 62 6c 69 73 74 3a "add_pw_sublist:
1710: 20 63 75 72 72 65 6e 74 20 3d 20 4e 55 4c 4c 22 current = NULL"
1720: 29 3b 0a 09 09 70 61 72 65 6e 74 2d 3e 73 75 62 );...parent->sub
1730: 6c 69 73 74 73 20 3d 20 6e 65 77 3b 0a 09 09 6e lists = new;...n
1740: 65 77 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b ew->next = NULL;
1750: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a ...return 0;..}.
1760: 09 77 68 69 6c 65 28 63 75 72 72 65 6e 74 2d 3e .while(current->
1770: 6e 65 78 74 20 21 3d 20 4e 55 4c 4c 29 7b 0a 09 next != NULL){..
1780: 09 63 75 72 72 65 6e 74 20 3d 20 63 75 72 72 65 .current = curre
1790: 6e 74 2d 3e 6e 65 78 74 3b 0a 09 7d 0a 09 63 75 nt->next;..}..cu
17a0: 72 72 65 6e 74 2d 3e 6e 65 78 74 20 3d 20 6e 65 rrent->next = ne
17b0: 77 3b 0a 09 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 w;..new->next =
17c0: 4e 55 4c 4c 3b 0a 0a 09 72 65 74 75 72 6e 20 30 NULL;...return 0
17d0: 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f ;.}..int.pwlist_
17e0: 61 64 64 5f 70 74 72 28 50 57 4c 69 73 74 20 2a add_ptr(PWList *
17f0: 6c 69 73 74 2c 20 50 77 20 2a 6e 65 77 29 0a 7b list, Pw *new).{
1800: 0a 09 50 77 20 2a 63 75 72 72 65 6e 74 3b 0a 09 ..Pw *current;..
1810: 0a 09 69 66 28 6c 69 73 74 20 3d 3d 20 4e 55 4c ..if(list == NUL
1820: 4c 29 7b 0a 09 09 64 65 62 75 67 28 22 61 64 64 L){...debug("add
1830: 5f 70 77 5f 70 74 72 20 3a 20 42 61 64 20 50 77 _pw_ptr : Bad Pw
1840: 4c 69 73 74 22 29 3b 0a 09 09 72 65 74 75 72 6e List");...return
1850: 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 6e 65 77 20 -1;..}..if(new
1860: 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 64 65 62 75 == NULL){...debu
1870: 67 28 22 61 64 64 5f 70 77 5f 70 74 72 20 3a 20 g("add_pw_ptr :
1880: 42 61 64 20 50 77 22 29 3b 0a 09 09 72 65 74 75 Bad Pw");...retu
1890: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 6c 69 rn -1;..}..if(li
18a0: 73 74 2d 3e 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c st->list == NULL
18b0: 29 7b 0a 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20 ){...list->list
18c0: 3d 20 6e 65 77 3b 0a 09 09 6e 65 77 2d 3e 6e 65 = new;...new->ne
18d0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 74 xt = NULL;...ret
18e0: 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 64 65 62 75 urn 0;..}...debu
18f0: 67 28 22 61 64 64 5f 70 77 5f 70 74 72 3a 20 61 g("add_pw_ptr: a
1900: 64 64 20 74 6f 20 6c 69 73 74 22 29 3b 0a 09 63 dd to list");..c
1910: 75 72 72 65 6e 74 20 3d 20 6c 69 73 74 2d 3e 6c urrent = list->l
1920: 69 73 74 3b 0a 09 77 68 69 6c 65 28 63 75 72 72 ist;..while(curr
1930: 65 6e 74 2d 3e 6e 65 78 74 20 21 3d 20 4e 55 4c ent->next != NUL
1940: 4c 29 7b 0a 09 09 63 75 72 72 65 6e 74 20 3d 20 L){...current =
1950: 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 3b 0a 09 current->next;..
1960: 7d 0a 09 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 }..current->next
1970: 20 3d 20 6e 65 77 3b 0a 09 6e 65 77 2d 3e 6e 65 = new;..new->ne
1980: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 72 65 74 xt = NULL;...ret
1990: 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 0a urn 0;.}..void .
19a0: 70 77 6c 69 73 74 5f 64 65 74 61 63 68 5f 70 77 pwlist_detach_pw
19b0: 28 50 57 4c 69 73 74 20 2a 6c 69 73 74 2c 20 50 (PWList *list, P
19c0: 77 20 2a 70 77 29 0a 7b 0a 09 50 77 20 2a 69 74 w *pw).{..Pw *it
19d0: 65 72 2c 20 2a 70 72 65 76 3b 0a 0a 09 70 72 65 er, *prev;...pre
19e0: 76 20 3d 20 4e 55 4c 4c 3b 0a 09 66 6f 72 28 69 v = NULL;..for(i
19f0: 74 65 72 20 3d 20 6c 69 73 74 2d 3e 6c 69 73 74 ter = list->list
1a00: 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 ; iter != NULL;
1a10: 69 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e 65 78 iter = iter->nex
1a20: 74 29 7b 0a 09 09 0a 09 09 69 66 28 69 74 65 72 t){......if(iter
1a30: 20 3d 3d 20 70 77 29 7b 0a 09 09 09 69 66 28 70 == pw){....if(p
1a40: 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 rev == NULL){...
1a50: 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20 3d 20 69 ..list->list = i
1a60: 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 20 ter->next;....}
1a70: 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 65 76 2d else {.....prev-
1a80: 3e 6e 65 78 74 20 3d 20 69 74 65 72 2d 3e 6e 65 >next = iter->ne
1a90: 78 74 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 xt;....}....brea
1aa0: 6b 3b 0a 09 09 7d 0a 09 09 70 72 65 76 20 3d 20 k;...}...prev =
1ab0: 69 74 65 72 3b 0a 09 7d 0a 7d 0a 0a 76 6f 69 64 iter;..}.}..void
1ac0: 20 0a 70 77 6c 69 73 74 5f 64 65 6c 65 74 65 5f .pwlist_delete_
1ad0: 70 77 28 50 57 4c 69 73 74 20 2a 6c 69 73 74 2c pw(PWList *list,
1ae0: 20 50 77 20 2a 70 77 29 0a 7b 0a 09 50 77 20 2a Pw *pw).{..Pw *
1af0: 69 74 65 72 2c 20 2a 70 72 65 76 3b 0a 0a 09 70 iter, *prev;...p
1b00: 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 66 6f 72 rev = NULL;..for
1b10: 28 69 74 65 72 20 3d 20 6c 69 73 74 2d 3e 6c 69 (iter = list->li
1b20: 73 74 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c st; iter != NULL
1b30: 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e ; iter = iter->n
1b40: 65 78 74 29 7b 0a 09 09 0a 09 09 69 66 28 69 74 ext){......if(it
1b50: 65 72 20 3d 3d 20 70 77 29 7b 0a 09 09 09 69 66 er == pw){....if
1b60: 28 70 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a (prev == NULL){.
1b70: 09 09 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20 3d ....list->list =
1b80: 20 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09 iter->next;....
1b90: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 65 } else {.....pre
1ba0: 76 2d 3e 6e 65 78 74 20 3d 20 69 74 65 72 2d 3e v->next = iter->
1bb0: 6e 65 78 74 3b 0a 09 09 09 7d 0a 09 09 09 70 77 next;....}....pw
1bc0: 6c 69 73 74 5f 66 72 65 65 5f 70 77 28 69 74 65 list_free_pw(ite
1bd0: 72 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 r);....break;...
1be0: 7d 0a 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b }...prev = iter;
1bf0: 0a 09 7d 0a 7d 0a 0a 76 6f 69 64 20 0a 70 77 6c ..}.}..void .pwl
1c00: 69 73 74 5f 64 65 74 61 63 68 5f 73 75 62 6c 69 ist_detach_subli
1c10: 73 74 28 50 57 4c 69 73 74 20 2a 70 61 72 65 6e st(PWList *paren
1c20: 74 2c 20 50 57 4c 69 73 74 20 2a 6f 6c 64 29 0a t, PWList *old).
1c30: 7b 0a 09 50 57 4c 69 73 74 20 2a 69 74 65 72 2c {..PWList *iter,
1c40: 20 2a 70 72 65 76 3b 0a 0a 09 70 72 65 76 20 3d *prev;...prev =
1c50: 20 4e 55 4c 4c 3b 0a 09 66 6f 72 28 69 74 65 72 NULL;..for(iter
1c60: 20 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 = parent->subli
1c70: 73 74 73 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c sts; iter != NUL
1c80: 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d 3e L; iter = iter->
1c90: 6e 65 78 74 29 7b 0a 0a 09 09 69 66 28 69 74 65 next){....if(ite
1ca0: 72 20 3d 3d 20 6f 6c 64 29 7b 0a 09 09 09 69 66 r == old){....if
1cb0: 28 70 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a (prev == NULL){.
1cc0: 09 09 09 09 70 61 72 65 6e 74 2d 3e 73 75 62 6c ....parent->subl
1cd0: 69 73 74 73 20 3d 20 69 74 65 72 2d 3e 6e 65 78 ists = iter->nex
1ce0: 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 t;....} else {..
1cf0: 09 09 09 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 ...prev->next =
1d00: 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d iter->next;....}
1d10: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 ....break;...}..
1d20: 09 70 72 65 76 20 3d 20 69 74 65 72 3b 0a 09 7d .prev = iter;..}
1d30: 0a 7d 0a 0a 76 6f 69 64 0a 70 77 6c 69 73 74 5f .}..void.pwlist_
1d40: 64 65 6c 65 74 65 5f 73 75 62 6c 69 73 74 28 50 delete_sublist(P
1d50: 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 2c 20 50 WList *parent, P
1d60: 57 4c 69 73 74 20 2a 6f 6c 64 29 0a 7b 0a 09 50 WList *old).{..P
1d70: 57 4c 69 73 74 20 2a 69 74 65 72 2c 20 2a 70 72 WList *iter, *pr
1d80: 65 76 3b 0a 0a 09 70 72 65 76 20 3d 20 4e 55 4c ev;...prev = NUL
1d90: 4c 3b 0a 09 66 6f 72 28 69 74 65 72 20 3d 20 70 L;..for(iter = p
1da0: 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73 3b arent->sublists;
1db0: 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 69 iter != NULL; i
1dc0: 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e 65 78 74 ter = iter->next
1dd0: 29 7b 0a 0a 09 09 69 66 28 69 74 65 72 20 3d 3d ){....if(iter ==
1de0: 20 6f 6c 64 29 7b 0a 09 09 09 69 66 28 70 72 65 old){....if(pre
1df0: 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 09 09 v == NULL){.....
1e00: 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73 parent->sublists
1e10: 20 3d 20 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 = iter->next;..
1e20: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 ..} else {.....p
1e30: 72 65 76 2d 3e 6e 65 78 74 20 3d 20 69 74 65 72 rev->next = iter
1e40: 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 0a 09 09 09 ->next;....}....
1e50: 70 77 6c 69 73 74 5f 66 72 65 65 28 69 74 65 72 pwlist_free(iter
1e60: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d );....break;...}
1e70: 0a 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b 0a ...prev = iter;.
1e80: 09 7d 0a 7d 0a 0a 76 6f 69 64 20 0a 70 77 6c 69 .}.}..void .pwli
1e90: 73 74 5f 77 72 69 74 65 5f 6e 6f 64 65 28 78 6d st_write_node(xm
1ea0: 6c 4e 6f 64 65 50 74 72 20 72 6f 6f 74 2c 20 50 lNodePtr root, P
1eb0: 77 2a 20 70 77 29 0a 7b 0a 09 78 6d 6c 4e 6f 64 w* pw).{..xmlNod
1ec0: 65 50 74 72 20 6e 6f 64 65 3b 0a 0a 09 2f 2f 20 ePtr node;...//
1ed0: 57 65 20 6e 65 65 64 20 74 6f 20 65 73 63 61 70 We need to escap
1ee0: 65 20 74 68 65 20 73 74 72 69 6e 67 73 20 62 65 e the strings be
1ef0: 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68 65 fore storing the
1f00: 6d 0a 09 2f 2f 20 4f 74 68 65 72 77 69 73 65 2c m..// Otherwise,
1f10: 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 special charact
1f20: 65 72 73 20 28 65 73 70 65 63 69 61 6c 6c 79 20 ers (especially
1f30: 26 29 20 77 69 6c 6c 0a 09 2f 2f 20 20 65 6e 64 &) will..// end
1f40: 20 75 70 20 62 72 6f 6b 65 6e 21 0a 09 78 6d 6c up broken!..xml
1f50: 43 68 61 72 20 2a 65 73 63 61 70 65 64 4e 61 6d Char *escapedNam
1f60: 65 20 3d 20 0a 09 09 78 6d 6c 45 6e 63 6f 64 65 e = ...xmlEncode
1f70: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f SpecialChars(roo
1f80: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72 t->doc, (xmlChar
1f90: 2a 29 70 77 2d 3e 6e 61 6d 65 29 3b 0a 09 78 6d *)pw->name);..xm
1fa0: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 48 6f lChar *escapedHo
1fb0: 73 74 20 3d 0a 09 09 78 6d 6c 45 6e 63 6f 64 65 st =...xmlEncode
1fc0: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f SpecialChars(roo
1fd0: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72 t->doc, (xmlChar
1fe0: 2a 29 70 77 2d 3e 68 6f 73 74 29 3b 0a 09 78 6d *)pw->host);..xm
1ff0: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 55 73 lChar *escapedUs
2000: 65 72 20 3d 0a 09 09 78 6d 6c 45 6e 63 6f 64 65 er =...xmlEncode
2010: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f SpecialChars(roo
2020: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72 t->doc, (xmlChar
2030: 2a 29 70 77 2d 3e 75 73 65 72 29 3b 0a 09 78 6d *)pw->user);..xm
2040: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 50 61 lChar *escapedPa
2050: 73 73 77 64 20 3d 20 0a 09 09 78 6d 6c 45 6e 63 sswd = ...xmlEnc
2060: 6f 64 65 53 70 65 63 69 61 6c 43 68 61 72 73 28 odeSpecialChars(
2070: 72 6f 6f 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 root->doc, (xmlC
2080: 68 61 72 2a 29 70 77 2d 3e 70 61 73 73 77 64 29 har*)pw->passwd)
2090: 3b 0a 09 78 6d 6c 43 68 61 72 20 2a 65 73 63 61 ;..xmlChar *esca
20a0: 70 65 64 4c 61 75 6e 63 68 20 3d 0a 09 09 78 6d pedLaunch =...xm
20b0: 6c 45 6e 63 6f 64 65 53 70 65 63 69 61 6c 43 68 lEncodeSpecialCh
20c0: 61 72 73 28 72 6f 6f 74 2d 3e 64 6f 63 2c 20 28 ars(root->doc, (
20d0: 78 6d 6c 43 68 61 72 2a 29 70 77 2d 3e 6c 61 75 xmlChar*)pw->lau
20e0: 6e 63 68 29 3b 0a 0a 09 2f 2f 20 42 75 69 6c 64 nch);...// Build
20f0: 20 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 61 the entry and a
2100: 64 64 20 69 6e 20 6f 75 72 20 28 65 73 63 61 70 dd in our (escap
2110: 65 64 29 20 63 6f 6e 74 65 6e 74 73 0a 09 6e 6f ed) contents..no
2120: 64 65 20 3d 20 78 6d 6c 4e 65 77 43 68 69 6c 64 de = xmlNewChild
2130: 28 72 6f 6f 74 2c 20 4e 55 4c 4c 2c 20 28 78 6d (root, NULL, (xm
2140: 6c 43 68 61 72 2a 29 22 50 77 49 74 65 6d 22 2c lChar*)"PwItem",
2150: 20 4e 55 4c 4c 29 3b 0a 0a 09 78 6d 6c 4e 65 77 NULL);...xmlNew
2160: 43 68 69 6c 64 28 6e 6f 64 65 2c 20 4e 55 4c 4c Child(node, NULL
2170: 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 6e 61 6d , (xmlChar*)"nam
2180: 65 22 2c 20 65 73 63 61 70 65 64 4e 61 6d 65 29 e", escapedName)
2190: 3b 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64 28 6e ;..xmlNewChild(n
21a0: 6f 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d 6c 43 ode, NULL, (xmlC
21b0: 68 61 72 2a 29 22 68 6f 73 74 22 2c 20 65 73 63 har*)"host", esc
21c0: 61 70 65 64 48 6f 73 74 29 3b 0a 09 78 6d 6c 4e apedHost);..xmlN
21d0: 65 77 43 68 69 6c 64 28 6e 6f 64 65 2c 20 4e 55 ewChild(node, NU
21e0: 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 75 LL, (xmlChar*)"u
21f0: 73 65 72 22 2c 20 65 73 63 61 70 65 64 55 73 65 ser", escapedUse
2200: 72 29 3b 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64 r);..xmlNewChild
2210: 28 6e 6f 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d (node, NULL, (xm
2220: 6c 43 68 61 72 2a 29 22 70 61 73 73 77 64 22 2c lChar*)"passwd",
2230: 20 65 73 63 61 70 65 64 50 61 73 73 77 64 29 3b escapedPasswd);
2240: 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64 28 6e 6f ..xmlNewChild(no
2250: 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d 6c 43 68 de, NULL, (xmlCh
2260: 61 72 2a 29 22 6c 61 75 6e 63 68 22 2c 20 65 73 ar*)"launch", es
2270: 63 61 70 65 64 4c 61 75 6e 63 68 29 3b 0a 0a 09 capedLaunch);...
2280: 2f 2f 20 46 69 6e 61 6c 6c 79 2c 20 77 65 20 6e // Finally, we n
2290: 65 65 64 20 74 6f 20 66 72 65 65 20 61 6c 6c 20 eed to free all
22a0: 6f 75 72 20 65 73 63 61 70 65 64 20 76 65 72 73 our escaped vers
22b0: 69 6f 6e 73 20 6e 6f 77 20 77 65 27 72 65 20 64 ions now we're d
22c0: 6f 6e 65 0a 09 78 6d 6c 46 72 65 65 28 65 73 63 one..xmlFree(esc
22d0: 61 70 65 64 4e 61 6d 65 29 3b 0a 09 78 6d 6c 46 apedName);..xmlF
22e0: 72 65 65 28 65 73 63 61 70 65 64 48 6f 73 74 29 ree(escapedHost)
22f0: 3b 0a 09 78 6d 6c 46 72 65 65 28 65 73 63 61 70 ;..xmlFree(escap
2300: 65 64 55 73 65 72 29 3b 0a 09 78 6d 6c 46 72 65 edUser);..xmlFre
2310: 65 28 65 73 63 61 70 65 64 50 61 73 73 77 64 29 e(escapedPasswd)
2320: 3b 0a 09 78 6d 6c 46 72 65 65 28 65 73 63 61 70 ;..xmlFree(escap
2330: 65 64 4c 61 75 6e 63 68 29 3b 0a 7d 0a 0a 76 6f edLaunch);.}..vo
2340: 69 64 0a 70 77 6c 69 73 74 5f 77 72 69 74 65 28 id.pwlist_write(
2350: 78 6d 6c 4e 6f 64 65 50 74 72 20 70 61 72 65 6e xmlNodePtr paren
2360: 74 2c 20 50 57 4c 69 73 74 20 2a 6c 69 73 74 29 t, PWList *list)
2370: 0a 7b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20 6e .{..xmlNodePtr n
2380: 6f 64 65 3b 0a 09 50 77 20 2a 69 74 65 72 3b 0a ode;..Pw *iter;.
2390: 09 50 57 4c 69 73 74 20 2a 70 77 6c 69 74 65 72 .PWList *pwliter
23a0: 3b 0a 09 0a 09 6e 6f 64 65 20 3d 20 78 6d 6c 4e ;....node = xmlN
23b0: 65 77 43 68 69 6c 64 28 70 61 72 65 6e 74 2c 20 ewChild(parent,
23c0: 4e 55 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29 NULL, (xmlChar*)
23d0: 22 50 77 4c 69 73 74 22 2c 20 4e 55 4c 4c 29 3b "PwList", NULL);
23e0: 0a 09 78 6d 6c 53 65 74 50 72 6f 70 28 6e 6f 64 ..xmlSetProp(nod
23f0: 65 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 6e 61 e, (xmlChar*)"na
2400: 6d 65 22 2c 20 28 78 6d 6c 43 68 61 72 2a 29 6c me", (xmlChar*)l
2410: 69 73 74 2d 3e 6e 61 6d 65 29 3b 0a 09 0a 09 66 ist->name);....f
2420: 6f 72 28 69 74 65 72 20 3d 20 6c 69 73 74 2d 3e or(iter = list->
2430: 6c 69 73 74 3b 20 69 74 65 72 20 21 3d 20 4e 55 list; iter != NU
2440: 4c 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d LL; iter = iter-
2450: 3e 6e 65 78 74 29 7b 0a 09 09 70 77 6c 69 73 74 >next){...pwlist
2460: 5f 77 72 69 74 65 5f 6e 6f 64 65 28 6e 6f 64 65 _write_node(node
2470: 2c 20 69 74 65 72 29 3b 0a 09 7d 0a 09 66 6f 72 , iter);..}..for
2480: 28 70 77 6c 69 74 65 72 20 3d 20 6c 69 73 74 2d (pwliter = list-
2490: 3e 73 75 62 6c 69 73 74 73 3b 20 70 77 6c 69 74 >sublists; pwlit
24a0: 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 70 77 6c 69 er != NULL; pwli
24b0: 74 65 72 20 3d 20 70 77 6c 69 74 65 72 2d 3e 6e ter = pwliter->n
24c0: 65 78 74 29 7b 0a 09 09 70 77 6c 69 73 74 5f 77 ext){...pwlist_w
24d0: 72 69 74 65 28 6e 6f 64 65 2c 20 70 77 6c 69 74 rite(node, pwlit
24e0: 65 72 29 3b 0a 09 7d 0a 7d 0a 0a 69 6e 74 0a 70 er);..}.}..int.p
24f0: 77 6c 69 73 74 5f 77 72 69 74 65 5f 66 69 6c 65 wlist_write_file
2500: 28 29 0a 7b 0a 09 63 68 61 72 20 76 65 72 73 5b ().{..char vers[
2510: 35 5d 3b 0a 09 78 6d 6c 44 6f 63 50 74 72 20 64 5];..xmlDocPtr d
2520: 6f 63 3b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20 oc;..xmlNodePtr
2530: 72 6f 6f 74 3b 0a 0a 09 69 66 28 6f 70 74 69 6f root;...if(optio
2540: 6e 73 2d 3e 72 65 61 64 6f 6e 6c 79 29 7b 0a 09 ns->readonly){..
2550: 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 .return 0;..}...
2560: 69 66 28 21 70 77 6c 69 73 74 29 7b 0a 09 09 64 if(!pwlist){...d
2570: 65 62 75 67 28 22 77 72 69 74 65 5f 66 69 6c 65 ebug("write_file
2580: 3a 20 62 61 64 20 70 61 73 73 77 6f 72 64 20 66 : bad password f
2590: 69 6c 65 22 29 3b 0a 09 09 75 69 5f 73 74 61 74 ile");...ui_stat
25a0: 75 73 6c 69 6e 65 5f 6d 73 67 28 22 42 61 64 20 usline_msg("Bad
25b0: 70 61 73 73 77 6f 72 64 20 6c 69 73 74 22 29 3b password list");
25c0: 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d ...return -1;..}
25d0: 0a 09 73 6e 70 72 69 6e 74 66 28 76 65 72 73 2c ..snprintf(vers,
25e0: 20 35 2c 20 22 25 64 22 2c 20 46 46 5f 56 45 52 5, "%d", FF_VER
25f0: 53 49 4f 4e 29 3b 0a 09 64 6f 63 20 3d 20 78 6d SION);..doc = xm
2600: 6c 4e 65 77 44 6f 63 28 28 78 6d 6c 43 68 61 72 lNewDoc((xmlChar
2610: 2a 29 22 31 2e 30 22 29 3b 0a 09 0a 09 72 6f 6f *)"1.0");....roo
2620: 74 20 3d 20 78 6d 6c 4e 65 77 44 6f 63 4e 6f 64 t = xmlNewDocNod
2630: 65 28 64 6f 63 2c 20 4e 55 4c 4c 2c 20 28 78 6d e(doc, NULL, (xm
2640: 6c 43 68 61 72 2a 29 22 50 57 4d 61 6e 5f 50 61 lChar*)"PWMan_Pa
2650: 73 73 77 6f 72 64 4c 69 73 74 22 2c 20 4e 55 4c sswordList", NUL
2660: 4c 29 3b 0a 0a 09 78 6d 6c 53 65 74 50 72 6f 70 L);...xmlSetProp
2670: 28 72 6f 6f 74 2c 20 28 78 6d 6c 43 68 61 72 2a (root, (xmlChar*
2680: 29 22 76 65 72 73 69 6f 6e 22 2c 20 28 78 6d 6c )"version", (xml
2690: 43 68 61 72 2a 29 76 65 72 73 29 3b 0a 09 70 77 Char*)vers);..pw
26a0: 6c 69 73 74 5f 77 72 69 74 65 28 72 6f 6f 74 2c list_write(root,
26b0: 20 70 77 6c 69 73 74 29 3b 0a 0a 09 78 6d 6c 44 pwlist);...xmlD
26c0: 6f 63 53 65 74 52 6f 6f 74 45 6c 65 6d 65 6e 74 ocSetRootElement
26d0: 28 64 6f 63 2c 20 72 6f 6f 74 29 3b 0a 0a 09 67 (doc, root);...g
26e0: 6e 75 70 67 5f 77 72 69 74 65 28 64 6f 63 2c 20 nupg_write(doc,
26f0: 6f 70 74 69 6f 6e 73 2d 3e 67 70 67 5f 69 64 2c options->gpg_id,
2700: 20 6f 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f options->passwo
2710: 72 64 5f 66 69 6c 65 29 3b 0a 09 0a 09 78 6d 6c rd_file);....xml
2720: 46 72 65 65 44 6f 63 28 64 6f 63 29 3b 0a 09 72 FreeDoc(doc);..r
2730: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64 eturn 0;.}..void
2740: 0a 70 77 6c 69 73 74 5f 72 65 61 64 5f 6e 6f 64 .pwlist_read_nod
2750: 65 28 78 6d 6c 4e 6f 64 65 50 74 72 20 70 61 72 e(xmlNodePtr par
2760: 65 6e 74 2c 20 50 57 4c 69 73 74 20 2a 6c 69 73 ent, PWList *lis
2770: 74 29 0a 7b 0a 09 50 77 2a 20 6e 65 77 3b 0a 09 t).{..Pw* new;..
2780: 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65 3b xmlNodePtr node;
2790: 0a 09 63 68 61 72 20 2a 74 65 78 74 3b 0a 09 0a ..char *text;...
27a0: 09 6e 65 77 20 3d 20 70 77 6c 69 73 74 5f 6e 65 .new = pwlist_ne
27b0: 77 5f 70 77 28 29 3b 0a 0a 09 66 6f 72 28 6e 6f w_pw();...for(no
27c0: 64 65 20 3d 20 70 61 72 65 6e 74 2d 3e 63 68 69 de = parent->chi
27d0: 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d 20 4e ldren; node != N
27e0: 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f 64 65 ULL; node = node
27f0: 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 21 6e ->next){...if(!n
2800: 6f 64 65 20 7c 7c 20 21 6e 6f 64 65 2d 3e 6e 61 ode || !node->na
2810: 6d 65 29 7b 0a 09 09 09 64 65 62 75 67 28 22 4d me){....debug("M
2820: 65 73 73 65 64 20 75 70 20 78 6d 6c 20 6e 6f 64 essed up xml nod
2830: 65 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 e");...} else if
2840: 28 20 73 74 72 63 6d 70 28 28 63 68 61 72 2a 29 ( strcmp((char*)
2850: 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 22 6e 61 6d node->name, "nam
2860: 65 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09 74 65 e") == 0){....te
2870: 78 74 20 3d 20 28 63 68 61 72 2a 29 78 6d 6c 4e xt = (char*)xmlN
2880: 6f 64 65 47 65 74 43 6f 6e 74 65 6e 74 28 6e 6f odeGetContent(no
2890: 64 65 29 3b 0a 09 09 09 69 66 28 74 65 78 74 29 de);....if(text)
28a0: 20 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6e 61 strncpy(new->na
28b0: 6d 65 2c 20 74 65 78 74 2c 20 53 54 52 49 4e 47 me, text, STRING
28c0: 5f 4d 45 44 49 55 4d 29 3b 0a 09 09 7d 20 65 6c _MEDIUM);...} el
28d0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 28 63 se if( strcmp((c
28e0: 68 61 72 2a 29 6e 6f 64 65 2d 3e 6e 61 6d 65 2c har*)node->name,
28f0: 20 22 75 73 65 72 22 29 20 3d 3d 20 30 29 7b 0a "user") == 0){.
2900: 09 09 09 74 65 78 74 20 3d 20 28 63 68 61 72 2a ...text = (char*
2910: 29 78 6d 6c 4e 6f 64 65 47 65 74 43 6f 6e 74 65 )xmlNodeGetConte
2920: 6e 74 28 6e 6f 64 65 29 3b 0a 09 09 09 69 66 28 nt(node);....if(
2930: 74 65 78 74 29 20 73 74 72 6e 63 70 79 28 6e 65 text) strncpy(ne
2940: 77 2d 3e 75 73 65 72 2c 20 74 65 78 74 2c 20 53 w->user, text, S
2950: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 TRING_MEDIUM);..
2960: 09 7d 20 65 6c 73 65 20 69 66 28 20 73 74 72 63 .} else if( strc
2970: 6d 70 28 28 63 68 61 72 2a 29 6e 6f 64 65 2d 3e mp((char*)node->
2980: 6e 61 6d 65 2c 20 22 70 61 73 73 77 64 22 29 20 name, "passwd")
2990: 3d 3d 20 30 29 7b 0a 09 09 09 74 65 78 74 20 3d == 0){....text =
29a0: 20 28 63 68 61 72 2a 29 78 6d 6c 4e 6f 64 65 47 (char*)xmlNodeG
29b0: 65 74 43 6f 6e 74 65 6e 74 28 6e 6f 64 65 29 3b etContent(node);
29c0: 0a 09 09 09 69 66 28 74 65 78 74 29 20 73 74 72 ....if(text) str
29d0: 6e 63 70 79 28 6e 65 77 2d 3e 70 61 73 73 77 64 ncpy(new->passwd
29e0: 2c 20 74 65 78 74 2c 20 53 54 52 49 4e 47 5f 53 , text, STRING_S
29f0: 48 4f 52 54 29 3b 0a 09 09 7d 20 65 6c 73 65 20 HORT);...} else
2a00: 69 66 28 20 73 74 72 63 6d 70 28 28 63 68 61 72 if( strcmp((char
2a10: 2a 29 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 22 68 *)node->name, "h
2a20: 6f 73 74 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09 ost") == 0){....
2a30: 74 65 78 74 20 3d 20 28 63 68 61 72 2a 29 78 6d text = (char*)xm
2a40: 6c 4e 6f 64 65 47 65 74 43 6f 6e 74 65 6e 74 28 lNodeGetContent(
2a50: 6e 6f 64 65 29 3b 0a 09 09 09 69 66 28 74 65 78 node);....if(tex
2a60: 74 29 20 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e t) strncpy(new->
2a70: 68 6f 73 74 2c 20 74 65 78 74 2c 20 53 54 52 49 host, text, STRI
2a80: 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 09 7d 20 NG_MEDIUM);...}
2a90: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 else if( strcmp(
2aa0: 28 63 68 61 72 2a 29 6e 6f 64 65 2d 3e 6e 61 6d (char*)node->nam
2ab0: 65 2c 20 22 6c 61 75 6e 63 68 22 29 20 3d 3d 20 e, "launch") ==
2ac0: 30 29 7b 0a 09 09 09 74 65 78 74 20 3d 20 28 63 0){....text = (c
2ad0: 68 61 72 2a 29 78 6d 6c 4e 6f 64 65 47 65 74 43 har*)xmlNodeGetC
2ae0: 6f 6e 74 65 6e 74 28 6e 6f 64 65 29 3b 0a 09 09 ontent(node);...
2af0: 09 69 66 28 74 65 78 74 29 20 73 74 72 6e 63 70 .if(text) strncp
2b00: 79 28 6e 65 77 2d 3e 6c 61 75 6e 63 68 2c 20 74 y(new->launch, t
2b10: 65 78 74 2c 20 53 54 52 49 4e 47 5f 4c 4f 4e 47 ext, STRING_LONG
2b20: 29 3b 0a 09 09 7d 20 0a 09 7d 0a 09 70 77 6c 69 );...} ..}..pwli
2b30: 73 74 5f 61 64 64 5f 70 74 72 28 6c 69 73 74 2c st_add_ptr(list,
2b40: 20 6e 65 77 29 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 new);.}..int.pw
2b50: 6c 69 73 74 5f 72 65 61 64 28 78 6d 6c 4e 6f 64 list_read(xmlNod
2b60: 65 50 74 72 20 70 61 72 65 6e 74 2c 20 50 57 4c ePtr parent, PWL
2b70: 69 73 74 20 2a 70 61 72 65 6e 74 5f 6c 69 73 74 ist *parent_list
2b80: 29 0a 7b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20 ).{..xmlNodePtr
2b90: 6e 6f 64 65 3b 0a 09 50 57 4c 69 73 74 20 2a 6e node;..PWList *n
2ba0: 65 77 3b 0a 0a 09 63 68 61 72 20 6e 61 6d 65 5b ew;...char name[
2bb0: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 5d 3b 0a STRING_MEDIUM];.
2bc0: 09 69 66 28 21 70 61 72 65 6e 74 20 7c 7c 20 21 .if(!parent || !
2bd0: 70 61 72 65 6e 74 2d 3e 6e 61 6d 65 29 7b 0a 09 parent->name){..
2be0: 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d .ui_statusline_m
2bf0: 73 67 28 22 4d 65 73 73 65 64 20 75 70 20 78 6d sg("Messed up xm
2c00: 6c 20 6e 6f 64 65 22 29 3b 0a 09 09 72 65 74 75 l node");...retu
2c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 73 74 rn -1;..}..if(st
2c20: 72 63 6d 70 28 28 63 68 61 72 2a 29 70 61 72 65 rcmp((char*)pare
2c30: 6e 74 2d 3e 6e 61 6d 65 2c 22 50 77 4c 69 73 74 nt->name,"PwList
2c40: 22 29 20 3d 3d 20 30 29 7b 0a 09 09 73 74 72 6e ") == 0){...strn
2c50: 63 70 79 28 6e 61 6d 65 2c 20 78 6d 6c 47 65 74 cpy(name, xmlGet
2c60: 50 72 6f 70 28 70 61 72 65 6e 74 2c 20 28 78 6d Prop(parent, (xm
2c70: 6c 43 68 61 72 2a 29 22 6e 61 6d 65 22 29 2c 20 lChar*)"name"),
2c80: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a STRING_MEDIUM);.
2c90: 09 09 6e 65 77 20 3d 20 70 77 6c 69 73 74 5f 6e ..new = pwlist_n
2ca0: 65 77 28 6e 61 6d 65 29 3b 0a 0a 09 09 66 6f 72 ew(name);....for
2cb0: 28 6e 6f 64 65 20 3d 20 70 61 72 65 6e 74 2d 3e (node = parent->
2cc0: 63 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 children; node !
2cd0: 3d 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e = NULL; node = n
2ce0: 6f 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 09 69 ode->next){....i
2cf0: 66 28 21 6e 6f 64 65 20 7c 7c 20 21 6e 6f 64 65 f(!node || !node
2d00: 2d 3e 6e 61 6d 65 29 7b 0a 09 09 09 09 64 65 62 ->name){.....deb
2d10: 75 67 28 22 72 65 61 64 5f 70 77 6c 69 73 74 3a ug("read_pwlist:
2d20: 20 6d 65 73 73 65 64 20 75 70 20 63 68 69 6c 64 messed up child
2d30: 20 6e 6f 64 65 22 29 3b 0a 09 09 09 7d 20 65 6c node");....} el
2d40: 73 65 20 69 66 28 73 74 72 63 6d 70 28 6e 6f 64 se if(strcmp(nod
2d50: 65 2d 3e 6e 61 6d 65 2c 20 22 50 77 4c 69 73 74 e->name, "PwList
2d60: 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09 09 70 77 ") == 0){.....pw
2d70: 6c 69 73 74 5f 72 65 61 64 28 6e 6f 64 65 2c 20 list_read(node,
2d80: 6e 65 77 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 new);....} else
2d90: 69 66 28 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e if(strcmp(node->
2da0: 6e 61 6d 65 2c 20 22 50 77 49 74 65 6d 22 29 20 name, "PwItem")
2db0: 3d 3d 20 30 29 7b 0a 09 09 09 09 70 77 6c 69 73 == 0){.....pwlis
2dc0: 74 5f 72 65 61 64 5f 6e 6f 64 65 28 6e 6f 64 65 t_read_node(node
2dd0: 2c 20 6e 65 77 29 3b 0a 09 09 09 7d 0a 09 09 7d , new);....}...}
2de0: 0a 09 7d 0a 0a 09 69 66 28 70 61 72 65 6e 74 5f ..}...if(parent_
2df0: 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 list == NULL){..
2e00: 09 70 77 6c 69 73 74 20 3d 20 6e 65 77 3b 0a 09 .pwlist = new;..
2e10: 09 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62 6c .current_pw_subl
2e20: 69 73 74 20 3d 20 70 77 6c 69 73 74 3b 0a 0a 09 ist = pwlist;...
2e30: 09 70 77 6c 69 73 74 2d 3e 63 75 72 72 65 6e 74 .pwlist->current
2e40: 5f 69 74 65 6d 20 3d 20 30 3b 0a 09 7d 20 65 6c _item = 0;..} el
2e50: 73 65 20 7b 0a 09 09 70 77 6c 69 73 74 5f 61 64 se {...pwlist_ad
2e60: 64 5f 73 75 62 6c 69 73 74 28 70 61 72 65 6e 74 d_sublist(parent
2e70: 5f 6c 69 73 74 2c 20 6e 65 77 29 3b 0a 09 7d 0a _list, new);..}.
2e80: 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e .return 0;.}..in
2e90: 74 0a 70 77 6c 69 73 74 5f 72 65 61 64 5f 66 69 t.pwlist_read_fi
2ea0: 6c 65 28 29 0a 7b 0a 20 20 20 20 63 68 61 72 20 le().{. char
2eb0: 66 6e 5b 53 54 52 49 4e 47 5f 4c 4f 4e 47 5d 3b fn[STRING_LONG];
2ec0: 0a 09 63 68 61 72 20 2a 62 75 66 3b 0a 09 69 6e ..char *buf;..in
2ed0: 74 20 69 20 3d 20 30 3b 0a 09 69 6e 74 20 67 6e t i = 0;..int gn
2ee0: 75 70 67 5f 77 6f 72 6b 65 64 20 3d 20 30 3b 0a upg_worked = 0;.
2ef0: 09 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65 .xmlNodePtr node
2f00: 2c 20 72 6f 6f 74 3b 0a 09 78 6d 6c 44 6f 63 50 , root;..xmlDocP
2f10: 74 72 20 64 6f 63 3b 0a 0a 09 2f 2f 20 48 61 76 tr doc;...// Hav
2f20: 65 20 74 68 65 20 64 65 66 69 6e 65 64 20 61 20 e the defined a
2f30: 66 69 6c 65 20 79 65 74 3f 0a 09 69 66 28 21 6f file yet?..if(!o
2f40: 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64 ptions->password
2f50: 5f 66 69 6c 65 29 7b 0a 09 09 72 65 74 75 72 6e _file){...return
2f60: 20 2d 31 3b 0a 09 7d 0a 09 2f 2f 20 44 6f 20 77 -1;..}..// Do w
2f70: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 e need to create
2f80: 20 61 20 6e 65 77 20 66 69 6c 65 3f 0a 09 73 6e a new file?..sn
2f90: 70 72 69 6e 74 66 28 66 6e 2c 20 53 54 52 49 4e printf(fn, STRIN
2fa0: 47 5f 4c 4f 4e 47 2c 20 22 25 73 22 2c 20 6f 70 G_LONG, "%s", op
2fb0: 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64 5f tions->password_
2fc0: 66 69 6c 65 29 3b 0a 09 69 66 28 61 63 63 65 73 file);..if(acces
2fd0: 73 28 66 6e 2c 20 46 5f 4f 4b 29 20 21 3d 20 30 s(fn, F_OK) != 0
2fe0: 29 7b 0a 09 09 75 69 5f 73 74 61 74 75 73 6c 69 ){...ui_statusli
2ff0: 6e 65 5f 6d 73 67 28 22 44 61 74 61 62 61 73 65 ne_msg("Database
3000: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 63 72 65 61 not found, crea
3010: 74 65 64 2e 20 50 72 65 73 73 20 61 6e 79 20 6b ted. Press any k
3020: 65 79 20 74 6f 20 62 65 67 69 6e 20 20 22 29 3b ey to begin ");
3030: 20 67 65 74 63 68 28 29 3b 0a 09 09 72 65 74 75 getch();...retu
3040: 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2f 20 54 rn -1;..}...// T
3050: 72 79 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 66 ry to load the f
3060: 69 6c 65 0a 09 67 6e 75 70 67 5f 77 6f 72 6b 65 ile..gnupg_worke
3070: 64 20 3d 20 67 6e 75 70 67 5f 72 65 61 64 28 6f d = gnupg_read(o
3080: 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64 ptions->password
3090: 5f 66 69 6c 65 2c 20 26 64 6f 63 29 3b 09 0a 0a _file, &doc);...
30a0: 09 2f 2f 20 44 69 64 20 69 74 20 77 6f 72 6b 3f .// Did it work?
30b0: 0a 09 69 66 28 67 6e 75 70 67 5f 77 6f 72 6b 65 ..if(gnupg_worke
30c0: 64 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 d != 0) {...retu
30d0: 72 6e 20 67 6e 75 70 67 5f 77 6f 72 6b 65 64 3b rn gnupg_worked;
30e0: 0a 09 7d 0a 09 0a 09 69 66 28 21 64 6f 63 29 7b ..}....if(!doc){
30f0: 0a 09 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 ...ui_statusline
3100: 5f 6d 73 67 28 22 42 61 64 20 78 6d 6c 20 44 61 _msg("Bad xml Da
3110: 74 61 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d ta");...return -
3120: 31 3b 0a 09 7d 0a 09 72 6f 6f 74 20 3d 20 78 6d 1;..}..root = xm
3130: 6c 44 6f 63 47 65 74 52 6f 6f 74 45 6c 65 6d 65 lDocGetRootEleme
3140: 6e 74 28 64 6f 63 29 3b 0a 09 69 66 28 21 72 6f nt(doc);..if(!ro
3150: 6f 74 20 7c 7c 20 21 72 6f 6f 74 2d 3e 6e 61 6d ot || !root->nam
3160: 65 09 7c 7c 20 28 73 74 72 63 6d 70 28 28 63 68 e.|| (strcmp((ch
3170: 61 72 2a 29 72 6f 6f 74 2d 3e 6e 61 6d 65 2c 20 ar*)root->name,
3180: 22 50 57 4d 61 6e 5f 50 61 73 73 77 6f 72 64 4c "PWMan_PasswordL
3190: 69 73 74 22 29 20 21 3d 20 30 29 20 29 7b 0a 09 ist") != 0) ){..
31a0: 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d .ui_statusline_m
31b0: 73 67 28 22 42 61 64 6c 79 20 46 6f 72 6d 65 64 sg("Badly Formed
31c0: 20 70 61 73 73 77 6f 72 64 20 64 61 74 61 22 29 password data")
31d0: 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 ;...return -1;..
31e0: 7d 0a 09 69 66 28 20 62 75 66 20 3d 20 78 6d 6c }..if( buf = xml
31f0: 47 65 74 50 72 6f 70 28 72 6f 6f 74 2c 20 28 78 GetProp(root, (x
3200: 6d 6c 43 68 61 72 2a 29 22 76 65 72 73 69 6f 6e mlChar*)"version
3210: 22 29 20 29 7b 0a 09 09 69 20 3d 20 61 74 6f 69 ") ){...i = atoi
3220: 28 20 62 75 66 20 29 3b 0a 09 7d 20 65 6c 73 65 ( buf );..} else
3230: 20 7b 0a 09 09 69 20 3d 20 30 3b 0a 09 7d 0a 09 {...i = 0;..}..
3240: 69 66 28 69 20 3c 20 46 46 5f 56 45 52 53 49 4f if(i < FF_VERSIO
3250: 4e 29 7b 0a 09 09 75 69 5f 73 74 61 74 75 73 6c N){...ui_statusl
3260: 69 6e 65 5f 6d 73 67 28 22 50 61 73 73 77 6f 72 ine_msg("Passwor
3270: 64 20 46 69 6c 65 20 69 6e 20 6f 6c 64 65 72 20 d File in older
3280: 66 6f 72 6d 61 74 2c 20 75 73 65 20 63 6f 6e 76 format, use conv
3290: 65 72 74 5f 70 77 64 62 22 29 3b 0a 09 09 72 65 ert_pwdb");...re
32a0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 66 6f turn -1;..}...fo
32b0: 72 28 6e 6f 64 65 20 3d 20 72 6f 6f 74 2d 3e 63 r(node = root->c
32c0: 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d hildren; node !=
32d0: 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f NULL; node = no
32e0: 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 de->next){...if(
32f0: 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e 6e 61 6d strcmp(node->nam
3300: 65 2c 20 22 50 77 4c 69 73 74 22 29 20 3d 3d 20 e, "PwList") ==
3310: 30 29 7b 0a 09 09 09 70 77 6c 69 73 74 5f 72 65 0){....pwlist_re
3320: 61 64 28 6e 6f 64 65 2c 20 4e 55 4c 4c 29 3b 0a ad(node, NULL);.
3330: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 ....break;...}..
3340: 7d 0a 09 78 6d 6c 46 72 65 65 44 6f 63 28 64 6f }..xmlFreeDoc(do
3350: 63 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d c);..return 0;.}
3360: 0a 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f 64 6f ...int.pwlist_do
3370: 5f 65 78 70 6f 72 74 28 50 57 4c 69 73 74 20 2a _export(PWList *
3380: 70 77 6c 69 73 74 2c 20 50 77 20 2a 70 77 29 0a pwlist, Pw *pw).
3390: 7b 0a 09 63 68 61 72 20 76 65 72 73 5b 35 5d 3b {..char vers[5];
33a0: 0a 09 63 68 61 72 20 66 69 6c 65 5b 53 54 52 49 ..char file[STRI
33b0: 4e 47 5f 4c 4f 4e 47 5d 3b 0a 09 69 6e 74 20 6d NG_LONG];..int m
33c0: 61 78 5f 69 64 5f 6e 75 6d 20 3d 20 35 2c 20 69 ax_id_num = 5, i
33d0: 3d 30 2c 20 76 61 6c 69 64 5f 69 64 73 20 3d 20 =0, valid_ids =
33e0: 30 3b 0a 09 63 68 61 72 20 2a 69 64 73 5b 6d 61 0;..char *ids[ma
33f0: 78 5f 69 64 5f 6e 75 6d 5d 3b 0a 09 0a 09 78 6d x_id_num];....xm
3400: 6c 44 6f 63 50 74 72 20 64 6f 63 3b 0a 09 78 6d lDocPtr doc;..xm
3410: 6c 4e 6f 64 65 50 74 72 20 72 6f 6f 74 3b 0a 0a lNodePtr root;..
3420: 09 69 66 28 21 70 77 6c 69 73 74 20 26 26 20 21 .if(!pwlist && !
3430: 70 77 29 20 7b 0a 09 09 64 65 62 75 67 28 22 65 pw) {...debug("e
3440: 78 70 6f 72 74 5f 70 61 73 73 77 64 3a 20 62 61 xport_passwd: ba
3450: 64 20 70 61 73 73 77 6f 72 64 22 29 3b 0a 09 09 d password");...
3460: 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d 73 ui_statusline_ms
3470: 67 28 22 42 61 64 20 70 61 73 73 77 6f 72 64 22 g("Bad password"
3480: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a );...return -1;.
3490: 09 7d 0a 0a 09 2f 2f 20 57 65 20 6e 65 65 64 20 .}...// We need
34a0: 74 68 65 20 49 44 73 20 74 6f 20 64 65 66 61 75 the IDs to defau
34b0: 6c 74 20 74 6f 20 65 6d 70 74 79 20 73 74 72 69 lt to empty stri
34c0: 6e 67 73 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c ngs..for(i=0; i<
34d0: 6d 61 78 5f 69 64 5f 6e 75 6d 3b 20 69 2b 2b 29 max_id_num; i++)
34e0: 20 7b 0a 09 09 69 64 73 5b 69 5d 20 3d 20 6d 61 {...ids[i] = ma
34f0: 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 4c 4f 4e 47 lloc(STRING_LONG
3500: 29 3b 0a 09 09 73 6e 70 72 69 6e 74 66 28 69 64 );...snprintf(id
3510: 73 5b 69 5d 2c 20 53 54 52 49 4e 47 5f 4c 4f 4e s[i], STRING_LON
3520: 47 2c 20 22 22 29 3b 0a 09 7d 0a 0a 09 2f 2f 20 G, "");..}...//
3530: 46 65 74 63 68 20 74 68 65 20 49 44 73 0a 09 67 Fetch the IDs..g
3540: 6e 75 70 67 5f 67 65 74 5f 69 64 73 28 69 64 73 nupg_get_ids(ids
3550: 2c 6d 61 78 5f 69 64 5f 6e 75 6d 29 3b 0a 0a 09 ,max_id_num);...
3560: 2f 2f 20 43 68 65 63 6b 20 77 65 20 72 65 61 6c // Check we real
3570: 6c 79 20 67 6f 74 20 6f 6e 65 0a 09 66 6f 72 28 ly got one..for(
3580: 69 3d 30 3b 20 69 3c 6d 61 78 5f 69 64 5f 6e 75 i=0; i<max_id_nu
3590: 6d 3b 20 69 2b 2b 29 20 7b 0a 09 09 69 66 28 69 m; i++) {...if(i
35a0: 64 73 5b 69 5d 5b 30 5d 20 21 3d 20 30 29 20 7b ds[i][0] != 0) {
35b0: 0a 09 09 09 76 61 6c 69 64 5f 69 64 73 2b 2b 3b ....valid_ids++;
35c0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 28 76 61 6c ...}..}...if(val
35d0: 69 64 5f 69 64 73 20 3d 3d 20 30 29 7b 0a 09 09 id_ids == 0){...
35e0: 64 65 62 75 67 28 22 65 78 70 6f 72 74 5f 70 61 debug("export_pa
35f0: 73 73 77 64 3a 20 63 61 6e 63 65 6c 20 62 65 63 sswd: cancel bec
3600: 61 75 73 65 20 69 64 20 69 73 20 62 6c 61 6e 6b ause id is blank
3610: 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b ");...return -1;
3620: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 64 65 62 ..} else {...deb
3630: 75 67 28 22 65 78 70 6f 72 74 69 6e 67 20 74 6f ug("exporting to
3640: 20 25 64 20 69 64 73 22 2c 20 76 61 6c 69 64 5f %d ids", valid_
3650: 69 64 73 29 3b 0a 09 7d 0a 09 0a 09 67 6e 75 70 ids);..}....gnup
3660: 67 5f 67 65 74 5f 66 69 6c 65 6e 61 6d 65 28 66 g_get_filename(f
3670: 69 6c 65 2c 20 27 77 27 29 3b 0a 0a 09 64 65 62 ile, 'w');...deb
3680: 75 67 28 22 65 78 70 6f 72 74 5f 70 61 73 73 77 ug("export_passw
3690: 64 3a 20 63 6f 6e 73 74 72 75 63 74 20 78 6d 6c d: construct xml
36a0: 20 64 6f 63 22 29 3b 0a 09 73 6e 70 72 69 6e 74 doc");..snprint
36b0: 66 28 76 65 72 73 2c 20 35 2c 20 22 25 64 22 2c f(vers, 5, "%d",
36c0: 20 46 46 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 64 FF_VERSION);..d
36d0: 6f 63 20 3d 20 78 6d 6c 4e 65 77 44 6f 63 28 28 oc = xmlNewDoc((
36e0: 78 6d 6c 43 68 61 72 2a 29 22 31 2e 30 22 29 3b xmlChar*)"1.0");
36f0: 0a 09 0a 09 72 6f 6f 74 20 3d 20 78 6d 6c 4e 65 ....root = xmlNe
3700: 77 44 6f 63 4e 6f 64 65 28 64 6f 63 2c 20 4e 55 wDocNode(doc, NU
3710: 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 50 LL, (xmlChar*)"P
3720: 57 4d 61 6e 5f 45 78 70 6f 72 74 22 2c 20 4e 55 WMan_Export", NU
3730: 4c 4c 29 3b 0a 0a 09 78 6d 6c 53 65 74 50 72 6f LL);...xmlSetPro
3740: 70 28 72 6f 6f 74 2c 20 22 76 65 72 73 69 6f 6e p(root, "version
3750: 22 2c 20 76 65 72 73 29 3b 0a 09 0a 20 20 20 69 ", vers);... i
3760: 66 28 70 77 6c 69 73 74 29 20 7b 0a 20 20 20 20 f(pwlist) {.
3770: 20 20 70 77 6c 69 73 74 5f 77 72 69 74 65 28 72 pwlist_write(r
3780: 6f 6f 74 2c 20 70 77 6c 69 73 74 29 3b 0a 20 20 oot, pwlist);.
3790: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 } else {.
37a0: 70 77 6c 69 73 74 5f 77 72 69 74 65 5f 6e 6f 64 pwlist_write_nod
37b0: 65 28 72 6f 6f 74 2c 20 70 77 29 3b 0a 20 20 20 e(root, pw);.
37c0: 7d 0a 0a 09 78 6d 6c 44 6f 63 53 65 74 52 6f 6f }...xmlDocSetRoo
37d0: 74 45 6c 65 6d 65 6e 74 28 64 6f 63 2c 20 72 6f tElement(doc, ro
37e0: 6f 74 29 3b 0a 0a 09 67 6e 75 70 67 5f 77 72 69 ot);...gnupg_wri
37f0: 74 65 5f 6d 61 6e 79 28 64 6f 63 2c 20 69 64 73 te_many(doc, ids
3800: 2c 20 6d 61 78 5f 69 64 5f 6e 75 6d 2c 20 66 69 , max_id_num, fi
3810: 6c 65 29 3b 0a 09 0a 09 78 6d 6c 46 72 65 65 44 le);....xmlFreeD
3820: 6f 63 28 64 6f 63 29 3b 0a 0a 09 2f 2f 20 41 6c oc(doc);...// Al
3830: 6c 20 64 6f 6e 65 2e 0a 09 2f 2f 20 46 72 65 65 l done...// Free
3840: 20 6f 75 72 20 49 44 20 73 74 72 75 63 74 75 72 our ID structur
3850: 65 73 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6d es..for(i=0; i<m
3860: 61 78 5f 69 64 5f 6e 75 6d 3b 20 69 2b 2b 29 20 ax_id_num; i++)
3870: 7b 0a 09 09 66 72 65 65 28 69 64 73 5b 69 5d 29 {...free(ids[i])
3880: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 20 30 ;..}....return 0
3890: 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f ;.}..int.pwlist_
38a0: 65 78 70 6f 72 74 5f 70 61 73 73 77 64 28 50 77 export_passwd(Pw
38b0: 20 2a 70 77 29 0a 7b 0a 20 20 20 72 65 74 75 72 *pw).{. retur
38c0: 6e 20 70 77 6c 69 73 74 5f 64 6f 5f 65 78 70 6f n pwlist_do_expo
38d0: 72 74 28 4e 55 4c 4c 2c 20 70 77 29 3b 0a 7d 0a rt(NULL, pw);.}.
38e0: 69 6e 74 0a 70 77 6c 69 73 74 5f 65 78 70 6f 72 int.pwlist_expor
38f0: 74 5f 6c 69 73 74 28 50 57 4c 69 73 74 20 2a 70 t_list(PWList *p
3900: 77 6c 69 73 74 29 0a 7b 0a 20 20 20 72 65 74 75 wlist).{. retu
3910: 72 6e 20 70 77 6c 69 73 74 5f 64 6f 5f 65 78 70 rn pwlist_do_exp
3920: 6f 72 74 28 70 77 6c 69 73 74 2c 20 4e 55 4c 4c ort(pwlist, NULL
3930: 29 3b 0a 7d 0a 0a 0a 69 6e 74 0a 70 77 6c 69 73 );.}...int.pwlis
3940: 74 5f 69 6d 70 6f 72 74 5f 70 61 73 73 77 64 28 t_import_passwd(
3950: 29 0a 7b 0a 09 63 68 61 72 20 66 69 6c 65 5b 53 ).{..char file[S
3960: 54 52 49 4e 47 5f 4c 4f 4e 47 5d 2c 20 2a 62 75 TRING_LONG], *bu
3970: 66 3b 0a 09 69 6e 74 20 69 20 3d 20 30 3b 0a 09 f;..int i = 0;..
3980: 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65 2c xmlNodePtr node,
3990: 20 72 6f 6f 74 3b 0a 09 78 6d 6c 44 6f 63 50 74 root;..xmlDocPt
39a0: 72 20 64 6f 63 3b 0a 0a 09 67 6e 75 70 67 5f 67 r doc;...gnupg_g
39b0: 65 74 5f 66 69 6c 65 6e 61 6d 65 28 66 69 6c 65 et_filename(file
39c0: 2c 20 27 72 27 29 3b 0a 0a 09 67 6e 75 70 67 5f , 'r');...gnupg_
39d0: 72 65 61 64 28 66 69 6c 65 2c 20 26 64 6f 63 29 read(file, &doc)
39e0: 3b 09 0a 09 0a 09 69 66 28 21 64 6f 63 29 7b 0a ;.....if(!doc){.
39f0: 09 09 64 65 62 75 67 28 22 69 6d 70 6f 72 74 5f ..debug("import_
3a00: 70 61 73 73 77 64 3a 20 62 61 64 20 64 61 74 61 passwd: bad data
3a10: 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b ");...return -1;
3a20: 0a 09 7d 0a 09 72 6f 6f 74 20 3d 20 78 6d 6c 44 ..}..root = xmlD
3a30: 6f 63 47 65 74 52 6f 6f 74 45 6c 65 6d 65 6e 74 ocGetRootElement
3a40: 28 64 6f 63 29 3b 0a 09 69 66 28 21 72 6f 6f 74 (doc);..if(!root
3a50: 20 7c 7c 20 21 72 6f 6f 74 2d 3e 6e 61 6d 65 09 || !root->name.
3a60: 7c 7c 20 28 73 74 72 63 6d 70 28 28 63 68 61 72 || (strcmp((char
3a70: 2a 29 72 6f 6f 74 2d 3e 6e 61 6d 65 2c 20 22 50 *)root->name, "P
3a80: 57 4d 61 6e 5f 45 78 70 6f 72 74 22 29 20 21 3d WMan_Export") !=
3a90: 20 30 29 20 29 7b 0a 09 09 75 69 5f 73 74 61 74 0) ){...ui_stat
3aa0: 75 73 6c 69 6e 65 5f 6d 73 67 28 22 42 61 64 6c usline_msg("Badl
3ab0: 79 20 46 6f 72 6d 65 64 20 70 61 73 73 77 6f 72 y Formed passwor
3ac0: 64 20 64 61 74 61 22 29 3b 0a 09 09 72 65 74 75 d data");...retu
3ad0: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 20 62 rn -1;..}..if( b
3ae0: 75 66 20 3d 20 78 6d 6c 47 65 74 50 72 6f 70 28 uf = xmlGetProp(
3af0: 72 6f 6f 74 2c 20 28 78 6d 6c 43 68 61 72 2a 29 root, (xmlChar*)
3b00: 22 76 65 72 73 69 6f 6e 22 29 20 29 7b 0a 09 09 "version") ){...
3b10: 69 20 3d 20 61 74 6f 69 28 20 62 75 66 20 29 3b i = atoi( buf );
3b20: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 20 3d ..} else {...i =
3b30: 20 30 3b 0a 09 7d 0a 09 69 66 28 69 20 3c 20 46 0;..}..if(i < F
3b40: 46 5f 56 45 52 53 49 4f 4e 29 7b 0a 09 09 75 69 F_VERSION){...ui
3b50: 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d 73 67 28 _statusline_msg(
3b60: 22 50 61 73 73 77 6f 72 64 20 45 78 70 6f 72 74 "Password Export
3b70: 20 46 69 6c 65 20 69 6e 20 6f 6c 64 65 72 20 66 File in older f
3b80: 6f 72 6d 61 74 2c 20 75 73 65 20 63 6f 6e 76 65 ormat, use conve
3b90: 72 74 5f 70 77 64 62 22 29 3b 0a 09 09 72 65 74 rt_pwdb");...ret
3ba0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 0a 09 66 6f urn -1;..}....fo
3bb0: 72 28 6e 6f 64 65 20 3d 20 72 6f 6f 74 2d 3e 63 r(node = root->c
3bc0: 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d hildren; node !=
3bd0: 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f NULL; node = no
3be0: 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 de->next){...if(
3bf0: 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e 6e 61 6d strcmp(node->nam
3c00: 65 2c 20 22 50 77 4c 69 73 74 22 29 20 3d 3d 20 e, "PwList") ==
3c10: 30 29 7b 0a 09 09 09 70 77 6c 69 73 74 5f 72 65 0){....pwlist_re
3c20: 61 64 28 6e 6f 64 65 2c 20 63 75 72 72 65 6e 74 ad(node, current
3c30: 5f 70 77 5f 73 75 62 6c 69 73 74 29 3b 0a 09 09 _pw_sublist);...
3c40: 09 62 72 65 61 6b 3b 0a 09 09 7d 20 65 6c 73 65 .break;...} else
3c50: 20 69 66 28 73 74 72 63 6d 70 28 6e 6f 64 65 2d if(strcmp(node-
3c60: 3e 6e 61 6d 65 2c 20 22 50 77 49 74 65 6d 22 29 >name, "PwItem")
3c70: 20 3d 3d 20 30 29 7b 0a 09 09 09 70 77 6c 69 73 == 0){....pwlis
3c80: 74 5f 72 65 61 64 5f 6e 6f 64 65 28 6e 6f 64 65 t_read_node(node
3c90: 2c 20 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62 , current_pw_sub
3ca0: 6c 69 73 74 29 3b 0a 09 09 09 62 72 65 61 6b 3b list);....break;
3cb0: 0a 09 09 7d 0a 09 7d 0a 09 78 6d 6c 46 72 65 65 ...}..}..xmlFree
3cc0: 44 6f 63 28 64 6f 63 29 3b 0a 09 72 65 74 75 72 Doc(doc);..retur
3cd0: 6e 20 30 3b 0a 7d 0a n 0;.}.