Advertisement
Guest User

Untitled

a guest
May 26th, 2017
545
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 57.80 KB | None | 0 0
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.  
  3.    Copyright (c) 2009 Hex-Rays <info@hex-rays.com>
  4.  
  5.  
  6.  
  7.    Detected compiler: GNU C++
  8.  
  9. */
  10.  
  11.  
  12.  
  13. #include <defs.h>
  14.  
  15.  
  16.  
  17. #include <stdarg.h>
  18.  
  19.  
  20.  
  21.  
  22.  
  23. //-------------------------------------------------------------------------
  24.  
  25. // Data declarations
  26.  
  27.  
  28.  
  29. extern _UNKNOWN start; // weak
  30.  
  31. extern char format[]; // idb
  32.  
  33. extern char aUnableToCreate[]; // idb
  34.  
  35. extern char aUnableToSetReu[]; // idb
  36.  
  37. extern char aUnableToBindSo[]; // idb
  38.  
  39. extern char aUnableToListen[]; // idb
  40.  
  41. extern char aFailedToFindUs[]; // idb
  42.  
  43. extern char aDrop_privsFail[]; // idb
  44.  
  45. extern char aSetgidCurrentG[]; // idb
  46.  
  47. extern char aSetgidCurrentU[]; // idb
  48.  
  49. extern char a02x[]; // idb
  50.  
  51. extern char aS[]; // idb
  52.  
  53. extern char modes[]; // idb
  54.  
  55. extern char aSCanTBeOpened_[]; // idb
  56.  
  57. extern char aS_0[]; // idb
  58.  
  59. extern char aNodeX[]; // idb
  60.  
  61. extern char aChickensU[]; // idb
  62.  
  63. extern char aEggsU[]; // idb
  64.  
  65. extern char aMoniesU[]; // idb
  66.  
  67. extern char aIdU[]; // idb
  68.  
  69. extern char aUsernameS[]; // idb
  70.  
  71. extern char aInfoS[]; // idb
  72.  
  73. extern char aOfficeS[]; // idb
  74.  
  75. extern char aPasswordS[]; // idb
  76.  
  77. extern char aPermU[]; // idb
  78.  
  79. extern char aNextX[]; // idb
  80.  
  81. extern char aPrevX[]; // idb
  82.  
  83. extern char aLcggedIn[]; // idb
  84.  
  85. extern char s[]; // idb
  86.  
  87. extern char aEnterNewUserna[]; // idb
  88.  
  89. extern char aEnterNewInfo[]; // idb
  90.  
  91. extern char aEnterNewOffice[]; // idb
  92.  
  93. extern char aEnterNewPass[]; // idb
  94.  
  95. extern char aInsertFailed_[]; // idb
  96.  
  97. extern char aYouCurrentlyHa[]; // idb
  98.  
  99. extern char aMarketPriceFor[]; // idb
  100.  
  101. extern char aWouldYouLikeTo[]; // idb
  102.  
  103. extern char aHowMany_[]; // idb
  104.  
  105. extern char aUSold[]; // idb
  106.  
  107. extern char aNotEnoughEggs[]; // idb
  108.  
  109. extern char aYouCurrently_0[]; // idb
  110.  
  111. extern char aWouldYouLike_0[]; // idb
  112.  
  113. extern char aHowMuch_[]; // idb
  114.  
  115. extern char aUBurntToACrisp[]; // idb
  116.  
  117. extern char aOhSnapItSAllGo[]; // idb
  118.  
  119. extern char aYouCurrently_1[]; // idb
  120.  
  121. extern char aMarketPriceF_0[]; // idb
  122.  
  123. extern char aWouldYouLike_1[]; // idb
  124.  
  125. extern char aUPurchased[]; // idb
  126.  
  127. extern char aNotEnoughMoney[]; // idb
  128.  
  129. extern char aWouldYouLike_2[]; // idb
  130.  
  131. extern char aWouldYouLike_3[]; // idb
  132.  
  133. extern char aWouldYouLike_4[]; // idb
  134.  
  135. extern char aWouldYouLike_5[]; // idb
  136.  
  137. extern char aWouldYouLike_6[]; // idb
  138.  
  139. extern char aEnterNewUid[]; // idb
  140.  
  141. extern char aWouldYouLike_7[]; // idb
  142.  
  143. extern char aEnterNewEggCou[]; // idb
  144.  
  145. extern char aYouDonTHaveEno[]; // idb
  146.  
  147. extern char aWouldYouLike_8[]; // idb
  148.  
  149. extern char aEnterNewChicke[]; // idb
  150.  
  151. extern char aYouDonTHaveE_0[]; // idb
  152.  
  153. extern char aWouldYouLike_9[]; // idb
  154.  
  155. extern char aEnterNewMonies[]; // idb
  156.  
  157. extern char aYouDonTHaveE_1[]; // idb
  158.  
  159. extern char aWouldYouLik_10[]; // idb
  160.  
  161. extern char aEnterNewPerm[]; // idb
  162.  
  163. extern char aYouDonTHaveE_2[]; // idb
  164.  
  165. extern char aFinishedUpdate[]; // idb
  166.  
  167. extern char aEnterUsername[]; // idb
  168.  
  169. extern char aEnterPassword[]; // idb
  170.  
  171. extern char aBadUsernameOrP[]; // idb
  172.  
  173. extern char aFantasyChicken[]; // idb
  174.  
  175. extern char aMenuS[]; // idb
  176.  
  177. extern char aLLogout[]; // idb
  178.  
  179. extern char aBBuyChickens[]; // idb
  180.  
  181. extern char aIIncinerateMon[]; // idb
  182.  
  183. extern char aSSellEggs[]; // idb
  184.  
  185. extern char aPDisplayMyInfo[]; // idb
  186.  
  187. extern char aUUpdateMyInfo[]; // idb
  188.  
  189. extern char aPPrintUserlist[]; // idb
  190.  
  191. extern char aMenu[]; // idb
  192.  
  193. extern char aCCreateAccount[]; // idb
  194.  
  195. extern char aLLogin[]; // idb
  196.  
  197. extern char aQQuit[]; // idb
  198.  
  199. extern char s2[]; // idb
  200.  
  201. extern char aUser[]; // idb
  202.  
  203. extern char aAttemptedS_[]; // idb
  204.  
  205. extern char aCya[]; // idb
  206.  
  207. extern char aCanTAllocateUs[]; // idb
  208.  
  209. extern char aHomeFcflUser_d[]; // idb
  210.  
  211. extern char aCanTReadUserDb[]; // idb
  212.  
  213. extern char aDS[]; // idb
  214.  
  215. extern char aThatSNotAValid[]; // idb
  216.  
  217. extern char aC[2]; // weak
  218.  
  219. extern char asc_804D115[2]; // weak
  220.  
  221. extern char aS_1[2]; // weak
  222.  
  223. extern char aI[2]; // weak
  224.  
  225. extern char aB[2]; // weak
  226.  
  227. extern char aU[2]; // weak
  228.  
  229. extern char aP[2]; // weak
  230.  
  231. extern char asc_804D121[2]; // weak
  232.  
  233. extern char aP_0[2]; // weak
  234.  
  235. extern char a6[2]; // weak
  236.  
  237. extern char filename[]; // idb
  238.  
  239. extern char aQ[2]; // weak
  240.  
  241. extern int dword_804E1D8; // weak
  242.  
  243. extern int dword_804E1E0[]; // weak
  244.  
  245. extern _UNKNOWN unk_804E1E4; // weak
  246.  
  247. extern int dword_804E1E8; // weak
  248.  
  249. extern _UNKNOWN unk_804E3C0; // weak
  250.  
  251. extern __int16 word_804E404; // weak
  252.  
  253. extern char name[]; // idb
  254.  
  255. extern char dword_804E40C[]; // idb
  256.  
  257. extern char dword_804E410[]; // idb
  258.  
  259. extern char byte_804E418; // weak
  260.  
  261. extern int dword_804E41C; // weak
  262.  
  263. extern int dword_804E420; // weak
  264.  
  265. extern int dword_804E424; // weak
  266.  
  267. extern char s1; // idb
  268.  
  269. // extern _UNKNOWN _gmon_start__; weak
  270.  
  271.  
  272.  
  273. //-------------------------------------------------------------------------
  274.  
  275. // Function declarations
  276.  
  277.  
  278.  
  279. int __cdecl init_proc();
  280.  
  281. int sprintf(char *s, const char *format, ...);
  282.  
  283. void srand(unsigned int seed);
  284.  
  285. void err(int status, const char *format, ...);
  286.  
  287. __sighandler_t signal(int sig, __sighandler_t handler);
  288.  
  289. int __gmon_start__(void); // weak
  290.  
  291. char *strncpy(char *dest, const char *src, size_t n);
  292.  
  293. int listen(int fd, int n);
  294.  
  295. void *memset(void *s, int c, size_t n);
  296.  
  297. uint16_t htons(uint16_t hostshort);
  298.  
  299. int setegid(__gid_t gid);
  300.  
  301. __pid_t wait4(__pid_t pid, void *stat_loc, int options, struct rusage *usage);
  302.  
  303. ssize_t read(int fd, void *buf, size_t nbytes);
  304.  
  305. int __cdecl setresuid(_DWORD, _DWORD); // weak
  306.  
  307. int __cdecl setresgid(_DWORD, _DWORD); // weak
  308.  
  309. int accept(int fd, struct sockaddr *addr, socklen_t *addr_len);
  310.  
  311. int socket(int domain, int type, int protocol);
  312.  
  313. int fclose(FILE *stream);
  314.  
  315. int setuid(__uid_t uid);
  316.  
  317. size_t strlen(const char *s);
  318.  
  319. FILE *fopen(const char *filename, const char *modes);
  320.  
  321. char *strcpy(char *dest, const char *src);
  322.  
  323. __gid_t getegid(void);
  324.  
  325. int printf(const char *format, ...);
  326.  
  327. int chdir(const char *path);
  328.  
  329. int bind(int fd, const struct sockaddr *addr, socklen_t len);
  330.  
  331. __uid_t getuid(void);
  332.  
  333. int atoi(const char *nptr);
  334.  
  335. int close(int fd);
  336.  
  337. int initgroups(const char *, __gid_t group);
  338.  
  339. time_t time(time_t *timer);
  340.  
  341. void *malloc(size_t size);
  342.  
  343. char *strcat(char *dest, const char *src);
  344.  
  345. ssize_t send(int fd, const void *buf, size_t n, int flags);
  346.  
  347. int vasprintf(char **, const char *, va_list);
  348.  
  349. __pid_t fork(void);
  350.  
  351. int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
  352.  
  353. int rand(void);
  354.  
  355. void bzero(void *s, size_t n);
  356.  
  357. int strncmp(const char *s1, const char *s2, size_t n);
  358.  
  359. size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
  360.  
  361. int seteuid(__uid_t uid);
  362.  
  363. int setgid(__gid_t gid);
  364.  
  365. struct passwd *getpwnam(const char *name);
  366.  
  367. int strcmp(const char *s1, const char *s2);
  368.  
  369. void exit(int status);
  370.  
  371. __gid_t getgid(void);
  372.  
  373. __uid_t geteuid(void);
  374.  
  375. void __cdecl sub_8048CB0();
  376.  
  377. int __cdecl sub_8048D10();
  378.  
  379. int __cdecl sub_8048D34();
  380.  
  381. __pid_t __cdecl handler();
  382.  
  383. int __cdecl sub_8048E0A(int fd, int a2, unsigned int a3, char a4);
  384.  
  385. signed int __cdecl sub_8048E75(int fd, const char *s, int a3);
  386.  
  387. signed int __cdecl sub_8048EB2(int fd, int a2, unsigned int a3);
  388.  
  389. int sub_8048F10(int fd, const char *a2, ...);
  390.  
  391. int __cdecl sub_8048F7A(uint16_t a1);
  392.  
  393. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD));
  394.  
  395. int __cdecl sub_804915E(const char *name);
  396.  
  397. int __cdecl sub_80491BE(int a1);
  398.  
  399. int __cdecl sub_804935C(int a1);
  400.  
  401. char __cdecl sub_804939E(int a1, int a2, unsigned int a3);
  402.  
  403. int __cdecl sub_80494D4(int a1);
  404.  
  405. int __cdecl sub_8049649(int a1, int a2);
  406.  
  407. int __cdecl sub_804A296(int a1);
  408.  
  409. int __cdecl sub_804A3DC(const char *s);
  410.  
  411. int __cdecl sub_804A443(const char *filename);
  412.  
  413. char *__cdecl sub_804A60A(int a1, char *dest);
  414.  
  415. char *__cdecl sub_804A666(const char *s, char *dest);
  416.  
  417. int __cdecl sub_804A6C0(int fd, int a2);
  418.  
  419. int __cdecl sub_804A820(int fd, int); // idb
  420.  
  421. int __cdecl sub_804A855(int fd, int); // idb
  422.  
  423. int __cdecl sub_804A8A1(int fd, char *a2, const char *s1, const char *s);
  424.  
  425. void __cdecl sub_804A988();
  426.  
  427. signed int __cdecl sub_804A9CB(int a1, const char *s2);
  428.  
  429. int __cdecl sub_804AA10(int fd, int); // idb
  430.  
  431. signed int __cdecl sub_804AA9F(int fd, const char *s, int a3);
  432.  
  433. int __cdecl sub_804ACFC(int fd, const char *nptr, int a3);
  434.  
  435. int __cdecl sub_804AE76(int fd, const char *nptr, int a3);
  436.  
  437. int __cdecl sub_804AFC6(int fd, const char *nptr, int a3);
  438.  
  439. int __cdecl sub_804B148(int fd, const char *nptr, int a3);
  440.  
  441. int __cdecl sub_804B6F5(int fd, int s1, char *a3);
  442.  
  443. int __cdecl sub_804B7E0(int fd); // idb
  444.  
  445. int __cdecl sub_804B90A(FILE *stream, int a2, unsigned int a3, char a4);
  446.  
  447. void *__cdecl sub_804B9E6(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11);
  448.  
  449. signed int __cdecl sub_804BAB7(const char *filename, int a2, int fd);
  450.  
  451. void __cdecl sub_804C067(int fd);
  452.  
  453. int __cdecl sub_804C09F(int a1);
  454.  
  455. void __cdecl sub_804C18B(int fd);
  456.  
  457. void __cdecl sub_804C5F0();
  458.  
  459. int *__cdecl sub_804C600();
  460.  
  461. void __cdecl sub_804C65A();
  462.  
  463. void (*__cdecl sub_804C660())(void);
  464.  
  465. void __cdecl term_proc();
  466.  
  467.  
  468.  
  469.  
  470.  
  471. //----- (08048900) --------------------------------------------------------
  472.  
  473. int __cdecl init_proc()
  474.  
  475. {
  476.  
  477.   int v1; // ST04_4@3
  478.  
  479.  
  480.  
  481.   if ( &_gmon_start__ )
  482.  
  483.     __gmon_start__();
  484.  
  485.   sub_8048D10();
  486.  
  487.   sub_804C660();
  488.  
  489.   return v1;
  490.  
  491. }
  492.  
  493. // 8048980: using guessed type int __gmon_start__(void);
  494.  
  495.  
  496.  
  497. //----- (08048C80) --------------------------------------------------------
  498.  
  499. #error "8048C83: positive sp value has been found (funcsize=2)"
  500.  
  501.  
  502.  
  503. //----- (08048CB0) --------------------------------------------------------
  504.  
  505. void __cdecl sub_8048CB0()
  506.  
  507. {
  508.  
  509.   int v0; // eax@2
  510.  
  511.   int i; // ebx@2
  512.  
  513.  
  514.  
  515.   if ( !byte_804E418 )
  516.  
  517.   {
  518.  
  519.     v0 = dword_804E41C;
  520.  
  521.     for ( i = ((signed int)(&unk_804E1E4 - (_UNKNOWN *)dword_804E1E0) >> 2) - 1;
  522.  
  523.           dword_804E41C < (unsigned int)i;
  524.  
  525.           v0 = dword_804E41C )
  526.  
  527.     {
  528.  
  529.       dword_804E41C = v0 + 1;
  530.  
  531.       ((void (*)(void))dword_804E1E0[dword_804E41C])();
  532.  
  533.     }
  534.  
  535.     byte_804E418 = 1;
  536.  
  537.   }
  538.  
  539. }
  540.  
  541. // 804E1E0: using guessed type int dword_804E1E0[];
  542.  
  543. // 804E418: using guessed type char byte_804E418;
  544.  
  545. // 804E41C: using guessed type int dword_804E41C;
  546.  
  547.  
  548.  
  549. //----- (08048D10) --------------------------------------------------------
  550.  
  551. int __cdecl sub_8048D10()
  552.  
  553. {
  554.  
  555.   int result; // eax@1
  556.  
  557.  
  558.  
  559.   result = dword_804E1E8;
  560.  
  561.   if ( dword_804E1E8 )
  562.  
  563.     result = 0;
  564.  
  565.   return result;
  566.  
  567. }
  568.  
  569. // 804E1E8: using guessed type int dword_804E1E8;
  570.  
  571.  
  572.  
  573. //----- (08048D34) --------------------------------------------------------
  574.  
  575. int __cdecl sub_8048D34()
  576.  
  577. {
  578.  
  579.   int v1; // ST1C_4@1
  580.  
  581.  
  582.  
  583.   v1 = sub_8048F7A(word_804E404);
  584.  
  585.   sub_804915E("fcfl");
  586.  
  587.   sub_80490D0(v1, (int (__cdecl *)(_DWORD))sub_804C18B);
  588.  
  589.   return 0;
  590.  
  591. }
  592.  
  593. // 804E404: using guessed type __int16 word_804E404;
  594.  
  595.  
  596.  
  597. //----- (08048D78) --------------------------------------------------------
  598.  
  599. __pid_t __cdecl handler()
  600.  
  601. {
  602.  
  603.   __pid_t result; // eax@1
  604.  
  605.   char stat_loc; // [sp+1Ch] [bp-Ch]@1
  606.  
  607.  
  608.  
  609.   do
  610.  
  611.     result = wait4(-1, &stat_loc, 1, 0);
  612.  
  613.   while ( result > 0 );
  614.  
  615.   return result;
  616.  
  617. }
  618.  
  619.  
  620.  
  621. //----- (08048E0A) --------------------------------------------------------
  622.  
  623. int __cdecl sub_8048E0A(int fd, int a2, unsigned int a3, char a4)
  624.  
  625. {
  626.  
  627.   char buf; // [sp+2Bh] [bp-Dh]@2
  628.  
  629.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  630.  
  631.  
  632.  
  633.   for ( i = 0; ; ++i )
  634.  
  635.   {
  636.  
  637.     if ( read(fd, &buf, 1u) <= 0 )
  638.  
  639.       return -1;
  640.  
  641.     if ( buf == a4 )
  642.  
  643.       return i;
  644.  
  645.     if ( i >= a3 )
  646.  
  647.       break;
  648.  
  649.     *(_BYTE *)(i + a2) = buf;
  650.  
  651.   }
  652.  
  653.   return -1;
  654.  
  655. }
  656.  
  657.  
  658.  
  659. //----- (08048E75) --------------------------------------------------------
  660.  
  661. signed int __cdecl sub_8048E75(int fd, const char *s, int a3)
  662.  
  663. {
  664.  
  665.   unsigned int v3; // eax@2
  666.  
  667.   size_t v5; // [sp+1Ch] [bp-Ch]@1
  668.  
  669.  
  670.  
  671.   v5 = strlen(s);
  672.  
  673.   if ( a3 )
  674.  
  675.     v3 = v5 + 1;
  676.  
  677.   else
  678.  
  679.     v3 = v5;
  680.  
  681.   return sub_8048EB2(fd, (int)s, v3);
  682.  
  683. }
  684.  
  685.  
  686.  
  687. //----- (08048EB2) --------------------------------------------------------
  688.  
  689. signed int __cdecl sub_8048EB2(int fd, int a2, unsigned int a3)
  690.  
  691. {
  692.  
  693.   unsigned int i; // [sp+18h] [bp-10h]@1
  694.  
  695.   ssize_t v5; // [sp+1Ch] [bp-Ch]@2
  696.  
  697.  
  698.  
  699.   for ( i = 0; i < a3; i += v5 )
  700.  
  701.   {
  702.  
  703.     v5 = send(fd, (const void *)(a2 + i), a3 - i, 0);
  704.  
  705.     if ( !v5 )
  706.  
  707.       return -1;
  708.  
  709.   }
  710.  
  711.   return i;
  712.  
  713. }
  714.  
  715.  
  716.  
  717. //----- (08048F10) --------------------------------------------------------
  718.  
  719. int sub_8048F10(int fd, const char *a2, ...)
  720.  
  721. {
  722.  
  723.   char *s; // [sp+18h] [bp-10h]@1
  724.  
  725.   int v4; // [sp+1Ch] [bp-Ch]@1
  726.  
  727.   va_list va; // [sp+38h] [bp+10h]@1
  728.  
  729.  
  730.  
  731.   va_start(va, a2);
  732.  
  733.   v4 = 0;
  734.  
  735.   s = 0;
  736.  
  737.   if ( vasprintf(&s, a2, va) != -1 && s )
  738.  
  739.     v4 = sub_8048E75(fd, s, 0);
  740.  
  741.   else
  742.  
  743.     v4 = -1;
  744.  
  745.   return v4;
  746.  
  747. }
  748.  
  749.  
  750.  
  751. //----- (08048F7A) --------------------------------------------------------
  752.  
  753. int __cdecl sub_8048F7A(uint16_t a1)
  754.  
  755. {
  756.  
  757.   int optval; // [sp+2Ch] [bp-ACh]@1
  758.  
  759.   __int16 s; // [sp+BCh] [bp-1Ch]@1
  760.  
  761.   uint16_t v4; // [sp+BEh] [bp-1Ah]@1
  762.  
  763.   int fd; // [sp+CCh] [bp-Ch]@3
  764.  
  765.  
  766.  
  767.   optval = 1;
  768.  
  769.   memset(&s, 0, 0x10u);
  770.  
  771.   s = 2;
  772.  
  773.   v4 = htons(a1);
  774.  
  775.   if ( signal(17, (__sighandler_t)handler) == (__sighandler_t)-1 )
  776.  
  777.     err(-1, "Unable to set SIGCHLD handler");
  778.  
  779.   fd = socket(2, 1, 0);
  780.  
  781.   if ( fd == -1 )
  782.  
  783.     err(-1, "Unable to create socket");
  784.  
  785.   if ( setsockopt(fd, 1, 2, &optval, 4u) == -1 )
  786.  
  787.     err(-1, "Unable to set reuse");
  788.  
  789.   if ( bind(fd, (const struct sockaddr *)&s, 0x10u) == -1 )
  790.  
  791.     err(-1, "Unable to bind socket");
  792.  
  793.   if ( listen(fd, 20) == -1 )
  794.  
  795.     err(-1, "Unable to listen on socket");
  796.  
  797.   return fd;
  798.  
  799. }
  800.  
  801.  
  802.  
  803. //----- (080490D0) --------------------------------------------------------
  804.  
  805. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD))
  806.  
  807. {
  808.  
  809.   socklen_t addr_len; // [sp+1Ch] [bp-2Ch]@2
  810.  
  811.   struct sockaddr addr; // [sp+20h] [bp-28h]@2
  812.  
  813.   int v4; // [sp+30h] [bp-18h]@1
  814.  
  815.   int v5; // [sp+34h] [bp-14h]@2
  816.  
  817.   int v6; // [sp+38h] [bp-10h]@3
  818.  
  819.   int status; // [sp+3Ch] [bp-Ch]@5
  820.  
  821.  
  822.  
  823.   v4 = 1;
  824.  
  825.   while ( v4 )
  826.  
  827.   {
  828.  
  829.     addr_len = 16;
  830.  
  831.     v5 = accept(fd, &addr, &addr_len);
  832.  
  833.     if ( v5 != -1 )
  834.  
  835.     {
  836.  
  837.       v6 = fork();
  838.  
  839.       if ( v6 != -1 )
  840.  
  841.       {
  842.  
  843.         if ( !v6 )
  844.  
  845.         {
  846.  
  847.           close(fd);
  848.  
  849.           status = a2(v5);
  850.  
  851.           close(v5);
  852.  
  853.           exit(status);
  854.  
  855.         }
  856.  
  857.         close(v5);
  858.  
  859.       }
  860.  
  861.     }
  862.  
  863.   }
  864.  
  865. }
  866.  
  867.  
  868.  
  869. //----- (0804915E) --------------------------------------------------------
  870.  
  871. int __cdecl sub_804915E(const char *name)
  872.  
  873. {
  874.  
  875.   int v2; // [sp+1Ch] [bp-Ch]@1
  876.  
  877.  
  878.  
  879.   v2 = (int)getpwnam(name);
  880.  
  881.   if ( !v2 )
  882.  
  883.     err(-1, "Failed to find user %s\n", name);
  884.  
  885.   if ( sub_80491BE(v2) == -1 )
  886.  
  887.     err(-1, "drop_privs failed!\n");
  888.  
  889.   return 0;
  890.  
  891. }
  892.  
  893.  
  894.  
  895. //----- (080491BE) --------------------------------------------------------
  896.  
  897. int __cdecl sub_80491BE(int a1)
  898.  
  899. {
  900.  
  901.   int result; // eax@2
  902.  
  903.   int v2; // ebx@8
  904.  
  905.   __gid_t v3; // eax@8
  906.  
  907.   int v4; // ebx@12
  908.  
  909.   __uid_t v5; // eax@12
  910.  
  911.   __uid_t v6; // [sp+14h] [bp-14h]@1
  912.  
  913.   __gid_t v7; // [sp+18h] [bp-10h]@1
  914.  
  915.  
  916.  
  917.   v6 = getuid();
  918.  
  919.   v7 = getgid();
  920.  
  921.   initgroups(*(const char **)a1, *(_DWORD *)(a1 + 12));
  922.  
  923.   if ( setresgid(*(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 12)) >= 0 )
  924.  
  925.   {
  926.  
  927.     if ( setresuid(*(_DWORD *)(a1 + 8), *(_DWORD *)(a1 + 8)) >= 0 )
  928.  
  929.     {
  930.  
  931.       if ( *(_DWORD *)(a1 + 12) == v7 || setgid(v7) == -1 && setegid(v7) == -1 )
  932.  
  933.       {
  934.  
  935.         if ( *(_DWORD *)(a1 + 8) == v6 || setuid(v6) == -1 && seteuid(v6) == -1 )
  936.  
  937.         {
  938.  
  939.           if ( getgid() == *(_DWORD *)(a1 + 12) && getegid() == *(_DWORD *)(a1 + 12) )
  940.  
  941.           {
  942.  
  943.             if ( getuid() == *(_DWORD *)(a1 + 8) && geteuid() == *(_DWORD *)(a1 + 8) )
  944.  
  945.               result = chdir(*(const char **)(a1 + 20));
  946.  
  947.             else
  948.  
  949.               result = -1;
  950.  
  951.           }
  952.  
  953.           else
  954.  
  955.           {
  956.  
  957.             result = -1;
  958.  
  959.           }
  960.  
  961.         }
  962.  
  963.         else
  964.  
  965.         {
  966.  
  967.           v4 = *(_DWORD *)(a1 + 8);
  968.  
  969.           v5 = getuid();
  970.  
  971.           printf("setgid current uid: %d target uid: %d\n", v5, v4);
  972.  
  973.           result = -1;
  974.  
  975.         }
  976.  
  977.       }
  978.  
  979.       else
  980.  
  981.       {
  982.  
  983.         v2 = *(_DWORD *)(a1 + 12);
  984.  
  985.         v3 = getgid();
  986.  
  987.         printf("setgid current gid: %d target gid: %d\n", v3, v2);
  988.  
  989.         result = -1;
  990.  
  991.       }
  992.  
  993.     }
  994.  
  995.     else
  996.  
  997.     {
  998.  
  999.       result = -1;
  1000.  
  1001.     }
  1002.  
  1003.   }
  1004.  
  1005.   else
  1006.  
  1007.   {
  1008.  
  1009.     result = -1;
  1010.  
  1011.   }
  1012.  
  1013.   return result;
  1014.  
  1015. }
  1016.  
  1017. // 8048A30: using guessed type int __cdecl setresuid(_DWORD, _DWORD);
  1018.  
  1019. // 8048A40: using guessed type int __cdecl setresgid(_DWORD, _DWORD);
  1020.  
  1021.  
  1022.  
  1023. //----- (0804935C) --------------------------------------------------------
  1024.  
  1025. int __cdecl sub_804935C(int a1)
  1026.  
  1027. {
  1028.  
  1029.   int result; // eax@1
  1030.  
  1031.  
  1032.  
  1033.   *(_DWORD *)(a1 + 4) = 0;
  1034.  
  1035.   *(_DWORD *)a1 = *(_DWORD *)(a1 + 4);
  1036.  
  1037.   *(_DWORD *)(a1 + 8) = -559038737;
  1038.  
  1039.   *(_DWORD *)(a1 + 12) = -782326291;
  1040.  
  1041.   *(_DWORD *)(a1 + 16) = -553727763;
  1042.  
  1043.   result = a1;
  1044.  
  1045.   *(_DWORD *)(a1 + 20) = -1161901314;
  1046.  
  1047.   return result;
  1048.  
  1049. }
  1050.  
  1051.  
  1052.  
  1053. //----- (0804939E) --------------------------------------------------------
  1054.  
  1055. char __cdecl sub_804939E(int a1, int a2, unsigned int a3)
  1056.  
  1057. {
  1058.  
  1059.   char result; // al@9
  1060.  
  1061.   int v4[16]; // [sp+14h] [bp-54h]@6
  1062.  
  1063.   int v5; // [sp+54h] [bp-14h]@1
  1064.  
  1065.   unsigned int v6; // [sp+58h] [bp-10h]@5
  1066.  
  1067.   int v7; // [sp+5Ch] [bp-Ch]@5
  1068.  
  1069.  
  1070.  
  1071.   v5 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1072.  
  1073.   if ( *(_DWORD *)a1 + 8 * a3 < *(_DWORD *)a1 )
  1074.  
  1075.     ++*(_DWORD *)(a1 + 4);
  1076.  
  1077.   *(_DWORD *)a1 += 8 * a3;
  1078.  
  1079.   *(_DWORD *)(a1 + 4) += a3 >> 29;
  1080.  
  1081.   while ( 1 )
  1082.  
  1083.   {
  1084.  
  1085.     result = a3-- != 0;
  1086.  
  1087.     if ( !result )
  1088.  
  1089.       break;
  1090.  
  1091.     *(_BYTE *)(a1 + v5++ + 24) = *(_BYTE *)a2++;
  1092.  
  1093.     if ( v5 == 64 )
  1094.  
  1095.     {
  1096.  
  1097.       v6 = 0;
  1098.  
  1099.       v7 = 0;
  1100.  
  1101.       while ( v6 <= 0xF )
  1102.  
  1103.       {
  1104.  
  1105.         v4[v6++] = (*(_BYTE *)(a1 + v7 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v7 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v7 + 3 + 24) << 24) | *(_BYTE *)(a1 + v7 + 24);
  1106.  
  1107.         v7 += 4;
  1108.  
  1109.       }
  1110.  
  1111.       sub_8049649(a1 + 8, (int)v4);
  1112.  
  1113.       v5 = 0;
  1114.  
  1115.     }
  1116.  
  1117.   }
  1118.  
  1119.   return result;
  1120.  
  1121. }
  1122.  
  1123. // 804939E: using guessed type int var_54[16];
  1124.  
  1125.  
  1126.  
  1127. //----- (080494D4) --------------------------------------------------------
  1128.  
  1129. int __cdecl sub_80494D4(int a1)
  1130.  
  1131. {
  1132.  
  1133.   unsigned int v1; // eax@2
  1134.  
  1135.   int result; // eax@7
  1136.  
  1137.   int v3[14]; // [sp+10h] [bp-58h]@5
  1138.  
  1139.   int v4; // [sp+48h] [bp-20h]@1
  1140.  
  1141.   int v5; // [sp+4Ch] [bp-1Ch]@1
  1142.  
  1143.   int v6; // [sp+50h] [bp-18h]@1
  1144.  
  1145.   unsigned int v7; // [sp+54h] [bp-14h]@4
  1146.  
  1147.   int v8; // [sp+58h] [bp-10h]@4
  1148.  
  1149.   unsigned int v9; // [sp+5Ch] [bp-Ch]@4
  1150.  
  1151.  
  1152.  
  1153.   v4 = *(_DWORD *)a1;
  1154.  
  1155.   v5 = *(_DWORD *)(a1 + 4);
  1156.  
  1157.   v6 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1158.  
  1159.   if ( v6 > 55 )
  1160.  
  1161.     v1 = 120 - v6;
  1162.  
  1163.   else
  1164.  
  1165.     v1 = 56 - v6;
  1166.  
  1167.   v9 = v1;
  1168.  
  1169.   sub_804939E(a1, (int)&unk_804E3C0, v1);
  1170.  
  1171.   v7 = 0;
  1172.  
  1173.   v8 = 0;
  1174.  
  1175.   while ( v7 <= 0xD )
  1176.  
  1177.   {
  1178.  
  1179.     v3[v7++] = (*(_BYTE *)(a1 + v8 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v8 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v8 + 3 + 24) << 24) | *(_BYTE *)(a1 + v8 + 24);
  1180.  
  1181.     v8 += 4;
  1182.  
  1183.   }
  1184.  
  1185.   result = sub_8049649(a1 + 8, (int)v3);
  1186.  
  1187.   v7 = 0;
  1188.  
  1189.   v8 = 0;
  1190.  
  1191.   while ( v7 <= 3 )
  1192.  
  1193.   {
  1194.  
  1195.     *(_BYTE *)(a1 + v8 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8);
  1196.  
  1197.     *(_BYTE *)(a1 + v8 + 1 + 88) = *(_WORD *)(a1 + 4 * v7 + 8) >> 8;
  1198.  
  1199.     *(_BYTE *)(a1 + v8 + 2 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8) >> 16;
  1200.  
  1201.     result = a1;
  1202.  
  1203.     *(_BYTE *)(a1 + v8 + 3 + 88) = *(_DWORD *)(a1 + 4 * v7++ + 8) >> 24;
  1204.  
  1205.     v8 += 4;
  1206.  
  1207.   }
  1208.  
  1209.   return result;
  1210.  
  1211. }
  1212.  
  1213. // 80494D4: using guessed type int var_58[14];
  1214.  
  1215.  
  1216.  
  1217. //----- (08049649) --------------------------------------------------------
  1218.  
  1219. int __cdecl sub_8049649(int a1, int a2)
  1220.  
  1221. {
  1222.  
  1223.   int result; // eax@1
  1224.  
  1225.   int v3; // ST04_4@1
  1226.  
  1227.   int v4; // ST08_4@1
  1228.  
  1229.   int v5; // ST0C_4@1
  1230.  
  1231.   int v6; // et0@1
  1232.  
  1233.   int v7; // ST00_4@1
  1234.  
  1235.   int v8; // et0@1
  1236.  
  1237.   int v9; // ST0C_4@1
  1238.  
  1239.   int v10; // et0@1
  1240.  
  1241.   int v11; // ST08_4@1
  1242.  
  1243.   int v12; // et0@1
  1244.  
  1245.   int v13; // ST04_4@1
  1246.  
  1247.   int v14; // et0@1
  1248.  
  1249.   int v15; // ST00_4@1
  1250.  
  1251.   int v16; // et0@1
  1252.  
  1253.   int v17; // ST0C_4@1
  1254.  
  1255.   int v18; // et0@1
  1256.  
  1257.   int v19; // ST08_4@1
  1258.  
  1259.   int v20; // et0@1
  1260.  
  1261.   int v21; // ST04_4@1
  1262.  
  1263.   int v22; // et0@1
  1264.  
  1265.   int v23; // ST00_4@1
  1266.  
  1267.   int v24; // et0@1
  1268.  
  1269.   int v25; // ST0C_4@1
  1270.  
  1271.   int v26; // et0@1
  1272.  
  1273.   int v27; // ST08_4@1
  1274.  
  1275.   int v28; // et0@1
  1276.  
  1277.   int v29; // ST04_4@1
  1278.  
  1279.   int v30; // et0@1
  1280.  
  1281.   int v31; // ST00_4@1
  1282.  
  1283.   int v32; // et0@1
  1284.  
  1285.   int v33; // ST0C_4@1
  1286.  
  1287.   int v34; // et0@1
  1288.  
  1289.   int v35; // ST08_4@1
  1290.  
  1291.   int v36; // et0@1
  1292.  
  1293.   int v37; // ST04_4@1
  1294.  
  1295.   int v38; // et0@1
  1296.  
  1297.   int v39; // ST00_4@1
  1298.  
  1299.   int v40; // et0@1
  1300.  
  1301.   int v41; // ST0C_4@1
  1302.  
  1303.   int v42; // et0@1
  1304.  
  1305.   int v43; // ST08_4@1
  1306.  
  1307.   int v44; // et0@1
  1308.  
  1309.   int v45; // ST04_4@1
  1310.  
  1311.   int v46; // et0@1
  1312.  
  1313.   int v47; // ST00_4@1
  1314.  
  1315.   int v48; // et0@1
  1316.  
  1317.   int v49; // ST0C_4@1
  1318.  
  1319.   int v50; // et0@1
  1320.  
  1321.   int v51; // ST08_4@1
  1322.  
  1323.   int v52; // et0@1
  1324.  
  1325.   int v53; // ST04_4@1
  1326.  
  1327.   int v54; // et0@1
  1328.  
  1329.   int v55; // ST00_4@1
  1330.  
  1331.   int v56; // et0@1
  1332.  
  1333.   int v57; // ST0C_4@1
  1334.  
  1335.   int v58; // et0@1
  1336.  
  1337.   int v59; // ST08_4@1
  1338.  
  1339.   int v60; // et0@1
  1340.  
  1341.   int v61; // ST04_4@1
  1342.  
  1343.   int v62; // et0@1
  1344.  
  1345.   int v63; // ST00_4@1
  1346.  
  1347.   int v64; // et0@1
  1348.  
  1349.   int v65; // ST0C_4@1
  1350.  
  1351.   int v66; // et0@1
  1352.  
  1353.   int v67; // ST08_4@1
  1354.  
  1355.   int v68; // et0@1
  1356.  
  1357.   int v69; // ST04_4@1
  1358.  
  1359.   int v70; // et0@1
  1360.  
  1361.   int v71; // ST00_4@1
  1362.  
  1363.   int v72; // et0@1
  1364.  
  1365.   int v73; // ST0C_4@1
  1366.  
  1367.   int v74; // et0@1
  1368.  
  1369.   int v75; // ST08_4@1
  1370.  
  1371.   int v76; // et0@1
  1372.  
  1373.   int v77; // ST04_4@1
  1374.  
  1375.   int v78; // et0@1
  1376.  
  1377.   int v79; // ST00_4@1
  1378.  
  1379.   int v80; // et0@1
  1380.  
  1381.   int v81; // ST0C_4@1
  1382.  
  1383.   int v82; // et0@1
  1384.  
  1385.   int v83; // ST08_4@1
  1386.  
  1387.   int v84; // et0@1
  1388.  
  1389.   int v85; // ST04_4@1
  1390.  
  1391.   int v86; // et0@1
  1392.  
  1393.   int v87; // ST00_4@1
  1394.  
  1395.   int v88; // et0@1
  1396.  
  1397.   int v89; // ST0C_4@1
  1398.  
  1399.   int v90; // et0@1
  1400.  
  1401.   int v91; // ST08_4@1
  1402.  
  1403.   int v92; // et0@1
  1404.  
  1405.   int v93; // ST04_4@1
  1406.  
  1407.   int v94; // et0@1
  1408.  
  1409.   int v95; // ST00_4@1
  1410.  
  1411.   int v96; // et0@1
  1412.  
  1413.   int v97; // ST0C_4@1
  1414.  
  1415.   int v98; // et0@1
  1416.  
  1417.   int v99; // ST08_4@1
  1418.  
  1419.   int v100; // et0@1
  1420.  
  1421.   int v101; // ST04_4@1
  1422.  
  1423.   int v102; // et0@1
  1424.  
  1425.   int v103; // ST00_4@1
  1426.  
  1427.   int v104; // et0@1
  1428.  
  1429.   int v105; // ST0C_4@1
  1430.  
  1431.   int v106; // et0@1
  1432.  
  1433.   int v107; // ST08_4@1
  1434.  
  1435.   int v108; // et0@1
  1436.  
  1437.   int v109; // ST04_4@1
  1438.  
  1439.   int v110; // et0@1
  1440.  
  1441.   int v111; // ST00_4@1
  1442.  
  1443.   int v112; // et0@1
  1444.  
  1445.   int v113; // ST0C_4@1
  1446.  
  1447.   int v114; // et0@1
  1448.  
  1449.   int v115; // ST08_4@1
  1450.  
  1451.   int v116; // et0@1
  1452.  
  1453.   int v117; // ST04_4@1
  1454.  
  1455.   int v118; // et0@1
  1456.  
  1457.   int v119; // ST00_4@1
  1458.  
  1459.   int v120; // et0@1
  1460.  
  1461.   int v121; // ST0C_4@1
  1462.  
  1463.   int v122; // et0@1
  1464.  
  1465.   int v123; // ST08_4@1
  1466.  
  1467.   int v124; // et0@1
  1468.  
  1469.   int v125; // ST04_4@1
  1470.  
  1471.   int v126; // et0@1
  1472.  
  1473.   int v127; // ST00_4@1
  1474.  
  1475.   int v128; // et0@1
  1476.  
  1477.   int v129; // ST0C_4@1
  1478.  
  1479.   int v130; // et0@1
  1480.  
  1481.   int v131; // ST08_4@1
  1482.  
  1483.   int v132; // et0@1
  1484.  
  1485.  
  1486.  
  1487.   v3 = *(_DWORD *)(a1 + 4);
  1488.  
  1489.   v4 = *(_DWORD *)(a1 + 8);
  1490.  
  1491.   v5 = *(_DWORD *)(a1 + 12);
  1492.  
  1493.   v6 = __ROR__(*(_DWORD *)a1 + (v5 & ~v3 | v4 & v3) + *(_DWORD *)a2 - 680876936, 25);
  1494.  
  1495.   v7 = v3 + v6;
  1496.  
  1497.   v8 = __ROR__(v5 + (v4 & ~(v3 + v6) | v3 & (v3 + v6)) + *(_DWORD *)(a2 + 4) - 389564586, 20);
  1498.  
  1499.   v9 = v7 + v8;
  1500.  
  1501.   v10 = __ROR__(v4 + (v3 & ~(v7 + v8) | v7 & (v7 + v8)) + *(_DWORD *)(a2 + 8) + 606105819, 15);
  1502.  
  1503.   v11 = v9 + v10;
  1504.  
  1505.   v12 = __ROR__(v3 + (v7 & ~(v9 + v10) | v9 & (v9 + v10)) + *(_DWORD *)(a2 + 12) - 1044525330, 10);
  1506.  
  1507.   v13 = v11 + v12;
  1508.  
  1509.   v14 = __ROR__(v7 + (v9 & ~(v11 + v12) | v11 & (v11 + v12)) + *(_DWORD *)(a2 + 16) - 176418897, 25);
  1510.  
  1511.   v15 = v13 + v14;
  1512.  
  1513.   v16 = __ROR__(v9 + (v11 & ~(v13 + v14) | v13 & (v13 + v14)) + *(_DWORD *)(a2 + 20) + 1200080426, 20);
  1514.  
  1515.   v17 = v15 + v16;
  1516.  
  1517.   v18 = __ROR__(v11 + (v13 & ~(v15 + v16) | v15 & (v15 + v16)) + *(_DWORD *)(a2 + 24) - 1473231341, 15);
  1518.  
  1519.   v19 = v17 + v18;
  1520.  
  1521.   v20 = __ROR__(v13 + (v15 & ~(v17 + v18) | v17 & (v17 + v18)) + *(_DWORD *)(a2 + 28) - 45705983, 10);
  1522.  
  1523.   v21 = v19 + v20;
  1524.  
  1525.   v22 = __ROR__(v15 + (v17 & ~(v19 + v20) | v19 & (v19 + v20)) + *(_DWORD *)(a2 + 32) + 1770035416, 25);
  1526.  
  1527.   v23 = v21 + v22;
  1528.  
  1529.   v24 = __ROR__(v17 + (v19 & ~(v21 + v22) | v21 & (v21 + v22)) + *(_DWORD *)(a2 + 36) - 1958414417, 20);
  1530.  
  1531.   v25 = v23 + v24;
  1532.  
  1533.   v26 = __ROR__(v19 + (v21 & ~(v23 + v24) | v23 & (v23 + v24)) + *(_DWORD *)(a2 + 40) - 42063, 15);
  1534.  
  1535.   v27 = v25 + v26;
  1536.  
  1537.   v28 = __ROR__(v21 + (v23 & ~(v25 + v26) | v25 & (v25 + v26)) + *(_DWORD *)(a2 + 44) - 1990404162, 10);
  1538.  
  1539.   v29 = v27 + v28;
  1540.  
  1541.   v30 = __ROR__(v23 + (v25 & ~(v27 + v28) | v27 & (v27 + v28)) + *(_DWORD *)(a2 + 48) + 1804603682, 25);
  1542.  
  1543.   v31 = v29 + v30;
  1544.  
  1545.   v32 = __ROR__(v25 + (v27 & ~(v29 + v30) | v29 & (v29 + v30)) + *(_DWORD *)(a2 + 52) - 40341101, 20);
  1546.  
  1547.   v33 = v31 + v32;
  1548.  
  1549.   v34 = __ROR__(v27 + (v29 & ~(v31 + v32) | v31 & (v31 + v32)) + *(_DWORD *)(a2 + 56) - 1502002290, 15);
  1550.  
  1551.   v35 = v33 + v34;
  1552.  
  1553.   v36 = __ROR__(v29 + (v31 & ~(v33 + v34) | v33 & (v33 + v34)) + *(_DWORD *)(a2 + 60) + 1236535329, 10);
  1554.  
  1555.   v37 = v35 + v36;
  1556.  
  1557.   v38 = __ROR__(v31 + (v35 & ~v33 | v33 & (v35 + v36)) + *(_DWORD *)(a2 + 4) - 165796510, 27);
  1558.  
  1559.   v39 = v37 + v38;
  1560.  
  1561.   v40 = __ROR__(v33 + (v37 & ~v35 | v35 & (v37 + v38)) + *(_DWORD *)(a2 + 24) - 1069501632, 23);
  1562.  
  1563.   v41 = v39 + v40;
  1564.  
  1565.   v42 = __ROR__(v35 + (v39 & ~v37 | v37 & (v39 + v40)) + *(_DWORD *)(a2 + 44) + 643717713, 18);
  1566.  
  1567.   v43 = v41 + v42;
  1568.  
  1569.   v44 = __ROR__(v37 + (v41 & ~v39 | v39 & (v41 + v42)) + *(_DWORD *)a2 - 373897302, 12);
  1570.  
  1571.   v45 = v43 + v44;
  1572.  
  1573.   v46 = __ROR__(v39 + (v43 & ~v41 | v41 & (v43 + v44)) + *(_DWORD *)(a2 + 20) - 701558691, 27);
  1574.  
  1575.   v47 = v45 + v46;
  1576.  
  1577.   v48 = __ROR__(v41 + (v45 & ~v43 | v43 & (v45 + v46)) + *(_DWORD *)(a2 + 40) + 38016083, 23);
  1578.  
  1579.   v49 = v47 + v48;
  1580.  
  1581.   v50 = __ROR__(v43 + (v47 & ~v45 | v45 & (v47 + v48)) + *(_DWORD *)(a2 + 60) - 660478335, 18);
  1582.  
  1583.   v51 = v49 + v50;
  1584.  
  1585.   v52 = __ROR__(v45 + (v49 & ~v47 | v47 & (v49 + v50)) + *(_DWORD *)(a2 + 16) - 405537848, 12);
  1586.  
  1587.   v53 = v51 + v52;
  1588.  
  1589.   v54 = __ROR__(v47 + (v51 & ~v49 | v49 & (v51 + v52)) + *(_DWORD *)(a2 + 36) + 568446438, 27);
  1590.  
  1591.   v55 = v53 + v54;
  1592.  
  1593.   v56 = __ROR__(v49 + (v53 & ~v51 | v51 & (v53 + v54)) + *(_DWORD *)(a2 + 56) - 1019803690, 23);
  1594.  
  1595.   v57 = v55 + v56;
  1596.  
  1597.   v58 = __ROR__(v51 + (v55 & ~v53 | v53 & (v55 + v56)) + *(_DWORD *)(a2 + 12) - 187363961, 18);
  1598.  
  1599.   v59 = v57 + v58;
  1600.  
  1601.   v60 = __ROR__(v53 + (v57 & ~v55 | v55 & (v57 + v58)) + *(_DWORD *)(a2 + 32) + 1163531501, 12);
  1602.  
  1603.   v61 = v59 + v60;
  1604.  
  1605.   v62 = __ROR__(v55 + (v59 & ~v57 | v57 & (v59 + v60)) + *(_DWORD *)(a2 + 52) - 1444681467, 27);
  1606.  
  1607.   v63 = v61 + v62;
  1608.  
  1609.   v64 = __ROR__(v57 + (v61 & ~v59 | v59 & (v61 + v62)) + *(_DWORD *)(a2 + 8) - 51403784, 23);
  1610.  
  1611.   v65 = v63 + v64;
  1612.  
  1613.   v66 = __ROR__(v59 + (v63 & ~v61 | v61 & (v63 + v64)) + *(_DWORD *)(a2 + 28) + 1735328473, 18);
  1614.  
  1615.   v67 = v65 + v66;
  1616.  
  1617.   v68 = __ROR__(v61 + (v65 & ~v63 | v63 & (v65 + v66)) + *(_DWORD *)(a2 + 48) - 1926607734, 12);
  1618.  
  1619.   v69 = v67 + v68;
  1620.  
  1621.   v70 = __ROR__(v63 + (v65 ^ (v67 + v68) ^ v67) + *(_DWORD *)(a2 + 20) - 378558, 28);
  1622.  
  1623.   v71 = v69 + v70;
  1624.  
  1625.   v72 = __ROR__(v65 + (v67 ^ (v69 + v70) ^ v69) + *(_DWORD *)(a2 + 32) - 2022574463, 21);
  1626.  
  1627.   v73 = v71 + v72;
  1628.  
  1629.   v74 = __ROR__(v67 + (v69 ^ (v71 + v72) ^ v71) + *(_DWORD *)(a2 + 44) + 1839030562, 16);
  1630.  
  1631.   v75 = v73 + v74;
  1632.  
  1633.   v76 = __ROR__(v69 + (v71 ^ (v73 + v74) ^ v73) + *(_DWORD *)(a2 + 56) - 35309556, 9);
  1634.  
  1635.   v77 = v75 + v76;
  1636.  
  1637.   v78 = __ROR__(v71 + (v73 ^ (v75 + v76) ^ v75) + *(_DWORD *)(a2 + 4) - 1530992060, 28);
  1638.  
  1639.   v79 = v77 + v78;
  1640.  
  1641.   v80 = __ROR__(v73 + (v75 ^ (v77 + v78) ^ v77) + *(_DWORD *)(a2 + 16) + 1272893353, 21);
  1642.  
  1643.   v81 = v79 + v80;
  1644.  
  1645.   v82 = __ROR__(v75 + (v77 ^ (v79 + v80) ^ v79) + *(_DWORD *)(a2 + 28) - 155497632, 16);
  1646.  
  1647.   v83 = v81 + v82;
  1648.  
  1649.   v84 = __ROR__(v77 + (v79 ^ (v81 + v82) ^ v81) + *(_DWORD *)(a2 + 40) - 1094730640, 9);
  1650.  
  1651.   v85 = v83 + v84;
  1652.  
  1653.   v86 = __ROR__(v79 + (v81 ^ (v83 + v84) ^ v83) + *(_DWORD *)(a2 + 52) + 681279174, 28);
  1654.  
  1655.   v87 = v85 + v86;
  1656.  
  1657.   v88 = __ROR__(v81 + (v83 ^ (v85 + v86) ^ v85) + *(_DWORD *)a2 - 358537222, 21);
  1658.  
  1659.   v89 = v87 + v88;
  1660.  
  1661.   v90 = __ROR__(v83 + (v85 ^ (v87 + v88) ^ v87) + *(_DWORD *)(a2 + 12) - 722521979, 16);
  1662.  
  1663.   v91 = v89 + v90;
  1664.  
  1665.   v92 = __ROR__(v85 + (v87 ^ (v89 + v90) ^ v89) + *(_DWORD *)(a2 + 24) + 76029189, 9);
  1666.  
  1667.   v93 = v91 + v92;
  1668.  
  1669.   v94 = __ROR__(v87 + (v89 ^ (v91 + v92) ^ v91) + *(_DWORD *)(a2 + 36) - 640364487, 28);
  1670.  
  1671.   v95 = v93 + v94;
  1672.  
  1673.   v96 = __ROR__(v89 + (v91 ^ (v93 + v94) ^ v93) + *(_DWORD *)(a2 + 48) - 421815835, 21);
  1674.  
  1675.   v97 = v95 + v96;
  1676.  
  1677.   v98 = __ROR__(v91 + (v93 ^ (v95 + v96) ^ v95) + *(_DWORD *)(a2 + 60) + 530742520, 16);
  1678.  
  1679.   v99 = v97 + v98;
  1680.  
  1681.   v100 = __ROR__(v93 + (v95 ^ (v97 + v98) ^ v97) + *(_DWORD *)(a2 + 8) - 995338651, 9);
  1682.  
  1683.   v101 = v99 + v100;
  1684.  
  1685.   v102 = __ROR__(v95 + (v99 ^ ((v99 + v100) | ~v97)) + *(_DWORD *)a2 - 198630844, 26);
  1686.  
  1687.   v103 = v101 + v102;
  1688.  
  1689.   v104 = __ROR__(v97 + (v101 ^ ((v101 + v102) | ~v99)) + *(_DWORD *)(a2 + 28) + 1126891415, 22);
  1690.  
  1691.   v105 = v103 + v104;
  1692.  
  1693.   v106 = __ROR__(v99 + (v103 ^ ((v103 + v104) | ~v101)) + *(_DWORD *)(a2 + 56) - 1416354905, 17);
  1694.  
  1695.   v107 = v105 + v106;
  1696.  
  1697.   v108 = __ROR__(v101 + (v105 ^ ((v105 + v106) | ~v103)) + *(_DWORD *)(a2 + 20) - 57434055, 11);
  1698.  
  1699.   v109 = v107 + v108;
  1700.  
  1701.   v110 = __ROR__(v103 + (v107 ^ ((v107 + v108) | ~v105)) + *(_DWORD *)(a2 + 48) + 1700485571, 26);
  1702.  
  1703.   v111 = v109 + v110;
  1704.  
  1705.   v112 = __ROR__(v105 + (v109 ^ ((v109 + v110) | ~v107)) + *(_DWORD *)(a2 + 12) - 1894986606, 22);
  1706.  
  1707.   v113 = v111 + v112;
  1708.  
  1709.   v114 = __ROR__(v107 + (v111 ^ ((v111 + v112) | ~v109)) + *(_DWORD *)(a2 + 40) - 1051523, 17);
  1710.  
  1711.   v115 = v113 + v114;
  1712.  
  1713.   v116 = __ROR__(v109 + (v113 ^ ((v113 + v114) | ~v111)) + *(_DWORD *)(a2 + 4) - 2054922799, 11);
  1714.  
  1715.   v117 = v115 + v116;
  1716.  
  1717.   v118 = __ROR__(v111 + (v115 ^ ((v115 + v116) | ~v113)) + *(_DWORD *)(a2 + 32) + 1873313359, 26);
  1718.  
  1719.   v119 = v117 + v118;
  1720.  
  1721.   v120 = __ROR__(v113 + (v117 ^ ((v117 + v118) | ~v115)) + *(_DWORD *)(a2 + 60) - 30611744, 22);
  1722.  
  1723.   v121 = v119 + v120;
  1724.  
  1725.   v122 = __ROR__(v115 + (v119 ^ ((v119 + v120) | ~v117)) + *(_DWORD *)(a2 + 24) - 1560198380, 17);
  1726.  
  1727.   v123 = v121 + v122;
  1728.  
  1729.   v124 = __ROR__(v117 + (v121 ^ ((v121 + v122) | ~v119)) + *(_DWORD *)(a2 + 52) + 1309151649, 11);
  1730.  
  1731.   v125 = v123 + v124;
  1732.  
  1733.   v126 = __ROR__(v119 + (v123 ^ ((v123 + v124) | ~v121)) + *(_DWORD *)(a2 + 16) - 145523070, 26);
  1734.  
  1735.   v127 = v125 + v126;
  1736.  
  1737.   v128 = __ROR__(v121 + (v125 ^ ((v125 + v126) | ~v123)) + *(_DWORD *)(a2 + 44) - 1120210379, 22);
  1738.  
  1739.   v129 = v127 + v128;
  1740.  
  1741.   v130 = __ROR__(v123 + (v127 ^ ((v127 + v128) | ~v125)) + *(_DWORD *)(a2 + 8) + 718787259, 17);
  1742.  
  1743.   v131 = v129 + v130;
  1744.  
  1745.   v132 = __ROR__(v125 + (v129 ^ ((v129 + v130) | ~v127)) + *(_DWORD *)(a2 + 36) - 343485551, 11);
  1746.  
  1747.   *(_DWORD *)a1 += v127;
  1748.  
  1749.   *(_DWORD *)(a1 + 4) += v131 + v132;
  1750.  
  1751.   *(_DWORD *)(a1 + 8) += v131;
  1752.  
  1753.   result = v129 + *(_DWORD *)(a1 + 12);
  1754.  
  1755.   *(_DWORD *)(a1 + 12) = result;
  1756.  
  1757.   return result;
  1758.  
  1759. }
  1760.  
  1761.  
  1762.  
  1763. //----- (0804A296) --------------------------------------------------------
  1764.  
  1765. int __cdecl sub_804A296(int a1)
  1766.  
  1767. {
  1768.  
  1769.   int result; // eax@2
  1770.  
  1771.   signed int i; // [sp+1Ch] [bp-Ch]@1
  1772.  
  1773.  
  1774.  
  1775.   for ( i = 0; i <= 15; ++i )
  1776.  
  1777.     result = printf("%02x", *(_BYTE *)(a1 + i + 88));
  1778.  
  1779.   return result;
  1780.  
  1781. }
  1782.  
  1783.  
  1784.  
  1785. //----- (0804A3DC) --------------------------------------------------------
  1786.  
  1787. int __cdecl sub_804A3DC(const char *s)
  1788.  
  1789. {
  1790.  
  1791.   char v2; // [sp+14h] [bp-74h]@1
  1792.  
  1793.   unsigned int v3; // [sp+7Ch] [bp-Ch]@1
  1794.  
  1795.  
  1796.  
  1797.   v3 = strlen(s);
  1798.  
  1799.   sub_804935C((int)&v2);
  1800.  
  1801.   sub_804939E((int)&v2, (int)s, v3);
  1802.  
  1803.   sub_80494D4((int)&v2);
  1804.  
  1805.   sub_804A296((int)&v2);
  1806.  
  1807.   return printf(" \"%s\"\n\n", s);
  1808.  
  1809. }
  1810.  
  1811.  
  1812.  
  1813. //----- (0804A443) --------------------------------------------------------
  1814.  
  1815. int __cdecl sub_804A443(const char *filename)
  1816.  
  1817. {
  1818.  
  1819.   int result; // eax@2
  1820.  
  1821.   char ptr; // [sp+10h] [bp-478h]@4
  1822.  
  1823.   char v3; // [sp+410h] [bp-78h]@3
  1824.  
  1825.   FILE *stream; // [sp+478h] [bp-10h]@1
  1826.  
  1827.   unsigned int v5; // [sp+47Ch] [bp-Ch]@4
  1828.  
  1829.  
  1830.  
  1831.   stream = fopen(filename, "rb");
  1832.  
  1833.   if ( stream )
  1834.  
  1835.   {
  1836.  
  1837.     sub_804935C((int)&v3);
  1838.  
  1839.     while ( 1 )
  1840.  
  1841.     {
  1842.  
  1843.       v5 = fread(&ptr, 1u, 0x400u, stream);
  1844.  
  1845.       if ( !v5 )
  1846.  
  1847.         break;
  1848.  
  1849.       sub_804939E((int)&v3, (int)&ptr, v5);
  1850.  
  1851.     }
  1852.  
  1853.     sub_80494D4((int)&v3);
  1854.  
  1855.     sub_804A296((int)&v3);
  1856.  
  1857.     printf(" %s\n", filename);
  1858.  
  1859.     result = fclose(stream);
  1860.  
  1861.   }
  1862.  
  1863.   else
  1864.  
  1865.   {
  1866.  
  1867.     result = printf("%s can't be opened.\n", filename);
  1868.  
  1869.   }
  1870.  
  1871.   return result;
  1872.  
  1873. }
  1874.  
  1875.  
  1876.  
  1877. //----- (0804A60A) --------------------------------------------------------
  1878.  
  1879. char *__cdecl sub_804A60A(int a1, char *dest)
  1880.  
  1881. {
  1882.  
  1883.   char *result; // eax@1
  1884.  
  1885.   char src; // [sp+16h] [bp-42h]@2
  1886.  
  1887.   int i; // [sp+48h] [bp-10h]@1
  1888.  
  1889.   int v5; // [sp+4Ch] [bp-Ch]@2
  1890.  
  1891.  
  1892.  
  1893.   result = dest;
  1894.  
  1895.   *dest = 0;
  1896.  
  1897.   for ( i = 0; i <= 15; ++i )
  1898.  
  1899.   {
  1900.  
  1901.     v5 = sprintf(&src, "%02x", *(_BYTE *)(a1 + i + 88));
  1902.  
  1903.     result = strcat(dest, &src);
  1904.  
  1905.   }
  1906.  
  1907.   return result;
  1908.  
  1909. }
  1910.  
  1911.  
  1912.  
  1913. //----- (0804A666) --------------------------------------------------------
  1914.  
  1915. char *__cdecl sub_804A666(const char *s, char *dest)
  1916.  
  1917. {
  1918.  
  1919.   int v3; // [sp+14h] [bp-74h]@1
  1920.  
  1921.   unsigned int v4; // [sp+7Ch] [bp-Ch]@1
  1922.  
  1923.  
  1924.  
  1925.   v4 = strlen(s);
  1926.  
  1927.   sub_804935C((int)&v3);
  1928.  
  1929.   sub_804939E((int)&v3, (int)s, v4);
  1930.  
  1931.   sub_80494D4((int)&v3);
  1932.  
  1933.   return sub_804A60A((int)&v3, dest);
  1934.  
  1935. }
  1936.  
  1937.  
  1938.  
  1939. //----- (0804A6C0) --------------------------------------------------------
  1940.  
  1941. int __cdecl sub_804A6C0(int fd, int a2)
  1942.  
  1943. {
  1944.  
  1945.   sub_8048F10(fd, "<node> %x\n", a2);
  1946.  
  1947.   sub_8048F10(fd, "  chickens: %u \n", *(_DWORD *)(a2 + 60));
  1948.  
  1949.   sub_8048F10(fd, "  eggs:     %u \n", *(_DWORD *)(a2 + 68));
  1950.  
  1951.   sub_8048F10(fd, "  monies:   %u \n", *(_DWORD *)(a2 + 64));
  1952.  
  1953.   sub_8048F10(fd, "  id:       %u \n", *(_DWORD *)(a2 + 72));
  1954.  
  1955.   sub_8048F10(fd, "  username: %s \n", a2);
  1956.  
  1957.   sub_8048F10(fd, "  info:     %s \n", a2 + 84);
  1958.  
  1959.   sub_8048F10(fd, "  office:   %s \n", a2 + 134);
  1960.  
  1961.   sub_8048F10(fd, "  password: %s \n\n", a2 + 20);
  1962.  
  1963.   sub_8048F10(fd, "  perm:     %u \n", *(_DWORD *)(a2 + 56));
  1964.  
  1965.   sub_8048F10(fd, "  next:     %x \n", *(_DWORD *)(a2 + 76));
  1966.  
  1967.   return sub_8048F10(fd, "  prev:     %x \n", *(_DWORD *)(a2 + 80));
  1968.  
  1969. }
  1970.  
  1971.  
  1972.  
  1973. //----- (0804A820) --------------------------------------------------------
  1974.  
  1975. int __cdecl sub_804A820(int fd, int a2)
  1976.  
  1977. {
  1978.  
  1979.   int result; // eax@3
  1980.  
  1981.   int i; // [sp+1Ch] [bp-Ch]@1
  1982.  
  1983.  
  1984.  
  1985.   for ( i = a2; ; sub_804A6C0(fd, i) )
  1986.  
  1987.   {
  1988.  
  1989.     result = *(_DWORD *)(i + 76);
  1990.  
  1991.     if ( !result )
  1992.  
  1993.       break;
  1994.  
  1995.     i = *(_DWORD *)(i + 76);
  1996.  
  1997.   }
  1998.  
  1999.   return result;
  2000.  
  2001. }
  2002.  
  2003.  
  2004.  
  2005. //----- (0804A855) --------------------------------------------------------
  2006.  
  2007. int __cdecl sub_804A855(int fd, int a2)
  2008.  
  2009. {
  2010.  
  2011.   int result; // eax@4
  2012.  
  2013.   int v3; // [sp+1Ch] [bp-Ch]@1
  2014.  
  2015.  
  2016.  
  2017.   v3 = a2;
  2018.  
  2019.   while ( 1 )
  2020.  
  2021.   {
  2022.  
  2023.     result = *(_DWORD *)(v3 + 76);
  2024.  
  2025.     if ( !result )
  2026.  
  2027.       break;
  2028.  
  2029.     v3 = *(_DWORD *)(v3 + 76);
  2030.  
  2031.     if ( !strcmp(&s1, (const char *)v3) )
  2032.  
  2033.       sub_804A6C0(fd, v3);
  2034.  
  2035.   }
  2036.  
  2037.   return result;
  2038.  
  2039. }
  2040.  
  2041.  
  2042.  
  2043. //----- (0804A8A1) --------------------------------------------------------
  2044.  
  2045. int __cdecl sub_804A8A1(int fd, char *a2, const char *s1, const char *s)
  2046.  
  2047. {
  2048.  
  2049.   char dest; // [sp+17h] [bp-31h]@3
  2050.  
  2051.   char v6; // [sp+37h] [bp-11h]@3
  2052.  
  2053.   int v7; // [sp+38h] [bp-10h]@1
  2054.  
  2055.   char *src; // [sp+3Ch] [bp-Ch]@1
  2056.  
  2057.  
  2058.  
  2059.   v7 = 1;
  2060.  
  2061.   src = a2;
  2062.  
  2063.   while ( *((_DWORD *)src + 19) )
  2064.  
  2065.   {
  2066.  
  2067.     src = (char *)*((_DWORD *)src + 19);
  2068.  
  2069.     if ( !strcmp(s1, src) )
  2070.  
  2071.     {
  2072.  
  2073.       sub_804A666(s, &dest);
  2074.  
  2075.       v6 = 0;
  2076.  
  2077.       if ( !strncmp(&dest, src + 20, 0x20u) )
  2078.  
  2079.       {
  2080.  
  2081.         sub_8048F10(fd, "lcgged in!\n", src + 20);
  2082.  
  2083.         dword_804E424 = 1;
  2084.  
  2085.         strncpy(&::s1, src, 0x14u);
  2086.  
  2087.         if ( *((_DWORD *)src + 14) > 0x1F3u )
  2088.  
  2089.           dword_804E420 = 1;
  2090.  
  2091.         return 0;
  2092.  
  2093.       }
  2094.  
  2095.     }
  2096.  
  2097.   }
  2098.  
  2099.   return v7;
  2100.  
  2101. }
  2102.  
  2103. // 804E420: using guessed type int dword_804E420;
  2104.  
  2105. // 804E424: using guessed type int dword_804E424;
  2106.  
  2107.  
  2108.  
  2109. //----- (0804A988) --------------------------------------------------------
  2110.  
  2111. void __cdecl sub_804A988()
  2112.  
  2113. {
  2114.  
  2115.   dword_804E424 = 0;
  2116.  
  2117.   dword_804E420 = 0;
  2118.  
  2119.   s1 = 0;
  2120.  
  2121. }
  2122.  
  2123. // 804E420: using guessed type int dword_804E420;
  2124.  
  2125. // 804E424: using guessed type int dword_804E424;
  2126.  
  2127.  
  2128.  
  2129. //----- (0804A9CB) --------------------------------------------------------
  2130.  
  2131. signed int __cdecl sub_804A9CB(int a1, const char *s2)
  2132.  
  2133. {
  2134.  
  2135.   int v3; // [sp+1Ch] [bp-Ch]@1
  2136.  
  2137.  
  2138.  
  2139.   v3 = a1;
  2140.  
  2141.   while ( *(_DWORD *)(v3 + 76) )
  2142.  
  2143.   {
  2144.  
  2145.     v3 = *(_DWORD *)(v3 + 76);
  2146.  
  2147.     if ( !strcmp((const char *)v3, s2) )
  2148.  
  2149.       return 1;
  2150.  
  2151.   }
  2152.  
  2153.   return 0;
  2154.  
  2155. }
  2156.  
  2157.  
  2158.  
  2159. //----- (0804AA10) --------------------------------------------------------
  2160.  
  2161. int __cdecl sub_804AA10(int fd, int a2)
  2162.  
  2163. {
  2164.  
  2165.   int i; // [sp+1Ch] [bp-Ch]@1
  2166.  
  2167.  
  2168.  
  2169.   for ( i = sub_8048E0A(fd, a2, 0x257u, 10);
  2170.  
  2171.         i != 1 || *(_BYTE *)a2 != 121 && *(_BYTE *)a2 != 110;
  2172.  
  2173.         i = sub_8048E0A(fd, a2, 0x257u, 10) )
  2174.  
  2175.     sub_8048E75(fd, "[y/n]", 0);
  2176.  
  2177.   return *(_BYTE *)a2;
  2178.  
  2179. }
  2180.  
  2181.  
  2182.  
  2183. //----- (0804AA9F) --------------------------------------------------------
  2184.  
  2185. signed int __cdecl sub_804AA9F(int fd, const char *s, int a3)
  2186.  
  2187. {
  2188.  
  2189.   signed int result; // eax@2
  2190.  
  2191.   const char dest[33]; // [sp+39h] [bp-8Fh]@3
  2192.  
  2193.   const char v5[20]; // [sp+5Ah] [bp-6Eh]@3
  2194.  
  2195.   const char v6[50]; // [sp+6Eh] [bp-5Ah]@3
  2196.  
  2197.   char src; // [sp+A0h] [bp-28h]@1
  2198.  
  2199.   int v8; // [sp+B4h] [bp-14h]@1
  2200.  
  2201.   int v9; // [sp+B8h] [bp-10h]@1
  2202.  
  2203.   int v10; // [sp+BCh] [bp-Ch]@1
  2204.  
  2205.  
  2206.  
  2207.   v8 = 0;
  2208.  
  2209.   v10 = 0;
  2210.  
  2211.   sub_8048E75(fd, "enter new username: ", 0);
  2212.  
  2213.   v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  2214.  
  2215.   s[v9] = 0;
  2216.  
  2217.   strncpy(&src, s, 0x14u);
  2218.  
  2219.   if ( sub_804A9CB(a3, &src) )
  2220.  
  2221.   {
  2222.  
  2223.     result = 1;
  2224.  
  2225.   }
  2226.  
  2227.   else
  2228.  
  2229.   {
  2230.  
  2231.     sub_8048E75(fd, "enter new info: ", 0);
  2232.  
  2233.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  2234.  
  2235.     s[v9] = 0;
  2236.  
  2237.     strncpy((char *)v6, s, 0x32u);
  2238.  
  2239.     sub_8048E75(fd, "enter new office: ", 0);
  2240.  
  2241.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  2242.  
  2243.     s[v9] = 0;
  2244.  
  2245.     strncpy((char *)v5, s, 0x14u);
  2246.  
  2247.     sub_8048E75(fd, "enter new pass: ", 0);
  2248.  
  2249.     v9 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  2250.  
  2251.     s[v9] = 0;
  2252.  
  2253.     strncpy((char *)dest, s, 0x21u);
  2254.  
  2255.     sub_804A666(s, (char *)dest);
  2256.  
  2257.     if ( sub_804B9E6(fd, a3, &src, v6, v5, dest, v8, 1, 1000, 0, 0) )
  2258.  
  2259.     {
  2260.  
  2261.       v10 = 1;
  2262.  
  2263.       sub_8048F10(fd, "insert failed.\n");
  2264.  
  2265.     }
  2266.  
  2267.     result = v10;
  2268.  
  2269.   }
  2270.  
  2271.   return result;
  2272.  
  2273. }
  2274.  
  2275.  
  2276.  
  2277. //----- (0804ACFC) --------------------------------------------------------
  2278.  
  2279. int __cdecl sub_804ACFC(int fd, const char *nptr, int a3)
  2280.  
  2281. {
  2282.  
  2283.   int result; // eax@4
  2284.  
  2285.   int v4; // [sp+2E8h] [bp-10h]@1
  2286.  
  2287.   int v5; // [sp+2ECh] [bp-Ch]@5
  2288.  
  2289.  
  2290.  
  2291.   v4 = a3;
  2292.  
  2293.   do
  2294.  
  2295.   {
  2296.  
  2297.     if ( !*(_DWORD *)(v4 + 76) )
  2298.  
  2299.       break;
  2300.  
  2301.     v4 = *(_DWORD *)(v4 + 76);
  2302.  
  2303.   }
  2304.  
  2305.   while ( strcmp(&s1, (const char *)v4) );
  2306.  
  2307.   sub_8048F10(fd, "you currently have $%u and %u eggs\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 68));
  2308.  
  2309.   sub_8048F10(fd, "market price for an egg is %u\n ", *(_DWORD *)dword_804E410);
  2310.  
  2311.   sub_8048F10(fd, "would you like to sell eggs [y/n]: ");
  2312.  
  2313.   result = sub_804AA10(fd, (int)nptr);
  2314.  
  2315.   if ( (_BYTE)result == 121 )
  2316.  
  2317.   {
  2318.  
  2319.     sub_8048F10(fd, "how many?: ");
  2320.  
  2321.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  2322.  
  2323.     v5 = atoi(nptr);
  2324.  
  2325.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 68) )
  2326.  
  2327.     {
  2328.  
  2329.       result = sub_8048F10(fd, "not enough eggs!\n");
  2330.  
  2331.     }
  2332.  
  2333.     else
  2334.  
  2335.     {
  2336.  
  2337.       *(_DWORD *)(v4 + 68) -= v5;
  2338.  
  2339.       *(_DWORD *)(v4 + 64) += v5 * *(_DWORD *)dword_804E410;
  2340.  
  2341.       result = sub_8048F10(fd, "%u sold!\n", v5);
  2342.  
  2343.     }
  2344.  
  2345.   }
  2346.  
  2347.   return result;
  2348.  
  2349. }
  2350.  
  2351.  
  2352.  
  2353. //----- (0804AE76) --------------------------------------------------------
  2354.  
  2355. int __cdecl sub_804AE76(int fd, const char *nptr, int a3)
  2356.  
  2357. {
  2358.  
  2359.   int result; // eax@4
  2360.  
  2361.   int v4; // [sp+2E4h] [bp-14h]@1
  2362.  
  2363.   int v5; // [sp+2ECh] [bp-Ch]@6
  2364.  
  2365.  
  2366.  
  2367.   v4 = a3;
  2368.  
  2369.   do
  2370.  
  2371.   {
  2372.  
  2373.     if ( !*(_DWORD *)(v4 + 76) )
  2374.  
  2375.       break;
  2376.  
  2377.     v4 = *(_DWORD *)(v4 + 76);
  2378.  
  2379.   }
  2380.  
  2381.   while ( strcmp(&s1, (const char *)v4) );
  2382.  
  2383.   sub_8048F10(fd, "you currently have $%u\n ", *(_DWORD *)(v4 + 64));
  2384.  
  2385.   sub_8048F10(fd, "would you like to incinerate some?[y/n]: ");
  2386.  
  2387.   result = sub_804AA10(fd, (int)nptr);
  2388.  
  2389.   if ( (_BYTE)result == 121 || (_BYTE)result == 110 )
  2390.  
  2391.   {
  2392.  
  2393.     sub_8048F10(fd, "how much?: ");
  2394.  
  2395.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  2396.  
  2397.     v5 = atoi(nptr);
  2398.  
  2399.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 64) )
  2400.  
  2401.     {
  2402.  
  2403.       *(_DWORD *)(v4 + 64) = 0;
  2404.  
  2405.       result = sub_8048F10(fd, "oh snap!  it's all gone! all that's left is ashes!\n");
  2406.  
  2407.     }
  2408.  
  2409.     else
  2410.  
  2411.     {
  2412.  
  2413.       *(_DWORD *)(v4 + 64) -= v5;
  2414.  
  2415.       result = sub_8048F10(fd, "%u burnt to a crisp!\n", v5);
  2416.  
  2417.     }
  2418.  
  2419.   }
  2420.  
  2421.   return result;
  2422.  
  2423. }
  2424.  
  2425.  
  2426.  
  2427. //----- (0804AFC6) --------------------------------------------------------
  2428.  
  2429. int __cdecl sub_804AFC6(int fd, const char *nptr, int a3)
  2430.  
  2431. {
  2432.  
  2433.   int result; // eax@4
  2434.  
  2435.   int v4; // [sp+2E8h] [bp-10h]@1
  2436.  
  2437.   int v5; // [sp+2ECh] [bp-Ch]@5
  2438.  
  2439.  
  2440.  
  2441.   v4 = a3;
  2442.  
  2443.   do
  2444.  
  2445.   {
  2446.  
  2447.     if ( !*(_DWORD *)(v4 + 76) )
  2448.  
  2449.       break;
  2450.  
  2451.     v4 = *(_DWORD *)(v4 + 76);
  2452.  
  2453.   }
  2454.  
  2455.   while ( strcmp(&s1, (const char *)v4) );
  2456.  
  2457.   sub_8048F10(fd, "you currently have $%u and %u chickens\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 60));
  2458.  
  2459.   sub_8048F10(fd, "market price for a chicken is %u\n ", *(_DWORD *)dword_804E40C);
  2460.  
  2461.   sub_8048F10(fd, "would you like to buy chickens [y/n]: ");
  2462.  
  2463.   result = sub_804AA10(fd, (int)nptr);
  2464.  
  2465.   if ( (_BYTE)result == 121 )
  2466.  
  2467.   {
  2468.  
  2469.     sub_8048F10(fd, "how many?: ");
  2470.  
  2471.     nptr[sub_8048E0A(fd, (int)nptr, 0x257u, 10)] = 0;
  2472.  
  2473.     v5 = atoi(nptr);
  2474.  
  2475.     if ( (unsigned int)(*(_DWORD *)dword_804E40C * v5) > *(_DWORD *)(v4 + 64) )
  2476.  
  2477.     {
  2478.  
  2479.       result = sub_8048F10(fd, "not enough money!\n");
  2480.  
  2481.     }
  2482.  
  2483.     else
  2484.  
  2485.     {
  2486.  
  2487.       *(_DWORD *)(v4 + 64) -= v5 * *(_DWORD *)dword_804E40C;
  2488.  
  2489.       *(_DWORD *)(v4 + 60) += v5;
  2490.  
  2491.       result = sub_8048F10(fd, "%u purchased!\n", v5);
  2492.  
  2493.     }
  2494.  
  2495.   }
  2496.  
  2497.   return result;
  2498.  
  2499. }
  2500.  
  2501.  
  2502.  
  2503. //----- (0804B148) --------------------------------------------------------
  2504.  
  2505. int __cdecl sub_804B148(int fd, const char *nptr, int a3)
  2506.  
  2507. {
  2508.  
  2509.   int v4; // [sp+C0h] [bp-18h]@1
  2510.  
  2511.   int v5; // [sp+CCh] [bp-Ch]@1
  2512.  
  2513.  
  2514.  
  2515.   v4 = 0;
  2516.  
  2517.   v5 = a3;
  2518.  
  2519.   do
  2520.  
  2521.   {
  2522.  
  2523.     if ( !*(_DWORD *)(v5 + 76) )
  2524.  
  2525.       break;
  2526.  
  2527.     v5 = *(_DWORD *)(v5 + 76);
  2528.  
  2529.   }
  2530.  
  2531.   while ( strcmp(&s1, (const char *)v5) );
  2532.  
  2533.   sub_8048F10(fd, "would you like to change username (%s) [y/n]: ", &s1);
  2534.  
  2535.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2536.  
  2537.   {
  2538.  
  2539.     sub_8048F10(fd, "enter new username: ");
  2540.  
  2541.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2542.  
  2543.     nptr[v4] = 0;
  2544.  
  2545.     strncpy((char *)v5, nptr, 0x14u);
  2546.  
  2547.     strncpy(&s1, nptr, 0x14u);
  2548.  
  2549.   }
  2550.  
  2551.   sub_8048F10(fd, "would you like to change user info (%s) [y/n]: ", v5 + 84);
  2552.  
  2553.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2554.  
  2555.   {
  2556.  
  2557.     sub_8048F10(fd, "enter new info: ");
  2558.  
  2559.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2560.  
  2561.     nptr[v4] = 0;
  2562.  
  2563.     strncpy((char *)(v5 + 84), nptr, 0x32u);
  2564.  
  2565.   }
  2566.  
  2567.   sub_8048F10(fd, "would you like to change office #(%s) [y/n]: ", v5 + 134);
  2568.  
  2569.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2570.  
  2571.   {
  2572.  
  2573.     sub_8048F10(fd, "enter new office: ");
  2574.  
  2575.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2576.  
  2577.     nptr[v4] = 0;
  2578.  
  2579.     strcpy((char *)(v5 + 134), nptr);
  2580.  
  2581.   }
  2582.  
  2583.   sub_8048F10(fd, "would you like to change password [y/n]: ");
  2584.  
  2585.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2586.  
  2587.   {
  2588.  
  2589.     sub_8048F10(fd, "enter new pass: ");
  2590.  
  2591.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2592.  
  2593.     nptr[v4] = 0;
  2594.  
  2595.     strncpy((char *)(v5 + 20), nptr, 0x21u);
  2596.  
  2597.   }
  2598.  
  2599.   sub_8048F10(fd, "would you like to change uid(%u) [y/n]: ", *(_DWORD *)(v5 + 72));
  2600.  
  2601.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2602.  
  2603.   {
  2604.  
  2605.     sub_8048F10(fd, "enter new uid: ");
  2606.  
  2607.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2608.  
  2609.     nptr[v4] = 0;
  2610.  
  2611.     *(_DWORD *)(v5 + 72) = atoi(nptr);
  2612.  
  2613.   }
  2614.  
  2615.   sub_8048F10(fd, "would you like to change you egg count(%u) [y/n]: ", *(_DWORD *)(v5 + 68));
  2616.  
  2617.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2618.  
  2619.   {
  2620.  
  2621.     sub_8048F10(fd, "enter new egg count: ");
  2622.  
  2623.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2624.  
  2625.     nptr[v4] = 0;
  2626.  
  2627.     if ( dword_804E420 )
  2628.  
  2629.       *(_DWORD *)(v5 + 68) = atoi(nptr);
  2630.  
  2631.     else
  2632.  
  2633.       sub_8048F10(fd, "you don't have enough permissions to change egg amount\n");
  2634.  
  2635.   }
  2636.  
  2637.   sub_8048F10(fd, "would you like to change chicken count(%u) [y/n]: ", *(_DWORD *)(v5 + 60));
  2638.  
  2639.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2640.  
  2641.   {
  2642.  
  2643.     sub_8048F10(fd, "enter new chicken count: ");
  2644.  
  2645.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2646.  
  2647.     nptr[v4] = 0;
  2648.  
  2649.     if ( dword_804E420 )
  2650.  
  2651.       *(_DWORD *)(v5 + 60) = atoi(nptr);
  2652.  
  2653.     else
  2654.  
  2655.       sub_8048F10(fd, "you don't have enough permissions to adjust chickens\n");
  2656.  
  2657.   }
  2658.  
  2659.   sub_8048F10(fd, "would you like to change monies(%u) [y/n]: ", *(_DWORD *)(v5 + 64));
  2660.  
  2661.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2662.  
  2663.   {
  2664.  
  2665.     sub_8048F10(fd, "enter new monies: ");
  2666.  
  2667.     v4 = sub_8048E0A(fd, (int)nptr, 0x257u, 10);
  2668.  
  2669.     nptr[v4] = 0;
  2670.  
  2671.     if ( dword_804E420 )
  2672.  
  2673.       *(_DWORD *)(v5 + 64) = atoi(nptr);
  2674.  
  2675.     else
  2676.  
  2677.       sub_8048F10(fd, "you don't have enough permissions to add monies\n");
  2678.  
  2679.   }
  2680.  
  2681.   sub_8048F10(fd, "would you like to change your perms(%u) [y/n]: ", *(_DWORD *)(v5 + 56));
  2682.  
  2683.   if ( (unsigned __int8)sub_804AA10(fd, (int)nptr) == 121 )
  2684.  
  2685.   {
  2686.  
  2687.     sub_8048F10(fd, "enter new perm: ");
  2688.  
  2689.     nptr[v4] = 0;
  2690.  
  2691.     if ( dword_804E420 )
  2692.  
  2693.       *(_DWORD *)(v5 + 56) = atoi(nptr);
  2694.  
  2695.     else
  2696.  
  2697.       sub_8048F10(fd, "you don't have enough permissions to change permissions\n");
  2698.  
  2699.   }
  2700.  
  2701.   sub_8048F10(fd, "finished updates \n");
  2702.  
  2703.   return 0;
  2704.  
  2705. }
  2706.  
  2707. // 804E420: using guessed type int dword_804E420;
  2708.  
  2709.  
  2710.  
  2711. //----- (0804B6F5) --------------------------------------------------------
  2712.  
  2713. int __cdecl sub_804B6F5(int fd, int s1, char *a3)
  2714.  
  2715. {
  2716.  
  2717.   int result; // eax@1
  2718.  
  2719.   int v4; // eax@1
  2720.  
  2721.   int v5; // eax@1
  2722.  
  2723.   const char s[600]; // [sp+14h] [bp-264h]@1
  2724.  
  2725.   int v7; // [sp+26Ch] [bp-Ch]@1
  2726.  
  2727.  
  2728.  
  2729.   sub_8048E75(fd, "enter username: ", 0);
  2730.  
  2731.   v4 = sub_8048E0A(fd, s1, 0x257u, 10);
  2732.  
  2733.   v7 = v4;
  2734.  
  2735.   *(_BYTE *)(s1 + v4) = 0;
  2736.  
  2737.   sub_8048E75(fd, "enter password: ", 0);
  2738.  
  2739.   v5 = sub_8048E0A(fd, (int)s, 0x257u, 10);
  2740.  
  2741.   v7 = v5;
  2742.  
  2743.   s[v5] = 0;
  2744.  
  2745.   result = sub_804A8A1(fd, a3, (const char *)s1, s);
  2746.  
  2747.   if ( result )
  2748.  
  2749.     result = sub_8048E75(fd, "Bad username or pass: ", 0);
  2750.  
  2751.   return result;
  2752.  
  2753. }
  2754.  
  2755.  
  2756.  
  2757. //----- (0804B7E0) --------------------------------------------------------
  2758.  
  2759. int __cdecl sub_804B7E0(int fd)
  2760.  
  2761. {
  2762.  
  2763.   sub_8048E75(fd, "\n\nfantasy chicken farmin league\n", 0);
  2764.  
  2765.   if ( dword_804E424 )
  2766.  
  2767.   {
  2768.  
  2769.     sub_8048F10(fd, "\n\nmenu    (%s)\n", &s1);
  2770.  
  2771.     sub_8048F10(fd, " L) logout\n");
  2772.  
  2773.     sub_8048F10(fd, " b) buy chickens\n");
  2774.  
  2775.     sub_8048F10(fd, " i) incinerate money\n");
  2776.  
  2777.     sub_8048F10(fd, " s) sell eggs\n");
  2778.  
  2779.     sub_8048F10(fd, " p) display my info\n");
  2780.  
  2781.     sub_8048F10(fd, " u) update my info\n");
  2782.  
  2783.     if ( dword_804E420 )
  2784.  
  2785.       sub_8048F10(fd, " P) print userlist\n");
  2786.  
  2787.   }
  2788.  
  2789.   else
  2790.  
  2791.   {
  2792.  
  2793.     sub_8048F10(fd, "\n\nmenu\n");
  2794.  
  2795.     sub_8048F10(fd, " c) create account\n");
  2796.  
  2797.     sub_8048F10(fd, " l) login\n");
  2798.  
  2799.   }
  2800.  
  2801.   return sub_8048F10(fd, " q) quit \n");
  2802.  
  2803. }
  2804.  
  2805. // 804E420: using guessed type int dword_804E420;
  2806.  
  2807. // 804E424: using guessed type int dword_804E424;
  2808.  
  2809.  
  2810.  
  2811. //----- (0804B90A) --------------------------------------------------------
  2812.  
  2813. int __cdecl sub_804B90A(FILE *stream, int a2, unsigned int a3, char a4)
  2814.  
  2815. {
  2816.  
  2817.   char ptr; // [sp+2Bh] [bp-Dh]@2
  2818.  
  2819.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  2820.  
  2821.  
  2822.  
  2823.   for ( i = 0; ; ++i )
  2824.  
  2825.   {
  2826.  
  2827.     if ( !fread(&ptr, 1u, 1u, stream) )
  2828.  
  2829.       return -1;
  2830.  
  2831.     if ( ptr == a4 )
  2832.  
  2833.       return i;
  2834.  
  2835.     if ( i >= a3 )
  2836.  
  2837.       break;
  2838.  
  2839.     *(_BYTE *)(i + a2) = ptr;
  2840.  
  2841.   }
  2842.  
  2843.   return -1;
  2844.  
  2845. }
  2846.  
  2847.  
  2848.  
  2849. //----- (0804B9E6) --------------------------------------------------------
  2850.  
  2851. void *__cdecl sub_804B9E6(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11)
  2852.  
  2853. {
  2854.  
  2855.   void *result; // eax@1
  2856.  
  2857.   void *v12; // [sp+1Ch] [bp-Ch]@1
  2858.  
  2859.  
  2860.  
  2861.   result = malloc(0x9Cu);
  2862.  
  2863.   v12 = result;
  2864.  
  2865.   if ( result )
  2866.  
  2867.   {
  2868.  
  2869.     strcpy((char *)result, src);
  2870.  
  2871.     strcpy((char *)v12 + 84, a4);
  2872.  
  2873.     strcpy((char *)v12 + 134, a5);
  2874.  
  2875.     strcpy((char *)v12 + 20, a6);
  2876.  
  2877.     *((_DWORD *)v12 + 18) = a7;
  2878.  
  2879.     *((_DWORD *)v12 + 14) = a8;
  2880.  
  2881.     *((_DWORD *)v12 + 16) = a9;
  2882.  
  2883.     *((_DWORD *)v12 + 15) = a10;
  2884.  
  2885.     *((_DWORD *)v12 + 17) = a11;
  2886.  
  2887.     *((_DWORD *)v12 + 19) = *(_DWORD *)(a2 + 76);
  2888.  
  2889.     *((_DWORD *)v12 + 20) = a2;
  2890.  
  2891.     *(_DWORD *)(a2 + 76) = v12;
  2892.  
  2893.     result = 0;
  2894.  
  2895.   }
  2896.  
  2897.   return result;
  2898.  
  2899. }
  2900.  
  2901.  
  2902.  
  2903. //----- (0804BAB7) --------------------------------------------------------
  2904.  
  2905. signed int __cdecl sub_804BAB7(const char *filename, int a2, int fd)
  2906.  
  2907. {
  2908.  
  2909.   char v4; // [sp+39h] [bp-2FFh]@1
  2910.  
  2911.   char v5; // [sp+5Ah] [bp-2DEh]@1
  2912.  
  2913.   char v6; // [sp+6Eh] [bp-2CAh]@1
  2914.  
  2915.   char v7; // [sp+A0h] [bp-298h]@1
  2916.  
  2917.   char v8; // [sp+B4h] [bp-284h]@3
  2918.  
  2919.   signed int v9; // [sp+30Ch] [bp-2Ch]@1
  2920.  
  2921.   int v10; // [sp+310h] [bp-28h]@1
  2922.  
  2923.   int v11; // [sp+314h] [bp-24h]@1
  2924.  
  2925.   int v12; // [sp+318h] [bp-20h]@6
  2926.  
  2927.   int v13; // [sp+31Ch] [bp-1Ch]@16
  2928.  
  2929.   int v14; // [sp+320h] [bp-18h]@18
  2930.  
  2931.   int v15; // [sp+324h] [bp-14h]@20
  2932.  
  2933.   int v16; // [sp+328h] [bp-10h]@22
  2934.  
  2935.   FILE *v17; // [sp+32Ch] [bp-Ch]@1
  2936.  
  2937.  
  2938.  
  2939.   v9 = 0;
  2940.  
  2941.   v10 = 0;
  2942.  
  2943.   v11 = 0;
  2944.  
  2945.   bzero(&v7, 0x14u);
  2946.  
  2947.   bzero(&v6, 0x32u);
  2948.  
  2949.   bzero(&v5, 0x14u);
  2950.  
  2951.   bzero(&v4, 0x21u);
  2952.  
  2953.   v17 = fopen(filename, "rb");
  2954.  
  2955.   if ( v17 )
  2956.  
  2957.   {
  2958.  
  2959.     while ( 1 )
  2960.  
  2961.     {
  2962.  
  2963.       v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  2964.  
  2965.       if ( v10 == -1 )
  2966.  
  2967.         break;
  2968.  
  2969.       *(&v8 + v10) = 0;
  2970.  
  2971.       if ( strcmp(&v8, "[user db]") )
  2972.  
  2973.       {
  2974.  
  2975.         if ( strcmp(&v8, "[user]") )
  2976.  
  2977.         {
  2978.  
  2979.           v9 = 1;
  2980.  
  2981.           break;
  2982.  
  2983.         }
  2984.  
  2985.         ++v11;
  2986.  
  2987.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  2988.  
  2989.         if ( v10 != -1 )
  2990.  
  2991.         {
  2992.  
  2993.           *(&v8 + v10) = 0;
  2994.  
  2995.           v12 = atoi(&v8);
  2996.  
  2997.         }
  2998.  
  2999.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3000.  
  3001.         if ( v10 != -1 )
  3002.  
  3003.         {
  3004.  
  3005.           *(&v8 + v10) = 0;
  3006.  
  3007.           strncpy(&v7, &v8, 0x14u);
  3008.  
  3009.         }
  3010.  
  3011.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3012.  
  3013.         if ( v10 != -1 )
  3014.  
  3015.         {
  3016.  
  3017.           *(&v8 + v10) = 0;
  3018.  
  3019.           strncpy(&v6, &v8, 0x32u);
  3020.  
  3021.         }
  3022.  
  3023.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3024.  
  3025.         if ( v10 != -1 )
  3026.  
  3027.         {
  3028.  
  3029.           *(&v8 + v10) = 0;
  3030.  
  3031.           strncpy(&v5, &v8, 0x14u);
  3032.  
  3033.         }
  3034.  
  3035.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3036.  
  3037.         if ( v10 != -1 )
  3038.  
  3039.         {
  3040.  
  3041.           *(&v8 + v10) = 0;
  3042.  
  3043.           strncpy(&v4, &v8, 0x21u);
  3044.  
  3045.         }
  3046.  
  3047.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3048.  
  3049.         if ( v10 != -1 )
  3050.  
  3051.         {
  3052.  
  3053.           *(&v8 + v10) = 0;
  3054.  
  3055.           v13 = atoi(&v8);
  3056.  
  3057.         }
  3058.  
  3059.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3060.  
  3061.         if ( v10 != -1 )
  3062.  
  3063.         {
  3064.  
  3065.           *(&v8 + v10) = 0;
  3066.  
  3067.           v14 = atoi(&v8);
  3068.  
  3069.         }
  3070.  
  3071.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3072.  
  3073.         if ( v10 != -1 )
  3074.  
  3075.         {
  3076.  
  3077.           *(&v8 + v10) = 0;
  3078.  
  3079.           v15 = atoi(&v8);
  3080.  
  3081.         }
  3082.  
  3083.         v10 = sub_804B90A(v17, (int)&v8, 0x257u, 10);
  3084.  
  3085.         if ( v10 != -1 )
  3086.  
  3087.         {
  3088.  
  3089.           *(&v8 + v10) = 0;
  3090.  
  3091.           v16 = atoi(&v8);
  3092.  
  3093.         }
  3094.  
  3095.         if ( sub_804B9E6(fd, a2, &v7, &v6, &v5, &v4, v12, v13, v16, v14, v15) )
  3096.  
  3097.         {
  3098.  
  3099.           v9 = 1;
  3100.  
  3101.           sub_8048F10(fd, "insert failed.\n");
  3102.  
  3103.           break;
  3104.  
  3105.         }
  3106.  
  3107.       }
  3108.  
  3109.     }
  3110.  
  3111.     fclose(v17);
  3112.  
  3113.   }
  3114.  
  3115.   else
  3116.  
  3117.   {
  3118.  
  3119.     sub_8048F10(fd, "attempted %s.\n", filename);
  3120.  
  3121.     v9 = 1;
  3122.  
  3123.   }
  3124.  
  3125.   return v9;
  3126.  
  3127. }
  3128.  
  3129.  
  3130.  
  3131. //----- (0804C067) --------------------------------------------------------
  3132.  
  3133. void __cdecl sub_804C067(int fd)
  3134.  
  3135. {
  3136.  
  3137.   sub_8048E75(fd, "cya\n", 0);
  3138.  
  3139.   close(fd);
  3140.  
  3141.   exit(0);
  3142.  
  3143. }
  3144.  
  3145.  
  3146.  
  3147. //----- (0804C09F) --------------------------------------------------------
  3148.  
  3149. int __cdecl sub_804C09F(int a1)
  3150.  
  3151. {
  3152.  
  3153.   int v1; // edx@1
  3154.  
  3155.   int result; // eax@11
  3156.  
  3157.   signed int v3; // [sp+8h] [bp-10h]@1
  3158.  
  3159.   int v4; // [sp+Ch] [bp-Ch]@6
  3160.  
  3161.  
  3162.  
  3163.   v1 = rand() % 5;
  3164.  
  3165.   v3 = v1 - 2;
  3166.  
  3167.   if ( v1 != 2 )
  3168.  
  3169.   {
  3170.  
  3171.     *(_DWORD *)dword_804E40C += v3;
  3172.  
  3173.     *(_DWORD *)dword_804E410 += v3 / 2;
  3174.  
  3175.     if ( !*(_DWORD *)dword_804E410 )
  3176.  
  3177.       *(_DWORD *)dword_804E410 = 1;
  3178.  
  3179.     if ( !*(_DWORD *)dword_804E410 )
  3180.  
  3181.       *(_DWORD *)dword_804E410 = 1;
  3182.  
  3183.   }
  3184.  
  3185.   v4 = a1;
  3186.  
  3187.   while ( 1 )
  3188.  
  3189.   {
  3190.  
  3191.     result = *(_DWORD *)(v4 + 76);
  3192.  
  3193.     if ( !result )
  3194.  
  3195.       break;
  3196.  
  3197.     v4 = *(_DWORD *)(v4 + 76);
  3198.  
  3199.     if ( *(_DWORD *)(v4 + 60) )
  3200.  
  3201.     {
  3202.  
  3203.       if ( v3 == 1 )
  3204.  
  3205.         *(_DWORD *)(v4 + 60) += *(_DWORD *)(v4 + 60) >> 2;
  3206.  
  3207.       *(_DWORD *)(v4 + 68) = *(_DWORD *)(v4 + 60) + *(_DWORD *)(v4 + 68) - (*(_DWORD *)(v4 + 60) >> 3);
  3208.  
  3209.     }
  3210.  
  3211.   }
  3212.  
  3213.   return result;
  3214.  
  3215. }
  3216.  
  3217.  
  3218.  
  3219. //----- (0804C18B) --------------------------------------------------------
  3220.  
  3221. void __cdecl sub_804C18B(int fd)
  3222.  
  3223. {
  3224.  
  3225.   unsigned int v1; // eax@1
  3226.  
  3227.   int nptr; // [sp+26Ch] [bp-26Ch]@7
  3228.  
  3229.   char v3[4]; // [sp+4C4h] [bp-14h]@1
  3230.  
  3231.   void *s; // [sp+4C8h] [bp-10h]@1
  3232.  
  3233.   FILE *stream; // [sp+4CCh] [bp-Ch]@40
  3234.  
  3235.  
  3236.  
  3237.   *(_DWORD *)v3 = 0;
  3238.  
  3239.   v1 = time(0);
  3240.  
  3241.   srand(v1);
  3242.  
  3243.   s = malloc(0x9Cu);
  3244.  
  3245.   if ( !s )
  3246.  
  3247.   {
  3248.  
  3249.     sub_8048E75(fd, "can't allocate user_list, quitting\n", 0);
  3250.  
  3251.     sub_804C067(fd);
  3252.  
  3253.   }
  3254.  
  3255.   bzero(s, 0x9Cu);
  3256.  
  3257.   *((_DWORD *)s + 19) = 0;
  3258.  
  3259.   *((_DWORD *)s + 20) = 0;
  3260.  
  3261.   sub_804A988();
  3262.  
  3263.   if ( sub_804BAB7("/home/fcfl/user.db", (int)s, fd) )
  3264.  
  3265.   {
  3266.  
  3267.     sub_8048E75(fd, "can't read user db, quitting\n", 0);
  3268.  
  3269.     sub_804C067(fd);
  3270.  
  3271.   }
  3272.  
  3273.   while ( 1 )
  3274.  
  3275.   {
  3276.  
  3277.     sub_804C09F((int)s);
  3278.  
  3279.     sub_804B7E0(fd);
  3280.  
  3281.     *(_DWORD *)v3 = sub_8048E0A(fd, (int)&nptr, 0x257u, 10);
  3282.  
  3283.     *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  3284.  
  3285.     sub_8048F10(fd, "%d: %s\n", *(_DWORD *)v3, &nptr);
  3286.  
  3287.     if ( *(_DWORD *)v3 == 1 )
  3288.  
  3289.     {
  3290.  
  3291.       if ( (_BYTE)nptr != aC[0] || dword_804E424 )
  3292.  
  3293.       {
  3294.  
  3295.         if ( (_BYTE)nptr != asc_804D115[0] || dword_804E424 )
  3296.  
  3297.         {
  3298.  
  3299.           if ( (_BYTE)nptr == aS_1[0] && dword_804E424 )
  3300.  
  3301.           {
  3302.  
  3303.             sub_804ACFC(fd, (const char *)&nptr, (int)s);
  3304.  
  3305.           }
  3306.  
  3307.           else
  3308.  
  3309.           {
  3310.  
  3311.             if ( (_BYTE)nptr == aI[0] && dword_804E424 )
  3312.  
  3313.             {
  3314.  
  3315.               sub_804AE76(fd, (const char *)&nptr, (int)s);
  3316.  
  3317.             }
  3318.  
  3319.             else
  3320.  
  3321.             {
  3322.  
  3323.               if ( (_BYTE)nptr == aB[0] && dword_804E424 )
  3324.  
  3325.               {
  3326.  
  3327.                 sub_804AFC6(fd, (const char *)&nptr, (int)s);
  3328.  
  3329.               }
  3330.  
  3331.               else
  3332.  
  3333.               {
  3334.  
  3335.                 if ( (_BYTE)nptr == aU[0] && dword_804E424 )
  3336.  
  3337.                 {
  3338.  
  3339.                   sub_804B148(fd, (const char *)&nptr, (int)s);
  3340.  
  3341.                 }
  3342.  
  3343.                 else
  3344.  
  3345.                 {
  3346.  
  3347.                   if ( (_BYTE)nptr == aP[0] && dword_804E424 )
  3348.  
  3349.                   {
  3350.  
  3351.                     sub_804A855(fd, (int)s);
  3352.  
  3353.                   }
  3354.  
  3355.                   else
  3356.  
  3357.                   {
  3358.  
  3359.                     if ( (_BYTE)nptr == asc_804D121[0] && dword_804E424 )
  3360.  
  3361.                     {
  3362.  
  3363.                       sub_804A988();
  3364.  
  3365.                     }
  3366.  
  3367.                     else
  3368.  
  3369.                     {
  3370.  
  3371.                       if ( (_BYTE)nptr == aP_0[0] && dword_804E424 && dword_804E420 )
  3372.  
  3373.                       {
  3374.  
  3375.                         sub_804A820(fd, (int)s);
  3376.  
  3377.                       }
  3378.  
  3379.                       else
  3380.  
  3381.                       {
  3382.  
  3383.                         if ( (_BYTE)nptr == a6[0] && dword_804E424 && dword_804E420 )
  3384.  
  3385.                         {
  3386.  
  3387.                           stream = fopen("/home/fcfl/key", "rb");
  3388.  
  3389.                           *(_DWORD *)v3 = sub_804B90A(stream, (int)&nptr, 0x257u, 10);
  3390.  
  3391.                           if ( *(_DWORD *)v3 != -1 )
  3392.  
  3393.                           {
  3394.  
  3395.                             *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  3396.  
  3397.                             sub_8048E75(fd, (const char *)&nptr, 1);
  3398.  
  3399.                           }
  3400.  
  3401.                         }
  3402.  
  3403.                         else
  3404.  
  3405.                         {
  3406.  
  3407.                           if ( (_BYTE)nptr == aQ[0] )
  3408.  
  3409.                             sub_804C067(fd);
  3410.  
  3411.                           sub_8048E75(fd, "that's not a valid option", 0);
  3412.  
  3413.                         }
  3414.  
  3415.                       }
  3416.  
  3417.                     }
  3418.  
  3419.                   }
  3420.  
  3421.                 }
  3422.  
  3423.               }
  3424.  
  3425.             }
  3426.  
  3427.           }
  3428.  
  3429.         }
  3430.  
  3431.         else
  3432.  
  3433.         {
  3434.  
  3435.           sub_804B6F5(fd, (int)&nptr, (char *)s);
  3436.  
  3437.         }
  3438.  
  3439.       }
  3440.  
  3441.       else
  3442.  
  3443.       {
  3444.  
  3445.         sub_804AA9F(fd, (const char *)&nptr, (int)s);
  3446.  
  3447.       }
  3448.  
  3449.     }
  3450.  
  3451.     else
  3452.  
  3453.     {
  3454.  
  3455.       *(_DWORD *)v3 = 0;
  3456.  
  3457.       sub_8048E75(fd, "that's not a valid option", 0);
  3458.  
  3459.     }
  3460.  
  3461.   }
  3462.  
  3463. }
  3464.  
  3465. // 804E420: using guessed type int dword_804E420;
  3466.  
  3467. // 804E424: using guessed type int dword_804E424;
  3468.  
  3469.  
  3470.  
  3471. //----- (0804C5F0) --------------------------------------------------------
  3472.  
  3473. void __cdecl sub_804C5F0()
  3474.  
  3475. {
  3476.  
  3477.   ;
  3478.  
  3479. }
  3480.  
  3481.  
  3482.  
  3483. //----- (0804C600) --------------------------------------------------------
  3484.  
  3485. int *__cdecl sub_804C600()
  3486.  
  3487. {
  3488.  
  3489.   init_proc();
  3490.  
  3491.   return &dword_804E1D8;
  3492.  
  3493. }
  3494.  
  3495. // 804E1D8: using guessed type int dword_804E1D8;
  3496.  
  3497.  
  3498.  
  3499. //----- (0804C65A) --------------------------------------------------------
  3500.  
  3501. void __cdecl sub_804C65A()
  3502.  
  3503. {
  3504.  
  3505.   ;
  3506.  
  3507. }
  3508.  
  3509.  
  3510.  
  3511. //----- (0804C660) --------------------------------------------------------
  3512.  
  3513. void (*__cdecl sub_804C660())(void)
  3514.  
  3515. {
  3516.  
  3517.   void (*result)(void); // eax@1
  3518.  
  3519.   int *v1; // ebx@2
  3520.  
  3521.  
  3522.  
  3523.   result = (void (*)(void))dword_804E1D8;
  3524.  
  3525.   if ( dword_804E1D8 != -1 )
  3526.  
  3527.   {
  3528.  
  3529.     v1 = &dword_804E1D8;
  3530.  
  3531.     do
  3532.  
  3533.     {
  3534.  
  3535.       --v1;
  3536.  
  3537.       result();
  3538.  
  3539.       result = (void (*)(void))*v1;
  3540.  
  3541.     }
  3542.  
  3543.     while ( *v1 != -1 );
  3544.  
  3545.   }
  3546.  
  3547.   return result;
  3548.  
  3549. }
  3550.  
  3551. // 804E1D8: using guessed type int dword_804E1D8;
  3552.  
  3553.  
  3554.  
  3555. //----- (0804C68C) --------------------------------------------------------
  3556.  
  3557. void __cdecl term_proc()
  3558.  
  3559. {
  3560.  
  3561.   sub_8048CB0();
  3562.  
  3563. }
  3564.  
  3565.  
  3566.  
  3567. #error "There were 1 decompilation failure(s) on 48 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement