• Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
RetroPie forum home
  • Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

XINIT and ;

Scheduled Pinned Locked Moved Help and Support
script modulexinit
12 Posts 4 Posters 1.6k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S
    sleve_mcdichael
    last edited by sleve_mcdichael 29 Mar 2022, 07:07

    Seeing something weird in my log file:

    Executing (via xinit): pushd /home/pi/RetroPie/roms/ports/sorr
    ./SorR.dat: doesn't exist or isn't version 7 DCB compatible
    /dev/shm/retropie_xinitrc: line 5: popd\n: command not found
    ~/RetroPie/roms/ports/sorr ~
    ~

    /dev/shm/retropie_xinitrc is removed before I can look at it, so I hacked the emulators.cfg command to copy it while it exists to ~ where I can view it later:

    bgdi-333 = "XINIT:pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 %ROM%; popd"
    default = "bgdi-333"
    

    That worked, here's what I got:

    pi@retropie:~ $ cat retropie_xinitrc
    #!/bin/bash
    XRANDR_OUTPUT="$(xrandr --verbose | grep " connected" | awk '{ print $1 }')"
    xrandr --output $XRANDR_OUTPUT --mode 1280x720 --refresh 60
    echo "Set mode 1280x720@60Hz on $XRANDR_OUTPUT"
    echo -e "\nExecuting (via xinit): "pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"; popd"\n"
    pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"; popd

    That second echo is where the problem is:

    echo -e "\nExecuting (via xinit): "pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"; popd"\n"
    

    with those ; in there, it's getting parsed as:

    $ echo -e "\nExecuting (via xinit): "pushd /home/pi/RetroPie/roms/ports/sorr
    Executing (via xinit): pushd /home/pi/RetroPie/roms/ports/sorr
    $ cp /dev/shm/retropie_xinitrc ~
    cp: cannot stat '/dev/shm/retropie_xinitrc': No such file or directory
    # this was my "hack" -- cannot stat because file doesn't exist outside of runcommand environment.
    $ /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"
    ./SorR.dat: doesn't exist or isn't version 7 DCB compatible
    # "./SorR.dat" doesn't exist because we haven't actually moved to where it is yet.
    $ popd"\n"
    -bash: popd\n: command not found

    ...then after that, it actually does the pushd (instead of simply echoing that it is going to) and then repeats the cp (which works, if we are in runcommand; not when I trigger manually) and the /opt/retropie/ports/sorr/bgdi-333 (which works, because we are in the right place now where ./SorR can be found) and the popd (which works, because it doesn't have a "\n" after it.)

    In this case, it doesn't seem do anything drastic, but I could imagine a scenario where running partial lists of commands from the wrong directory might do more serious damage than logging some complaints about your syntax.

    Is there anything to be done about this, besides "you can't use XINIT: like that"?

    Y 1 Reply Last reply 29 Mar 2022, 12:48 Reply Quote 0
    • Y
      YFZdude @sleve_mcdichael
      last edited by 29 Mar 2022, 12:48

      @sleve_mcdichael
      If my CLI knowledge is on par, the echo command is stopping at the first ; like it should because that symbol signals the end of one command and the beginning of another, or taking the place of a line break.

      If you want the whole thing echoed I think you need to use a set of ( ) around everything you want the echo to apply to.

      S 1 Reply Last reply 29 Mar 2022, 15:18 Reply Quote 0
      • S
        sleve_mcdichael @YFZdude
        last edited by 29 Mar 2022, 15:18

        @YFZdude I tried putting parentheses both around everything, and inside the outermost quotes. Results were different each time but neither was correct.

        pi@retropie:~ $ echo -e ("\nExecuting (via xinit): "pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"; popd"\n")
        -bash: syntax error near unexpected token `('
        pi@retropie:~ $ echo -e "(\nExecuting (via xinit): "pushd /home/pi/RetroPie/roms/ports/sorr; cp /dev/shm/retropie_xinitrc ~; /opt/retropie/ports/sorr/bgdi-333 "./SorR.dat"; popd"\n)"
        (
        Executing (via xinit): pushd /home/pi/RetroPie/roms/ports/sorr
        cp: cannot stat '/dev/shm/retropie_xinitrc': No such file or directory
        ./SorR.dat: doesn't exist or isn't version 7 DCB compatible
        -bash: popd\n): command not found
        pi@retropie:~ $
        B Y 2 Replies Last reply 29 Mar 2022, 15:36 Reply Quote 0
        • B
          BuZz administrators @sleve_mcdichael
          last edited by 29 Mar 2022, 15:36

          @sleve_mcdichael You will need to use a launch script if you need to do that when using XINIT:

          To help us help you - please make sure you read the sticky topics before posting - https://retropie.org.uk/forum/topic/3/read-this-first

          1 Reply Last reply Reply Quote 0
          • Y
            YFZdude @sleve_mcdichael
            last edited by 29 Mar 2022, 16:26

            @sleve_mcdichael
            After thinking about it and playing with a test command I remembered the trick.

            You need to escape the ; characters with a \ before each one so it will treat them as text instead of the command separator function.

             echo -e this should\; print as \; one line
            
            S 1 Reply Last reply 29 Mar 2022, 17:08 Reply Quote 0
            • S
              sleve_mcdichael @YFZdude
              last edited by sleve_mcdichael 29 Mar 2022, 17:08

              @YFZdude would that I were merely crafting an echo command whole-cloth, that would be great. Unfortunately, it is generated automatically by whatever is in emulators.cfg; I can't just escape the semicolons in one place but not the other, (I mean, I'm sure someone probably can, but I wouldn't know where to start.)

              @BuZz so something like lr-nxengine does then, yeah? First, I'd do an addPort with just XINIT:<command>, and then overwrite that automatically-generated launch script with a custom one:

              [...]
              addPort "bgdi-333" "sorr" "Streets of Rage Remake" "XINIT:$md_inst/bgdi-333 %ROM%" "./SorR.dat"
              local file="$romdir/ports/Streets of Rage Remake.sh"
              cat > "$file" << _EOF_
              #!/bin/bash
              pushd "$romdir/ports/sorr"
              "$rootdir/supplementary/runcommand/runcommand.sh" 0 _PORT_ "sorr" "./SorR.dat"
              popd
              _EOF_
              chown $user:$user "$file"
              chmod +x "$file"
              [...]

              Like that?

              M 1 Reply Last reply 29 Mar 2022, 17:37 Reply Quote 0
              • M
                mitu Global Moderator @sleve_mcdichael
                last edited by 29 Mar 2022, 17:37

                @sleve_mcdichael Don't mix runcommand into your launch script.

                S 1 Reply Last reply 29 Mar 2022, 18:06 Reply Quote 0
                • S
                  sleve_mcdichael @mitu
                  last edited by sleve_mcdichael 29 Mar 2022, 18:06

                  @mitu ...er, why? Literally every launch script in my ports folder uses runcommand:

                  pi@retropie:~/RetroPie/roms/ports $ grep *.sh -e runcommand.sh
                  am2r.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "droidports" "/home/pi/RetroPie/roms/ports/droidports/am2r_155.apk"
                  cavestory.sh:    "/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ cavestory "/home/pi/RetroPie/roms/ports/CaveStory/Doukutsu.exe"
                  doom2-htp.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/htp/DOOM2.WAD"
                  doom2-nerve.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/nerve/DOOM2.WAD"
                  doom2-pg.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/pg/DOOM2.WAD"
                  doom2.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/doom2/DOOM2.WAD"
                  doom-jptr.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/jptr/DOOM.WAD"
                  doom-sigil.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/sigil/DOOM.WAD"
                  doom-ultimate.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/ultimate/DOOM.WAD"
                  duke3d.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "duke3d" "-j /home/pi/RetroPie/roms/ports/duke3d/"
                  duke-dc.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "duke3d" "-j /home/pi/RetroPie/roms/ports/duke3d -g dc/dukedc.grp"
                  duke-nw.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "duke3d" "-j /home/pi/RetroPie/roms/ports/duke3d -g nw/nwinter.grp -x nw/nwinter.con"
                  duke-vacation.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "duke3d" "-j /home/pi/RetroPie/roms/ports/duke3d -g vacation/vacation.grp -x vacation/game.con -j /home/pi/RetroPie/roms/ports/duke3d/vacation"
                  finaldoom1.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/finaldoom1/TNT.WAD"
                  finaldoom2.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/finaldoom2/PLUTONIA.WAD"
                  freedoom1.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom//freedoom1/FREEDOOM1.WAD"
                  freedoom2.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/freedoom2/FREEDOOM2.WAD"
                  hcl.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "hcl" ""
                  hurrican.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "hurrican" ""
                  maldita.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "droidports" "/home/pi/RetroPie/roms/ports/droidports/Maldita_Castilla_ouya.apk"
                  marathon1.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "alephone" "/home/pi/RetroPie/roms/ports/alephone/Marathon/"
                  marathon2.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "alephone" "/home/pi/RetroPie/roms/ports/alephone/Marathon 2/"
                  marathon3.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "alephone" "/home/pi/RetroPie/roms/ports/alephone/Marathon Infinity/"
                  quake-dopa.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "quake" "/home/pi/RetroPie/roms/ports/quake/dopa/pak0.pak"
                  quake-hipnotic.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "quake" "/home/pi/RetroPie/roms/ports/quake/hipnotic/pak0.pak"
                  quake-rogue.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "quake" "/home/pi/RetroPie/roms/ports/quake/rogue/pak0.pak"
                  quake.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "quake" "/home/pi/RetroPie/roms/ports/quake/id1/pak0.pak"sorr.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "sorr" "./SorR.dat"
                  supertux.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "supertux" ""
                  sw-dragon.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "sw" "-gdragon.zip"
                  sw.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "sw" ""
                  sw-wt.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "sw" "-gwt.grp"
                  wolf3d.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "wolf3d" "/home/pi/RetroPie/roms/ports/wolf3d/vswap.wl6"wolf-sd1.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "wolf3d" "/home/pi/RetroPie/roms/ports/wolf3d/vswap.sd1"
                  wolf-sd2.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "wolf3d" "/home/pi/RetroPie/roms/ports/wolf3d/vswap.sd2"
                  wolf-sd3.sh:"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "wolf3d" "/home/pi/RetroPie/roms/ports/wolf3d/vswap.sd3"
                  

                  I based it on what lr-nxengine.sh does for Cave Story:

                  addPort "$md_id" "cavestory" "Cave Story" "$md_inst/nxengine_libretro.so"
                      local file="$romdir/ports/Cave Story.sh"
                      # custom launch script - if the data files are not found, warn the user
                      cat >"$file" << _EOF_
                  #!/bin/bash
                  if [[ ! -f "$romdir/ports/CaveStory/Doukutsu.exe" ]]; then
                      dialog --no-cancel --pause "$md_help" 22 76 15
                  else
                      "$rootdir/supplementary/runcommand/runcommand.sh" 0 _PORT_ cavestory "$romdir/ports/CaveStory/Doukutsu.exe"
                  fi
                  _EOF_
                      chown $user:$user "$file"
                      chmod +x "$file"
                  

                  Is this different because of XINIT:, or what do you mean?

                  Edit: oh, is that going to "start over" in ~, essentially "undoing" the pushd?

                  1 Reply Last reply Reply Quote 0
                  • M
                    mitu Global Moderator
                    last edited by 29 Mar 2022, 18:17

                    @sleve_mcdichael said in XINIT and ;:

                    Is this different because of XINIT:, or what do you mean?

                    Your script is called from runcommand, which takes care of XINIT handling, calling runcommand again from your script doesn't makes sense. The script should just start the game.

                    1 Reply Last reply Reply Quote 0
                    • S
                      sleve_mcdichael
                      last edited by sleve_mcdichael 29 Mar 2022, 18:39

                      @mitu ah, so I'm not overwriting the "launch script" that's inroms like lr-nxengine does, but adding, say, a "buffer" launch script in $md_inst like wolf4sdl or eduke32 do?

                      Something like this then, maybe:

                      [...]
                      addPort "bgdi-333" "sorr" "Streets of Rage Remake" "XINIT:$md_inst/$md_id.sh %ROM%" "./SorR.dat"
                      local file="$md_inst/$md_id.sh"
                      cat > "$file" << _EOF_
                      #!/bin/bash
                      pushd "$romdir/ports/sorr"
                      "$md_inst/bgdi-333" \$*
                      popd
                      _EOF_
                      chown $user:$user "$file"
                      chmod +x "$file"
                      [[ -f "$romdir/ports/$md_id/SorMaker.dat" || "$md_mode" == "remove" ]] && addPort "bgdi-333" "sorr" "SorMaker" "XINIT:$md_inst/$md_id.sh %ROM%" "./SorMaker.dat"
                      [...]

                      Edit: changed the commands a little. Does this work to pass %ROM% as additional arguments? And does that last line work like I think it does?

                      M 1 Reply Last reply 29 Mar 2022, 18:57 Reply Quote 0
                      • M
                        mitu Global Moderator @sleve_mcdichael
                        last edited by 29 Mar 2022, 18:57

                        That looks better.

                        Edit: changed the commands a little. Does this work to pass %ROM% as additional arguments?

                        Yes, you'd get it in $1 (1st arg), but I'm not sure if it help or is useful in this case. You can just pass SorR.dat as argument to the starting game script.

                        S 1 Reply Last reply 29 Mar 2022, 18:59 Reply Quote 0
                        • S
                          sleve_mcdichael @mitu
                          last edited by 29 Mar 2022, 18:59

                          @mitu sorry I made another edit. I want to pass that as the %ROM% parameter so we can make another menu entry for the level editor.

                          1 Reply Last reply Reply Quote 0
                          • S sleve_mcdichael referenced this topic on 11 May 2022, 00:25
                          12 out of 12
                          • First post
                            12/12
                            Last post

                          Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.

                          Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.

                            This community forum collects and processes your personal information.
                            consent.not_received