Renaming IFS object using Rename() API in RPGLE |
We can change the name of an ifs object using rename() api.
What is the Rename() API?
Rename() is allows you to rename an object. This api works with link not with data. Therefore this api has nothing to do with data.
Prototype for the Rename() API in C language
int rename(const char *old, const char *new);
- The return value is an int (integer) and values are 0 which indicate success, or -1 if an error occurred.
- First parameter is input const char *old where a pointer to the null-terminated path name of the file to be renamed.(old file)
- Second parameter is const char *new where pointer to the null-terminated path name of the new name of the file. (new file)
Prototype for the Rename() API in RPG
Please note that, the external procedure name is not "rename" it would be either Qp0lRenameKeep or Qp0lRenameUnlink. Here, you notice two different rename() apis. The difference between them appears when the "new name" (new file) already exists i.e. the name of another object.
If we use Qp0lRenameKeep, and the "new name" (new file) already exists, this api will return the error, and do not delete the existing file.
D renameK PR 10I 0 ExtProc('Qp0lRenameKeep') D oldname * Value options(*string) D newname * Value options(*string)
Instead, If we use Qp0lRenameUnlink, and the "new name" (new file) already exists, then this api will first unlink (delete) the existing filename, and then proceed to rename the file name. We must prefer to use Qp0lRenameKeep which ensures that the existing file does not get deleted if the new file name already exists.
D renameU PR 10I 0 ExtProc('Qp0lRenameUnlink') D oldname * Value options(*string) D newname * Value options(*string)
RPGLE program for rename IFS object using RENAME() API
HDFTACTGRP(*NO) D renameK PR 10I 0 ExtProc('Qp0lRenameKeep') D oldname * Value options(*string) D newname * Value options(*string) D renameU PR 10I 0 ExtProc('Qp0lRenameUnlink') D oldname * Value options(*string) D newname * Value options(*string) D errorifs PR * ExtProc('__errno') D strerror PR * ExtProc('strerror') D error_num 10I 0 value Difspathold s 512a Difspathnew s 512a Dreturn_renameK s 10i 0 inz Dreturn_renameU s 10i 0 inz Derror_ptr S * Derror_num S 10I 0 based(error_ptr) Derrormsg_ptr S * Derror_msg S 500a based(errormsg_ptr) C EVAL ifspathold = '/home/easyclass/helloworld' C EVAL ifspathold = '/home/easyclass/helloworld2' C EVAL return_renameK = renameK(%trim(ifspathold): C %trim(ifspathnew)) C IF return_renameK < 0 C EVAL error_ptr = errorIFS() C EVAL errormsg_ptr = strerror(error_num) C ENDIF C EVAL return_renameU = renameU(%trim(ifspathold): C %trim(ifspathnew)) C IF return_renameU < 0 C EVAL error_ptr = errorIFS() C EVAL errormsg_ptr = strerror(error_num) C ENDIF C EVAL *INLR = *ON C RETURN
HDFTACTGRP(*NO) D renameK PR 10I 0 ExtProc('Qp0lRenameKeep') D oldname * Value options(*string) D newname * Value options(*string) D renameU PR 10I 0 ExtProc('Qp0lRenameUnlink') D oldname * Value options(*string) D newname * Value options(*string) D errorifs PR * ExtProc('__errno') D strerror PR * ExtProc('strerror') D error_num 10I 0 value Difspathold s 512a Difspathnew s 512a Dreturn_renameK s 10i 0 inz Dreturn_renameU s 10i 0 inz Derror_ptr S * Derror_num S 10I 0 based(error_ptr) Derrormsg_ptr S * Derror_msg S 500a based(errormsg_ptr) /free ifspathold = '/home/easyclass/helloworld'; ifspathnew = '/home/easyclass/helloworld2'; return_renameK = renameK(%trim(ifspathold):%trim(ifspathnew)); if return_renameK < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; return_renameU = renameU(%trim(ifspathold):%trim(ifspathnew)); if return_renameU < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; *inlr = *on; return; /end-free
**FREE CTL-OPT DFTACTGRP(*NO); DCL-PR renameK int(10) EXTPROC('Qp0lRenameKeep'); oldname pointer VALUE options(*string); newname pointer VALUE options(*string); END-PR; DCL-PR renameU int(10) EXTPROC('Qp0lRenameUnlink'); oldname pointer VALUE options(*string); newname pointer VALUE options(*string); END-PR; DCL-PR errorifs pointer EXTPROC('__errno'); END-PR; DCL-PR strerror pointer EXTPROC('strerror'); error_num int(10) VALUE; END-PR; DCL-S ifspathold CHAR(512); DCL-S ifspathnew CHAR(512); DCL-S return_renameK int(10); DCL-S return_renameU int(10); DCL-S error_ptr pointer; DCL-S error_num int(10) based(error_ptr); DCL-S errormsg_ptr pointer; DCL-S error_msg char(500) based(errormsg_ptr); ifspathold = '/home/easyclass/helloworld'; ifspathnew = '/home/easyclass/helloworld2'; return_renameK = renameK(%trim(ifspathold):%trim(ifspathnew)); if return_renameK < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; return_renameU = renameU(%trim(ifspathold):%trim(ifspathnew)); if return_renameU < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; *inlr = *on; return;
first we call renameK() api i.e. Qp0lRenameKeep api that will rename the file name "helloworld" to new name "helloworld2" in user home directory. In case the new file name already exists then this api will return -1 and do not proceed with rename ifs object.
Secondly, we call renameU() api i.e. Qp0lRenameUnlink api that will rename the file name "helloworld" to new name "helloworld2" in user home directory. In case the new file name already exists then this api will first unlink that file i.e. delete that file and then proceed with rename ifs object to new name from old name.
Please note that when any error returned by any of the rename() api then we call the error handling apis to get error number and corresponding error message.