Artifact 192be884c0ea849b5eab936aeaecc77b420728cf4d0e584cbe197090bece4a41:
- File launch.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: 2359) [more...]
- File
src/launch.c
— part of check-in
[11403de3f1]
at
2011-01-30 19:00:30
on branch origin/tweaks
— Fix more compiler warnings
git-svn-id: https://pwman.svn.sourceforge.net/svnroot/pwman/trunk@117 db5f1c25-4851-472e-ac1e-5437d07aece1 (user: gagravarr@users.sourceforge.net size: 2359)
0000: 2f 2a 0a 20 2a 20 20 50 57 6d 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 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e e <stdlib.h>.#in
0370: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e clude <string.h>
0380: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 .#include <unist
0390: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 d.h>.#include <s
03a0: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 ys/types.h>.#inc
03b0: 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68 lude <sys/wait.h
03c0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e >.#include <errn
03d0: 6f 2e 68 3e 0a 0a 63 68 61 72 20 2a 20 0a 6c 61 o.h>..char * .la
03e0: 75 6e 63 68 5f 66 69 6e 64 5f 72 65 70 6c 61 63 unch_find_replac
03f0: 65 28 63 68 61 72 20 2a 68 61 79 73 74 61 63 6b e(char *haystack
0400: 2c 20 63 68 61 72 2a 20 6e 65 65 64 6c 65 2c 20 , char* needle,
0410: 63 68 61 72 2a 20 63 6f 77 29 0a 7b 0a 09 63 68 char* cow).{..ch
0420: 61 72 20 2a 70 6f 73 3b 0a 09 69 6e 74 20 6c 65 ar *pos;..int le
0430: 6e 2c 69 3b 0a 09 63 68 61 72 20 2a 72 65 74 2c n,i;..char *ret,
0440: 20 2a 72 65 74 5f 70 3b 0a 0a 09 70 6f 73 20 3d *ret_p;...pos =
0450: 20 73 74 72 73 74 72 28 68 61 79 73 74 61 63 6b strstr(haystack
0460: 2c 20 6e 65 65 64 6c 65 29 3b 0a 09 69 66 28 70 , needle);..if(p
0470: 6f 73 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 72 os == NULL){...r
0480: 65 74 75 72 6e 20 68 61 79 73 74 61 63 6b 3b 0a eturn haystack;.
0490: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 72 65 61 6c .}.../*.. * real
04a0: 20 75 67 6c 79 20 73 68 69 74 20 66 6f 72 20 0a ugly shit for .
04b0: 09 20 2a 20 72 65 70 6c 61 63 69 6e 67 20 74 68 . * replacing th
04c0: 65 20 73 74 72 69 6e 67 73 0a 09 20 2a 2f 0a 09 e strings.. */..
04d0: 6c 65 6e 20 3d 20 28 73 74 72 6c 65 6e 28 68 61 len = (strlen(ha
04e0: 79 73 74 61 63 6b 29 20 2d 20 73 74 72 6c 65 6e ystack) - strlen
04f0: 28 6e 65 65 64 6c 65 29 29 20 2b 20 73 74 72 6c (needle)) + strl
0500: 65 6e 28 63 6f 77 29 20 2b 20 31 3b 0a 09 72 65 en(cow) + 1;..re
0510: 74 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 29 3b t = malloc(len);
0520: 0a 09 72 65 74 5f 70 20 3d 20 72 65 74 3b 0a 09 ..ret_p = ret;..
0530: 69 20 3d 20 70 6f 73 20 2d 20 26 68 61 79 73 74 i = pos - &hayst
0540: 61 63 6b 5b 30 5d 3b 0a 09 73 74 72 6e 63 70 79 ack[0];..strncpy
0550: 28 72 65 74 5f 70 2c 20 68 61 79 73 74 61 63 6b (ret_p, haystack
0560: 2c 20 69 29 3b 0a 09 72 65 74 5f 70 20 2b 3d 20 , i);..ret_p +=
0570: 69 3b 0a 09 73 74 72 63 70 79 28 72 65 74 5f 70 i;..strcpy(ret_p
0580: 2c 20 63 6f 77 29 3b 0a 09 72 65 74 5f 70 20 2b , cow);..ret_p +
0590: 3d 20 73 74 72 6c 65 6e 28 63 6f 77 29 3b 0a 09 = strlen(cow);..
05a0: 70 6f 73 20 2b 3d 20 73 74 72 6c 65 6e 28 6e 65 pos += strlen(ne
05b0: 65 64 6c 65 29 3b 0a 09 73 74 72 63 70 79 28 72 edle);..strcpy(r
05c0: 65 74 5f 70 2c 20 70 6f 73 29 3b 0a 0a 09 72 65 et_p, pos);...re
05d0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 69 6e 74 turn ret;.}..int
05e0: 20 0a 6c 61 75 6e 63 68 5f 65 78 65 63 75 74 65 .launch_execute
05f0: 28 63 68 61 72 20 2a 63 6d 64 29 20 7b 0a 09 69 (char *cmd) {..i
0600: 6e 74 20 70 69 64 2c 20 73 74 61 74 75 73 3b 0a nt pid, status;.
0610: 09 63 68 61 72 20 2a 61 72 67 76 5b 34 5d 3b 0a .char *argv[4];.
0620: 0a 09 69 66 20 28 63 6d 64 20 3d 3d 20 4e 55 4c ..if (cmd == NUL
0630: 4c 29 7b 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a L){...return 1;.
0640: 09 7d 0a 09 0a 09 70 69 64 20 3d 20 66 6f 72 6b .}....pid = fork
0650: 28 29 3b 0a 09 69 66 20 28 70 69 64 20 3d 3d 20 ();..if (pid ==
0660: 2d 31 29 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31 -1){...return -1
0670: 3b 0a 09 7d 0a 09 69 66 20 28 70 69 64 20 3d 3d ;..}..if (pid ==
0680: 20 30 29 20 7b 0a 09 09 61 72 67 76 5b 30 5d 20 0) {...argv[0]
0690: 3d 20 22 70 77 6d 61 6e 5f 65 78 65 63 22 3b 0a = "pwman_exec";.
06a0: 09 09 61 72 67 76 5b 31 5d 20 3d 20 22 2d 63 22 ..argv[1] = "-c"
06b0: 3b 0a 09 09 61 72 67 76 5b 32 5d 20 3d 20 63 6d ;...argv[2] = cm
06c0: 64 3b 0a 09 09 61 72 67 76 5b 33 5d 20 3d 20 4e d;...argv[3] = N
06d0: 55 4c 4c 3b 0a 0a 09 09 65 78 65 63 76 28 22 2f ULL;....execv("/
06e0: 62 69 6e 2f 73 68 22 2c 20 61 72 67 76 29 3b 0a bin/sh", argv);.
06f0: 09 09 65 78 69 74 28 31 32 37 29 3b 0a 09 7d 0a ..exit(127);..}.
0700: 09 64 6f 20 7b 0a 09 09 69 66 20 28 77 61 69 74 .do {...if (wait
0710: 70 69 64 28 70 69 64 2c 20 26 73 74 61 74 75 73 pid(pid, &status
0720: 2c 20 30 29 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 , 0) == -1) {...
0730: 09 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 49 .if (errno != EI
0740: 4e 54 52 29 7b 0a 09 09 09 09 72 65 74 75 72 6e NTR){.....return
0750: 20 2d 31 3b 0a 09 09 09 7d 20 0a 09 09 7d 65 6c -1;....} ...}el
0760: 73 65 20 7b 0a 09 09 09 72 65 74 75 72 6e 20 73 se {....return s
0770: 74 61 74 75 73 3b 0a 09 09 7d 0a 09 7d 20 77 68 tatus;...}..} wh
0780: 69 6c 65 28 31 29 3b 0a 7d 0a 0a 69 6e 74 0a 6c ile(1);.}..int.l
0790: 61 75 6e 63 68 28 50 77 20 2a 70 77 29 0a 7b 0a aunch(Pw *pw).{.
07a0: 09 69 6e 74 20 69 3b 0a 09 63 68 61 72 20 2a 63 .int i;..char *c
07b0: 6d 64 3b 0a 09 63 68 61 72 20 2a 2a 63 6d 64 5f md;..char **cmd_
07c0: 61 72 72 61 79 3b 0a 0a 09 69 66 28 28 70 77 20 array;...if((pw
07d0: 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 70 77 2d == NULL) || (pw-
07e0: 3e 6c 61 75 6e 63 68 20 3d 3d 20 4e 55 4c 4c 29 >launch == NULL)
07f0: 29 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a ){...return -1;.
0800: 09 7d 0a 09 63 6d 64 20 3d 20 6c 61 75 6e 63 68 .}..cmd = launch
0810: 5f 66 69 6e 64 5f 72 65 70 6c 61 63 65 28 70 77 _find_replace(pw
0820: 2d 3e 6c 61 75 6e 63 68 2c 20 22 25 68 22 2c 20 ->launch, "%h",
0830: 70 77 2d 3e 68 6f 73 74 29 3b 0a 09 63 6d 64 20 pw->host);..cmd
0840: 3d 20 6c 61 75 6e 63 68 5f 66 69 6e 64 5f 72 65 = launch_find_re
0850: 70 6c 61 63 65 28 63 6d 64 2c 20 22 25 75 22 2c place(cmd, "%u",
0860: 20 70 77 2d 3e 75 73 65 72 29 3b 0a 09 63 6d 64 pw->user);..cmd
0870: 20 3d 20 6c 61 75 6e 63 68 5f 66 69 6e 64 5f 72 = launch_find_r
0880: 65 70 6c 61 63 65 28 63 6d 64 2c 20 22 25 70 22 eplace(cmd, "%p"
0890: 2c 20 70 77 2d 3e 70 61 73 73 77 64 29 3b 0a 0a , pw->passwd);..
08a0: 09 64 65 66 5f 70 72 6f 67 5f 6d 6f 64 65 28 29 .def_prog_mode()
08b0: 3b 0a 09 75 69 5f 65 6e 64 28 29 3b 0a 0a 09 69 ;..ui_end();...i
08c0: 20 3d 20 6c 61 75 6e 63 68 5f 65 78 65 63 75 74 = launch_execut
08d0: 65 28 63 6d 64 29 3b 0a 0a 09 70 75 74 73 28 22 e(cmd);...puts("
08e0: 50 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f Press any key to
08f0: 20 63 6f 6e 74 69 6e 75 65 22 29 3b 0a 09 67 65 continue");..ge
0900: 74 63 68 28 29 3b 0a 09 0a 09 75 69 5f 69 6e 69 tch();....ui_ini
0910: 74 28 29 3b 0a 09 72 65 73 65 74 5f 70 72 6f 67 t();..reset_prog
0920: 5f 6d 6f 64 65 28 29 3b 0a 0a 09 72 65 74 75 72 _mode();...retur
0930: 6e 20 69 3b 0a 7d 0a n i;.}.