tag:linuxfr.org,2005:/users/harlock974/postsLinuxFr.org : les publications de harlock9742023-03-15T12:39:46+01:00/favicon.pngtag:linuxfr.org,2005:Post/435302023-03-15T12:39:46+01:002023-03-15T12:39:46+01:00C : gestion du répertoire de travail<p>Bonjour à tous,</p>
<p>Je recherche le moyen le plus simple (au sens "moins de lignes de code") de récupérer le répertoire de travail d'un programme.</p>
<p>Supposons que le programme ait besoin d'ouvrir un fichier data.txt situé dans le même répertoire que l'exécutable. Le plus simple est d'écrire :</p>
<p><code>f=fopen("data.txt","r");</code></p>
<p>Mais si j'appelle le programme d'un autre emplacement que celui de l'exécutable, ça ne marche pas. Il faut donc récupérer le répertoire de travail.</p>
<p>Voici les deux méthodes les plus simples que j'ai trouvées :</p>
<h4 id="toc-méthode-1-">Méthode 1 :</h4>
<pre><code class="C"><span class="cp">#define _GNU_SOURCE</span>
<span class="cp">#include</span> <span class="cpf"><libgen.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><stdio.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><string.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><stdlib.h></span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="kt">FILE</span> <span class="o">*</span><span class="n">f</span><span class="p">;</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">racine</span><span class="p">;</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">chemin</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">nom_fichier</span><span class="p">[]</span><span class="o">=</span><span class="s">"/data.txt"</span><span class="p">;</span>
<span class="n">racine</span><span class="o">=</span><span class="n">strdupa</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
<span class="n">chemin</span><span class="o">=</span><span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">dirname</span><span class="p">(</span><span class="n">racine</span><span class="p">))</span><span class="o">+</span><span class="n">strlen</span><span class="p">(</span><span class="n">nom_fichier</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
<span class="n">strcpy</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="n">racine</span><span class="p">);</span>
<span class="n">strcat</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="n">nom_fichier</span><span class="p">);</span>
<span class="k">if</span> <span class="p">((</span><span class="n">f</span><span class="o">=</span><span class="n">fopen</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="s">"r"</span><span class="p">))</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">...</span></code></pre>
<p>Si l'on veut se passer de l'extension GNU, on peut remplacer <code>racine=strdupa(argv[0]);</code> par :</p>
<pre><code class="C"><span class="n">racine</span><span class="o">=</span><span class="n">malloc</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
<span class="n">strcpy</span><span class="p">(</span><span class="n">racine</span><span class="p">,</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span></code></pre>
<p>Bien sûr ceci a peu d'intérêt étant donné le caractère anecdotique des systèmes d'exploitations autres que GNU-Linux.</p>
<h4 id="toc-méthode-2-">Méthode 2 :</h4>
<pre><code class="C"><span class="cp">#define _GNU_SOURCE</span>
<span class="cp">#include</span> <span class="cpf"><errno.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><stdio.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><string.h></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><stdlib.h></span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="kt">FILE</span> <span class="o">*</span><span class="n">f</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">l</span><span class="p">;</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">chemin</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">nom_fichier</span><span class="p">[]</span><span class="o">=</span><span class="s">"data.txt"</span><span class="p">;</span>
<span class="n">l</span><span class="o">=</span><span class="n">strlen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">-</span><span class="n">strlen</span><span class="p">(</span><span class="n">program_invocation_short_name</span><span class="p">);</span>
<span class="n">chemin</span><span class="o">=</span><span class="n">malloc</span><span class="p">(</span><span class="n">l</span><span class="o">+</span><span class="n">strlen</span><span class="p">(</span><span class="n">nom_fichier</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
<span class="n">memcpy</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">l</span><span class="p">);</span>
<span class="n">strcat</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="n">nom_fichier</span><span class="p">);</span>
<span class="k">if</span> <span class="p">((</span><span class="n">f</span><span class="o">=</span><span class="n">fopen</span><span class="p">(</span><span class="n">chemin</span><span class="p">,</span><span class="s">"r"</span><span class="p">))</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">...</span></code></pre>
<p>On peut simplifier encore plus en se passant des malloc en assignant une dimension fixe aux chaînes, mais c'est moins propre.</p>
<p>Et vous comment faites vous ?</p>
<div><a href="https://linuxfr.org/forums/programmation-c--2/posts/c-gestion-du-repertoire-de-travail.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/130616/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-c--2/posts/c-gestion-du-repertoire-de-travail#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/130616/comments.atomtag:linuxfr.org,2005:Post/413502020-08-11T07:31:59+02:002020-08-11T09:31:14+02:00[Résolu] Des modules se compilent tout seuls...<p>Bonjour à tous,<br>
Je suis sur Linux Mint 19.3<br>
Depuis quelque temps et probablement suite à une mise à jour, des modules se compilent tous seuls, ce qui génère une bonne activité CPU et des fichiers qui apparaissent/disparaissent en permanence dans le dossier /tmp. ps aux renvoie ce genre de truc :</p>
<pre><code class="bash">/bin/bash /usr/sbin/dkms install evdi/5.2.14
/bin/bash /usr/sbin/dkms install evdi/5.2.14
make -j4 <span class="nv">KERNELRELEASE</span><span class="o">=</span><span class="m">5</span>.4.0-42-generic all <span class="nv">INCLUDEDIR</span><span class="o">=</span>/lib/modules/5.4.0-42-generic/build/include <span class="nv">KVERSION</span><span class="o">=</span><span class="m">5</span>.4.0
make <span class="nv">KBUILD_VERBOSE</span><span class="o">=</span><span class="m">1</span> <span class="nv">SUBDIRS</span><span class="o">=</span>/var/lib/dkms/evdi/5.2.14/build <span class="nv">SRCROOT</span><span class="o">=</span>/var/lib/dkms/evdi/5.2.14/build CONFIG_MODU
make -f ./scripts/Makefile.modbuiltin <span class="nv">obj</span><span class="o">=</span>drivers
sleep <span class="m">3</span>
make -f ./scripts/Makefile.modbuiltin <span class="nv">obj</span><span class="o">=</span>drivers/media
make -f ./scripts/Makefile.modbuiltin <span class="nv">obj</span><span class="o">=</span>drivers/net
make -f ./scripts/Makefile.modbuiltin <span class="nv">obj</span><span class="o">=</span>drivers/net/ethernet
make -f ./scripts/Makefile.modbuiltin <span class="nv">obj</span><span class="o">=</span>drivers/media/usb</code></pre>
<p>Je n'avais jamais vu ça auparavant. Faut-il laisser faire ?</p>
<div><a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/resolu-des-modules-se-compilent-tout-seuls.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/121282/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/resolu-des-modules-se-compilent-tout-seuls#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/121282/comments.atomtag:linuxfr.org,2005:Post/404762019-09-18T07:27:59+02:002019-09-18T08:05:42+02:00Faire cohabiter deux versions de librairie (libcurl) [Résolu]<p>Bonjour à tous,</p>
<p>J'utilise Linux Mint 19.2 (base Ubuntu 18.04)</p>
<p>J'ai installé un logiciel métier qui dépend de lbcurl3. Cette librairie se trouve dans les paquets de la distribution, donc pas de soucis.</p>
<p>Mais si je veux installer curl, celui-ci dépend désormais de libcurl4. Les deux versions, 3 et 4, sont dans les dépôts, mais on ne peut apparemment pas les installer en même temps. Si j'installe curl, le gestionnaire désinstalle le logiciel métier, et réciproquement.<br>
Même souci avec R, cmake et plein d'autres, qui dépendent aussi de libcurl4.<br>
Le pire, c'est que je ne vois pas à quoi peut servir cette librairie à mon logiciel, qui n'est pas censé télécharger des trucs…</p>
<p>Existe t'il donc une astuce pour faire cohabiter les deux librairies ?</p>
<div><a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/faire-cohabiter-deux-versions-de-librairie-libcurl-resolu.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/118144/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/faire-cohabiter-deux-versions-de-librairie-libcurl-resolu#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/118144/comments.atomtag:linuxfr.org,2005:Post/386032017-10-23T08:43:11+02:002017-10-23T08:43:11+02:00Effacement de tous les fichiers d'un utilisateur<p>Bonjour les amis,</p>
<p>J'ai un souci bien ennuyeux : durant le week-end, sur une machine du bureau, tous les fichiers d'un utilisateur ont été effacés :<br>
- le répertoire de l'utilisateur était toujours présent, mais vide<br>
- des fichiers de cet utilisateur qui se trouvaient ailleurs que sous /home (sous /var/www) ont disparu<br>
- les fichiers qui se trouvaient sur un disque externe monté par cet utilisateur ont aussi disparu<br>
- seuls ont survécu des fichiers de cet utilisateur qui se trouvaient sous /var/www/ et étaient en lecture seule.</p>
<p>Quelques précisions :<br>
- personne n'a eu physiquement accès à l'ordinateur ce week-end<br>
- il y a un serveur ssh, mais les logs dans /var/log/auth.log ne font pas état d'une connexion réussie ce week end (mais n'ayant pas l'habitude de fouiller dans les logs, il n'est pas exclu que quelque chose m'ait échappé).<br>
- la commande history ne donne rien, puique le fichier d'historique a également disparu.<br>
- le système est un linux mint 18.1 Serena (basé sur Ubuntu)<br>
- Il s'agit de l'utilisateur principal, donc son mot de passe permet d'accéder à root. Toutefois, aucun fichier appartenant à root ne semble avoir été affecté.<br>
- le répertoire /home est dans la même partition que /</p>
<p>J'avais heureusement une sauvegarde, mais j'aimerais comprendre ce qu'il s'est passé.<br>
Je suppose que pour réussir cet exploit, il faut être loggé sous cet utilisateur et lancer une commande rm etc.. à la racine. Mais je ne vois pas comment celà a pu se produire.<br>
Si vous aviez une piste pouvant m'aidez à cerner le litige, un log à consulter que je ne connaitrais pas, une expérience similaire, …</p>
<p>À bientôt</p>
<p>Pierre</p><div><a href="https://linuxfr.org/forums/linux-general/posts/effacement-de-tous-les-fichiers-d-un-utilisateur.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/112929/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-general/posts/effacement-de-tous-les-fichiers-d-un-utilisateur#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/112929/comments.atomtag:linuxfr.org,2005:Post/379802017-03-18T12:52:29+01:002017-03-18T12:52:29+01:00#define une partie de nom de fonction<p>Bonjour,</p>
<p>J'ai une librairie avec des noms de fonction inutilement longs :</p>
<p>void pifacecad_lcd_clear (void)<br>
void pifacecad_lcd_home (void)<br>
void pifacecad_lcd_display_on (void)<br>
void pifacecad_lcd_display_off (void)<br>
void pifacecad_lcd_blink_on (void)<br>
void pifacecad_lcd_blink_off (void)<br>
void pifacecad_lcd_cursor_on (void)<br>
etc…<br>
(C'est une librairie pour piloter un afficheur LCD avec un Raspberry Pi)</p>
<p>Pour simplifier l'édition du programme, j'ai voulu faire ceci :</p>
<p><code>#define pifacecad_lcd LCD</code></p>
<p>puis taper mes fonctions ainsi :</p>
<p>LCD_clear()<br>
LCD_home()<br>
etc…</p>
<p>Mais ça ne marche pas. La substitution se fait pour un nom complet (par exemple #define LCD_clear pifacecad_lcd_clear), mais pas pour une partie de nom. Le compilateur lit LCD_clear() tel quel, et croit que c'est une fonction non déclarée.</p>
<p>Je sais bien que cela ne sert pas à grand chose, et que je n'ai qu'à taper des LCD partout et faire un rechercher-remplacer à la fin, mais juste par curiosité, j'aimerais bien savoir s'il y a une astuce pour remplacer une partie de nom de fonction avec un define.</p><div><a href="https://linuxfr.org/forums/programmation-c--2/posts/define-une-partie-de-nom-de-fonction.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/111479/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-c--2/posts/define-une-partie-de-nom-de-fonction#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/111479/comments.atomtag:linuxfr.org,2005:Post/369962016-06-24T06:01:14+02:002016-06-24T06:01:14+02:00Accès au réseau avec Samba<p>Bonjour,</p>
<p>Il y a encore quelque postes Windows au bureau…<br>
Depuis quelque temps (depuis une mise à jour je pense), j'ai une difficulté d'accès au réseau windows via samba, à partir d'une linux Mint LMDE.<br>
Dans le navigateur de fichier (Caja), si je fais Parcourir le réseau / Réseau Windows, j'ai l'erreur suivante : "impossible de monter l'emplacement - Message did not receive a reply (timeout by message bus)"</p>
<p>En console, si je fais smbtree -N, j'ai "Erreur de segmentation".</p>
<p>Par contre, la même commande en root me renvoie l'arborescence du réseau.</p>
<p>Et le plus bizarre, c'est que une fois que j'ai lancé cette commande en root, si je reviens en utilisateur normal, la commande fonctionne désormais, et je peux aussi parcourir le réseau dans le navigateur de fichier.</p>
<p>Du point de vue des droits, mon utilisateur fait bien partie du groupe sambashare (si ça a une importance).</p>
<p>Voilà, si quelqu'un a une idée du pourquoi du comment…</p>
<p>Bonne journée</p>
<p>Pierre</p><div><a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/acces-au-reseau-avec-samba.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/109328/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/acces-au-reseau-avec-samba#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/109328/comments.atomtag:linuxfr.org,2005:Post/364102016-01-28T05:58:17+01:002016-01-28T05:58:17+01:00Comportement des fenêtres<p>Bonjour à tous,<br>
Voici un problème assez ridicule, je le reconnais, pas très important, et très ancien, affectant la plupart des gestionnaires de fenêtre (j'utilise Mate de Linux Mint actuellement) :<br>
Certaines applications sur certaines machines mettent parfois du temps pour se lancer. Donc en pratique :</p>
<ul>
<li>je suis en train de taper ce texte</li>
<li>tiens, j'ai besoin d'une image, j'ouvre Gimp</li>
<li>le temps que Gimp s'ouvre, je reviens dans ma fenêtre en cours et continue à taper mon texte</li>
<li>paf, Gimp s'ouvre et sa fenêtre se mets en premier plan, me faisant taper dans le vide les derniers caractères.</li>
</ul><p>Donc ce que j'aimerais, c'est que la fenêtre qui mets du temps pour s'ouvrir ne prennent pas le pas sur celle qui est en train d'être utilisée, et reste en arrière plan.</p>
<p>Je sais qu'il existe, sous le capot, des possibilité de réglage fin du comportement des fenêtre, mais je n'ai rien trouvé à ce sujet, et je ne sais pas si c'est d'ailleurs possible. Qu'en pensez-vous ?</p><div><a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/comportement-des-fenetres.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/108015/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/comportement-des-fenetres#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/108015/comments.atomtag:linuxfr.org,2005:Post/348902015-01-18T11:51:43+01:002015-01-18T16:43:04+01:00[Résolu] Apache2 : comment accéder aux sous-répertoires de /var/www ?<p>Bonjour à tous,</p>
<p>J'ai installé apache2 sur Linux Mint LMDE (base Debian), avec les paramètres par défaut.<br>
Tous les fichiers .html ou .php mis dans le répertoire /var/www sont effectivement accessibles depuis le navigateur, sous localhost. Par exemple : <a href="http://localhost/ma_page.php">http://localhost/ma_page.php</a></p>
<p>J'ai ensuite crée le sous-répertoire /var/www/icons/ afin d'y ranger les icones de ma page, mais pas moyen d'y avoir accès :</p>
<p>/var/www/icons/une_icone.png retourne "404 Not found - The requested URL /icons/une_icone.png was not found on this server"</p>
<p>et</p>
<p><a href="http://localhost/icons/">http://localhost/icons/</a> retourne : "403 Forbidden - You don't have permission to access /icons/ on this server"</p>
<p>Le sous-répertoire icons a les mêmes droits que /var/<a href="http://www">www</a>. Dans apache2.conf j'ai :</p>
<pre><code class="sh"> <Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory></code></pre>
<p>Je ne comprend pas car d'après la doc apache ce qui est déclaré pour un répertoire s'applique aux sous-répertoires…</p>
<p>Qu'en pensez-vous ?</p><div><a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/resolu-apache2-comment-acceder-aux-sous-repertoires-de-var-www.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/104519/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-debian-ubuntu/posts/resolu-apache2-comment-acceder-aux-sous-repertoires-de-var-www#comments">ouvrir dans le navigateur</a>
</p>
harlock974https://linuxfr.org/nodes/104519/comments.atom