рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди - рд╣рдо рдЗрд╕рдореЗрдВ рдмрдиреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ

рд╢реБрдн рджреЛрдкрд╣рд░
рдЕрдкрдиреЗ рд╣реЛрдо рд╕рд░реНрд╡рд░ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рднреА рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ * nix (rTorrent, Deluge, MLDonkey, Transmission) рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рджреЗрдЦрд╛ред
рдореБрдЭреЗ рдмрд╛рдж рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдЗрдирд╕ рдерд╛ - рдПрдХ .torrent рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдзрд╛рд░рд┐рдд рдирд╛рдореЛрдВ рдХреЛ рдирд╛рдо рджреЗрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - "рдХреНрд░рд╛рд╡реНрд╡рд╛рдЬрд╛ рдЧреЛрд░рд╛", "рдХреНрд░рд╛рдЗрдо рд╕реАрди рдиреНрдпреВрдпреЙрд░реНрдХ", рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл "рд╕реАрдЬрди 7"ред
рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдЖрджреЗрд╢ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдЕрдкрдиреА рдлрд┐рд▓реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдпрд╛ рдЗрд╕рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рднрд╛рдЧ) рдХреЛ "% SERIAL_NAME% / рд╕реАрдЬрди рдПрди" рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЕрдлрд╕реЛрд╕ рдпрд╣ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдмреАрдбрд╝рд╛ рдЙрдард╛рдпрд╛ред

рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рдиред рдирд╛рдо рдмрджрд▓реЗрдВ



рдкрд╣рд▓рд╛ рд╕рдмрдЯреИрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдзрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рджреМрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмрдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рддреАрди рд╕рд╛рд▓ рдкрд╣рд▓реЗ # 1220 рдХрд╛ рдЯрд┐рдХрдЯ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕реБрд╕реНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЙрдорд░реЗрдб рдЬрдХреНрд╕рдбрд╛ рдиреЗ рдХреГрдкрдпрд╛ рдПрдХ рдкреИрдЪ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдХреА рд╡рдХреНрд░рддрд╛ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдиреЗ рдореБрдЭреЗ рдЙрд╕ рд╕рдВрд╢реЛрдзрди (11895) рдХреЛ рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдЪрд┐рдк рдХреЗ рд╕рд╛рде рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ ~ 500 рд╕рдВрд╢реЛрдзрди рдЙрд╕ рд╕рдВрд╢реЛрдзрди рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реБрдПред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкреИрдЪрд┐рдВрдЧ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЪреБрдирд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде, рддрд╛рдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рд╕рд╣реА рдХрд░ рд╕рдХреВрдВ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рджрд╛рдирд╡ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреА рдЦрддреНрдо рдХрд░ рджреЗрдВред
рдпрд╣ рд╕рдм рдмрд╕ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
svn co svn://svn.transmissionbt.com/Transmission/trunk Transmission
рд╣рдо SVN рд╕рд░реНрд╡рд░ рд╕реЗ HEAD рд╕рдВрд╢реЛрдзрди рд▓реЗрддреЗ рд╣реИрдВред рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬреЛрдВ рдХреА рд╕реВрдЪреА рдЯреНрд░реИрдХ рдореЗрдВ рд╣реИ , рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдПрдХ gtk рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рд▓рд┐рдмрд╛рд╕ (libgtk2.0-dev, libnotify-dev, libglib2.0-dev рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВ) рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред libevent-dev рдХреЛ рдЗрд╕ рд╕рдордп рдирдП рд╕рд┐рд░реЗ рд╕реЗ (2.0.10) рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдореБрдЭреЗ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ -рджреЗрд╡ рдкреИрдХреЗрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╕реНрд░реЛрдд рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдореВрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдХрд░реНрдиреЗрд▓ ( libtransmission рдлрд╝реЛрд▓реНрдбрд░)ред рд╣реЗрдбрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди ред рдПрдЪ ред
Tor_info рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╡рд░реНрдгрди рд╕рдВрд░рдЪрдирд╛ tr_info рдлрд╝реАрд▓реНрдб " char * рдирд╛рдо рдмрджрд▓реЗрдВ " рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ .torrent рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЕрдЧрд░ рдРрд╕рд╛ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдЬреЛрдбрд╝реЗ рдЧрдП рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЯреЛрд░реЗрдВрдЯ рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рдирдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 int tr_torrentRename( tr_torrent * torrent, const char * newname ); 


рдПрдХ рдХрдард┐рдирд╛рдИ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдореВрд▓ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред
рдмреЗрд╢рдХ, рдЖрдк рд╕рдм рдХреБрдЫ рдкреИрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ, рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЗрди рдирд╛рдореЛрдВ рдХреЛ "рдУрд╡рд░рд▓реЛрдб" рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реВрдЪрдирд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдПрдХ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдмрдЪрдд рдХреЗ рд▓рд┐рдП рдкрдереЛрдВ рдХреА рдпрд╣ рдмрд╣реБрдд рд╕реВрдЪреА рд╣реИ, рдФрд░ рдЬрдм рд╣рдо рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ "рдпрд╛рдж" рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред

рдЬрдмрдХрд┐ рд╣рдо рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред
рдЪрд▓реЛ рдореБрдЦреНрдп рдмрд╛рдд рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рдЖрдВрджреЛрд▓рди рд╣реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рдо torrent.h / torrent.c рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЯреЛрд░реЗрдВрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдЯ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдЧрд╛, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╣реБрдд рд╣реА рддрдВрддреНрд░ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛:
 void tr_torrentInitFileName( tr_torrent * tor, tr_file_index_t fileIndex, const char * name ); 

рдареАрдХ рд╣реИ, torrents.c рдореЗрдВ рд╣реА, рдЙрд╕рдХрд╛ рд╢рд░реАрд░:
 void tr_torrentInitFileName( tr_torrent * tor, tr_file_index_t fileIndex, const char * name ) { tr_file * file; assert( tr_isTorrent( tor ) ); assert( fileIndex < tor->info.fileCount ); assert( name != NULL ); assert( name[0] != '\0' ); file = &tor->info.files[fileIndex]; tr_free( file->name ); file->name = tr_strdup( name ); } 

рд╕рдм рдХреБрдЫ рдЖрджрд┐рдо рд╣реИ - рд╣рдо рдкреБрд░рд╛рдиреЗ рд░рд╛рд╕реНрддреЗ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо fileExists () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдореБрдЦреНрдп рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 static bool dirExists( const char * path ) { struct stat sb; return stat( path, &sb ) == 0 && S_ISDIR( sb.st_mode ); } int tr_torrentRename( tr_torrent * tor, const char * newname ) { tr_info * info; const char * root, * p, * oldname, * base; char * oldpath = NULL, * newpath = NULL, * subpath = NULL; int err = 0; assert( tr_isTorrent( tor ) ); tr_torrentLock( tor ); if( !tr_torrentHasMetadata( tor ) ) { err = ENOENT; goto OUT; } if( !newname || !newname[0] || strchr( newname, TR_PATH_DELIMITER ) || !strcmp( newname, "." ) || !strcmp( newname, ".." ) ) { err = EINVAL; goto OUT; } info = &tor->info; if (info->rename) oldname = info->rename; else oldname = info->name; if( ( p = strchr( oldname, TR_PATH_DELIMITER ) ) ) { /* Should not happen, but just in case. */ err = EISDIR; goto OUT; } if( !strcmp( newname, oldname ) ) goto OUT; root = tr_torrentGetCurrentDir( tor ); if( info->fileCount > 1 ) { tr_file_index_t fi; oldpath = tr_buildPath( root, oldname, NULL ); if( dirExists( oldpath ) ) { newpath = tr_buildPath( root, newname, NULL ); if( fileExists( newpath, NULL) ) { err = EEXIST; goto OUT; } if( rename( oldpath, newpath ) == -1 ) { err = errno; goto OUT; } } for( fi = 0; fi < info->fileCount; ++fi ) { tr_file * file = &info->files[fi]; char * newfnam; if( !( p = strchr( file->name, TR_PATH_DELIMITER ) ) ) continue; newfnam = tr_buildPath( newname, p + 1, NULL ); tr_free( file->name ); file->name = newfnam; } } else { if( tr_torrentFindFile2( tor, 0, &base, &subpath, NULL) ) { oldpath = tr_buildPath( base, subpath, NULL ); newpath = tr_buildPath( base, newname, NULL ); if( fileExists( newpath, NULL) ) { err = EEXIST; goto OUT; } if( rename( oldpath, newpath ) == -1 ) { err = errno; goto OUT; } } tr_free( info->files[0].name ); info->files[0].name = tr_strdup( newname ); } tr_free( info->rename ); if( !strcmp( newname, info->name ) ) info->rename = NULL; else info->rename = tr_strdup( newname ); tr_torrentSetDirty( tor ); OUT: if( err ) { const char * es = tr_strerror( err ), * fmt; if( oldpath && newpath ) { /* %1$s is the original file path. * %2$s is the new file path. * %3$s is the error message. */ fmt = _( "Cannot rename \"%1$s\" to \"%2$s\": %3$s" ); tr_torerr( tor, fmt, oldpath, newpath, es ); } else if( oldpath ) { /* %1$s is the existing file name. * %2$s is the error message. */ fmt = _( "Cannot rename \"%1$s\": %2$s" ); tr_torerr( tor, fmt, oldpath, es ); } else { fmt = _( "Cannot rename torrent: %s" ); tr_torerr( tor, fmt, es ); } } tr_torrentUnlock( tor ); tr_free( oldpath ); tr_free( newpath ); tr_free( subpath ); return err; } 

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕рд░рд▓ рдЬрд╛рдВрдЪ рд╣реИ, рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╛рдо () рдХреЙрд▓ рд╣реА рд╣реИ, рдФрд░ рдЬрд╛рдирдХрд╛рд░реА-> рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдЦреИрд░, рдЬрд╛рдирдХрд╛рд░реА рднрд░рдирд╛ рди рднреВрд▓реЗрдВ-> рдирд╛рдо рдмрджрд▓реЗрдВ ред

рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдиреЗ tr_torrentName () рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛ , рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рд░рд╛рд╕реНрддрд╛ рдЪреБрдирд╛ред рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрд╢реЛрдзрди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк gtk рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рдБ, рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
 return tor->info.rename ? tor->info.rename : tor->info.name; 

рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ gtk рдХреЗ рд▓рд┐рдП рдУрдкрдирд╡рд░реНрдХ рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВ рдЗрд╕ gui рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рдЪреБрдВрдмрдХ рд▓рд┐рдВрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг (рдореВрд▓ рдкреИрдЪ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ RPC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ RPC рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдзрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдЦреЛрд▓ рд╕рдХреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдПрдХ (рдЖрдзрд╛ рдЕрдм рддрдХ) рд╣реИ, рджреВрд╕рд░рд╛ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рд╣рдо рдЖрд░рдкреАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - rpcimpl.c рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ)ред

рд╣рдо addField () рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЯреЛрд░реЗрдВрдЯ рд╕реВрдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рд╣рдо " рдирд╛рдо " рдлрд╝реАрд▓реНрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ " tr_torrentName (tor) " рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
 tor->info.rename ? tor->info.rename : tor->info.name 

рд╣реЛ рдЧрдпрд╛ред рдЕрдм рдЖрд░рдкреАрд╕реА рд╣рдорд╛рд░реА рдирдИ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИред
рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрд░рдкреАрд╕реА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрдЬреНрдЮрд╛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЯреЛрд░реЗрдВрдЯрд╕реЗрдЯ () рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рд▓рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд▓реЗрдпрд░ рдлрдВрдХреНрд╢рди:
 static const char * renameTorrent( tr_torrent * tor, const char * str ) { int err = tr_torrentRename( tor, str ); return err == 0 ? NULL : tr_strerror( err ); } 

рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЯреЛрд░реЗрдВрдЯрд╕реЗрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдЪрд░ рд╡рд┐рд╡рд░рдг рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ - const char * str ;
рдФрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
  if( !errmsg && tr_bencDictFindStr( args_in, "rename", &str ) ) errmsg = renameTorrent( tor, str ); 


рд╣рдордиреЗ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ? рдФрд░ рд╣рдо рдзрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП!
рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ / рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ ред рдПрдЪ )ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╣реЗрдЬреЗ рдЧрдП рдлрд╝реАрд▓реНрдб рдХреЗ рдЭрдВрдбреЗ рдЬреЛрдбрд╝реЗрдВред рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЧрдгрдирд╛ рд╣реИ, рднреНрд░рдорд┐рдд рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рд╣рдореЗрдВ рдЯреЛрд░реЗрдВрдЯ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ ( inf-> рдирд╛рдо рдмрджрд▓реЗрдВ ) рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред
рддреЛ 2 рдЪреЗрдХрдмреЙрдХреНрд╕:
  TR_FR_FILE_NAMES = ( 1 << 20 ), TR_FR_RENAME = ( 1 << 21 ) 

рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВред рд░реЗрдЬ рдХреА. c рдореЗрдВ рдХреБрдВрдЬреА-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ (рдХреБрдВрдЬреА рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдЗрдХрд╛рдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ)ред
рд╡рд╣рд╛рдВ рд╣рдореЗрдВ "рдлрд┐рдЯ" рд╣реЛрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 #define KEY_FILE_NAMES "name" #define KEY_RENAME "rename" 

рдореВрд▓ " рдирд╛рдо " рдлрд╝реАрд▓реНрдб рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрдзреЗ .torrent рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдкрде рд╕рдВрд░рдХреНрд╖рдг рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:
 static void saveFileNames( tr_benc * dict, const tr_torrent * tor ) { const tr_info * inf = tr_torrentInfo( tor ); const tr_file_index_t n = inf->fileCount; tr_file_index_t i; tr_benc * list; list = tr_bencDictAddList( dict, KEY_FILE_NAMES, n ); for( i = 0; i < n; ++i ) tr_bencListAddStr( list, inf->files[i].name ); } static uint64_t loadFileNames( tr_benc * dict, tr_torrent * tor ) { uint64_t ret = 0; tr_info * inf = &tor->info; const tr_file_index_t n = inf->fileCount; tr_benc * list; if( tr_bencDictFindList( dict, KEY_FILE_NAMES, &list ) && tr_bencListSize( list ) == n ) { const char * name; tr_file_index_t i; for( i = 0; i < n; ++i ) if( tr_bencGetStr( tr_bencListChild( list, i ), &name ) ) tr_torrentInitFileName( tor, i, name ); ret = TR_FR_FILE_NAMES; } return ret; } 

рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВред
tr_torrentSaveResume () , рддреБрд░рдВрдд рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж рдЕрдЧрд░ (tr_torrentHasMetadata (tor)) :
  if( tor->info.rename ) tr_bencDictAddStr( &top, KEY_RENAME, tor->info.rename ); saveFileNames( &top, tor ); 

рдФрд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреЛрдб рдореЗрдВ рд▓реЛрдб FromFile ():
  if( fieldsToLoad & TR_FR_FILE_NAMES ) fieldsLoaded |= loadFileNames( &top, tor ); if( ( fieldsToLoad & TR_FR_RENAME ) && tr_bencDictFindStr( &top, KEY_RENAME, &str ) && str && str[0] ) { tr_free( tor->info.rename ); tor->info.rename = tr_strdup( str ); } 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрди рдЭрдВрдбреЛрдВ рдХреЛ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ (TR_FR_ *), рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрдирдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИ?
рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ "рд╕рдм рдХреБрдЫ рдЕрдиреБрдордд рд╣реИ, рдЬреЛ рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рд╣реИ", рдЕрд░реНрдерд╛рдд, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ: рдЭрдВрдбреЗ рдФрд░ = ~ рдЗрдирдХрд╛рд░рдлрд┐рд▓реНрдбреНрд╕;
рдмреВрд▓рд┐рдпрди рддрд░реНрдХ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ 20 рдФрд░ 21 рдмрд┐рдЯреНрд╕ рд╡реИрд╕реЗ рднреА рд╕реЗрдЯ рд╣реЛрдВрдЧреЗред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рд╣реИред рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд рдкреИрдЪ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рд╕рдВрдкрд╛рджрди рдХреЛрдб gtk рдФрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди-рд░рд┐рдореЛрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕реАрдзреЗ gtk рдХреЗ рд▓рд┐рдП libtransmission, рдФрд░ rpc -remote рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╡реНрдпрд╡рд╕рд╛рдп рдХреА рдПрдХ рдмреВрдВрдж рдХреЗ рд╕рд╛рдеред -logicsред

рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рдиред рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реБрд▓рдЭрд╛ рд▓рд┐рдпрд╛, рдЕрдм рджреВрд╕рд░рд╛ рдЙрдкрд╡рд╛рдХреНрдп рд░рд╣ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реАрдЬрд╝рди рдПрди рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЕрд░реНрдерд╛рддреН, рд╡реЗ рд╣рдореЗрдВ рдЖрд░рдкреАрд╕реА рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдерд╛, рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЯреЙрд░реЗрдВрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), рдмрд▓реНрдХрд┐ рд╕рд╛рд░реНрдердХ рд▓рд╛рдЗрдиреЗрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╕рдВрдкрд╛рджрди рдХрд░реЗрдВрдЧреЗ - рдмрд╕ рдПрдХ рдирдИ " рдбрд┐рд╕реНрдкреНрд▓реЗрдирд╛рдо " рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдЖрд░рдкреАрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░реНрд╕ рдЬреЛрдбрд╝реЗрдВред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рд╕рд░рд▓ рд╕рдВрдкрд╛рджрди рд╣реИ - рд╣рдореЗрдВ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЖрд░рдкреАрд╕реА-рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рдеред

рдЕрдВрдХ рдкрд░:


рдЬрдм рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдзрд╛рд░ "рдЧрдВрджреА" рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЕрдВрддрд┐рдо рдмрдЪрдд рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЖрдк рд╕рдВрдХрд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

./autogen.sh --disable-gtk
make
make install prefix=/usr

рдЕрдм рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╢реЛрдзрди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди GUI рдбреЙрдЯрдиреЗрдЯ рдореЗрдВ рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реБрдзрд╛рд░ рдХрд┐рдП рд╣реИрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛ред

рд╕рдВрджрд░реНрдн


Source: https://habr.com/ru/post/In119274/


All Articles